systemdjournalctl: consultar o diário do systemdudevjournalctl: consultar o diário do systemd
Quando o systemd substituiu os scripts init tradicionais no SUSE Linux Enterprise 12 (consulte o Capítulo 11, O daemon systemd), ele introduziu seu próprio sistema de registro denominado diário. Não há mais necessidade de executar um serviço baseado no syslog, e todos os eventos do sistema são gravados no diário.
O próprio diário é um serviço do sistema gerenciado pelo systemd. Seu nome completo é systemd-journald.service. Ele coleta e armazena dados de registro mantendo diários indexados estruturados com base nas informações de registro recebidas do kernel, de processos dos usuários, da entrada padrão e de erro dos serviços do sistema. Por padrão, o serviço systemd-journald.service está ativado:
# systemctl status systemd-journald
systemd-journald.service - Journal Service
Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static)
Active: active (running) since Mon 2014-05-26 08:36:59 EDT; 3 days ago
Docs: man:systemd-journald.service(8)
man:journald.conf(5)
Main PID: 413 (systemd-journal)
Status: "Processing requests..."
CGroup: /system.slice/systemd-journald.service
└─413 /usr/lib/systemd/systemd-journald
[...]
Por padrão, o diário armazena os dados de registro em /run/log/journal/. Como o diretório /run/ é volátil por natureza, os dados de registro são perdidos na reinicialização. Para torná-los persistentes, deve haver um diretório /var/log/journal/ com propriedade e permissões corretas, no qual o serviço systemd-journald pode armazenar seus dados. O systemd criará o diretório para você (e mudará o registro para persistente), se você fizer o seguinte:
Como root, abra o /etc/systemd/journald.conf para edição.
# vi /etc/systemd/journald.conf
Remova o comentário da linha com Storage= e mude-a para
[...] [Journal] Storage=persistent #Compress=yes [...]
Grave o arquivo e reinicie o systemd-journald:
systemctl restart systemd-journald.service
journalctl #
Esta seção apresenta várias opções comuns úteis para melhorar o comportamento padrão do journalctl. Todos os switches estão descritos na página de manual do journalctl: man 1 journalctl.
Para mostrar todas as mensagens do diário relacionadas a determinado executável, especifique o caminho completo para o executável:
# journalctl /usr/lib/systemd/systemd
Mostra apenas as mensagens mais recentes do diário e imprime novas entradas de registro à medida que são adicionadas ao diário.
Imprime as mensagens e pula para o fim do diário para que as entradas mais recentes fiquem visíveis no paginador.
Imprime as mensagens do diário em ordem inversa para que as entradas mais recentes sejam listadas primeiro.
Mostra apenas as mensagens do kernel. Equivale à correspondência de campo _TRANSPORT=kernel (consulte a Seção 12.3.3, “Filtrando com base nos campos”).
Mostra apenas as mensagens da unidade systemd especificada. Equivale à correspondência de campo _SYSTEMD_UNIT=UNIDADE (consulte a Seção 12.3.3, “Filtrando com base nos campos”).
# journalctl -u apache2 [...] Jun 03 10:07:11 pinkiepie systemd[1]: Starting The Apache Webserver... Jun 03 10:07:12 pinkiepie systemd[1]: Started The Apache Webserver.
Quando chamado sem switches, o journalctl mostra o conteúdo completo do diário, com as entradas mais antigas listadas primeiro. É possível filtrar a saída por switches e campos específicos.
O journalctl pode filtrar as mensagens com base em um boot do sistema específico. Para listar todos os boots disponíveis, execute
# journalctl --list-boots -1 097ed2cd99124a2391d2cffab1b566f0 Mon 2014-05-26 08:36:56 EDT—Fri 2014-05-30 05:33:44 EDT 0 156019a44a774a0bb0148a92df4af81b Fri 2014-05-30 05:34:09 EDT—Fri 2014-05-30 06:15:01 EDT
A primeira coluna lista a diferença de boot: 0 para o boot atual, -1 para o anterior, -2 para o segundo anterior, etc. A segunda coluna apresenta o ID de boot e as marcações de horário de limite da sequência de boot específica.
Mostrar todas as mensagens do boot atual:
# journalctl -b
Se você precisa ver mensagens de diário do boot anterior, adicione um parâmetro de diferença. O seguinte exemplo representa as mensagens do boot anterior:
# journalctl -b -1
Uma outra maneira é listar as mensagens de boot com base no ID de boot. Para esta finalidade, use o campo _BOOT_ID:
# journalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b
É possível filtrar a saída do journalctl especificando a data de início e/ou de término. A especificação de data deve ser no formato "2014-06-30 9:17:16". Se a parte do horário for omitida, será considerada meia-noite. Se os segundos forem omitidos, será considerado ":00". Se a parte da data for omitida, será considerado o dia atual. Em vez da expressão numérica, é possível especificar as palavras-chave "ontem", "hoje" ou "amanhã", que se referem à meia-noite do dia anterior ao dia atual, do dia atual ou do dia posterior ao dia atual. Se você especificar "agora", vai se referir ao horário atual. É possível também especificar horários com os prefixos - ou +, que se referem aos horários antes ou depois do horário atual.
Mostrar apenas novas mensagens a partir de agora e atualizar a saída continuamente:
# journalctl --since "now" -f
Mostrar todas as mensagens desde meia-noite passada até às 3h20:
# journalctl --since "today" --until "3:20"
É possível filtrar a saída do diário por campos específicos. A sintaxe de um campo para correspondência é FIELD_NAME=MATCHED_VALUE, como _SYSTEMD_UNIT=httpd.service. É possível especificar várias correspondências em um única consulta para filtrar ainda mais as mensagens de saída. Consulte man 7 systemd.journal-fields para ver a lista de campos padrão.
Mostrar mensagens produzidas por um ID de processo específico:
# journalctl _PID=1039
Mostrar mensagens que pertencem a determinado ID de usuário:
# journalctl _UID=1000
Mostrar mensagens do buffer de anel do kernel (as mesmas que o dmesg produz):
# journalctl _TRANSPORT=kernel
Mostrar mensagens da saída padrão ou de erros do serviço:
# journalctl _TRANSPORT=stdout
Mostrar mensagens produzidas apenas por determinado serviço:
# journalctl _SYSTEMD_UNIT=avahi-daemon.service
Se dois campos diferentes forem especificados, apenas as entradas que corresponderem às duas expressões ao mesmo tempo serão mostradas:
# journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1488
Se duas correspondências fizerem referência ao mesmo campo, todas as entradas correspondentes a uma das expressões serão mostradas:
# journalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service
É possível usar o separador ''+'' para combinar duas expressões em um ''OR'' lógico. O seguinte exemplo mostra todas as mensagens do processo do serviço Avahi com ID de processo 1480 juntamente com todas as mensagens do serviço D-Bus:
# journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1480 + _SYSTEMD_UNIT=dbus.service
systemd #
Esta seção apresenta um exemplo simples que ilustra como localizar e corrigir o erro relatado pelo systemd durante a inicialização do apache2.
Tentar iniciar o serviço apache2:
# systemctl start apache2.service Job for apache2.service failed. See 'systemctl status apache2.service' and 'journalctl -xn' for details.
Vejamos o que diz o status do serviço:
# systemctl status apache2.service
apache2.service - The Apache Webserver
Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
Active: failed (Result: exit-code) since Tue 2014-06-03 11:08:13 CEST; 7min ago
Process: 11026 ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND \
-k graceful-stop (code=exited, status=1/FAILURE)O ID do processo que causa a falha é 11026.
Mostrar a versão verbosa das mensagens relacionadas ao ID de processo 11026:
# journalctl -o verbose _PID=11026 [...] MESSAGE=AH00526: Syntax error on line 6 of /etc/apache2/default-server.conf: [...] MESSAGE=Invalid command 'DocumenttRoot', perhaps misspelled or defined by a module [...]
Corrigir o erro de digitação em /etc/apache2/default-server.conf, iniciar o serviço apache2 e imprimir seu status:
# systemctl start apache2 && systemctl status apache2
apache2.service - The Apache Webserver
Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
Active: active (running) since Tue 2014-06-03 11:26:24 CEST; 4ms ago
Process: 11026 ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND
-k graceful-stop (code=exited, status=1/FAILURE)
Main PID: 11263 (httpd2-prefork)
Status: "Processing requests..."
CGroup: /system.slice/apache2.service
├─11263 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
├─11280 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
├─11281 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
├─11282 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
├─11283 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
└─11285 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
É possível ajustar o comportamento do serviço systemd-journald modificando /etc/systemd/journald.conf. Esta seção apresenta apenas as configurações de opção básicas. Para ver a descrição completa do arquivo, consulte man 5 journald.conf. Observe que é necessário reiniciar o diário para que as mudanças entrem em vigor com
# systemctl restart systemd-journald.service
Se os dados do registro em diário forem gravados em um local persistente (consulte a Seção 12.1, “Tornando o diário persistente”), eles usarão até 10% do sistema de arquivos no qual o /var/log/journal reside. Por exemplo, se /var/log/journal estiver em uma partição /var de 30 GB, o diário poderá usar até 3 GB de espaço em disco. Para mudar esse limite, altere (e remova o comentário) a opção SystemMaxUse:
SystemMaxUse=50M
/dev/ttyX #
É possível encaminhar o diário para um dispositivo de terminal para você receber informações sobre mensagens do sistema na tela de terminal de sua preferência, por exemplo /dev/tty12. Mude as seguintes opções de journald para
ForwardToConsole=yes TTYPath=/dev/tty12
O Journald é retroativamente compatível com as implementações tradicionais do syslog, como rsyslog. Verifique se as afirmativas a seguir são válidas:
O rsyslog está instalado.
# rpm -q rsyslog rsyslog-7.4.8-2.16.x86_64
O serviço rsyslog está habilitado.
# systemctl is-enabled rsyslog.service enabled
O encaminhamento para syslog está habilitado em /etc/systemd/journald.conf.
ForwardToSyslog=yes