Como configurar a política de armazenamento de log por unidade com o journald?

14

Eu tenho um serviço específico, que registra informações raras, mas importantes. Eu o configurei há alguns meses e hoje corri journalctl -n 50 --unit=my-serviceapenas para descobrir que não há entradas.

Estou perfeitamente feliz com esse comportamento na maioria das unidades - ou preciso de algo que aconteceu imediatamente (ou há alguns dias, no máximo) e não me importo com registros de meses.

No entanto, existe uma maneira de dizer journaldpara ter uma política de armazenamento e retenção independente para os registros de uma única unidade específica? Quero persistir esses logs específicos por, digamos, 5 anos - não importa o tamanho necessário. Os logs das outras unidades não devem ser afetados por isso e mantêm o comportamento existente.

Estou meio que perdendo o entendimento journald.conf(5)e não consigo descobrir sempre que é possível configurar por unidade. Se for - apreciaria um breve exemplo concreto - qual arquivo devo editar / criar e o que devo escrever. Ou, se você tiver certeza de que certamente não é viável - essa também seria uma boa resposta.

NOTA: Meu caso específico envolve o host do Arch Linux, mas acho que isso não deve importar muito.

drdaeman
fonte
Eu não posso comentar sobre a resposta acima para adicionar este link para um problema sobre a adição deste recurso para journald, então aqui é como uma outra resposta: github.com/systemd/systemd/issues/4751
swoop81

Respostas:

7

Parece que provavelmente estou sem sorte com o journald. A menos que eu descubra uma maneira de gerar um diário independente de "armazenamento de longo prazo" (como atualmente existem diferentes diários por usuário), mas não tenho certeza de que seja uma abordagem viável e sensata. Eu acho que configurar um syslogd (e logrotate) seria mais fácil.

O recurso não estava presente no final de 2014 , como confirmado pelo próprio Lennart.

E parece que ainda não está aqui. Pelo menos, a linha "journald: permita tempos de retenção por prioridade e por serviço ao girar / aspirar" ainda está no arquivo TODO (link para revisão de 11/07/2016).

drdaeman
fonte
3
Parece uma falha de design muito grande, quase incapacitante. Especialmente se alguém quiser diminuir a retenção ou pelo menos o nível de log de unidades muito faladoras, que entopem os logs.
precisa saber é
1
Para quem se deparar com essa questão, a linha referenciada no TODO ainda está presente a partir deste comentário (26.03.18): github.com/systemd/systemd/blob/…
timss
1
Na tentativa de obter alguma tração, eu o levantei como um problema no projeto - github.com/systemd/systemd/issues/9519 .
Slm
1

É extremamente simples gerar o arquivo de log. Por padrão, todo o registro no journald também é enviado para o syslog e esse padrão precisa estar em vigor. O rsyslog.conf controla como as entradas passadas para o syslog são tratadas. Além disso, os SyslogFacilitypadrões para daemonassim as entradas de log para qualquer serviço geralmente acabam no daemon.logarquivo em /var/log.

No seu arquivo de serviço, adicione à seção [service]

SyslogFacility=local2

(o número pode estar entre 0 e 7) https://www.freedesktop.org/software/systemd/man/systemd.exec.html

Modifique o /etc/rsyslog.conf (encontre as linhas existentes a serem modificadas) para que o local2 seja registrado em um arquivo específico (primeira linha) e, idealmente, não seja registrado no syslog, adicionando local2.nonecomo mostrado (ele já está no diário).

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

[editar] você também precisa alterar todas as capturas

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

É claro que a retenção real precisa ser feita por logrotate.

HTH

Brian
fonte