Como analiso os logs do journalctl fora do journalctl?

1

Eu preciso coletar algumas estatísticas dos meus arquivos de log do systemd, como quantos usuários passam em um determinado parâmetro de string de consulta para o meu serviço. Eu sei que posso ver essas informações no journalctl, mas não consigo descobrir como fazer isso em Go (ou Python) para que eu possa agregar os dados. Eu tenho procurado por uma biblioteca para isso, mas não consigo encontrar nada e não consigo descobrir onde os arquivos de log são realmente armazenados.

    
por Marissa Levy 10.10.2018 / 02:04

2 respostas

2

Você pode usar a API do Journal para acessar o diário do systemd de forma programática.

Alternativamente, você pode considerar a execução do serviço systemd-journal-gatewayd em seu host, que exporta dados de diário por meio de um servidor HTTP, caso em que você pode usar uma implementação de cliente HTTP de outro idioma para consultar o diário diretamente.

API do Journal

A API oficial do Journal é fornecida como parte do próprio systemd e é usada para implementar o journalctl. É uma API C.

Esta API acessa os arquivos escritos por systemd-journald em /var/log/journal ou /run/log/journal diretamente, portanto, você precisa de permissões apropriadas para ler nesses locais, o que geralmente significa que você precisa executar seu código como root.

Essa API também exige que você vincule às bibliotecas do systemd e as disponibilize no tempo de execução. Você precisa instalar o pacote libsystemd-dev no seu sistema Ubuntu 18.04, para poder compilar e vincular a ele.

sudo apt-get install libsystemd-dev

Você pode procurar a página man do sd-journal (3) uma visão geral desta API. Para o caso mais específico de consultar o periódico, consulte sd_journal_next (3) (que inclui um bom exemplo com um programa simples e completo), também sd_journal_add_match (3) para restringir as correspondências obtidas ( implementando efetivamente uma consulta de diário.) Você também precisará de sd_journal_get_data (3) , sd_journal_open (3) , etc., mas esperamos que esses indicadores ajudem você a acessar o periódico diretamente.)

Ligações do Python

Existem ligações do Python para o systemd a partir do projeto systemd oficial, que inclui ligações para a API do Journal.

Estes módulos também estão disponíveis como pacotes do Ubuntu 18.04, com os quais você pode instalar:

sudo apt-get install python3-systemd

... para o Python 3 (recomendado), ou se você ainda precisar usar o Python 2, você pode usar:

sudo apt-get install python-systemd

Consulte a documentação do systemd.journal da classe Reader do módulo no código docstrings . Essa classe dá acesso de leitura ao diário, que é provavelmente o que você está interessado.

Ir ligações

Existem ligações Go para as bibliotecas systemd no módulo github.com/coreos/go-systemd .

Observe o submódulo sdjournal , em particular o tipo JournalReader , para leitura do diário, incluindo correspondências para filtragem. Você pode encontrar mais informações sobre no código-fonte

Journald Gatewayd

Uma alternativa ao uso da API do Journal para acessar diretamente os arquivos de diário é executar um serviço que os exporte por meio de um servidor HTTP. O Systemd fornece esse serviço por meio do systemd-journal-gatewayd .

Este programa está disponível no Ubuntu 18.04 como parte do pacote systemd-journal-remote, para que você possa instalá-lo e ativá-lo usando:

sudo apt-get install systemd-journal-remote
sudo systemctl enable --now systemd-journal-gatewayd

Que exportará um servidor HTTP na porta 19531, que você pode usar para navegar e consultar o diário.

Veja mais detalhes na página man do systemd-journal-gatewayd.service (8) , que inclui alguns exemplos de como acessá-lo usando o curl. Você pode obtê-lo para exportar os dados usando seu próprio Formato de exportação de diário nativo, como JSON ou como syslog como texto simples.

Se você usar a rota systemd-journal-gatewayd, certifique-se de compreender as implicações de segurança da exportação de seus dados de log por meio de um servidor HTTP. No mínimo, considere expor a porta apenas no host local.

    
por 12.10.2018 / 01:51
0

Eu acho que journalctl pega um subconjunto de /var/log/syslog , esse subconjunto sendo coisas que ele conhece. Isso é só da observação. Se você executar journalctl sem parâmetros, verá todos os registros. Saia pressionando q e, em seguida, execute tail /var/log/syslog . Você notará a mesma saída, mas também que as informações no arquivo syslog conterão mais do que a saída journalctl .

Portanto, à luz do comentário abaixo, você pode garantir que o syslog esteja instalado e apenas analisar /var/log/syslog do que você precisa. Você também pode tornar seu serviço (não está claro o que é isso) gravar em seu próprio log em /var/log/ .

    
por 10.10.2018 / 02:12