¿Rotación de registros con compresión?

¿Rotación de registros con compresión?

Estoy ejecutando un proceso en Linux (CentOS 7) que produce una gran cantidad de resultados en la salida estándar. Enviarlo todo a un archivo dará como resultado un tamaño de archivo superior a 1 TB. Pero, afortunadamente, el resultado es bastante comprimible: consta de una gran cantidad de texto bastante repetitivo.

Mi idea es, ¿puedo usar algún tipo de programa de rotación de registros como los que se describen aquí: (¿Rotación de registros de stdout?), pero ¿dónde una vez que un registro ya no está actualizado, se comprime (y nunca se elimina)? ¿Entonces termino escribiendo, digamos, un par de GB en el archivo, lo comprimo y sigo escribiendo en un archivo nuevo?

Respuesta1

Puedes usarlogrotatepara esto. CentOS 7 está usandosistemadpara que puedas configurar untarea logrotate programadacon algo como esto:

  • Cree un archivo de configuración logrotate /etc/systemd/systemllamado mylogrotate.configcon el siguiente contenido:

    /path/to/your/logfile/*.log {
        compress
        copytruncate
        delaycompress
        minsize 1G
        missingok
        nomail
        notifempty
        rotate 30
    }
    

Esto le indicará a logrotate que haga lo siguiente:

  • Las versiones antiguas de los archivos de registro se comprimen con gzip de forma predeterminada.
  • Trunque el archivo de registro original en su lugar después de crear una copia, en lugar de mover el archivo de registro antiguo y, opcionalmente, crear uno nuevo.
  • Posponga la compresión del archivo de registro anterior para el siguiente ciclo de rotación para tener dos archivos de registro sin comprimir.
  • Los archivos de registro se rotan cuando superan 1 GB.
  • Si falta el archivo de registro, pase al siguiente sin emitir un mensaje de error.
  • No envíe archivos de registro antiguos a ninguna dirección.
  • Los archivos de registro se rotan 30 veces antes de eliminarse, por lo que tendrá 30 archivos de registro antiguos. Todo lo anterior se eliminará.

Cree un servicio systemd. Cree un archivo /etc/systemd/systemllamado mylogrotate.servicecon lo siguiente:

[Unit]
Description=Rotate My Log

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/systemd/system/mylogrotate.config --state /etc/systemd/system/mylogrotate.state --verbose

Programemos esta tarea. Cree un tercer archivo /etc/systemd/systemllamado mylogrotate.timercon lo siguiente:

[Unit]
Description=Rotate My Log Timer

[Timer]
OnCalendar=*:00:00
Persistent=true

[Install]
WantedBy=timers.target

Esto ejecutará logrotate cada hora.

Todo ha sido configurado. Ahora habilite la tarea programada.

systemctl enable mylogrotate.timer
systemctl start mylogrotate.timer

Por supuesto haz todo esto como root.

(Estoy en Ubuntu pero espero que esto funcione en CentOS sin ningún problema)

información relacionada