Un script que escribí hace algo y, al final, agrega algunas líneas a su propio archivo de registro. Me gustaría mantener solo las últimas n líneas (digamos, 1000 líneas) del archivo de registro. Esto se puede hacer al final del script de esta manera:
tail -n 1000 myscript.log > myscript.log.tmp
mv -f myscript.log.tmp myscript.log
pero hay una solución más limpia y elegante? Tal vez logrado a través de un solo comando?
text-processing
tail
logs
dr01
fuente
fuente
logrotate
es la solución eleganteRespuestas:
Es posible así, pero como han dicho otros, la opción más segura es la generación de un nuevo archivo y luego un movimiento de ese archivo para sobrescribir el original.
El siguiente método carga las líneas en BASH, por lo que, dependiendo del número de líneas desde
tail
, eso afectará el uso de memoria del shell local para almacenar el contenido de las líneas de registro.El siguiente también elimina las líneas vacías en caso de que existan al final del archivo de registro (debido al comportamiento de la evaluación de BASH
"$(tail -1000 test.log)"
), por lo que no proporciona un truncamiento verdaderamente 100% preciso en todos los escenarios, pero dependiendo de su situación, puede ser suficiente.fuente
La utilidad
sponge
está diseñada solo para este caso. Si lo tiene instalado, entonces se pueden escribir sus dos líneas:Normalmente, leer de un archivo al mismo tiempo que está escribiendo no es confiable.
sponge
resuelve esto al no escribirmyscript.log
hasta después de quetail
haya terminado de leerlo y terminado la tubería.Instalar en pc
Para instalar
sponge
en un sistema similar a Debian:Para instalar
sponge
en un sistema RHEL / CentOS, agregue el repositorio EPEL y luego haga:Documentación
De
man sponge
:fuente
sponge
. Muy útil para todos aquellos que aprendieron de la manera difícil que no puedes hacersort importantfile.txt > importantfile.txt
:)definitivamente "tail + mv" es mucho mejor! Pero para gnu sed podemos intentar
fuente
Para el registro, con
ed
usted podría hacer algo comoEsto se abre
infile
yr
pasa a la salida detail -n 1000 infile
(es decir, inserta esa salida antes de la primera línea) y luego se elimina de lo que inicialmente era la primera línea hasta el final del archivo. Reemplace,p
conw
para editar el archivo en el lugar.Sin embargo, tenga en cuenta que las
ed
soluciones no son adecuadas para archivos grandes.fuente
Lo que puede hacer en su script es implementar la lógica de rotación de registros. Haga todo el registro a través de una función:
Esta función, en primer lugar, hace algo como:
luego, verifica el tamaño del archivo o de alguna manera decide que el archivo requiere rotación. En ese punto, el archivo
logfile.1
, si existe, se elimina, el archivologfile.0
, si existe, se renombralogfile.1
ylogfile
se le cambia el nombrelogfile.0
.Decidir si rotar podría basarse en un contador mantenido en el script mismo. Cuando llega a 1000, se restablece a cero.
Si siempre se requiere recortar estrictamente a 1000 líneas, la secuencia de comandos podría contar el número de líneas en el archivo de registro cuando se inicie e inicializar el contador en consecuencia (o si el recuento ya cumple o excede 1000, realice la rotación de inmediato).
O puede obtener el tamaño, como con
wc -c logfile
y hacer la rotación en función de exceder un cierto tamaño. De esta manera, el archivo nunca tiene que ser escaneado para determinar la condición.fuente
Utilicé, en lugar de
mv
, elcp
comando para lograrlo, que puede tener algunos archivos de registro en el lugar donde se está ejecutando un Software. Tal vez en el directorio de inicio del Usuario diferente o en el directorio de la aplicación y tenga todos los registros en un solo lugar como enlaces duros. Si usa elmv
comando, pierde el enlace duro. Si usa elcp
comando en su lugar, mantendrá este enlace rígido.mi código es algo como:
Por lo tanto, si los archivos están en el mismo sistema de archivos, también puede otorgar algunos derechos diferentes a los usuarios y
${LOGFILE_DIR}
modificar la longitud como lo hago yo.Si es el
mv
comando, pierde el enlace rígido entre los archivos y, por lo tanto, su segundo archivo no está más conectado al primero, tal vez se ubique en otro lugar.Si en el otro lugar no permites que alguien borre el archivo, tus registros permanecerán juntos y serán controlados a través de tu propio script.
logrotate
Quizás más agradable. Pero estoy contento con esta solución.No se preocupe por el "" pero en mi caso hay algunos archivos con espacios y otras letras especiales y, si no hago el "" o el {}, todo no funciona bien.
Por ejemplo, hay un Dir donde los archivos más antiguos se comprimen automáticamente
OLDFILE.zip
y todo lo que se comprime también se enumera en Archivo,.zip_log
por lo que también.zip_log
está en este Dir pero en elLOGFILE_DIR
que tengo con:el archivo igual ya que es un enlace duro.
fuente