Pesquisa de site

Gerenciar mensagens de log no Systemd usando Journalctl [Guia abrangente]


Systemd é um gerenciador de sistemas e serviços de última geração para sistemas Linux: um substituto do daemon init destinado a iniciar processos em paralelo na inicialização do sistema. Agora é suportado em várias distribuições convencionais atuais, incluindo Fedora, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS, etc.

Anteriormente, explicamos a história por trás de ‘init’ e ‘systemd’; onde discutimos o que são os dois daemons, por que ‘init’ tecnicamente precisava ser substituído por ‘systemd’, bem como os principais recursos do systemd.

Uma das principais vantagens do systemd sobre outros sistemas init comuns é o suporte para gerenciamento centralizado de registro de sistemas e processos usando um diário. Neste artigo, aprenderemos como gerenciar e visualizar mensagens de log no systemd usando o comando journalctl no Linux.

Importante: Antes de prosseguir neste guia, você pode aprender como gerenciar serviços e unidades 'Systemd' usando o comando 'Systemctl' e também criar e executar novos unidades de serviço no systemd usando scripts shell no Linux. No entanto, se você concordar com tudo isso, continue lendo.

Configurando o Journald para coletar mensagens de log no Systemd

journald é um daemon que coleta e escreve entradas de diário de todo o sistema; estas são essencialmente mensagens de inicialização, mensagens do kernel e do syslog ou vários aplicativos e armazenam todas as mensagens em um local central – arquivo de diário.

Você pode controlar o comportamento do journald através de seu arquivo de configuração padrão: /etc/systemd/journald.conf que é gerado em tempo de compilação. Este arquivo contém opções cujos valores você pode alterar para atender aos requisitos do seu ambiente local.

Abaixo está um exemplo da aparência do arquivo, visualizado usando o comando cat.

cat /etc/systemd/journald.conf 
See journald.conf(5) for details.

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg

Observe que várias instalações de pacotes e extrações de configuração de uso em /usr/lib/systemd/*.conf.d/ e configurações de tempo de execução podem ser encontradas em /run/systemd/journald.conf. d/*.conf que você pode não necessariamente usar.

Habilitar armazenamento de dados de diário em disco

Várias distribuições Linux, incluindo Ubuntu e seus derivados, como Linux Mint, não permitem o armazenamento persistente de mensagens de inicialização em disco por padrão.

É possível habilitar isso definindo a opção “Armazenamento” como “persistente” conforme mostrado abaixo. Isto criará o diretório /var/log/journal e todos os arquivos de diário serão armazenados nele.

sudo vi /etc/systemd/journald.conf 
OR
sudo nano /etc/systemd/journald.conf 
[Journal]
Storage=persistent

Para configurações adicionais, encontre o significado de todas as opções que devem ser configuradas na seção “[Diário]” digitando.

man journald.conf

Configurando a hora correta do sistema usando o comando Timedatectl

Para um gerenciamento de log confiável no systemd usando o serviço journald, certifique-se de que as configurações de hora, incluindo o fuso horário, estejam corretas no sistema.

Para visualizar as configurações atuais de data e hora em seu sistema, digite.

timedatectl 
OR
timedatectl status

Local time: Thu 2017-06-15 13:29:09 EAT
Universal time: Thu 2017-06-15 10:29:09 UTC
RTC time: Thu 2017-06-15 10:29:09
Time zone: Africa/Kampala (EAT, +0300)
Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

Para definir o fuso horário correto e possivelmente a hora do sistema, use os comandos abaixo.

sudo timedatectl set-timezone  Africa/Kampala
sudo timedatectl set-time “13:50:00”

Visualizando mensagens de log usando o comando Journalctl

journalctl é um utilitário usado para visualizar o conteúdo do diário do systemd (que é escrito pelo serviço journald).

Para mostrar todos os logs coletados sem qualquer filtragem, digite.

journalctl
-- Logs begin at Wed 2017-06-14 21:56:43 EAT, end at Thu 2017-06-15 12:28:19 EAT
Jun 14 21:56:43 tecmint systemd-journald[336]: Runtime journal (/run/log/journal
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuset
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpu
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuacct
Jun 14 21:56:43 tecmint kernel: Linux version 4.4.0-21-generic (buildd@lgw01-21)
Jun 14 21:56:43 tecmint kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-
Jun 14 21:56:43 tecmint kernel: KERNEL supported cpus:
Jun 14 21:56:43 tecmint kernel:   Intel GenuineIntel
Jun 14 21:56:43 tecmint kernel:   AMD AuthenticAMD
Jun 14 21:56:43 tecmint kernel:   Centaur CentaurHauls
Jun 14 21:56:43 tecmint kernel: x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x01: 'x87 flo
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x02: 'SSE reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x04: 'AVX reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Enabled xstate features 0x7, context si
Jun 14 21:56:43 tecmint kernel: x86/fpu: Using 'eager' FPU context switches.
Jun 14 21:56:43 tecmint kernel: e820: BIOS-provided physical RAM map:
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000000000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000090000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001ff
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020000000-0x00000000201
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020200000-0x00000000400

Ver mensagens de log com base em botas

Você pode exibir uma lista de números de inicialização (relativos à inicialização atual), seus IDs e os carimbos de data e hora da primeira e da última mensagem correspondente à inicialização com a opção --list-boots.

journalctl --list-boots

-1 9fb590b48e1242f58c2579defdbbddc9 Thu 2017-06-15 16:43:36 EAT—Thu 2017-06-15 1
 0 464ae35c6e264a4ca087949936be434a Thu 2017-06-15 16:47:36 EAT—Thu 2017-06-15 1 

Para visualizar as entradas do diário da inicialização atual (número 0), use a opção -b como esta (igual ao exemplo de saída acima).

journalctl -b

e para ver um diário da inicialização anterior, use o ponteiro relativo -1 com a opção -b conforme abaixo.

journalctl -b -1

Alternativamente, use o ID de inicialização como este.

journalctl -b 9fb590b48e1242f58c2579defdbbddc9

Filtrando mensagens de log com base no horário

Para usar a hora no formato Tempo Universal Coordenado (UTC), adicione as opções --utc conforme a seguir.

journalctl --utc

Para ver todas as entradas desde uma data e hora específicas, por ex. 15 de junho de 2017 às 8h15, digite este comando.

journalctl --since "2017-06-15 08:15:00"
journalctl --since today
journalctl --since yesterday

Visualizando mensagens de registro recentes

Para visualizar mensagens de log recentes (10 por padrão), use o sinalizador -n conforme mostrado abaixo.

journalctl -n
journalctl -n 20 

Visualizando mensagens de log geradas pelo kernel

Para ver apenas mensagens do kernel, semelhante à saída do comando dmesg, você pode usar o sinalizador -k.

journalctl -k 
journalctl -k -b 
journalctl -k -b 9fb590b48e1242f58c2579defdbbddc9

Visualizando mensagens de log geradas por unidades

Para poder visualizar todos os lançamentos contábeis manuais de uma unidade específica, use a opção -u conforme a seguir.

journalctl -u apache2.service

Para zerar até a inicialização atual, digite este comando.

journalctl -b -u apache2.service

Para mostrar logs da inicialização anterior, use isto.

journalctl -b -1 -u apache2.service

Abaixo estão alguns outros comandos úteis:

journalctl -u apache2.service  
journalctl -u apache2.service --since today
journalctl -u apache2.service -u nagios.service --since yesterday

Visualizando mensagens de log geradas por processos

Para visualizar os logs gerados por um processo específico, especifique seu PID assim.

journalctl _PID=19487
journalctl _PID=19487 --since today
journalctl _PID=19487 --since yesterday

Visualizando mensagens de log geradas por ID de usuário ou grupo

Para visualizar logs gerados por um usuário ou grupo específico, especifique seu ID de usuário ou grupo desta forma.

journalctl _UID=1000
journalctl _UID=1000 --since today
journalctl _UID=1000 -b -1 --since today

Visualizando logs gerados por um arquivo

Para mostrar todos os logs gerados por um arquivo (possivelmente um executável), como o executável D-Bus ou executáveis bash, basta digitar.

journalctl /usr/bin/dbus-daemon
journalctl /usr/bin/bash

Visualizando mensagens de log por prioridade

Você também pode filtrar a saída com base nas prioridades das mensagens ou intervalos de prioridade usando o sinalizador -p. Os valores possíveis são: 0 – emergente, 1 – alerta, 2 – crítico, 3 – errar, 4 – aviso, 5 – aviso, 6 – informação, 7 – depuração):

journalctl -p err

Para especificar um intervalo, use o formato abaixo (emergir para aviso).

journalctl -p 1..4
OR
journalctl -p emerg..warning

Visualize mensagens de registro em tempo real

Você pode praticamente observar os logs enquanto eles são gravados com a opção -f (semelhante à funcionalidade tail -f).

journalctl -f

Tratamento da formatação de exibição do diário

Se você deseja controlar a formatação de saída dos lançamentos contábeis manuais, adicione o sinalizador -o e use estas opções: cat, export, json, json-pretty, json-sse, short, short-iso, curto-monotônico, curto-preciso e detalhado (verifique o significado das opções na página de manual:

A opção cat mostra a mensagem real de cada entrada de diário sem quaisquer metadados (carimbo de data e hora e assim por diante).

journalctl -b -u apache2.service -o cat

Gerenciando diários em um sistema

Para verificar a consistência interna do arquivo de diário, use a opção --verify. Se tudo estiver bem, a saída deverá indicar PASS.

journalctl --verify

PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal                               
491f68: Unused data (entry_offset==0)                                                                
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000003184-000551f9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000001fc8-000551f5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000d4f-000551f1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000001-000551f01cfcedff.journal

Excluindo Arquivos Antigos do Diário

Você também pode exibir o uso atual do disco de todos os arquivos de diário com as opções --disk-usage. Mostra a soma do uso do disco de todos os arquivos de diário arquivados e ativos:

journalctl --disk-usage

Para excluir arquivos de diário antigos (arquivados), execute os comandos abaixo:

sudo journalctl --vacuum-size=50M  #delete files until the disk space they use falls below the specified size
sudo journalctl --vacuum-time=1years	#delete files so that all journal files contain no data older than the specified timespan
sudo journalctl --vacuum-files=4     #delete files so that no more than the specified number of separate journal files remain in storage location

Arquivos de diário rotativos

Por último, mas não menos importante, você pode instruir o journald a girar os arquivos do diário com a opção --rotate. Observe que esta diretiva não retorna até que a operação de rotação seja concluída:

sudo journalctl --rotate

Para obter um guia de uso detalhado e opções, consulte a página de manual do journalctl como segue.

man journalctl

Confira alguns artigos úteis.

  1. Gerenciando processos e serviços de inicialização do sistema (SysVinit, Systemd e Upstart)
  2. Petiti – Uma ferramenta de análise de log de código aberto para SysAdmins Linux
  3. Como configurar e gerenciar a rotação de log usando Logrotate no Linux
  4. lnav – Observe e analise logs do Apache em um terminal Linux

É isso por enquanto. Use o feedback abaixo para fazer perguntas ou adicionar sua opinião sobre este tópico.