El archivo de logrotation de Linux muestra un tamaño incorrecto de lo habitual

El archivo de logrotation de Linux muestra un tamaño incorrecto de lo habitual

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 lspero 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 copytruncateopción establecida en el logrotatearchivo 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 vieditor 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 dumuestran 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 lsmuestra).

Para resolver esto, ya sea

  1. reescribir el programa que escribe en el archivo de registro para que abra el archivo en modo agregar, o
  2. decirle al programa quereabrirel archivo de registro cuando se rota el archivo (esto generalmente se hace enviando al programa una HUPseñal desde logrotate, pero debe leer el manual de su programa), o
  3. reinicie el programa desde logrotateque se gira el registro.

información relacionada