Leia e analise os logs do seu sistema Linux com Journalctl
Só porque você não está recebendo erros em seu sistema não significa que tudo está funcionando bem. Por que não ler e analisar os logs do seu sistema Linux para ver o que está acontecendo com o seu sistema? Não sabe como? Para sua sorte, o Journalctl está à altura da tarefa!
Neste tutorial, você aprenderá como acompanhar de perto o comportamento do seu sistema com a ferramenta journalctl, lendo e analisando os arquivos de log do diário do systemd.
Continue lendo e mantenha seu sistema no seu melhor!
Pré-requisitos
Este tutorial será uma demonstração prática. Se você quiser acompanhar, certifique-se de ter o seguinte.
- Uma máquina Linux – Esta demonstração usa Ubuntu 20.04 LTS, mas você pode usar qualquer distro.
- Uma conta não root com privilégios sudo.
Definindo a hora correta do sistema
Antes de usar o Journalctl, você precisará definir a hora do sistema. Os carimbos de data e hora registrados no diário do systemd estão em UTC, então você precisa selecionar o fuso horário correto. Se o seu tempo estiver atrasado em apenas alguns segundos, algumas das entradas de registro podem não aparecer corretamente quando você as usar posteriormente.
1. Abra seu terminal e execute o comando timedatectl
abaixo para obter uma lista de fusos horários disponíveis.
timedatectl list-timezones
Escolha e anote um da lista mostrada abaixo que corresponda à sua região. Por exemplo, se você mora na América, escolha o fuso horário mais próximo da sua cidade.
2. Em seguida, execute o comando abaixo para definir seu fuso horário (set-timezone
). Substitua your-zone
pelo nome do fuso horário que você escolheu anteriormente (etapa um). Este comando define a hora do sistema para o fuso horário escolhido.
De agora em diante, todas as entradas de log serão registradas como seu horário local.
sudo timedatectl set-timezone your-zone
3. Por fim, execute o seguinte comando para verificar se você definiu o fuso horário corretamente.
timedatectl status
Conforme mostrado abaixo, a data e hora atuais do sistema devem corresponder à região e fuso horário selecionados.
Mostrando todos os registros
Agora que a configuração do fuso horário está fora de questão, você pode começar a visualizar os logs em seu sistema. O Systemd System and Service Manager fornece gerenciamento centralizado de daemons de log, que coleta logs de várias partes/ferramentas do sistema.
Mas como você visualiza os logs? O utilitário journalctl permite visualizar os logs da sua máquina. E a primeira coisa que você normalmente deseja fazer é mostrar tudo o que aconteceu desde a última inicialização.
Execute o comando journalctl
abaixo para mostrar todos os logs do daemon journald.
O utilitário journalctl implementa a interface de linha de comando do daemon journald para coletar e visualizar o diário do systemd. O utilitário journalctl permite que os usuários analisem a atividade e o status de qualquer unidade gerenciada pelo systemd (serviço, processo e assim por diante).
sudo journalctl
O comando exibe todo o diário mostrado abaixo e é um pouco difícil de ler. Os logs mais antigos estão no topo da lista, enquanto os logs mais recentes estão na parte inferior.
Você provavelmente terá centenas ou milhares de entradas se o diário do systemd estiver gravando logs por tempo suficiente.
Você pode usar outros parâmetros para filtrar os registros, mas não entrará nesses filtros aqui, pois esse tópico está além deste tutorial.
Como você provavelmente deseja navegar pela lista de forma mais seletiva, setas para cima/baixo de página seriam boas. Pressione K para pular uma página para cima e J para pular uma página para baixo. Pressione END para ir para a última página.
Observe que os carimbos de data e hora no início de cada entrada são a sua hora local, já que você definiu anteriormente o seu fuso horário na seção “Definindo a hora correta do sistema” (etapa dois).
Tornar o diário persistente
Você viu como visualizar todos os logs, mas normalmente deseja mantê-los por um período mais longo, para ter mais chances de encontrar dados sobre problemas que raramente acontecem. Como? Tornando o diário persistente.
O diretório /run/log/journal/ é o local padrão dos dados de log e não é persistente por padrão. Assim que você reinicia o sistema, todos os logs desaparecem. A ideia do log persistente é manter todos os arquivos de log, mas os logs mais antigos são arquivados quando ficam muito grandes.
Para tornar o diário persistente entre inicializações, você editará o arquivo /etc/systemd/journald.conf e o configurará para usar um local de armazenamento persistente.
1. Abra o arquivo /etc/systemd/journald.conf com seu editor de texto preferido e procure a diretiva Storage=auto
, conforme mostrado abaixo.
2. Em seguida, altere o valor da diretiva Storage de auto para persistent, salve as alterações e feche o editor. Mantenha a diretiva Storage em uma linha e sem espaços entre a diretiva e o valor, caso contrário a configuração não funcionará.
3. Execute o seguinte comando para reiniciar o serviço systemd-journald
para ativar todas as alterações. Este comando não imprime a saída, mas reinicialize sua máquina e abra outro terminal assim que o comando for concluído.
Neste ponto, o systemd irá ignorar /run/log/journal e, em vez disso, armazenará os dados do diário no diretório /var/log/journal, para que seu diário de log se torne persistente entre botas.
Quando você inicia o serviço
systemd-journald
, ele cria automaticamente o diretório /var/log/journal se ele não existir.
sudo systemctl restart systemd-journald
4. Agora, execute o comando abaixo para verificar o status do systemd-journald.service
.
sudo systemctl status systemd-journald.service
Você verá um status ativo (em execução) se sua configuração funcionar, conforme mostrado abaixo. A saída abaixo confirma que o diário está funcionando conforme esperado.
5. Execute o comando ls
abaixo para ver se o diretório /var/log/journal
existe.
ls /var/log/journal
Você verá a seguinte saída, que é o UUID do diário persistente. Este UUID não tem nenhum significado específico e é apenas uma string única aleatória gerada durante o processo de inicialização. Esta string é um identificador que você pode usar para referenciar os dados em /var/log/journal.
Anote o UUID, pois você o usará para listar diários de registro (etapa seis).
6. Por fim, execute o comando abaixo para listar os diários de log. Certifique-se de substituir myUUID
pelo UUID anotado anteriormente (etapa cinco).
ls /var/log/journal/myUUID
Da mesma forma abaixo, você verá o diário da sua última inicialização. E neste ponto, agora você tem um sistema de registro persistente!
Listando entradas de diário da inicialização atual
Você aprendeu como exibir todas as entradas de log. Mas talvez você prefira filtrar tipos específicos de logs. Nesse caso, você pode querer visualizar apenas as entradas de log do kernel.
A ferramenta journalctl possui uma sintaxe de filtragem poderosa que permite exibir tipos específicos de entradas de log. Ou até mesmo mostrar informações relacionadas, como o ID do processo (PID) ou o nome da unidade do serviço de origem.
Existem diferentes maneiras de filtrar logs, mas talvez você esteja interessado apenas em visualizar os diários da sua inicialização atual. Nesse caso, o comando básico journalctl
resolverá o problema.
Execute o comando journalctl
abaixo para listar todas as entradas de diário da sua inicialização atual (-b
) pertinentes ao seu sistema/ambiente atual. O sinalizador -b
informa ao comando journalctl
para exibir os logs armazenados pelo journald desde a última inicialização do sistema.
journalctl -b
Listando registros de botas anteriores
Ao usar journalctl
para solução de problemas, você também pode precisar exibir as entradas de log de uma inicialização anterior específica. Talvez você tenha um serviço que inicia em uma inicialização, mas falha em outra. Nesse caso, você deve isolar a entrada de log da segunda inicialização para ver o que deu errado.
1. Execute o comando abaixo para exibir a lista de inicializações anteriores (–list-boots).
journalctl --list-boots
Conforme mostrado abaixo, como você configurou o log persistente na seção anterior, o journalctl exibe todas as inicializações anteriores.
- Cada linha da lista indica uma entrada de log de inicialização anterior. A primeira coluna é o deslocamento da inicialização, que você pode usar para fazer referência a cada entrada. Os deslocamentos são mostrados como números (-1, 0).
- Você também pode usar a segunda coluna, o ID de inicialização, como referência absoluta a uma entrada de inicialização.
2. Em seguida, execute o comando journalctl -b -1
para exibir as entradas do diário da inicialização 1 (a inicialização anterior). Mas você também pode exibir entradas de diário de outras inicializações alterando o número de inicialização (ou seja, inicialização 2, inicialização 3…)
journalctl -b -1
3. Por fim, execute o comando abaixo para exibir as entradas do diário da mesma inicialização, mas referenciadas por seu ID de inicialização (boot_id
). Certifique-se de substituir boot_id
pelo ID de inicialização que você anotou na etapa um.
journalctl -b boot_id
Listando logs com base em janelas de tempo
Você viu como visualizar todos os logs de inicializações anteriores, mas e se precisar visualizar logs específicos por hora? Anexar as opções --since
e --until
filtra as entradas do log do diário com base nas janelas de tempo.
Execute o comando journalctl
abaixo para encontrar todas as entradas de diário geradas 24 horas atrás a partir de uma data e hora específicas (--desde "2022-02-04 12:40:49 ”
).
journalctl --since "2022-02-04 12:40:49”
Talvez você não queira especificar data e hora. Nesse caso, use valores relativos e durações de tempo. Por exemplo, “2 minutos”, “30m”, “1h” e até dias como “ontem” ou “agora e assim por diante”.
Execute o comando abaixo para mostrar todos os lançamentos contábeis manuais desde 24 horas atrás a partir da data e hora atuais ( ”ontem”
).
journalctl --since "yesterday"
Agora, e se o seu serviço SSH estivesse funcionando desde as 10h10 de hoje e continuasse até ser interrompido há uma hora? Anexe as opções --since
e --until
ao comando journalctl
para descobrir o que deu errado.
Execute o comando abaixo para encontrar os logs gerados de 10h10
de hoje até 1 hora atrás
.
journalctl --since 10:10 --until "1 hour ago"
Filtrando logs com base na unidade do processo de origem
Encontrar logs gerados de e até uma data e hora específicas é útil para solução de problemas, mas você ainda pode obter muitos registros na saída. Como você filtra ainda mais os logs?
Por exemplo, você deseja filtrar as entradas de diário de uma unidade de servidor web NGINX que falhou ao iniciar na inicialização. Use o comando journalctl
com a opção -unit
e o nome da unidade do serviço para visualizar os logs.
Execute o comando abaixo para listar todas as entradas de diário com base na unidade do processo de origem (-u
) (nginx.service
). Este tipo de filtragem é benéfico para conhecer os PIDs dos processos ou serviços relacionados a um determinado erro ou aviso.
journalctl -u nginx.service
Talvez você prefira exibir ativamente quaisquer alterações à medida que elas acontecem, como durante o serviço de solução de problemas, e precise visualizar os logs à medida que são carregados pelo journald. Nesse caso, execute o comando abaixo para listar ou acompanhar (-f
) todas as alterações conforme elas acontecem.
journalctl -f
Até agora, você viu que o journalctl é flexível e tem muitas opções para filtrar e exibir logs. É impossível mostrar todos os tipos de filtros e intervalos de tempo neste tutorial, mas você pode executar o comando
man journalctl
para ver outras opções que a ferramenta journalctl oferece.
Personalizando o formato de saída
Por padrão, o journalctl exibe entradas de log em um formato semelhante a um pager e colore o texto do terminal na saída. Mas você provavelmente deseja gerar seus logs em um formato padronizado e mais analisável. Nesse caso, você pode usar qualquer ferramenta de manipulação de texto.
Execute o comando abaixo para suprimir a paginação e a coloração. A ferramenta journalctl permite especificar o que exibir no stdout com uma diretiva de saída no arquivo de configuração.
journalctl --no-pager
Mas se você preferir especificar um formato de saída, adicione a opção -o
ao comando journalctl. O exemplo a seguir usa o formato de saída JSON, mas você pode usar qualquer outra opção disponível em journalctl.
O comando abaixo lista as entradas de diário da inicialização atual (-b
) gerada para o serviço NGINX (nginx
) e gera a lista no formato JSON (-o json
).
journalctl -b -u nginx -o json
Embora você também possa usar um formato de saída personalizado,
journalctl
fornece vários formatos de saída predefinidos úteis, como JSON, CSV e Syslog. Cada um desses formatos tem seus méritos, mas você deve consultar as páginas das ferramentas de manipulação de texto para obter mais informações sobre como elas lidam com o texto.
Conclusão
Neste tutorial, você aprendeu como usar o comando journalctl
para visualizar os logs do diário do systemd. Mas antes de usar qualquer um desses comandos, você deve primeiro selecionar as opções de subcomando apropriadas para especificar o que deseja visualizar.
Neste ponto, agora você pode localizar e identificar rapidamente informações específicas nos registros do sistema por meio do journalctl
. Agora você está equipado com o conhecimento necessário, então por que não começar a gerenciar serviços Linux com systemctl e journalctl?