¿Cómo configurar la política de almacenamiento de registros por unidad con journald?

14

Tengo un servicio en particular, que registra información poco frecuente pero importante. Lo configuré hace unos meses, y hoy he corrido journalctl -n 50 --unit=my-servicesolo para encontrar que no hay entradas.

Estoy perfectamente satisfecho con este comportamiento para la mayoría de las unidades: necesito algo que sucedió de inmediato (o hace unos días como máximo), y no me importan los registros de meses.

Sin embargo, ¿hay alguna manera de decir journaldque tenga una política de almacenamiento y retención independiente para los registros de una sola unidad en particular? Quiero persistir esos registros particulares durante, por ejemplo, 5 años, sin importar el tamaño que tome. Los registros de las otras unidades no se verán afectados por esto y conservarán su comportamiento actual.

Estoy algo perdido de comprensión journald.conf(5), y no puedo entender cuando la configuración por unidad es posible. Si es así, agradecería un breve ejemplo concreto, qué archivo debo editar / crear y qué debo escribir. O, si sabe con certeza que ciertamente no es factible, esa también sería una buena respuesta.

NOTA: Mi caso particular involucra el host Arch Linux, pero supongo que esto no debería importar mucho.

drdaeman
fuente
No puedo comentar sobre la respuesta anterior para agregar este enlace a un problema sobre cómo agregar esta función a journald, así que aquí está como otra respuesta: github.com/systemd/systemd/issues/4751
swoop81

Respuestas:

7

Parece que probablemente no tengo suerte con journald. A menos que encuentre una manera de generar un diario independiente de "almacenamiento a largo plazo" (como actualmente hay diferentes diarios por usuario), pero no estoy seguro de que sea un enfoque viable y sensato. Supongo que configurar un syslogd (y logrotate) sería más fácil.

La función no estaba presente a fines de 2014 , como lo confirmó el propio Lennart.

Y parece que todavía no está aquí. Al menos, la línea "journald: permitir tiempos de retención por prioridad y por servicio al rotar / aspirar" todavía está en el archivo TODO (enlace a la revisión del 2016-07-11).

drdaeman
fuente
3
Esto parece un gran defecto de diseño, casi paralizante. Especialmente si uno quiere disminuir la retención o al menos el nivel de registro de unidades muy habladoras, que obstruyen los registros.
orion
1
Para cualquiera que se encuentre con esta pregunta, la línea referenciada en TODO todavía está presente a partir de este comentario (26.03.18): github.com/systemd/systemd/blob/…
timss
1
En un intento de obtener algo de tracción, lo planteé como un problema con el proyecto: github.com/systemd/systemd/issues/9519 .
slm
1

Es notablemente simple generar el archivo de registro. De manera predeterminada, todo el registro en journald también va a syslog y este valor predeterminado debe estar en su lugar. Rsyslog.conf controla cómo se manejan las entradas pasadas a syslog. Además, el valor SyslogFacilitypredeterminado es que daemonlas entradas de registro para cualquier servicio generalmente terminan en el daemon.logarchivo /var/log.

En su archivo de servicio, agregue a la sección [servicio]

SyslogFacility=local2

(el número puede estar entre 0 y 7) https://www.freedesktop.org/software/systemd/man/systemd.exec.html

Modifique /etc/rsyslog.conf (busque las líneas existentes para modificar) de modo que local2 se registre en un archivo específico (primera línea) e idealmente no se registre en syslog agregando local2.nonecomo se muestra (ya está en el diario).

local2.*                        /var/log/your-service-name.log
*.*;auth,authpriv.none,local2.none          -/var/log/syslog

[editar] también necesitas modificar el catch all

*.=info;*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail,news.none,local2.none      -/var/log/messages

Por supuesto, la retención real debe hacerse mediante logrotate.

HTH

Brian
fuente