108.2 Lição 2
Certificação: |
LPIC-1 |
---|---|
Versão: |
5.0 |
Tópico: |
108 Serviços essenciais do sistema |
Objetivo: |
108.2 Registro de eventos do sistema |
Lição: |
2 de 2 |
Introdução
Com a adoção geral do systemd
por todas as principais distribuições, o daemon de diário (systemd-journald
) tornou-se o serviço de log padrão. Nesta lição, discutiremos como ele opera e como usá-lo para uma série de aplicações: consultá-lo, filtrar suas informações segundo diferentes critérios, configurar seu armazenamento e tamanho, excluir dados antigos, recuperar seus dados de um sistema de resgate ou cópia do sistema de arquivos e — por último mas não menos importante — entender sua interação com o rsyslogd
.
Fundamentos do systemd
Introduzido no Fedora, o systemd
substituiu progressivamente o SysV Init como o principal gerenciador de sistema e serviços na maioria das grandes distribuições Linux. Dentre seus pontos fortes estão os seguintes:
-
Facilidade de configuração: arquivos de unidade em vez de scripts SysV Init.
-
Gerenciamento versátil: além de daemons e processos, ele também gerencia dispositivos, sockets e pontos de montagem.
-
Compatibilidade reversa com SysV Init e Upstart.
-
Carregamento paralelo durante a inicialização: os serviços são carregados em paralelo, ao contrário do Sysv Init, que os carrega sequencialmente.
-
Possui um serviço de registro denominado diário (journal) que apresenta as seguintes vantagens:
-
Centraliza todos os logs em um só lugar.
-
Não requer rotação de logs.
-
Os logs podem ser desabilitados, carregados na RAM ou tornados persistentes.
-
Unidades e destinos
O systemd
funciona com unidades. Uma unidade é um recurso que o systemd
é capaz de gerenciar (p. ex. rede, bluetooth, etc.). As unidades, por sua vez, são governadas por arquivos de unidade. Trata-se de arquivos de texto simples que residem em /lib/systemd/system
e incluem as definições de configuração — na forma de sessões e diretivas — para o gerenciamento de um recurso em particular. Existem diversos tipos de unidade: service
, mount
, automount
, swap
, timer
, device
, socket
, path
, timer
, snapshot
, slice
, scope
e target
. Assim, o nome de arquivo de cada unidade segue o padrão <nome_do_recurso>.<tipo_de_unidade>
(p. ex. reboot.service
).
Um destino é um tipo especial de unidade que se assemelha aos níveis de execução clássicos do SysV Init. Isso ocorre porque uma unidade de destino reúne vários recursos que representam um estado particular do sistema (por exemplo, graphical.target
é semelhante a runlevel 5
, etc.). Para verificar o destino atual de seu sistema, use o comando systemctl get-default
:
carol@debian:~$ systemctl get-default graphical.target
Por outro lado, os destinos e os níveis de execução diferem porque os primeiros são mutuamente inclusivos, enquanto os últimos não. Assim, um destino pode trazer outros destinos — o que não é possível com os níveis de execução.
Note
|
Esta lição não explicará o funcionamento das unidades do |
O diário do sistema: systemd-journald
systemd-journald
é o serviço do sistema que se encarrega de receber as informações de log de uma variedade de fontes: mensagens do kernel, mensagens do sistema simples e estruturadas, saída padrão e erro padrão dos serviços, bem como registros de auditoria do subsistema de auditoria do kernel (para saber mais, consulte a página de manual de systemd-journald
). Sua missão é criar e manter um diário estruturado e indexado.
Seu arquivo de configuração é /etc/systemd/journald.conf
e — como no caso de qualquer outro serviço — usamos o comando systemctl
para iniciá-lo, reiniciá-lo, interrompê-lo ou — simplesmente — conferir seu status:
root@debian:~# systemctl status systemd-journald systemd-journald.service - Journal Service Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled) Active: active (running) since Sat 2019-10-12 13:43:06 CEST; 5min ago Docs: man:systemd-journald.service(8) man:journald.conf(5) Main PID: 178 (systemd-journal) Status: "Processing requests..." Tasks: 1 (limit: 4915) CGroup: /system.slice/systemd-journald.service └─178 /lib/systemd/systemd-journald (...)
Arquivos de configuração do tipo journal.conf.d/*.conf
— que podem incluir configurações específicas ao pacote — também são possíveis (consulte a página de manual de journald.conf
para saber mais).
Quando habilitado, o diário pode ser armazenado persistentemente no disco ou de maneira volátil em um sistema de arquivos baseado na RAM. O diário não é um arquivo de texto simples, mas sim binário. Portanto, não é possível usar ferramentas de análise de texto, como less
ou more
, para ler seu conteúdo; o comando journalctl
é usado em seu lugar.
Consultando o conteúdo do diário
journalctl
é o utilitário usado para consultar o diário do systemd
. É preciso ser root ou usar sudo
para invocá-lo. Se consultado sem opções, ele imprimirá todo o diário em ordem cronológica (com as entradas mais antigas listadas primeiro):
root@debian:~# journalctl -- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:19:46 CEST. -- Oct 12 13:43:06 debian kernel: Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (...) Oct 12 13:43:06 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=b6be6117-5226-4a8a-bade-2db35ccf4cf4 ro qu (...)
Para fazer consultas mais específicas, há uma série de opções:
-r
-
As mensagens do diário serão exibidas em ordem inversa:
root@debian:~# journalctl -r -- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:30:30 CEST. -- Oct 12 14:30:30 debian sudo[1356]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 14:30:30 debian sudo[1356]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -r Oct 12 14:19:53 debian sudo[1348]: pam_unix(sudo:session): session closed for user root (...)
-f
-
Imprime as mensagens mais recentes do diário e continua a imprimir as novas mensagens conforme são anexadas ao diário — semelhante a
tail -f
:root@debian:~# journalctl -f -- Logs begin at Sat 2019-10-12 13:43:06 CEST. -- (...) Oct 12 14:44:42 debian sudo[1356]: pam_unix(sudo:session): session closed for user root Oct 12 14:44:44 debian sudo[1375]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -f Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by carol(uid=0) (...)
-e
-
Salta para o final do diário, deixando as entradas mais recentes visíveis no paginador:
root@debian:~# journalctl -e (...) Oct 12 14:44:44 debian sudo[1375]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -f Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 14:45:57 debian sudo[1375]: pam_unix(sudo:session): session closed for user root Oct 12 14:48:39 debian sudo[1378]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -e Oct 12 14:48:39 debian sudo[1378]: pam_unix(sudo:session): session opened for user root by carol(uid=0)
-n <value>, --lines=<value>
-
Imprime as linhas mais recentes de value (se não for especificado um
<value>
, o padrão é 10):root@debian:~# journalctl -n 5 (...) Oct 12 14:44:44 debian sudo[1375]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -f Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 14:45:57 debian sudo[1375]: pam_unix(sudo:session): session closed for user root Oct 12 14:48:39 debian sudo[1378]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -e Oct 12 14:48:39 debian sudo[1378]: pam_unix(sudo:session): session opened for user root by carol(uid=0)
-k
,--dmesg
-
Equivale a usar o comando
dmesg
:root@debian:~# journalctl -k -- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:53:20 CEST. -- Oct 12 13:43:06 debian kernel: Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18 Oct 12 13:43:06 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=b6be6117-5226-4a8a-bade-2db35ccf4cf4 ro qu Oct 12 13:43:06 debian kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' Oct 12 13:43:06 debian kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' (...)
Navegando e pesquisando no diário
Para navegar pela saída do diário, usamos:
-
Teclas PageUp, PageDown e as setinhas para nos mover para cima, para baixo, a direita e a esquerda.
-
> para ir ao final da saída.
-
< para ir ao início da saída.
Você pode pesquisar strings para a frente e para trás a partir de sua posição atual:
-
Busca para a frente: Pressione / e insira a string a pesquisar, depois dê Enter.
-
Busca para trás: Pressione ? e insira a string a pesquisar, depois dê Enter.
Para navegar pelas correspondências nas pesquisas, use N para ir para a próxima ocorrência e Shift+N para ir para a anterior.
Filtrando os dados do diário
O diário permite filtrar os dados de log segundo diferentes critérios:
- Número de inicialização
-
--list-boots
-
Lista todas as inicializações disponíveis. A saída consiste em três colunas; a primeira especifica o número do boot (
0
refere-se ao boot atual,-1
ao anterior,-2
ao anterior ao anterior e assim por diante); a segunda coluna é o ID de inicialização; a terceira mostra as marcas temporais (timestamps):root@debian:~# journalctl --list-boots 0 83df3e8653474ea5aed19b41cdb45b78 Sat 2019-10-12 18:55:41 CEST—Sat 2019-10-12 19:02:24 CEST
-b
,--boot
-
Mostra todas as mensagens da inicialização atual. Para ver as mensagens de log das inicializações anteriores, basta adicionar um parâmetro de deslocamento conforme explicado acima. Por exemplo, para imprimir as mensagens da inicialização anterior, digitamos
journalctl -b -1
. Lembre-se, porém, de que para recuperar informações de logs anteriores, a persistência do diário deve ser habilitada (você aprenderá como fazer isso na próxima seção):root@debian:~# journalctl -b -1 Specifying boot ID has no effect, no persistent journal was found
- Prioridade
-
-p
-
Curiosamente, também podemos filtrar por gravidade/prioridade com a opção
-p
:root@debian:~# journalctl -b -0 -p err -- No entries --
O diário nos informa de que — até o momento — não houve nenhuma mensagem com prioridade de
error
(ou superior) da inicialização atual. Nota:-b -0
pode ser omitido quando nos referimos à inicialização atual.NoteConsulte a lição anterior para ver uma lista completa de todas as gravidades (ou seja, prioridades) de
syslog
.
- Intervalo de tempo
-
Podemos fazer com que o
journalctl
imprima apenas as mensagens registradas em um período de tempo específico usando as opções--since
e--until
. A especificação da data deve seguir o formatoAAAA-MM-DD HH:MM:SS
. A meia-noite será usada se omitirmos o componente de hora. Da mesma forma, se a data for omitida, o dia atual será pressuposto. Por exemplo, para ver as mensagens registradas das 19h às 19h01, digitamos:root@debian:~# journalctl --since "19:00:00" --until "19:01:00" -- Logs begin at Sat 2019-10-12 18:55:41 CEST, end at Sat 2019-10-12 20:10:50 CEST. -- Oct 12 19:00:14 debian systemd[1]: Started Run anacron jobs. Oct 12 19:00:14 debian anacron[1057]: Anacron 2.3 started on 2019-10-12 Oct 12 19:00:14 debian anacron[1057]: Normal exit (0 jobs run) Oct 12 19:00:14 debian systemd[1]: anacron.timer: Adding 2min 47.988096s random time.
Da mesma maneira, podemos usar uma especificação de tempo ligeiramente diferente:
"integer time-unit ago"
. Assim, para ver mensagens registradas há dois minutos, digitamossudo journalctl --since "2 minutes ago"
. Também é possível usar+
e-
para especificar momentos relativos à hora atual. Assim,--since "-2 minutes"
e--since "2 minutes ago"
são equivalentes.Além das expressões numéricas, podemos especificar uma série de palavras-chave:
yesterday
-
A partir de meia-noite do dia anterior ao dia atual.
today
-
A partir de meia-noite do dia atual.
tomorrow
-
A partir de meia-noite do dia seguinte ao dia atual.
now
-
A hora atual.
Vamos ver todas as mensagens desde a meia-noite passada até hoje às 21:00:
root@debian:~# journalctl --since "today" --until "21:00:00" -- Logs begin at Sat 2019-10-12 20:45:29 CEST, end at Sat 2019-10-12 21:06:15 CEST. -- Oct 12 20:45:29 debian sudo[1416]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/systemctl r Oct 12 20:45:29 debian sudo[1416]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 20:45:29 debian systemd[1]: Stopped Flush Journal to Persistent Storage. (...)
NotePara saber mais sobre as diferentes sintaxes para especificações de tempo, consulte a página de manual de
systemd.time
.
- Programa
-
Para ver as mensagens do diário relacionadas a um executável específico, a seguinte sintaxe é usada:
journalctl /path/to/executable
:root@debian:~# journalctl /usr/sbin/sshd -- Logs begin at Sat 2019-10-12 20:45:29 CEST, end at Sat 2019-10-12 21:54:49 CEST. -- Oct 12 21:16:28 debian sshd[1569]: Accepted password for carol from 192.168.1.65 port 34050 ssh2 Oct 12 21:16:28 debian sshd[1569]: pam_unix(sshd:session): session opened for user carol by (uid=0) Oct 12 21:16:54 debian sshd[1590]: Accepted password for carol from 192.168.1.65 port 34052 ssh2 Oct 12 21:16:54 debian sshd[1590]: pam_unix(sshd:session): session opened for user carol by (uid=0)
- Unidade
-
Lembre-se, uma unidade é qualquer recurso gerenciado pelo
systemd
e também podemos filtrar por elas.-u
-
Mostra mensagens sobre uma unidade específica:
root@debian:~# journalctl -u ssh.service -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 12:22:59 CEST. -- Oct 13 10:51:00 debian systemd[1]: Starting OpenBSD Secure Shell server... Oct 13 10:51:00 debian sshd[409]: Server listening on 0.0.0.0 port 22. Oct 13 10:51:00 debian sshd[409]: Server listening on :: port 22. (...)
NotePara imprimir todas as unidades carregadas e ativas, use
systemctl list-units
; para ver todos os arquivos de unidade instalados, usesystemctl list-unit-files
.
- Campos
-
O diário também pode ser filtrado por campos específicos através de uma das seguintes sintaxes:
-
<field-name>=<value>
-
_<field-name>=<value>_
-
__<field-name>=<value>
PRIORITY=
-
Um dos oito valores possíveis de prioridade de
syslog
formatado como uma string decimal:root@debian:~# journalctl PRIORITY=3 -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 14:30:50 CEST. -- Oct 13 10:51:00 debian avahi-daemon[314]: chroot.c: open() failed: No such file or directory
Note que a mesma saída poderia ser obtida com o comando
sudo journalctl -p err
visto acima. SYSLOG_FACILITY=
-
Qualquer um dos números de código dos recursos formatado como uma string decimal. Por exemplo, para ver todas as mensagens em nível de usuário:
root@debian:~# journalctl SYSLOG_FACILITY=1 -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 14:42:52 CEST. -- Oct 13 10:50:59 debian mtp-probe[227]: checking bus 1, device 2: "/sys/devices/pci0000:00/0000:00:06.0/usb1/1-1" Oct 13 10:50:59 debian mtp-probe[227]: bus: 1, device: 2 was not an MTP device Oct 13 10:50:59 debian mtp-probe[238]: checking bus 1, device 2: "/sys/devices/pci0000:00/0000:00:06.0/usb1/1-1" Oct 13 10:50:59 debian mtp-probe[238]: bus: 1, device: 2 was not an MTP device
_PID=
-
Mostra as mensagens produzidas por um ID de processo específico. Para ver todas as mensagens produzidas pelo
systemd
, digitaríamos:root@debian:~# journalctl _PID=1 -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 14:50:15 CEST. -- Oct 13 10:50:59 debian systemd[1]: Mounted Debug File System. Oct 13 10:50:59 debian systemd[1]: Mounted POSIX Message Queue File System. Oct 13 10:50:59 debian systemd[1]: Mounted Huge Pages File System. Oct 13 10:50:59 debian systemd[1]: Started Remount Root and Kernel File Systems. Oct 13 10:50:59 debian systemd[1]: Starting Flush Journal to Persistent Storage... (...)
_BOOT_ID
-
Com base no ID de inicialização, podemos selecionar as mensagens de uma inicialização específica, por exemplo:
sudo journalctl _BOOT_ID=83df3e8653474ea5aed19b41cdb45b78
. _TRANSPORT
-
Mostra mensagens recebidas de um transporte específico. Os valores possíveis são:
audit
(subsistema de auditoria do kernel),driver
(gerado internamente),syslog
(socket do syslog),journal
(protocolo de diário nativo),stdout
(saída padrão ou erro padrão dos serviços),kernel
(buffer de anel do kernel — o mesmo quedmesg
,journalctl -k
oujournalctl --dmesg
):root@debian:~# journalctl _TRANSPORT=journal -- Logs begin at Sun 2019-10-13 20:19:58 CEST, end at Sun 2019-10-13 20:46:36 CEST. -- Oct 13 20:19:58 debian systemd[1]: Started Create list of required static device nodes for the current kernel. Oct 13 20:19:58 debian systemd[1]: Starting Create Static Device Nodes in /dev... Oct 13 20:19:58 debian systemd[1]: Started Create Static Device Nodes in /dev. Oct 13 20:19:58 debian systemd[1]: Starting udev Kernel Device Manager... (...)
-
Combinando campos
Os campos não são mutuamente exclusivos, portanto podemos usar mais de um na mesma consulta. No entanto, apenas as mensagens que correspondem ao valor de ambos os campos simultaneamente serão mostradas:
root@debian:~# journalctl PRIORITY=3 SYSLOG_FACILITY=0 -- No entries -- root@debian:~# journalctl PRIORITY=4 SYSLOG_FACILITY=0 -- Logs begin at Sun 2019-10-13 20:19:58 CEST, end at Sun 2019-10-13 20:21:55 CEST. -- Oct 13 20:19:58 debian kernel: acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended PCI configuration (...)
A menos que usemos o separador +
para combinar duas expressões na forma de um OR lógico:
root@debian:~# journalctl PRIORITY=3 + SYSLOG_FACILITY=0 -- Logs begin at Sun 2019-10-13 20:19:58 CEST, end at Sun 2019-10-13 20:24:02 CEST. -- Oct 13 20:19:58 debian kernel: Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (...9 Oct 13 20:19:58 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID= (...) (...)
Por outro lado, podemos fornecer dois valores para o mesmo campo e todas as entradas correspondentes a qualquer um dos valores serão mostradas:
root@debian:~# journalctl PRIORITY=1 -- Logs begin at Sun 2019-10-13 17:16:24 CEST, end at Sun 2019-10-13 17:30:14 CEST. -- -- No entries -- root@debian:~# journalctl PRIORITY=1 PRIORITY=3 -- Logs begin at Sun 2019-10-13 17:16:24 CEST, end at Sun 2019-10-13 17:32:12 CEST. -- Oct 13 17:16:27 debian connmand[459]: __connman_inet_get_pnp_nameservers: Cannot read /pro Oct 13 17:16:27 debian connmand[459]: The name net.connman.vpn was not provided by any .se
Note
|
Os campos do diário se enquadram em uma destas categorias: “User Journal Fields”, “Trusted Journal Fields”, “Kernel Journal Fields”, “Fields on behalf of a different program” e “Address Fields”. Para saber mais sobre esse assunto — incluindo uma lista completa dos campos — consulte a página |
Entradas manuais no diário do sistema: systemd-cat
Assim como o comando logger
é usado para enviar mensagens da linha de comando para o log do sistema (como vimos na lição anterior), o comando systemd-cat
tem uma finalidade semelhante — mas mais completa — com o diário do sistema. Ele nos permite enviar a entrada padrão (stdin), a saída (stdout) e o erro (stderr) para o diário.
Se chamado sem parâmetros, ele enviará tudo o que for lido de stdin para o diário. Quando terminar, pressione Ctrl+C:.
carol@debian:~$ systemd-cat This line goes into the journal. ^C
Se passarmos para ele a saída de um comando com pipe, ela também será enviada ao diário:
carol@debian:~$ echo "And so does this line." | systemd-cat
Se seguido por um comando, a saída desse comando também será enviada para o diário — junto com stderr (se houver):
carol@debian:~$ systemd-cat echo "And so does this line too."
Também existe a possibilidade de especificar um nível de prioridade com a opção -p
:
carol@debian:~$ systemd-cat -p emerg echo "This is not a real emergency."
Consulte a página de manual de systemd-cat
para aprender sobre as outras opções.
Para ver as últimas quatro linhas do diário:
carol@debian:~$ journalctl -n 4 (...) -- Logs begin at Sun 2019-10-20 13:43:54 CEST. -- Nov 13 23:14:39 debian cat[1997]: This line goes into the journal. Nov 13 23:19:16 debian cat[2027]: And so does this line. Nov 13 23:23:21 debian echo[2030]: And so does this line too. Nov 13 23:26:48 debian echo[2034]: This is not a real emergency.
Note
|
As entradas de diário com um nível de prioridade de emergência serão impressas em vermelho e negrito na maioria dos sistemas. |
Armazenamento persistente do diário
Como mencionado anteriormente, temos três opções quando se trata da localização do diário:
-
Desativar totalmente registro em diário (porém, o redirecionamento para outros recursos, como o console, ainda será possível).
-
Mantê-lo na memória — o que o torna volátil — e remover os logs a cada reinicialização do sistema. Nesse caso, o diretório
/run/log/journal
será criado e usado. -
Torná-lo persistente, escrevendo os logs no disco. Nesse caso, as mensagens de log irão para o diretório
/var/log/journal
.
O comportamento padrão é o seguinte: se /var/log/journal/
não existir, os logs serão salvos de forma volátil em um diretório em /run/log/journal/
e — portanto — perdidos na reinicialização. O nome do diretório — o /etc/machine-id
— é uma string terminada em nova linha, hexadecimal, de 32 caracteres, em minúsculas:
carol@debian:~$ ls /run/log/journal/8821e1fdf176445697223244d1dfbd73/ system.journal
Se você tentar lê-lo com less, aparecerá um aviso, então use em vez disso o comando journalctl
:
root@debian:~# less /run/log/journal/9a32ba45ce44423a97d6397918de1fa5/system.journal "/run/log/journal/9a32ba45ce44423a97d6397918de1fa5/system.journal" may be a binary file. See it anyway? root@debian:~# journalctl -- Logs begin at Sat 2019-10-05 21:26:38 CEST, end at Sat 2019-10-05 21:31:27 CEST. -- (...) Oct 05 21:26:44 debian systemd-journald[1712]: Runtime journal (/run/log/journal/9a32ba45ce44423a97d6397918de1fa5) is 4.9M, max 39.5M, 34.6M free. Oct 05 21:26:44 debian systemd[1]: Started Journal Service. (...)
Se /var/log/journal/
existir, os logs serão armazenados lá de maneira persistente. Caso esse diretório seja excluído, o systemd-journald
não o recria, mas passa a escrever em /run/log/journal
. Logo que criarmos /var/log/journal/
novamente e reiniciarmos o daemon, o registro persistente de eventos é restabelecido:
root@debian:~# mkdir /var/log/journal/ root@debian:~# systemctl restart systemd-journald root@debian:~# journalctl (...) Oct 05 21:33:49 debian systemd-journald[1712]: Received SIGTERM from PID 1 (systemd). Oct 05 21:33:49 debian systemd[1]: Stopped Journal Service. Oct 05 21:33:49 debian systemd[1]: Starting Journal Service... Oct 05 21:33:49 debian systemd-journald[1768]: Journal started Oct 05 21:33:49 debian systemd-journald[1768]: System journal (/var/log/journal/9a32ba45ce44423a97d6397918de1fa5) is 8.0M, max 1.1G, 1.1G free. Oct 05 21:33:49 debian systemd[1]: Started Journal Service. Oct 05 21:33:49 debian systemd[1]: Starting Flush Journal to Persistent Storage... (...)
Note
|
Por padrão, há arquivos de diário específicos para todo usuário conectado, localizados em |
Além do que acabamos de mencionar, a forma como o daemon de diário lida com o armazenamento de logs pode ser alterada após a instalação ajustando-se seu arquivo de configuração: /etc/systemd/journald.conf
. A opção a se usar é Storage=
, que pode ter os seguintes valores:
Storage=volatile
-
Os dados de log serão armazenados exclusivamente na memória — em
/run/log/journal/
. Se não estiver presente, o diretório será criado. Storage=persistent
-
Os dados de log serão armazenados em disco por padrão — em
/var/log/journal/
— com uma alternativa de segurança na memória (/run/log/journal/
) durante os estágios iniciais da inicialização e se o disco não for gravável. Ambos os diretórios serão criados, se necessário. Storage=auto
-
auto
é semelhante apersistent
, mas o diretório/var/log/journal
não é criado se necessário. Este é o padrão. Storage=none
-
Todos os dados de log serão descartados. Entretanto, o encaminhamento para outros destinos, como o console, o buffer de log do kernel ou um socket syslog, ainda é possível.
Por exemplo, para que systemd-journald
crie /var/log/journal/
e passe para o armazenamento persistente, editaríamos /etc/systemd/journald.conf
definindo Storage=persistent
, salvaríamos o arquivo e reiniciaríamos o daemon com sudo systemctl restart systemd-journald
. Para verificar se a reinicialização ocorreu sem erros, sempre podemos conferir o status do daemon:
root@debian:~# systemctl status systemd-journald systemd-journald.service - Journal Service Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled) Active: active (running) since Wed 2019-10-09 10:03:40 CEST; 2s ago Docs: man:systemd-journald.service(8) man:journald.conf(5) Main PID: 1872 (systemd-journal) Status: "Processing requests..." Tasks: 1 (limit: 3558) Memory: 1.1M CGroup: /system.slice/systemd-journald.service └─1872 /lib/systemd/systemd-journald Oct 09 10:03:40 debian10 systemd-journald[1872]: Journal started Oct 09 10:03:40 debian10 systemd-journald[1872]: System journal (/var/log/journal/9a32ba45ce44423a97d6397918de1fa5) is 8.0M, max 1.2G, 1.2G free.
Note
|
Os arquivos de diário em |
Excluindo dados antigos do diário: Tamanho do diário
Os logs são salvos em arquivos de diário com nomes de arquivos que terminam com .journal
ou .journal~
e estão localizados no diretório apropriado (/run/log/journal
ou /var/log/journal
, conforme a configuração). Para conferir quanto espaço em disco está sendo ocupado atualmente com arquivos de diário (tanto arquivados quanto ativos), use a opção --disk-usage
:
root@debian:~# journalctl --disk-usage Archived and active journals take up 24.0M in the filesystem.
Os logs do systemd
têm como padrão um máximo de 10% do tamanho do sistema de arquivos onde estão armazenados. Por exemplo, em um sistema de arquivos de 1 GB, eles não ocuparão mais do que 100 MB. Assim que esse limite for atingido, os logs antigos começarão a desaparecer para se aproximar desse valor.
Porém, a aplicação de um limite de tamanho aos arquivos de diário armazenados pode ser gerenciada ajustando-se uma série de opções de configuração em /etc/systemd/journald.conf
. Essas opções se enquadram em duas categorias, dependendo do tipo de sistema de arquivos usado: persistente (/var/log/journal
) ou na memória (/run/log/journal
). O primeiro usa opções prefixadas com a palavra System
e só se aplicam se o log persistente estiver devidamente habilitado e quando o sistema estiver totalmente inicializado. Os nomes das opções do último começam com a palavra Runtime
e se aplicarão nos seguintes cenários:
SystemMaxUse=
,RuntimeMaxUse=
-
Controlam a quantidade de espaço em disco que pode ser ocupada pelo diário. O padrão é 10% do tamanho do sistema de arquivos, mas pode ser modificado (por exemplo,
SystemMaxUse=500M
), desde que não ultrapasse um máximo de 4GiB. SystemKeepFree=
,RuntimeKeepFree=
-
Controlam a quantidade de espaço em disco que deve ser deixado livre para outros usuários. O padrão é 15% do tamanho do sistema de arquivos, mas pode ser modificado (por exemplo,
SystemKeepFree = 500M
), desde que não ultrapasse um máximo de 4GiB.Quanto à prioridade de
*MaxUse
ou*KeepFree
, osystemd-journald
satisfaz a ambos usando o menor dos dois valores. Da mesma forma, tenha em mente que apenas os arquivos de diário arquivados (em oposição aos ativos) são excluídos. SystemMaxFileSize=
,RuntimeMaxFileSize=
-
Controlam o tamanho máximo para o qual os arquivos de diário individuais podem crescer. O padrão é 1/8 de
*MaxUse
. A redução de tamanho é realizada de forma síncrona e os valores podem ser especificados em bytes ou usandoK
,M
,G
,T
,P
,E
para Kibibytes, Mebibytes, Gibibyte, Tebibytes, Pebibytes e Exbibytes, respectivamente. SystemMaxFiles=
,RuntimeMaxFiles=
-
Estabelecem o número máximo de arquivos de diário individuais e arquivados a armazenar (os arquivos de diário ativos não são afetados). O padrão é 100.
Além da exclusão baseada no tamanho e rotação de mensagens de log, o systemd-journald
também permite critérios baseados no tempo usando estas duas opções: MaxRetentionSec=
e MaxFileSec=
. Consulte a página de manual do journald.conf
para saber mais sobre estas e outras opções.
Note
|
Sempre que você modificar o comportamento padrão do |
Limpando o diário
É possível limpar (vacuum) manualmente os arquivos de diário arquivados a qualquer momento com uma das três opções a seguir:
--vacuum-time=
-
Esta opção baseada remove todas as mensagens nos arquivos de diário que tiverem um carimbo de data/hora anterior ao período de tempo especificado. Os valores devem ser escritos com qualquer um dos seguintes sufixos:
s
,m
,h
,days
(oud
),months
,weeks
(orw
) eyears
(ouy
). Por exemplo, para se livrar de todas as mensagens com mais de 1 mês em arquivos de diário arquivados:root@debian:~# journalctl --vacuum-time=1months Deleted archived journal /var/log/journal/7203088f20394d9c8b252b64a0171e08/system@27dd08376f71405a91794e632ede97ed-0000000000000001-00059475764d46d6.journal (16.0M). Deleted archived journal /var/log/journal/7203088f20394d9c8b252b64a0171e08/user-1000@e7020d80d3af42f0bc31592b39647e9c-000000000000008e-00059479df9677c8.journal (8.0M).
--vacuum-size=
-
Esta opção remove arquivos de diário arquivados até que cheguem a um tamanho abaixo do especificado. Os valores devem ser escritos com qualquer um dos seguintes sufixos:
K
,M
,G
ouT
. Por exemplo, para eliminar arquivos de diário arquivados até que estejam abaixo de 100 Mebibytes:root@debian:~# journalctl --vacuum-size=100M Vacuuming done, freed 0B of archived journals from /run/log/journal/9a32ba45ce44423a97d6397918de1fa5.
--vacuum-files=
-
Esta opção cuida para que não restem mais arquivos de diário arquivados do que o número especificado. O valor é um número inteiro. Por exemplo, para limitar o número de arquivos de diário arquivados a 10:
root@debian:~# journalctl --vacuum-files=10 Vacuuming done, freed 0B of archived journals from /run/log/journal/9a32ba45ce44423a97d6397918de1fa5.
Essa limpeza remove apenas os arquivos de diário arquivados. Se a ideia for se livrar de tudo (incluindo arquivos de diário ativos), temos de empregar um sinal (SIGUSR2
) que solicita a rotação imediata dos arquivos de diário com a opção --rotate
. Outros sinais importantes podem ser chamados com as seguintes opções:
--flush
(SIGUSR1)
-
Solicita a liberação dos arquivos de diário de
/run/
para/var/
para tornar o diário persistente. Ele requer que o log persistente esteja habilitado e que/var/
esteja montado. --sync
(SIGRTMIN+1
)-
É usado para solicitar que todos os dados de log não gravados sejam gravados no disco.
Note
|
Para verificar a consistência interna do arquivo de diário, use |
Recuperando dados de diário de um sistema de resgate
Como administrador de sistema, você pode se encontrar em uma situação em que precisa acessar arquivos de diário no disco rígido de uma máquina defeituosa por meio de um sistema de recuperação (um CD inicializável ou pendrive contendo uma distribuição Linux ativa).
journalctl
procura por arquivos de diário em /var/log/journal/<machine-id>/
. Como os IDs de máquina dos sistemas de resgate e dos sistemas defeituosos serão diferentes, usamos a seguinte opção:
-D </path/to/dir>
,--directory=</path/to/dir>
-
Com esta opção, especificamos um caminho de diretório no qual
journalctl
busca por arquivos de diário ao invés do tempo de execução e locais do sistema.
Portanto, é necessário montar o rootfs
(/dev/sda1
) do sistema defeituoso no sistema de arquivos do sistema de recuperação e em seguida ler os arquivos de diário da seguinte forma:
root@debian:~# journalctl -D /media/carol/faulty.system/var/log/journal/ -- Logs begin at Sun 2019-10-20 12:30:45 CEST, end at Sun 2019-10-20 12:32:57 CEST. -- oct 20 12:30:45 suse-server kernel: Linux version 4.12.14-lp151.28.16-default (geeko@buildhost) (...) oct 20 12:30:45 suse-server kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.12.14-lp151.28.16-default root=UUID=7570f67f-4a08-448e-aa09-168769cb9289 splash=> oct 20 12:30:45 suse-server kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' oct 20 12:30:45 suse-server kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' (...)
Outras opções que podem ser úteis neste caso:
-m
,--merge
-
Mescla as entradas de todos os diários disponíveis em
/var/log/journal
, incluindo os remotos. --file
-
Mostra as entradas de um arquivo específico, por exemplo:
journalctl --file /var/log/journal/64319965bda04dfa81d3bc4e7919814a/user-1000.journal
. --root
-
Um caminho de diretório que indica que o diretório raiz é passado como um argumento.
journalctl
procura por arquivos de diário (por exemplo,journalctl --root /faulty.system/
).
Veja a página de manual do journalctl
para saber mais.
Encaminhando dados de log para um daemon syslog
tradicional
Os dados de log do diário podem ser disponibilizados para um daemon syslog
tradicional das seguintes maneiras:
-
Encaminhando mensagens para o arquivo de socket
/run/systemd/journal/syslog
parasyslogd
ler. Este recurso é habilitado com a opçãoForwardToSyslog=yes
. -
Fazendo com que um daemon
syslog
se comporte comojournalctl
, lendo assim mensagens de log diretamente nos arquivos de diário. Neste caso, a opção relevante éStorage
; ela deve ter um valor diferente denone
.
Note
|
Da mesma forma, é possível encaminhar mensagens de log para outros destinos com as seguintes opções: |
Exercícios Guiados
-
Pressupondo que você é
root
, complete a tabela com o comando apropriado dojournalctl
:Finalidade Comando Imprimir entradas do kernel
Imprimir mensagens da segunda inicialização a partir do início do diário
Imprimir mensagens da segunda inicialização a partir do final do diário
Imprimir as mensagens de log mais recentes e ficar atento às novas
Imprimir apenas novas mensagens a partir de agora e atualizar a saída continuamente
Imprimir mensagens da inicialização anterior com prioridade de
warning
e na ordem inversa -
O comportamento do daemon de diário em relação ao armazenamento é controlado principalmente pelo valor da opção
Storage
em/etc/systemd/journald.conf
. Indique qual comportamento está relacionado a qual valor na seguinte tabela:Comportamento Storage=auto
Storage=none
Storage=persistent
Storage=volatile
Os dados de registro são descartados, mas o encaminhamento é possível.
Assim que o sistema for inicializado, os dados de registro serão armazenados em
/var/log/journal
. Se ainda não estiver presente, o diretório será criado.Assim que o sistema for inicializado, os dados de registro serão armazenados em
/var/log/journal
. Se ainda não estiver presente, o diretório não será criado.Os dados de log serão armazenados em
/var/run/journal
, mas não sobreviverão a reinicializações. -
Como você aprendeu, o diário pode ser limpo manualmente com base no tempo, tamanho e número de arquivos. Conclua as seguintes tarefas usando
journalctl
e as opções apropriadas:-
Verifique quanto espaço em disco é ocupado pelos arquivos de diário:
-
Reduza a quantidade de espaço reservado a arquivos de diário arquivados e defina-o como 200 MiB:
-
Verifique o espaço em disco novamente e explique os resultados:
-
Exercícios Exploratórios
-
Quais opções você precisa modificar em
/etc/systemd/journald.conf
para que as mensagens sejam encaminhadas para/dev/tty5
? Quais valores as opções devem ter? -
Informe qual o filtro
journalctl
correto para imprimir o seguinte:Finalidade Filtro + Valor Imprimir mensagens pertencentes a um usuário específico
Imprimir mensagens de um host chamado
debian
Imprimir mensagens pertencentes a um grupo específico
Imprimir mensagens pertencentes a
root
Com base no caminho do executável, imprimir mensagens
sudo
Com base no nome do comando, imprimir mensagens
sudo
-
Ao filtrar por prioridade, os registros com uma prioridade mais alta do que a indicada também serão incluídos na lista; por exemplo,
journalctl -p err
irá imprimir as mensagens error, critical, alert e emergency. No entanto, você pode fazer com que ojournalctl
mostre apenas um intervalo específico. Qual comando você usaria para fazer com que ojournalctl
imprima apenas mensagens nos níveis de prioridade warning, error e critical? -
Os níveis de prioridade também podem ser especificados numericamente. Reescreva o comando do exercício anterior usando a representação numérica dos níveis de prioridade:
Summary
Nesta lição, você aprendeu:
-
As vantagens de usar o
systemd
como um gerenciador de sistema e serviços. -
O básico sobre as unidades e destinos do
systemd
. -
De onde
systemd-journald
obtém os dados de log. -
As opções que podemos passar ao
systemctl
para controlarsystemd-journald
:start
,status
,restart
estop
. -
Onde o arquivo de configuração do diário está localizado —
/etc/systemd/journald.conf
— e suas principais opções. -
Como consultar o diário de maneira geral e buscar por dados específicos usando filtros.
-
Como navegar e pesquisar no diário.
-
Como lidar com o armazenamento de arquivos de diário: na memória ou no disco.
-
Como desativar completamente o registro no diário.
-
Como verificar o espaço em disco ocupado pelo diário, impor limites de tamanho aos arquivos de diário armazenados e limpar os arquivos de diário arquivados manualmente (vacuuming).
-
Como recuperar dados de diário de um sistema de resgate.
-
Como encaminhar dados de log para um daemon
syslog
tradicional.
Comandos usados nesta lição:
systemctl
-
Controlar o gerenciador de sistema e serviços
systemd
. journalctl
-
Consultar o diário do
systemd
. ls
-
Listar o conteúdo do diretório.
less
-
Visualizar o conteúdo do arquivo.
mkdir
-
Criar diretórios.
Answers to Guided Exercises
-
Pressupondo que você é
root
, complete a tabela com o comando apropriado dojournalctl
:Finalidade Comando Imprimir entradas do kernel
journalctl -k
orjournalctl --dmesg
Imprimir mensagens da segunda inicialização a partir do início do diário
journalctl -b 2
Imprimir mensagens da segunda inicialização a partir do final do diário
journalctl -b -2 -r
orjournalctl -r -b -2
Imprimir as mensagens de log mais recentes e ficar atento às novas
journalctl -f
Imprimir apenas novas mensagens a partir de agora e atualizar a saída continuamente
journalctl --since "now" -f
Imprimir mensagens da inicialização anterior com prioridade de
warning
e na ordem inversajournalctl -b -1 -p warning -r
-
O comportamento do daemon de diário em relação ao armazenamento é controlado principalmente pelo valor da opção
Storage
em/etc/systemd/journald.conf
. Indique qual comportamento está relacionado a qual valor na seguinte tabela:Comportamento Storage=auto
Storage=none
Storage=persistent
Storage=volatile
Os dados de registro são descartados, mas o encaminhamento é possível
x
Assim que o sistema for inicializado, os dados de registro serão armazenados em
/var/log/journal
. Se ainda não estiver presente, o diretório será criadox
Assim que o sistema for inicializado, os dados de registro serão armazenados em
/var/log/journal
. Se ainda não estiver presente, o diretório não será criadox
Os dados de log serão armazenados em
/var/run/journal
, mas não sobreviverão a reinicializaçõesx
-
Como você aprendeu, o diário pode ser limpo manualmente com base no tempo, tamanho e número de arquivos. Conclua as seguintes tarefas usando
journalctl
e as opções apropriadas:-
Verifique quanto espaço em disco é ocupado pelos arquivos de diário:
journalctl --disk-usage
-
Reduza a quantidade de espaço reservado a arquivos de diário arquivados e defina-o como 200 MiB:
journalctl --vacuum-size=200M
-
Verifique o espaço em disco novamente e explique os resultados:
journalctl --disk-usage
Não há correlação porque
--disk-usage
mostra o espaço ocupado pelos arquivos de diário ativos e arquivados, ao passo que--vacuum-size
aplica-se apenas aos itens arquivados.
-
Answers to Explorational Exercises
-
Quais opções você precisa modificar em
/etc/systemd/journald.conf
para que as mensagens sejam encaminhadas para/dev/tty5
? Quais valores as opções devem ter?ForwardToConsole=yes TTYPath=/dev/tty5
-
Informe qual o filtro
journalctl
correto para imprimir o seguinte:Finalidade Filtro + Valor Imprimir mensagens pertencentes a um usuário específico
_ID=<user-id>
Imprimir mensagens de um host chamado
debian
_HOSTNAME=debian
Imprimir mensagens pertencentes a um grupo específico
_GID=<group-id>
Imprimir mensagens pertencentes a
root
_UID=0
Com base no caminho do executável, imprimir mensagens
sudo
_EXE=/usr/bin/sudo
Com base no nome do comando, imprimir mensagens
sudo
_COMM=sudo
-
Ao filtrar por prioridade, os registros com uma prioridade mais alta do que a indicada também serão incluídos na lista; por exemplo,
journalctl -p err
irá imprimir as mensagens error, critical, alert e emergency. No entanto, você pode fazer com que ojournalctl
mostre apenas um intervalo específico. Qual comando você usaria para fazer com que ojournalctl
imprima apenas mensagens nos níveis de prioridade warning, error e critical?journalctl -p warning..crit
-
Os níveis de prioridade também podem ser especificados numericamente. Reescreva o comando do exercício anterior usando a representação numérica dos níveis de prioridade:
journalctl -p 4..2