Mestre JournalCtl Entenda Systemd Logs

Mestre JournalCtl Entenda Systemd Logs
Systemd é o novo serviço de gerenciamento de ferramentas. Criado inicialmente pela Red Hat, ele permite gerenciar melhor os serviços por meio de um processo centralizado que monitora e lança serviços conforme necessário. Mas o Systemd também inclui um sistema de contêineres, um sistema Cron, uma maneira de fornecer diretórios temporários aos serviços de uma maneira segura e também um sistema de madeira - é onde vamos nos concentrar aqui.

Entender os registros é importante: se você cair em um servidor que tem um bug ou é hackeado, geralmente sua única maneira de entender o que aconteceu é através de logs. O principal aplicativo que vamos usar é o Journalctl, daí o nome do artigo. Então ouça com cuidado como no dia certo, você pode ficar feliz em saber como funciona.

Onde estão armazenados logs systemd? E em que formato é armazenado?

Vamos supor que você tenha um sistema normal, porque o Systemd pode ser personalizado para estar em lugares excepcionais. Além disso, algumas distribuições Linux como o Ubuntu 16.04 De com desativado o registro persistente por padrão, que impedem o Systemd a fazer seu trabalho corretamente. Se você tem essa distribuição, editar/etc/Systemd/Journald.arquivo conf, altere armazenamento = automático para armazenamento = persistente e finalmente, reinicie.

Então você encontrará normalmente os arquivos do Systemd Logs em/var/log/diário. O sistema de diários é um serviço chamado System-Journald.serviço. Vamos tentar listar os arquivos neste diretório:

# ls/var/log/journal/-r
/var/log/journal/:
15E43C1734090AC7FBEA6B40FCD99D31
/var/log/journal/15e43c1734090ac7fbea6b40fcd99d31:
[email protected] ~
Sistema@62AC1299826D036CB043D6C06A9493B7-0000000000000001-00067D6410099A19.Diário
[email protected] ~
User-1000@2123BC076B58569FE1FB13E9DBC1B0E0-000000000000000001-0007FE36AC2810E0.Diário
usuário-1000.Diário
[Muitos outros arquivos como os acima ...]

Porque eu quero que você continue lendo, tive que encurtar a saída, pois ela contém muitos arquivos (no meu exemplo, mais de 60 arquivos), desculpe por isso! Tentado a abrir um talvez?

# cabeça-bytes = 512/var/log/journal/15e43c1734090ac7fbea6b40fcd99d31/user-1000@2123bc076
B58569FE1FB13E9DBC1B0E0-0000000000000001-0007FE36AC2810E0.Diário
?s, q?n/flz???Ulz?eu?]????
?_?b???z????o?y1kn ?eu?EO??C?você? ?=?x0?eu?d?7??X4n#?e? D3L?
p??O | MFO:?!QS?.tk??R?\??1?| 5 ????$?g??#?S??;??B7???????t???Y????mn?q????ZQ
?Yv?e?????Bd?C?? wf??d |
?2?? 7???????[[??Un?= 8????c?2 = p?&?" ?0
????*????_?? ???
5?????YK?G? ?6?|??você??W: #12?Y??
3 Tu;???'?jx??2?x '?=??[Q???@Z
T_???3ehmd?@?_?>??3s???,lr?.?$?g?eu???s?/E??M1??q???

Ei, veja, isso realmente não se parece com os arquivos de log habituais que você vê certo? Não se preocupe, esse arquivo não está corrompido, você acabou de descobrir um aspecto do Systemd: Systemd armazena arquivos em um formato binário. É por isso que é o mais pequeno possível: dados estruturados como tempo ou local são armazenados reto em binário, que geralmente obtém menos bytes do que o texto. Mas esse não é o único motivo.

Systemd não armazena apenas linhas de log. Sua intenção é facilitar o monitoramento e a exploração de toras. Para ajudar nessa tarefa, as mensagens de log são de fato uma linha de texto acompanhada de dados como gravidade do log (aviso, erro, etc.), ou mesmo campos que seriam úteis apenas para o seu aplicativo (URL solicitado, por exemplo).

# Journalctl - -output = verbose --l
Prioridade = 6
_Uid = 0
_Gid = 0
_Cap_effective = 3fffffffff
_Boot_id = ee4cc2ce7e8273aaffb5fc59c873ce7b
_Machine_id = bc422e0feaab64bb7dd218c24e6830e5
_HostName = Linux
Syslog_facility = 3
Syslog_entifier = Systemd
Unidade = dnf-makecache.serviço
_Transport = Journal
_Pid = 1
_Comm = Systemd
_Exe =/usr/lib/systemd/systemd
_Cmdline =/usr/lib/systemd/Systemd-Switched-Root-System-Deserialize 76
_Systemd_cgroup =/init.escopo
_Systemd_unit = init.escopo
_Systemd_slice =-.fatiar
_Selinux_context = System_u: System_r: init_t: S0
Code_file = src/core/trabalho.c
Code_line = 795
Code_function = job_log_status_message
Message_id = a76e08846f5f0971371dbb11126e62e1
Mensagem = Iniciado DNF Makecache.
# JournalCtl-Catalog-lines = 3000-Páger-end "_Transport = kernel" resultado = feito
_Source_realtime_timestamp = 1532886335471422

Eu disse que há muitos campos (aqui há 25 campos ou 29 registros de data e hora), todo o trecho acima é apenas para uma única mensagem de log! O grande benefício é que você pode fazer uma pesquisa filtrando em qualquer campo nesta mensagem de log. Isso realmente permite que você faça filtragem avançada.

Um dos filtros mais óbvios que você gostaria é filtrar pelo serviço. Como você pode ver acima, há um campo unitário para que você possa filtrar facilmente para obter apenas mensagens de log de um serviço. Eu vou te contar mais sobre isso mais tarde.

Mas essa quantidade de dados também significa outra coisa: em quase todos os casos, você nunca abrirá um arquivo de log manualmente e nunca nunca tocará na pasta/var/log/diário. Você usará o JournalCTL para qualquer tarefa relacionada ao registro. Não existe uma coisa de rotação de log, tudo é gerenciado pelo tempo da mensagem de log.

Além disso, o número de campos dependerá de quão boa é a integração do Systemd em seu aplicativo. Quanto mais campos uma mensagem de log contém, melhor será. Para serviços de sistema básico, o Systemd já cuidou de fazer uma boa integração, mas para outros aplicativos e serviços, a qualidade da integração varia muito. Normalmente, isso deve melhorar com o tempo, à medida que as pessoas se acostumam a Systemd.

Ok, agora é hora de descobrir os recursos do JournalCTL.

Comandos mais usados ​​para o JournalCTL

O primeiro comando que você pode querer dar uma olhada é o que mostra os troncos do kernel Linux. Sim, o Systemd também lida com o armazenamento dos troncos do kernel, para que você possa obter os troncos de botas anteriores também. Aqui está o comando:

# Journalctl--catalog-lines = 3000-Páger-end "_Transport = kernel"

Ele mostra um pager onde você pode ver as últimas mensagens. Você pode rolar para as últimas 3.000 linhas usando teclas de seta (↑ / ↓) ou página para cima / página para baixo. A bandeira -catalog instrui o JournalCTL a mostrar contexto em torno das linhas de madeira, assim como as reinicializações de computador ou, em outros contextos, uma parada de serviço / partida. Eu sempre coloco essa bandeira como o contexto sempre importa, ajuda a saber em que situação a linha de madeira apareceu, para que você possa adivinhar por que você conseguiu essa linha de madeira.

Agora, talvez você queira ver apenas as linhas de log da inicialização atual:

# Journalctl--catalog-lines = 35000-Pager-end --boot "_transport = kernel"

Observe que o argumento da linha de comando -boot funciona em todas as situações, não apenas com os troncos do kernel. Se você preferir começar do início:

# JournalCtl -Catalog --Boot "_Transport = kernel"

Não sei se é o caso de você, mas tenho troncos suficientes! E que tal ter uma visão geral da sua máquina?

# JournalCtl-Catalog-Lines = 3000-Pager-End

Uau, há muitas coisas acontecendo no seu sistema! Um pouco de filtragem seria útil aqui. Um dos filtros mais utilizados é corresponder a um serviço específico (como o servidor SSH ou o servidor HTTP), o nome do arquivo da unidade Systemd para o serviço SSH é SSHD.Serviço, então:

# JournalCtl-Catalog-lines = 3000-Pager-end --unit = sshd.serviço

Isso é legal, não é? Bem, só é utilizável se você souber o nome do serviço - mas em muitos casos, você não sabe o nome desse serviço. Se você estiver em tal situação, pode querer uma lista dos serviços, suas descrições e seu status:

# systemctl list-units --type = serviço

Ok, esse problema agora está resolvido. Mas às vezes você tem uma mensagem de erro que recebe de um sistema externo como o seu próprio site ou de um aplicativo em sua área de trabalho. Então você provavelmente vai querer pesquisar uma palavra ou frase específica na mensagem de log. Desde Systemd v237, agora é possível.

No JournalCTL, a pesquisa é insensível ao caso se a palavra que você pesquisar estiver em minúsculas em minúsculas. Então, se você pesquisar a porta da palavra, ela também pesquisará a palavra porta com letras capitalizadas. Um exemplo:

# JournalCtl-Catalog-lines = 3000-Pager-end-Grep = "Port"

Agora, se você pesquisar uma palavra como a CPU, ela apenas pesquisará a CPU com todas as cartas capitalizadas, ela não pesquisará a CPU.

# JournalCtl-Catalog-lines = 3000-Pager-end--Grep = "CPU"

Você se lembra da mensagem de erro do sistema externo? Geralmente, essas mensagens contêm um registro de data e hora. Para filtrar a mensagem de log, convém usar esse registro de data e hora. JournalCTL pode listar todas as mensagens de registro desde uma data e hora específicas com o argumento -SENCE:

# JournalCtl--CATALOG--Since = "2018-07-30 09:30:00"

Se esse sistema externo estiver remoto ou estiver usando o Timestamps UTC, você deseja filtrar com base em uma data e hora da UTC e exibição no terminal os timestamps de UTC para que você não precise convertê -lo em sua cabeça, que tende a ser realmente confuso. Para fazer isso, você precisará adicionar UTC após a sequência de tempo no argumento. Você precisará adicionar a bandeira -utc. Então, por exemplo:

# JournalCtl--Catalog ---snce = "2018-07-30 10:45:00 UTC" --utc

Observe que você pode usar a bandeira -utc sozinha, neste caso, basicamente exibirá todas as datas e horários no fuso horário da UTC.

# JournalCtl-Catalog-lines = 3000-Pager-end --utc

Os logs são melhor gerenciados com o JournalCTL

Como você pode ver com todos os comandos anteriores, o SystemD Journaling facilita a filtragem e a depuração mais fácil, pois você pode selecionar todas as linhas de log usando um único comando, JournalCtl. Alguns de vocês provavelmente sabiam os tempos antigos em que teve que abrir manualmente todos os arquivos em /var /log para ter uma idéia geral do problema e do que aconteceu. Com todas as dicas que você aprendeu aqui, você terá ferramentas sólidas para olhar suas mensagens de log da maneira que deseja.