O que é e como usar o journalctl?
Ao usar o journalctl, você conseguirá gerenciar e analisar registros de sistema (logs) com eficiência, em ambientes Linux. Essa ferramenta de linha de comando oferece funções de monitoramento de atividades do sistema, de localização de erros, de acompanhamento de registros em tempo real e de visualização detalhada dos dados registrados. Por esses motivos, o journalctl se tornou indispensável para o diagnóstico eficaz de problemas.
O que é o journalctl?
journalctl é um poderoso utilitário para consultas e exibições de registros de eventos (log files) em sistemas Linux. Ele é um componente essencial do systemd, gerenciador de sistemas e serviços padrão de muitas distribuições modernas do Linux, como do Ubuntu, Fedora e Arch Linux. O nome journalctl é uma combinação dos termos journal (diário) e ctl (abreviação de control). Assim, ele faz referência à sua função de controlar e analisar registros do diário do sistema.
O journalctl possibilita acessos ao diário do sistema, que é gerenciado pelo serviço systemd-journald. Esse diário é uma coleção centralizada de mensagens e eventos registrados durante a operação do sistema Linux. Diferentemente de registros convencionais, baseados em texto, o journalctl possui recursos estruturados e eficientes para pesquisar, filtrar e exibir dados de registro em tempo real. Isso ajuda a diagnosticar problemas e a monitorar o status de um sistema.
Para disponibilizar os recursos listados, o journalctl armazena arquivos de registro em formato binário, já que log files binários são mais compactos e funcionais do que os equivalentes baseados em texto. Mesmo ao registrar grandes volumes de dados, esse formato suporta pesquisas de eventos ou de informações em arquivos de registro, com rapidez e eficiência. Ainda, devido à estrutura e à criptografia deles, log files binários têm maior segurança que registros baseados em texto, já que a manipulação de dados se torna bem mais difícil.
Configurar espaço de armazenamento para arquivos de registro
Com o journalctl, você pode definir e limitar o espaço de armazenamento que os arquivos de registro ocuparão no seu disco rígido. Para isso, altere as configurações do serviço systemd-journald, que podem ser encontradas no arquivo* /etc/systemd/journald.conf*. Lá estarão as seguintes entradas:
-
SystemMaxUse
: Limita o espaço de armazenamento de registros no diretório do sistema. -
RuntimeMaxUse
: Limita o espaço de armazenamento de registros no diretório temporário.
Para definir um limite de espaço, acrescente as seguintes linhas ao código, ou adapte-as conforme necessário:
[Journal]
SystemMaxUse=50M
RuntimeMaxUse=50M
bashOs valores desse exemplo (50M) podem ser alterados livremente. Você também pode utilizar outras unidades, como K (quilobytes), M (megabytes), G (gigabytes) e T (terabytes). Após editar esse arquivo de configurações, você deverá reiniciar o systemd-journald. Somente assim as alterações serão aplicadas:
sudo systemctl restart systemd-journald
bashFeito o procedimento, o systemd-journald estará configurado para limitar o espaço de armazenamento dos log files. Certifique-se de que o limite definido seja suficiente para armazenar todos os registros importantes e, ao mesmo tempo, não ocupe espaço demais no disco rígido. É importante que você saiba que os registros mais antigos serão excluídos automaticamente quando o limite for atingido.
Verificar uso do disco rígido
Antes de configurar o espaço de armazenamento para os seus arquivos de registro, você pode verificar quanto espaço o diário do sistema está ocupando atualmente. Para tanto, use o sinalizador --disk-usage
:
journalctl --disk-usage
Journals take up 8.0M on disk.
bashExcluir arquivos de registro antigos
Se o seu diário do sistema estiver ocupando muito espaço de armazenamento, considere apagar as entradas mais antigas. Existem duas formas de se fazer isso:
A opção --vacuum-size
permite reduzir esse diário a um tamanho predefinido. Nesse caso, as entradas mais antigas serão excluídas até que o espaço no disco rígido se restrinja ao limite desejado.
sudo journalctl --vacuum-size=1G
bashVocê também pode reduzir o seu diário estabelecendo um limite de tempo de armazenamento. Faça isso com a opção --vacuum-time
. Ela determinará que todas as entradas mais antigas que o limite sejam excluídas. Por exemplo, para manter somente as entradas de registro do último ano, execute o seguinte comando:
sudo journalctl --vacuum-time=1years
bashPara que serve o journalctl?
Uma das características mais úteis do journalctl é a sua capacidade de filtrar entradas de registro com base em critérios. Graças a esse recurso, você poderá buscar informações relevantes de forma direcionada e, assim, identificar problemas mais rapidamente. A seguir, apresentaremos as opções de filtragem mais comuns do journalctl.
Obter registros
Ao executar o comando journalctl
, as entradas de registro para o sistema atual são exibidas em ordem cronológica reversa. Digite journalctl -f
ou journalctl --follow
para exibir as entradas em tempo real. Novas entradas são mostradas automaticamente, na ordem em que são registradas.
Dependendo do tempo em que o systemd estiver operando no seu sistema, provavelmente você obterá uma enorme quantidade de dados, com dezenas ou centenas de milhares de linhas. Para encontrar mais depressa o que está procurando, você pode filtrar esses registros com comandos Linux.
Como filtrar por tempo
Com o journalctl, você pode filtrar registros de acordo com critérios de tempo definidos, para buscar informações relevantes com mais eficiência.
Filtrar por inicializações de sistema
Filtrar registros por inicializações (boots) é especialmente útil para consultar eventos do sistema em um determinado momento, ou em um cenário de inicialização específico. Isso facilita o diagnóstico de problemas, pois permite restringir entradas de registro a um determinado status do sistema ou a uma determinada configuração.
-
Inicialização atual: O comando
journalctl -b
exibe todas as entradas coletadas desde o boot mais recente. -
Inicializações anteriores: Ao inserir um número após a opção
-b
, você obterá as entradas para uma inicialização anterior específica. Por exemplo,journalctl -b 1
mostra o boot imediatamente anterior. -
Todas as inicializações registradas: O comando
journalctl --list-boots
exibe uma lista contendo todos os boots disponíveis, com os respectivos IDs. Você pode usar o ID de inicialização desejado para exibir os registros de uma inicialização específica.
Em algumas distribuições Linux, boots anteriores são armazenados por padrão. Já em outras, essa função precisa ser ativada. Para ativar essa função, você pode criar um diretório onde o diário será salvo e executar o comando sudo mkdir -p /var/log/journal
.
Alternativamente, edite o arquivo de configurações do diário, com sudo nano /etc/systemd/journald.conf
. Em seguida, na seção [Journal]
, defina a opção Storage=
como persistent
, para ativar o armazenamento persistente:
. . .
[Journal]
Storage=persistent
bashFiltrar por intervalo de tempo
Talvez você precise obter entradas de registro de um certo intervalo de tempo. Para isso, o journalctl oferece as opções --since
(desde) e --until
(até), que permitem restringir entradas a períodos específicos, pelo formato YYYY-MM-DD HH:MM:SS
. Por exemplo, para exibir todas as entradas entre as 12h00 do dia 1º de janeiro de 2023 e as 12h00 do dia 2 de janeiro de 2023, insira o comando:
journalctl --since "2023-01-01 12:00:00" --until "2023-01-02 12:00:00"
bashCombinando ambos os comandos, você também consegue filtrar por períodos mais curtos:
journalctl --since 09:00 --until "1 hour ago"
bashOpcionalmente, partes do formato acima podem ser omitidas. Por exemplo, com o objetivo de exibir todas as entradas a partir de um determinado horário:
journalctl --since "2023-11-16 15:25:00"
bashO journalctl também entende valores relativos, como as palavras yesterday (ontem), today (hoje) e tomorrow (amanhã). Ou seja, para exibir as entradas do dia anterior, basta que você digite:
journalctl --since yesterday
bashComo filtrar por interesse das mensagens
A filtragem de entradas do journalctl pelo interesse das mensagens também é bastante útil, por possibilitar a busca de informações relevantes por meio de aspectos específicos dos registros do sistema. Assim, você será capaz de diagnosticar erros com eficiência, detectar problemas de segurança logo no início ou monitorar o desempenho com rapidez.
Filtrar por prioridade
Para filtrar registros conforme a importância das mensagens, você pode utilizar prioridades de entradas. Para isso, indique o nome da prioridade desejada ou o valor numérico correspondente. Quanto menor o número, mais importante é a mensagem:
- 0: emerg (emergência)
- 1: alert (alerta)
- 2: crit (crítico)
- 3: err (erro)
- 4: warning (aviso)
- 5: notice (nota)
- 6: info (informação)
- 7: debug (depuração)
Mensagens com prioridades específicas podem ser filtradas por meio da opção -p
. Por exemplo, o seguinte comando exibe somente as entradas de registro com a prioridade err (erro) ou superior:
journalctl -p err
bashFiltrar por unidade
Filtrar registros por unidade é especialmente útil se você deseja obter serviços ou processos específicos. É possível filtrá-los com a opção -u
. Para exibir, por exemplo, as entradas para o servidor web Apache, digite:
journalctl -u apache2
bashAo fazer uso de valores de tempo relativos, você será capaz de refinar ainda mais a pesquisa. Se você quiser saber se o serviço já foi executado no dia, faça uso deste comando:
journalctl -u apache2 --since today
bashO journalctl também suporta a combinação de registros de diferentes unidades. Por exemplo, se um processo Nginx está vinculado a uma unidade PHP-FPM, você pode mesclar as entradas de ambos, em ordem cronológica. O comando para isso seria:
journalctl -u nginx.service -u php-fpm.service --since today-u apache2 --since today
bashFiltrar por ID de processo, usuário ou grupo
Com o journalctl, também é possível filtrar registros por IDs de processo, usuário ou grupo. Se você souber o PID exato do processo que deseja pesquisar, por exemplo, poderá filtrá-lo com a opção _PID
. Se o PID for 8088, o comando será:
journalctl _PID=8088
bashJá com os filtros _UID
ou _GID
, você obterá todas as entradas registradas por um certo usuário ou grupo. Supondo que o seu servidor web se chame www-data, você encontraria o respectivo ID de usuário da seguinte maneira:
id -u www-data
33
bashAo tomar conhecimento do ID do usuário que deseja, você poderá filtrar as entradas do diário:
journalctl _UID=33 --since today
bashPara ver os IDs de grupo para os quais existem entradas, utilize a opção -F
. Ela exibe todos os valores salvos para o campo “Group ID”:
journalctl -F _GID
32
99
102
133
81
84
100
0
124
87
bashFiltrar pelo campo de componente
A filtragem pelo campo de componente é muito prática àqueles que desejam obter registros de aplicativos, serviços ou processos específicos. Normalmente, o campo de componente é utilizado por diversos serviços ou componentes de software para identificar informações específicas em registros. Com esse tipo de filtro, você pode restringir entradas a um determinado componente, aplicativo ou unidade de serviço. Por exemplo, para filtrar entradas que contenham o arquivo executável bash
, use o comando a seguir:
journalctl /usr/bin/bash
bashFiltrar mensagens do kernel
Filtrar entradas com base em mensagens do kernel, pelo journalctl, é um método eficaz de análise de informações específicas sobre a operação do próprio kernel em um sistema Linux. Mensagens do kernel podem fornecer indícios de problemas de hardware e apontar conflitos entre drivers, além de outros eventos de sistema.
Mensagens do kernel encontradas na exibição dmesg
também podem ser filtradas no diário. Para exibi-las, faça uso do sinalizador -k
:
journalctl -k
bashPor padrão, as mensagens do kernel da inicialização atual serão exibidas. Mensagens de outra inicialização podem ser filtradas por sinalizadores de seleção de inicialização já apresentados. Se, por exemplo, você quisesse ver as mensagens do kernel das últimas cinco inicializações, teria de digitar este comando:
journalctl -k -b -5
bashAlterar exibição de registros no journalctl
Ao personalizar a exibição do diário no journalctl, usuários tornam-se capazes de fazer pesquisas mais direcionadas e de extrair informações relevantes com mais agilidade. Ao exibir dados de registro de um período específico ou em tempo real, é possível, por exemplo, encontrar rapidamente erros e problemas no sistema.
Encurtar ou expandir resultados
Você pode alterar a forma como o journalctl exibe os dados recuperados, encurtando ou expandindo os resultados das pesquisas. Por padrão, o journalctl mostra a entrada completa no pager, fazendo com que as linhas ultrapassem o lado direito da tela. Para encurtar essa exibição, faça uso da opção --no-full
:
journalctl --no-full
bashTambém é possível expandir a exibição com o sinalizador -a
:
journalctl -a
bashConfigurar exibição padrão
O journalctl normalmente exibe registros por pager, como less
. Isso é vantajoso, pois possibilita a visualização e a exibição passo a passo, o que facilita a navegação por longos arquivos de registro. Contudo, pode ser que você precise ver os registros diretamente na exibição padrão. Nesse caso, basta usar a seguinte opção:
journalctl --no-pager
bashConfigurar formatos de exibição
Você pode personalizar o formato de exibição dos registros de várias formas, no journalctl. Para fazer isso, você pode inserir a opção -o
com o nome do formato desejado. Isso fará com que os registros sejam exibidos no formato JSON:
journalctl -b -u nginx -o json
{ "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635", "__REALTIME_TIMESTAMP" : "1422990364739502", "__MONOTONIC_TIMESTAMP" : "27200938", "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d", "PRIORITY" : "6", "_UID" : "0", "_GID" : "0", "_CAP_EFFECTIVE" : "3fffffffff", "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee", "_HOSTNAME" : "desktop", "SYSLOG_FACILITY" : "3", "CODE_FILE" : "src/core/unit.c", "CODE_LINE" : "1402", "CODE_FUNCTION" :
bashOs seguintes formatos são suportados pelo journalctl:
- cat: Exibe apenas o campo das mensagens.
- export: Formato binário, apropriado para ser transmitido ou salvo.
- json: Formato JSON padrão, com uma entrada por linha.
- json-pretty: JSON formatado para uma melhor legibilidade.
- json-sse: JSON formatado com quebras de linha, que permite a adição de eventos enviados pelo servidor.
- short: Exibição padrão em estilo* syslog*.
- short-iso: Exibição com carimbos de data e hora no padrão ISO-8601, em formato* wall clock*.
- short-monotonic: Formato padrão com carimbos de data e hora monotônicos.
- short-precise: Formato padrão com precisão de microssegundos.
- verbose: Exibe todos os campos do diário disponíveis para a respectiva entrada.
Monitoramento processos ativamente
No monitoramento ativo de processos com o journalctl, o utilitário de linha de comando tail
é usado para acompanhar os registros em tempo real e exibir apenas as entradas mais recentes. Isso facilita o monitoramento de eventos do sistema e a reação imediata a eventuais problemas que ocorram.
Exibir registros atuais
Você pode usar a opção -n
para obter um número definido de registros. Essa opção funciona exatamente como tail -n
. Com o seguinte comando, por padrão, são exibidas as 10 últimas entradas:
journalctl -n
bashVocê também pode personalizar o número de entradas exibidas, por exemplo, para 20:
journalctl -n 20
bashRápida e escalável, a partir de US$ 55/mês!
- Rápida
- Segura
- De última geração