Ao usar o jour­nalctl, você con­se­guirá gerenciar e analisar registros de sistema (logs) com efi­ci­ên­cia, em ambientes Linux. Essa fer­ra­menta de linha de comando oferece funções de mo­ni­to­ra­mento de ati­vi­da­des do sistema, de lo­ca­li­za­ção de erros, de acom­pa­nha­mento de registros em tempo real e de vi­su­a­li­za­ção detalhada dos dados re­gis­tra­dos. Por esses motivos, o jour­nalctl se tornou in­dis­pen­sá­vel para o di­ag­nós­tico eficaz de problemas.

O que é o jour­nalctl?

jour­nalctl é um poderoso uti­li­tá­rio para consultas e exibições de registros de eventos (log files) em sistemas Linux. Ele é um com­po­nente essencial do systemd, ge­ren­ci­a­dor de sistemas e serviços padrão de muitas dis­tri­bui­ções modernas do Linux, como do Ubuntu, Fedora e Arch Linux. O nome jour­nalctl é uma com­bi­na­ção dos termos journal (diário) e ctl (abre­vi­a­ção de control). Assim, ele faz re­fe­rên­cia à sua função de controlar e analisar registros do diário do sistema.

O jour­nalctl pos­si­bi­lita acessos ao diário do sistema, que é ge­ren­ci­ado pelo serviço systemd-journald. Esse diário é uma coleção cen­tra­li­zada de mensagens e eventos re­gis­tra­dos durante a operação do sistema Linux. Di­fe­ren­te­mente de registros con­ven­ci­o­nais, baseados em texto, o jour­nalctl possui recursos es­tru­tu­ra­dos e efi­ci­en­tes para pesquisar, filtrar e exibir dados de registro em tempo real. Isso ajuda a di­ag­nos­ti­car problemas e a monitorar o status de um sistema.

Para dis­po­ni­bi­li­zar os recursos listados, o jour­nalctl armazena arquivos de registro em formato binário, já que log files binários são mais compactos e fun­ci­o­nais do que os equi­va­len­tes baseados em texto. Mesmo ao registrar grandes volumes de dados, esse formato suporta pesquisas de eventos ou de in­for­ma­ções em arquivos de registro, com rapidez e efi­ci­ên­cia. Ainda, devido à estrutura e à crip­to­gra­fia deles, log files binários têm maior segurança que registros baseados em texto, já que a ma­ni­pu­la­ção de dados se torna bem mais difícil.

Con­fi­gu­rar espaço de ar­ma­ze­na­mento para arquivos de registro

Com o jour­nalctl, você pode definir e limitar o espaço de ar­ma­ze­na­mento que os arquivos de registro ocuparão no seu disco rígido. Para isso, altere as con­fi­gu­ra­ções do serviço systemd-journald, que podem ser en­con­tra­das no arquivo* /etc/systemd/journald.conf*. Lá estarão as seguintes entradas:

  • SystemMaxUse: Limita o espaço de ar­ma­ze­na­mento de registros no diretório do sistema.
  • RuntimeMaxUse: Limita o espaço de ar­ma­ze­na­mento de registros no diretório tem­po­rá­rio.

Para definir um limite de espaço, acres­cente as seguintes linhas ao código, ou adapte-as conforme ne­ces­sá­rio:

[Journal]
SystemMaxUse=50M
RuntimeMaxUse=50M
bash

Os valores desse exemplo (50M) podem ser alterados li­vre­mente. Você também pode utilizar outras unidades, como K (qui­loby­tes), M (megabytes), G (gigabytes) e T (terabytes). Após editar esse arquivo de con­fi­gu­ra­ções, você deverá reiniciar o systemd-journald. Somente assim as al­te­ra­ções serão aplicadas:

sudo systemctl restart systemd-journald
bash

Feito o pro­ce­di­mento, o systemd-journald estará con­fi­gu­rado para limitar o espaço de ar­ma­ze­na­mento dos log files. Cer­ti­fi­que-se de que o limite definido seja su­fi­ci­ente para armazenar todos os registros im­por­tan­tes e, ao mesmo tempo, não ocupe espaço demais no disco rígido. É im­por­tante que você saiba que os registros mais antigos serão excluídos au­to­ma­ti­ca­mente quando o limite for atingido.

Verificar uso do disco rígido

Antes de con­fi­gu­rar o espaço de ar­ma­ze­na­mento para os seus arquivos de registro, você pode verificar quanto espaço o diário do sistema está ocupando atu­al­mente. Para tanto, use o si­na­li­za­dor --disk-usage:

journalctl --disk-usage
Journals take up 8.0M on disk.
bash

Excluir arquivos de registro antigos

Se o seu diário do sistema estiver ocupando muito espaço de ar­ma­ze­na­mento, 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 pre­de­fi­nido. 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
bash

Você também pode reduzir o seu diário es­ta­be­le­cendo um limite de tempo de ar­ma­ze­na­mento. Faça isso com a opção --vacuum-time. Ela de­ter­mi­nará 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
bash

Para que serve o jour­nalctl?

Uma das ca­rac­te­rís­ti­cas mais úteis do jour­nalctl é a sua ca­pa­ci­dade de filtrar entradas de registro com base em critérios. Graças a esse recurso, você poderá buscar in­for­ma­ções re­le­van­tes de forma di­re­ci­o­nada e, assim, iden­ti­fi­car problemas mais ra­pi­da­mente. A seguir, apre­sen­ta­re­mos as opções de filtragem mais comuns do jour­nalctl.

Obter registros

Ao executar o comando journalctl, as entradas de registro para o sistema atual são exibidas em ordem cro­no­ló­gica reversa. Digite journalctl -f ou journalctl --follow para exibir as entradas em tempo real. Novas entradas são mostradas au­to­ma­ti­ca­mente, na ordem em que são re­gis­tra­das.

De­pen­dendo do tempo em que o systemd estiver operando no seu sistema, pro­va­vel­mente você obterá uma enorme quan­ti­dade de dados, com dezenas ou centenas de milhares de linhas. Para encontrar mais depressa o que está pro­cu­rando, você pode filtrar esses registros com comandos Linux.

Como filtrar por tempo

Com o jour­nalctl, você pode filtrar registros de acordo com critérios de tempo definidos, para buscar in­for­ma­ções re­le­van­tes com mais efi­ci­ên­cia.

Filtrar por ini­ci­a­li­za­ções de sistema

Filtrar registros por ini­ci­a­li­za­ções (boots) é es­pe­ci­al­mente útil para consultar eventos do sistema em um de­ter­mi­nado momento, ou em um cenário de ini­ci­a­li­za­ção es­pe­cí­fico. Isso facilita o di­ag­nós­tico de problemas, pois permite res­trin­gir entradas de registro a um de­ter­mi­nado status do sistema ou a uma de­ter­mi­nada con­fi­gu­ra­ção.

  1. Ini­ci­a­li­za­ção atual: O comando journalctl -b exibe todas as entradas coletadas desde o boot mais recente.
  2. Ini­ci­a­li­za­ções an­te­ri­o­res: Ao inserir um número após a opção -b, você obterá as entradas para uma ini­ci­a­li­za­ção anterior es­pe­cí­fica. Por exemplo, journalctl -b 1 mostra o boot ime­di­a­ta­mente anterior.
  3. Todas as ini­ci­a­li­za­ções re­gis­tra­das: O comando journalctl --list-boots exibe uma lista contendo todos os boots dis­po­ní­veis, com os res­pec­ti­vos IDs. Você pode usar o ID de ini­ci­a­li­za­ção desejado para exibir os registros de uma ini­ci­a­li­za­ção es­pe­cí­fica.

Em algumas dis­tri­bui­ções Linux, boots an­te­ri­o­res são ar­ma­ze­na­dos 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.

Al­ter­na­ti­va­mente, edite o arquivo de con­fi­gu­ra­çõ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 ar­ma­ze­na­mento per­sis­tente:

. . .
[Journal]
Storage=persistent
bash

Filtrar por intervalo de tempo

Talvez você precise obter entradas de registro de um certo intervalo de tempo. Para isso, o jour­nalctl oferece as opções --since (desde) e --until (até), que permitem res­trin­gir entradas a períodos es­pe­cí­fi­cos, 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"
bash

Com­bi­nando ambos os comandos, você também consegue filtrar por períodos mais curtos:

journalctl --since 09:00 --until "1 hour ago"
bash

Op­ci­o­nal­mente, partes do formato acima podem ser omitidas. Por exemplo, com o objetivo de exibir todas as entradas a partir de um de­ter­mi­nado horário:

journalctl --since "2023-11-16 15:25:00"
bash

O jour­nalctl 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
bash

Como filtrar por interesse das mensagens

A filtragem de entradas do jour­nalctl pelo interesse das mensagens também é bastante útil, por pos­si­bi­li­tar a busca de in­for­ma­ções re­le­van­tes por meio de aspectos es­pe­cí­fi­cos dos registros do sistema. Assim, você será capaz de di­ag­nos­ti­car erros com efi­ci­ên­cia, detectar problemas de segurança logo no início ou monitorar o de­sem­pe­nho com rapidez.

Filtrar por pri­o­ri­dade

Para filtrar registros conforme a im­por­tân­cia das mensagens, você pode utilizar pri­o­ri­da­des de entradas. Para isso, indique o nome da pri­o­ri­dade desejada ou o valor numérico cor­res­pon­dente. Quanto menor o número, mais im­por­tante é a mensagem:

  • 0: emerg (emer­gên­cia)
  • 1: alert (alerta)
  • 2: crit (crítico)
  • 3: err (erro)
  • 4: warning (aviso)
  • 5: notice (nota)
  • 6: info (in­for­ma­ção)
  • 7: debug (depuração)

Mensagens com pri­o­ri­da­des es­pe­cí­fi­cas podem ser filtradas por meio da opção -p. Por exemplo, o seguinte comando exibe somente as entradas de registro com a pri­o­ri­dade err (erro) ou superior:

journalctl -p err
bash

Filtrar por unidade

Filtrar registros por unidade é es­pe­ci­al­mente útil se você deseja obter serviços ou processos es­pe­cí­fi­cos. É possível filtrá-los com a opção -u. Para exibir, por exemplo, as entradas para o servidor web Apache, digite:

journalctl -u apache2
bash

Ao 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
bash

O jour­nalctl também suporta a com­bi­na­ção de registros de di­fe­ren­tes unidades. Por exemplo, se um processo Nginx está vinculado a uma unidade PHP-FPM, você pode mesclar as entradas de ambos, em ordem cro­no­ló­gica. O comando para isso seria:

journalctl -u nginx.service -u php-fpm.service --since today-u apache2 --since today
bash

Filtrar por ID de processo, usuário ou grupo

Com o jour­nalctl, 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
bash

Já com os filtros _UID ou _GID, você obterá todas as entradas re­gis­tra­das por um certo usuário ou grupo. Supondo que o seu servidor web se chame www-data, você en­con­tra­ria o res­pec­tivo ID de usuário da seguinte maneira:

id -u www-data
33
bash

Ao tomar co­nhe­ci­mento do ID do usuário que deseja, você poderá filtrar as entradas do diário:

journalctl _UID=33 --since today
bash

Para 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
bash

Filtrar pelo campo de com­po­nente

A filtragem pelo campo de com­po­nente é muito prática àqueles que desejam obter registros de apli­ca­ti­vos, serviços ou processos es­pe­cí­fi­cos. Nor­mal­mente, o campo de com­po­nente é utilizado por diversos serviços ou com­po­nen­tes de software para iden­ti­fi­car in­for­ma­ções es­pe­cí­fi­cas em registros. Com esse tipo de filtro, você pode res­trin­gir entradas a um de­ter­mi­nado com­po­nente, apli­ca­tivo ou unidade de serviço. Por exemplo, para filtrar entradas que contenham o arquivo exe­cu­tá­vel bash, use o comando a seguir:

journalctl /usr/bin/bash
bash

Filtrar mensagens do kernel

Filtrar entradas com base em mensagens do kernel, pelo jour­nalctl, é um método eficaz de análise de in­for­ma­ções es­pe­cí­fi­cas 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 en­con­tra­das na exibição dmesg também podem ser filtradas no diário. Para exibi-las, faça uso do si­na­li­za­dor -k:

journalctl -k
bash

Por padrão, as mensagens do kernel da ini­ci­a­li­za­ção atual serão exibidas. Mensagens de outra ini­ci­a­li­za­ção podem ser filtradas por si­na­li­za­do­res de seleção de ini­ci­a­li­za­ção já apre­sen­ta­dos. Se, por exemplo, você quisesse ver as mensagens do kernel das últimas cinco ini­ci­a­li­za­ções, teria de digitar este comando:

journalctl -k -b -5
bash

Alterar exibição de registros no jour­nalctl

Ao per­so­na­li­zar a exibição do diário no jour­nalctl, usuários tornam-se capazes de fazer pesquisas mais di­re­ci­o­na­das e de extrair in­for­ma­ções re­le­van­tes com mais agilidade. Ao exibir dados de registro de um período es­pe­cí­fico ou em tempo real, é possível, por exemplo, encontrar ra­pi­da­mente erros e problemas no sistema.

Encurtar ou expandir re­sul­ta­dos

Você pode alterar a forma como o jour­nalctl exibe os dados re­cu­pe­ra­dos, en­cur­tando ou ex­pan­dindo os re­sul­ta­dos das pesquisas. Por padrão, o jour­nalctl mostra a entrada completa no pager, fazendo com que as linhas ul­tra­pas­sem o lado direito da tela. Para encurtar essa exibição, faça uso da opção --no-full:

journalctl --no-full
bash

Também é possível expandir a exibição com o si­na­li­za­dor -a:

journalctl -a
bash

Con­fi­gu­rar exibição padrão

O jour­nalctl nor­mal­mente exibe registros por pager, como less. Isso é vantajoso, pois pos­si­bi­lita a vi­su­a­li­za­çã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 di­re­ta­mente na exibição padrão. Nesse caso, basta usar a seguinte opção:

journalctl --no-pager
bash

Con­fi­gu­rar formatos de exibição

Você pode per­so­na­li­zar o formato de exibição dos registros de várias formas, no jour­nalctl. 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" :
bash

Os seguintes formatos são su­por­ta­dos pelo jour­nalctl:

  • cat: Exibe apenas o campo das mensagens.
  • export: Formato binário, apro­pri­ado para ser trans­mi­tido ou salvo.
  • json: Formato JSON padrão, com uma entrada por linha.
  • json-pretty: JSON formatado para uma melhor le­gi­bi­li­dade.
  • 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 mo­notô­ni­cos.
  • short-precise: Formato padrão com precisão de mi­cros­se­gun­dos.
  • verbose: Exibe todos os campos do diário dis­po­ní­veis para a res­pec­tiva entrada.

Mo­ni­to­ra­mento processos ati­va­mente

No mo­ni­to­ra­mento ativo de processos com o jour­nalctl, o uti­li­tá­rio de linha de comando tail é usado para acom­pa­nhar os registros em tempo real e exibir apenas as entradas mais recentes. Isso facilita o mo­ni­to­ra­mento 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 exa­ta­mente como tail -n. Com o seguinte comando, por padrão, são exibidas as 10 últimas entradas:

journalctl -n
bash

Você também pode per­so­na­li­zar o número de entradas exibidas, por exemplo, para 20:

journalctl -n 20
bash
Ir para o menu principal