O que é o journalctl e para que serve?
journalctl permite gerir e analisar os registos do sistema no Linux. A ferramenta oferece funcionalidades de monitorização das atividades do sistema, resolução de problemas ou acompanhamento de registos em tempo real, bem como uma visão detalhada dos dados de registo. Além disso, journalctl é indispensável na hora de diagnosticar problemas do sistema.
O que é o journalctl?
journalctl é uma ferramenta eficiente para consultar e visualizar registos de eventos ou ficheiros de log no Linux. journalctl constitui-se como um componente essencial do systemd, o gestor de sistemas e serviços que muitas distribuições modernas de Linux, como o Ubuntu, o Fedora e o Arch Linux, utilizam por predefinição. O nome «journalctl» é composto por «journal» (registo) e «ctl» (controlo), termos que fazem referência à sua função de ferramenta de controlo e análise de registos.
journalctl permite o acesso ao registo do sistema, gerido pelo systemd-journald. O registo do sistema é uma coleção centralizada de mensagens e eventos que ocorrem enquanto o sistema Linux está em funcionamento. Ao contrário dos registos tradicionais baseados em texto, journalctl oferece uma forma estruturada e eficiente de pesquisar, filtrar e apresentar dados de registo em tempo real. Graças a isso, é possível diagnosticar problemas ou monitorizar o estado do sistema.
journalctl armazena os ficheiros de registo em formato binário, uma vez que este tipo de ficheiro é mais compacto e eficiente do que o seu equivalente em texto. Isto permite, apesar da grande quantidade de dados registados, pesquisas rápidas de eventos específicos ou de informações. Além disso, a estrutura e a encriptação deste tipo de ficheiros oferecem maior segurança, pois dificultam a manipulação dos dados de registo.
Personalizar o espaço de armazenamento dos ficheiros de registo
journalctl pode ser utilizado para limitar e configurar o espaço ocupado pelos ficheiros de registo no disco rígido. Para efetuar essa configuração, é necessário utilizar as definições do serviço systemd-journald. As definições de configuração são guardadas em /etc/systemd/journald.conf, um ficheiro no qual é possível ver as seguintes entradas:
SystemMaxUse: limita o espaço de armazenamento para registos no diretório do sistema.RuntimeMaxUse: limita o espaço de armazenamento para registos no diretório temporário.
Para definir o limite de espaço de armazenamento, pode incluir as seguintes linhas, que pode ir modificando conforme necessário:
[Journal]
SystemMaxUse=50M
RuntimeMaxUse=50MbashOs valores deste exemplo (50M) podem ser alterados conforme necessário. Também é possível alterar as unidades: K (kilobytes), M (megabytes), G (gigabytes) ou T (terabytes). Após editar o ficheiro de configuração, é necessário reiniciar o systemd-journald para que as alterações entrem em vigor:
sudo systemctl restart systemd-journaldbashAo seguir os passos anteriores, terá configurado o systemd-journald para limitar o espaço de armazenamento dos ficheiros de registo. Certifique-se de que o limite definido é suficiente para armazenar os dados de registo necessários, sem que isso ocupe demasiado espaço no disco rígido. Tenha em conta que os registos mais antigos são apagados automaticamente quando se atinge o limite definido.
Determinar a utilização do disco rígido
Antes de configurar o espaço de armazenamento para os ficheiros de registo, pode verificar primeiro quanto espaço de armazenamento o «journal» ocupa atualmente. Para tal, deve utilizar o argumento --disk-usage:
journalctl --disk-usage
Journals take up 8.0M on disk.bashApagar entradas antigas do registo
Se o Journal ocupar demasiado espaço no disco, pode eliminar as entradas antigas do registo. Para tal, existem duas formas de proceder:
Com --vacuum-size, pode reduzir o tamanho do Journal especificando um tamanho. Neste caso, todas as entradas antigas são eliminadas até que o Journal atinja o tamanho desejado.
sudo journalctl --vacuum-tamaño=1GbashEm alternativa, é possível reduzir o tamanho do Journal especificando um período de armazenamento de ficheiros com a opção --vacuum-time. Todas as entradas anteriores ao período especificado serão eliminadas. Se pretender conservar as entradas do Journal do último ano, por exemplo, pode introduzir:
sudo journalctl --vacuum-time=1yearsbashPara que serve o journalctl?
Uma das funcionalidades mais importantes do journalctl é a filtragem de entradas do registo de acordo com vários critérios. Graças a ela, é possível procurar informações específicas e identificar problemas mais rapidamente. A seguir, apresentamos algumas das opções de filtragem mais comuns do journalctl.
Mostrar registos
Com o comando journalctl, são apresentadas as entradas do registo do sistema atual por ordem cronológica inversa. Se introduzir journalctl -f ou journalctl --follow, poderá ver as entradas em tempo real. As novas entradas são apresentadas automaticamente pela ordem em que chegam.
A quantidade de dados apresentada pode ser difícil de gerir (desde dezenas a centenas de linhas), embora isso dependa do tempo que o systemd já está a ser executado no seu sistema. Para encontrar o que procura de forma eficiente, pode filtrar ainda mais os registos utilizando outros comandos do Linux.
Filtrar por data
O journalctl pode ser utilizado para filtrar os registos de um período de tempo específico, o que permite obter as informações relevantes de forma mais eficiente.
Filtrar por sequências de arranque
Filtrar os registos por processos de arranque é especialmente útil se se pretender verificar eventos específicos do sistema num determinado momento ou durante um cenário de arranque específico. Isto facilita o diagnóstico de problemas, uma vez que as entradas de registo podem ser limitadas a um estado específico do sistema ou a uma configuração do sistema.
- Arranque atual: utilize
journalctl -bpara apresentar todas as entradas de registo recolhidas desde o último arranque. - Arranques anteriores: utilize a opção
-bseguida de um número para mostrar as entradas de registo correspondentes a um arranque específico anterior. Por exemplo, se introduzirjournalctl -b 1, será apresentado o arranque imediatamente anterior. - Lista de todas as sequências de arranque disponíveis: o comando
journalctl --list-bootsapresenta uma lista dos processos de arranque disponíveis com as respetivas identificações (ID). Pode utilizar um ID específico para aceder aos registos associados a um processo de arranque concreto.
Enquanto em algumas distribuições Linux o armazenamento de processos de arranque anteriores está ativado por predefinição, noutras tem de ser ativado manualmente. Para tal, com o comando sudo mkdir -p /var/log/journal, pode criar um diretório onde os registos serão armazenados.
Em alternativa, pode editar o ficheiro de configuração do Journal com o parâmetro sudo nano /etc/systemd/journald.conf. Em seguida, defina o parâmetro Storage= como persistent para ativar o registo persistente:
. . .
[Journal]
Storage=persistentbashFiltrar por intervalos de tempo
Por vezes, pode ser necessário apresentar as entradas de registo de um período de tempo específico. journalctl oferece as opções --since e --until, que podem ser utilizadas para restringir as entradas a um período de tempo concreto. Para tal, aplica-se o formato de data e hora YYYY-MM-DD HH:MM:SS. O comando para, por exemplo, apresentar todas as entradas de registo entre 1 de janeiro de 2023 às 12:00 e 2 de janeiro de 2023 às 12:00, teria o seguinte aspeto:
journalctl --since "2023-01-01 12:00:00" --until "2023-01-02 12:00:00"bashA combinação dos dois comandos também pode ser usada para filtrar um período de tempo mais curto:
journalctl --since 09:00 --until "1 hour ago"bashEm alternativa, é possível omitir partes do formato anterior. Por exemplo, é possível aceder a todas as entradas a partir de um determinado momento:
journalctl --since "2023-11-16 15:25:00"bashjournalctl também pode ser usado com valores relativos, como yesterday (ontem), today (hoje) ou tomorrow (amanhã). Para visualizar os registos de ontem, pode introduzir o seguinte:
journalctl --since yesterdaybashFiltrar por tema das mensagens
A capacidade de filtrar as entradas do registo por assunto com journalctl é também extremamente útil, uma vez que permite procurar informações relevantes e concentrar-se em aspetos específicos dos registos do sistema. Desta forma, é possível, entre outras coisas, realizar um diagnóstico eficiente de erros, detetar problemas numa fase inicial e monitorizar o desempenho rapidamente.
Filtrar por prioridade
Para filtrar os registos com journalctl de acordo com os teus interesses específicos nas mensagens, podes utilizar os níveis de gravidade das mensagens. Para tal, podes utilizar o nome do nível em questão ou o seu valor numérico correspondente. Quanto menor for o número, mais importante é a mensagem:
- 0: emerg (emergência)
- 1: alert (alarme)
- 2: crit (crítico)
- 3: err (erro)
- 4: warning (aviso)
- 5: notice (nota)
- 6: info (informação)
- 7: debug (depuração)
Para filtrar as mensagens com base num determinado nível de gravidade, pode utilizar a opção -p. O comando seguinte, por exemplo, mostra apenas as entradas de registo com prioridade «err» (erro) ou superior:
journalctl -p errbashFiltrar por unidade
Filtrar os registos por unidade com journalctl é especialmente útil se pretender concentrar-se em serviços ou processos específicos. Para tal, utilize a opção -u. Por exemplo, para apresentar os registos do servidor web Apache, pode introduzir o seguinte:
journalctl -u apache2bashA pesquisa pode ser ainda mais refinada utilizando valores de tempo relativo. Se, por exemplo, quiser saber se algum serviço foi executado hoje, pode introduzir o seguinte:
journalctl -u apache2 --since todaybashCom journalctl, também é possível combinar registos de dados de diferentes unidades. Se o seu processo Nginx estiver ligado a uma unidade PHP-FPM, por exemplo, é possível combinar as entradas de ambos por ordem cronológica. O comando segue a sintaxe apresentada:
journalctl -u nginx.service -u php-fpm.service --since today-u apache2 --since todaybashFiltrar por ID do processo, utilizador ou grupo
journalctl também pode ser utilizado para filtrar entradas do registo por ID do processo, utilizador ou grupo. Se souber o ID do processo (PID) que pretende procurar, pode filtrar as informações desejadas utilizando a opção _PID. Por exemplo, se o PID for 8088, o comando teria a sintaxe apresentada:
journalctl _PID=8088bashSe desejar, também pode filtrar por _UID ou _GID para aceder às entradas que foram registadas por um utilizador ou grupo específico. Para saber o seu nome de utilizador, pode utilizar o comando id -u www-data, que, neste caso, apresenta o resultado 33.
id -u www-data
33bashA seguir, podes filtrar por _UID, já que sabes o ID do utilizador:
journalctl _UID=33 --since todaybashPara ver para que ID de grupo (GID) foram criadas entradas, pode utilizar a opção -F, que mostra todos os valores guardados para o campo «ID de grupo»:
journalctl -F _GID
32
99
102
133
81
84
100
0
124
87bashFiltrar por campo do componente
Filtrar pelo campo «componente» é extremamente útil para se concentrar em aplicações, serviços ou processos específicos. O campo «componente» é normalmente utilizado por diferentes serviços ou componentes de software para identificar informações específicas nos registos. Este tipo de filtragem permite limitar as entradas do registo a um componente, aplicação ou unidade de serviço específicos. Por exemplo, para filtrar as entradas que contêm o ficheiro executável bash, deve introduzir o seguinte comando:
journalctl /usr/bin/bashbashMostrar mensagens do kernel
Filtrar entradas do registo por mensagens do kernel com journalctl é uma forma eficaz de analisar informações específicas sobre o funcionamento do kernel num sistema Linux. As mensagens do kernel podem fornecer indícios sobre problemas de hardware, conflitos de controladores ou outros eventos do sistema.
As mensagens do kernel encontradas na dmesg também podem ser filtradas a partir do journal. Podem ser exibidas com as opções -k ou --dmesg:
journalctl -kbashAs mensagens do kernel do processo de arranque atual são as que são apresentadas por predefinição. As mensagens de um processo de arranque alternativo podem ser filtradas através das opções de seleção de arranque já conhecidas. Por exemplo, se pretender ver as mensagens do kernel dos últimos cinco processos de arranque, introduza o seguinte:
journalctl -k -b -5bashAlterar a visualização do Journal no journalctl
Personalizar a visualização no journalctl permite aos utilizadores pesquisar os registos de forma mais específica e, assim, encontrar a informação pretendida com maior rapidez. Com a visualização dos dados de registo em tempo real ou relativos a um período específico, é possível identificar rapidamente erros e problemas no sistema.
Reduzir ou ampliar a saída
Além disso, é possível personalizar a forma como journalctl apresenta os dados. A saída pode ser encurtada ou alargada. Por predefinição, journalctl apresenta a entrada completa no pager e mostra o maior número possível de entradas na parte direita do ecrã. Isto pode ser encurtado com a opção --no-full:
journalctl --no-fullbashPodes ampliar a visualização utilizando a opção -a:
journalctl -abashConfigurar o journalctl para a saída padrão
No journalctl, a saída do registo é apresentada por predefinição através de um visualizador, por exemplo, less. Isto permite visualizar a saída passo a passo, o que facilita a navegação em ficheiros de registo mais extensos. Por vezes, no entanto, pode ser necessário apresentar os registos diretamente na saída padrão. Para tal, deve escrever o seguinte:
journalctl --no-pagerbashConfigurar formatos de saída
Existem várias opções disponíveis para personalizar o formato de saída dos registos no journalctl. Para efetuar esta configuração, pode utilizar a opção -o com o identificador de formato correspondente. Por exemplo, para que as entradas do registo sejam apresentadas em 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 formatos que podem ser especificados no journalctl são:
- cat: mostra apenas o corpo da mensagem.
- export: este formato binário é adequado para transferir ou guardar dados.
- json: utiliza o formato JSON padrão com uma entrada por linha.
- json-pretty: JSON formatado para melhor legibilidade.
- json-sse: saída no formato JSON encapsulado que permite adicionar eventos enviados pelo servidor.
- short: saída padrão no estilo syslog.
- short-iso: formato padrão para apresentar marcas de tempo ISO-8601.
- short-monotonic: formato padrão com marcas de tempo monótonas.
- short-precise: formato padrão com precisão de microssegundos.
- verbose: exibe todos os campos do journal disponíveis para a entrada correspondente.
Monitorizar processos ativos
Ao monitorizar processos com journalctl, utiliza-se o programa de linha de comandos tail para acompanhar os registos em tempo real e aceder às entradas mais recentes. Desta forma, é mais fácil acompanhar os eventos do sistema em tempo real e, consequentemente, reagir rapidamente a qualquer problema que surja.
Mostrar registos atuais
A opção -n permite aceder a um número específico de registos de dados. Esta opção funciona exatamente da mesma forma que tail -n. Com o comando seguinte, são apresentados, por predefinição, os últimos 10 registos:
journalctl -nbashO número de registos apresentados pode ser definido em cada caso. Com o comando seguinte, é possível consultar, por exemplo, 20:
journalctl -n 20bash