O sistema de registro no Linux passou por uma transformação com a introdução do systemd. Neste artigo, exploraremos como utilizar o comando journalctl
para analisar e filtrar as mensagens de log do sistema.
Centralização de Logs
O systemd, juntamente com seu gerenciador de serviços, implementou uma mudança crucial na forma como os logs do sistema são agregados. Anteriormente, esses logs estavam dispersos em diferentes locais do sistema de arquivos, dependendo do serviço ou daemon que os gerava. Apesar da diversidade, todos compartilhavam uma característica: eram arquivos de texto simples.
Com o systemd, todos os registros de sistema, inicialização e kernel são centralizados em uma solução de log unificada. O formato de armazenamento agora é binário, o que facilita a extração de dados em diversos formatos, como JSON, como veremos adiante.
Essa centralização também simplifica a correlação de informações que antes estariam em logs separados. Com os dados em um único diário, é possível selecionar e exibir informações de várias fontes de maneira integrada.
A ferramenta journalctl
é o meio pelo qual interagimos com o journal.
Utilizando journalctl
sem parâmetros
É possível executar o journalctl
sem parâmetros adicionais:
journalctl
O comando exibirá todo o diário, com as entradas mais antigas no início. A saída é apresentada através do programa less
, que permite navegar e pesquisar usando seus recursos tradicionais. As teclas de seta (esquerda e direita) também podem ser usadas para rolar horizontalmente e ler entradas mais longas.
Ao pressionar a tecla End
, você será levado diretamente ao final do log, exibindo as entradas mais recentes.
Para sair, pressione Ctrl + C
.
Embora o journalctl
possa ser executado sem sudo
, utilizar sudo
garante que todas as informações do log sejam exibidas.
sudo journalctl
Para enviar a saída do journalctl
diretamente para a janela do terminal, em vez de usar less
, utilize a opção --no-pager
.
sudo journalctl --no-pager
A saída será exibida rapidamente na janela do terminal, retornando ao prompt de comando após a conclusão.
Para limitar o número de linhas retornadas pelo journalctl
, use a opção -n (linhas)
. O comando abaixo exibirá as 10 linhas mais recentes:
sudo journalctl -n 10
Acompanhando as Atualizações do Diário
A opção -f (seguir)
permite que o journalctl
exiba as entradas mais recentes à medida que elas são adicionadas ao diário.
sudo journalctl -f
A entrada mais recente tem um carimbo de data/hora de 07:09:07. Novas entradas são adicionadas na parte inferior da tela conforme a atividade ocorre, proporcionando atualizações quase em tempo real.
Às 07:09:59, um aplicativo chamado geek-app
adicionou uma entrada de log que dizia: “Nova mensagem de HTG”.
Alterando o Formato de Exibição
Como o diário é um arquivo binário, seus dados precisam ser convertidos para texto antes de serem exibidos. Diferentes analisadores podem criar diversos formatos de saída a partir dos mesmos dados binários. O journalctl
oferece várias opções de formato.
O formato padrão é o short
, que se assemelha ao formato de log de sistema clássico. Para solicitar explicitamente o formato short
, use a opção -o (saída)
com o modificador short
.
sudo journalctl -n 10 -o short
Os campos exibidos da esquerda para a direita são:
- A hora em que a mensagem foi criada, na hora local.
- O nome do host.
- O nome do processo que gerou a mensagem.
- A mensagem de log.
Para obter um carimbo de data e hora completo, use o modificador short-full
:
sudo journalctl -n 10 -o short-full
O formato de data e hora nesta saída é o mesmo que você deve usar ao selecionar mensagens de log por período.
Para visualizar todos os metadados associados a cada mensagem de log, use o modificador verbose
.
sudo journalctl -n 10 -o verbose
Existem diversos campos possíveis, mas nem todos estarão presentes em todas as mensagens.
Um campo importante é o de Prioridade, que indica a importância da mensagem:
- 0: Emergência. Sistema inutilizável.
- 1: Alerta. Condição que requer correção imediata.
- 2: Crítico. Travamentos, falhas graves em aplicativos primários.
- 3: Erro. Erro relatado, mas não considerado grave.
- 4: Aviso. Condição que pode se tornar um erro se ignorada.
- 5: Observe. Eventos incomuns, mas não erros.
- 6: Informações. Mensagens operacionais regulares.
- 7: Depurar. Mensagens para facilitar a depuração.
Para exibir a saída formatada como JSON (JavaScript Object Notation), use o modificador json
:
sudo journalctl -n 10 -o json
Cada mensagem é exibida como um objeto JSON bem formatado, com uma mensagem por linha.
Para ter a saída JSON formatada de maneira mais legível, use o modificador json-pretty
.
sudo journalctl -n 10 -o json-pretty
Cada objeto JSON é dividido em várias linhas, com cada par nome-valor em uma nova linha.
Para exibir apenas as mensagens de log, sem carimbos de data/hora ou outros metadados, use o modificador cat
:
sudo journalctl -n 10 -o cat
Este formato de exibição dificulta a identificação de qual processo gerou o evento de log, embora algumas mensagens possam conter pistas.
Seleção de Mensagens de Log por Período
As opções -S (since)
e -U (until)
permitem limitar a saída do journalctl
a um período de tempo específico.
Para exibir as entradas de log a partir de uma determinada data e hora, utilize o seguinte comando:
sudo journalctl -S "2020-91-12 07:00:00"
A tela mostrará apenas as mensagens que chegaram após a data e hora especificadas.
Para definir um período de tempo específico, utilize as opções -S (desde)
e -U (até)
juntas. O comando abaixo analisará as mensagens de log em um período de 15 minutos:
sudo journalctl -S "2020-91-12 07:00:00" -U "2020-91-12 07:15:00"
Essa combinação é particularmente útil quando você sabe que algo incomum aconteceu em seu sistema, e tem uma ideia do período de tempo em que ocorreu.
Usando Períodos de Tempo Relativos
Você pode usar endereçamento relativo para selecionar seus períodos de tempo. Isso significa que você pode solicitar coisas como “mostre-me todos os eventos de um dia atrás até agora”. O comando abaixo faz exatamente isso. O “d” representa “dia” e o “-1” significa um dia no passado.
sudo journalctl -S -1d
As mensagens de log são listadas a partir das 00:00:00 de ontem até o presente momento.
Para investigar algo que aconteceu no passado recente, você pode especificar um período de tempo relativo medido em horas. Abaixo, revisamos as mensagens de log da última hora:
sudo journalctl -S -1h
As mensagens da última hora serão exibidas. Você também pode usar “m” para definir períodos de tempo relativos em minutos e “w” para semanas.
O journalctl
também compreende os termos “hoje”, “ontem” e “amanhã”. Esses modificadores fornecem uma maneira conveniente de especificar períodos de tempo comuns. Para visualizar todos os eventos que ocorreram ontem, use o seguinte comando:
sudo journalctl -S yesterday
Todos os eventos do diário de ontem, até a meia-noite (00:00:00), são recuperados e exibidos.
Para exibir todas as mensagens de log recebidas hoje até o momento atual, utilize o comando abaixo:
sudo journalctl -S today
Tudo a partir de 00:00:00 até o momento em que o comando é emitido será exibido.
Você pode combinar os diferentes modificadores de período de tempo. Para exibir tudo desde dois dias atrás até o início de hoje, use o seguinte comando:
sudo journalctl -S -2d -U today
Tudo, desde anteontem até hoje, será recuperado e exibido.
Seleção de Mensagens de Log por Campos de Dados
Você pode pesquisar mensagens de log que correspondam a diversos campos do diário. Essas pesquisas buscam correspondências nos metadados anexados a cada mensagem. É recomendado que você consulte a lista de campos e escolha aqueles que serão mais úteis para suas necessidades.
É importante notar que o preenchimento de todos os campos por um aplicativo depende totalmente dos desenvolvedores do aplicativo. Não há garantia de que todos os campos serão preenchidos.
Todos os modificadores de campo de diário são utilizados da mesma forma. Usaremos alguns exemplos abaixo. Para procurar mensagens de log de um aplicativo específico, use o modificador _COMM (comando)
. Se você também usar a opção -f (seguir)
, o journalctl
rastreará as novas mensagens deste aplicativo à medida que elas forem adicionadas.
sudo journalctl -f _COMM=geek-app
Você pode pesquisar entradas de log usando o ID do processo (PID) do processo que gerou a mensagem de log. Use o comando ps
para encontrar o PID do daemon ou aplicativo que você deseja pesquisar.
sudo journalctl _PID=751
Na máquina utilizada para este artigo, o daemon SSH tem o PID 751.
Você também pode pesquisar por ID do usuário (UID). Este é o ID do usuário que iniciou o aplicativo ou comando, ou que é o proprietário do processo.
sudo journalctl _UID=1000
Todas as mensagens associadas a outros UIDs serão filtradas. Apenas mensagens relacionadas ao usuário 1000 serão mostradas:
Outra forma de pesquisar mensagens de log relacionadas a um aplicativo específico é fornecer o caminho para o executável.
sudo journalctl /usr/bin/anacron
Todas as mensagens de log do planejador anacron serão recuperadas e exibidas.
Para facilitar a pesquisa, podemos pedir ao journalctl
para listar todos os valores que ele contém para qualquer um dos campos do diário.
Para visualizar os UIDs para os quais o journalctl
registrou mensagens de log, use a opção -F (campos)
e forneça o identificador de campo _UID
.
journalctl -F _UID
Vamos fazer isso novamente e analisar os IDs de grupo (GID):
journalctl -F _GID
Você pode fazer isso com qualquer um dos identificadores de campo de jornal.
Listando Mensagens do Kernel
Há uma maneira integrada de isolar rapidamente as mensagens do kernel. Não é necessário procurá-las e isolá-las. A opção -k (kernel)
remove todas as outras mensagens e fornece uma visão instantânea das entradas de log do kernel.
sudo journalctl -k
O destaque indica a importância da mensagem, de acordo com os valores do campo Prioridade.
Revisando Mensagens de Inicialização
Se você tiver um problema relacionado à inicialização, o journalctl
pode ajudar. Talvez você tenha adicionado um novo hardware que não está respondendo ou um componente que funcionava anteriormente não está mais funcionando após a última atualização do sistema.
Para visualizar as entradas de log relacionadas à sua última inicialização, use a opção -b (inicialização)
:
journalctl -b
As entradas de log da última inicialização serão exibidas.
Quando mencionamos “última inicialização”, estamos nos referindo ao processo de inicialização que ligou seu computador para a sessão de login atual. Para visualizar inicializações anteriores, você pode usar um número para informar ao journalctl
qual inicialização você deseja visualizar. Para exibir a terceira inicialização anterior, use o seguinte comando:
journalctl -b 3
Geralmente, se você teve um problema e precisou reiniciar a máquina, você está interessado em uma sequência de inicialização anterior. Portanto, este é um formato de comando bastante usado.
É fácil se confundir com a sequência de inicializações. Para ajudar, podemos solicitar ao journalctl
que liste as inicializações registradas em seu diário, usando a opção --list-boots
.
journalctl --list-boots
Você pode identificar a inicialização para a qual deseja visualizar mensagens a partir do carimbo de data/hora. Em seguida, utilize o número na coluna da esquerda para obter as mensagens de log dessa sequência de inicialização. Você também pode escolher o identificador de inicialização de 32 bits e passá-lo para o journalctl