He habilitado logrotation en el directorio springboot y está funcionando, pero lo que veo es que "content-data-svc.log" en realidad tiene 2 MB, pero cuando hago ls -ltrh se muestra como 61 MB.
Si veo el archivo de registro, hay más líneas vacías en el archivo de registro y, por lo tanto, el tamaño del archivo es grande. El 50% del archivo de registro tiene espacios vacíos y el resto son entradas de registro. ¿Alguna idea de por qué ocurre esto?
[aemelics@springboot]$ ls -ltrh
total 4.6M
-rw------- 1 aemelics aemelics 1.6M Apr 11 06:44 content-data-svc.log.2.gz
-rw------- 1 aemelics aemelics 1.1M Apr 12 00:44 content-data-svc.log.1.gz
-rw------- 1 aemelics aemelics 61M Apr 12 02:00 content-data-svc.log
[aemelics@springboot]$ du -shx content-data-svc.log
2.0M content-data-svc.log
A continuación se muestran mis entradas de logrotate:
[aemelics@springboot]$ gato /etc/logrotate.d/react
/logs/springboot/*.log*
{
su aemelics aemelics
missingok
daily
minsize 20M
copytruncate
notifempty
sharedscripts
compress
rotate 5
postrotate
endscript
}
Respuesta1
La razón por la que el archivo parece grande en la salida de ls
pero pequeño en la salida de du
, y que parece haber un espacio vacío al inicio del archivo después de la rotación es que cualquier programa que esté escribiendo en el archivo de registro esnoabriendo el archivo para "añadirlo".
Cuando se rota el archivo de registro, con la copytruncate
opción establecida en el logrotate
archivo de configuración, se crea una copia del archivo y se guarda el archivo original.truncado. Cuando se trunca un archivo, su contenido se elimina efectivamente, pero el archivo en sí no se elimina.
Normalmente, un programa habría abierto el archivo para agregarlo. Esto significa que cada nueva escritura en el registro ocurre en elfindel archivo, siempre. Cuando el archivo se trunca, esto significa que la siguiente línea de registro se escribirá al principio del archivo, porque ahí también está el final en ese punto.
Sin embargo, si el programano lo ha hechoabrió el archivo en modo agregar, la siguiente escritura irá a cualquier desplazamiento en el archivo en el que finalizó la última escritura, independientemente de si el archivo fue truncado o no.
Si el archivo ha sido truncado por logrotate
, esto significa que la escritura crea un agujero en el archivo entre el inicio y el punto donde ocurre la escritura. Este agujero está lleno de bytes nulos, que el vi
editor muestra como ^@
.
Esto es lo que sucede en tu caso.
Un archivo con un agujero de este tipo se denomina archivo "escaso". Los bytes nulos en el agujero en sí no se almacenan en el disco, por lo que du
muestran un tamaño bastante pequeño, pero si lees el archivo de principio a fin, leerás 61 M de datos (el tamaño lógico del archivo, que es lo que ls
muestra).
Para resolver esto, ya sea
- reescribir el programa que escribe en el archivo de registro para que abra el archivo en modo agregar, o
- decirle al programa quereabrirel archivo de registro cuando se rota el archivo (esto generalmente se hace enviando al programa una
HUP
señal desdelogrotate
, pero debe leer el manual de su programa), o - reinicie el programa desde
logrotate
que se gira el registro.