Pesquisa de site

Como usar o comando journalctl para analisar logs no Linux


Guia para iniciantes no uso de comandos journalctl para visualizar, filtrar e analisar logs de diário no Linux.

systemd é o padrão na maioria das principais distribuições Linux. Uma das principais características do systemd é a forma como ele coleta logs e as ferramentas que fornece para analisá-los.

No sistema SysVinit tradicional, você tem syslog que armazena logs em arquivos de texto simples. Ler e analisar esses arquivos requer o uso de find, grep, cut e muitos outros comandos.

O systemd coleta logs de mais fontes do que syslogs, mantém os logs do diário em formato binário e fornece uma ferramenta de linha de comando para ler, analisar e manipular os logs. Isso é mais simplificado que os syslogs.

O que é diário? O que é jornalctl?

journald é o daemon do systemd que coleta os logs de várias fontes de log, como syslog.

journalctl é a ferramenta de linha de comando que permite interagir com os logs do diário.

Com o journalctl, você pode ler logs, monitorar os logs em tempo real, filtrar os logs com base em tempo, serviço, gravidade e outros parâmetros.

Neste tutorial, mostrarei como usar o journalctl para ler, monitorar e analisar os logs no Linux.

Verifique se os logs de diário estão habilitados em seu sistema

Algumas distribuições Linux, especialmente as desktop, não habilitam os logs de diário por padrão.

O local padrão dos logs do journald é o diretório /var/log/journal. Você deve certificar-se de que este diretório existe. Se não, crie você mesmo.

Em seguida, no arquivo /etc/systemd/journald.conf certifique-se de que o valor Storage esteja definido como auto ou persistent.

O arquivo journald.conf mostra os valores padrão. Portanto, mesmo que haja um # na frente das entradas, significa que essas são as configurações padrão usadas. Se você quiser alterar alguma coisa, remova o # dessa linha.

Usando comandos do journalctl

Deixe-me mostrar alguns dos exemplos mais básicos, porém úteis, do comando journalctl.

Leia e pesquise logs com journalctl

Se você apenas digitar journalctl no terminal, os logs do diário serão exibidos em ordem cronológica.

journalctl

journalctl usa less abaixo para mostrar os logs. O que significa que você pode usar as mesmas teclas para mover os logs como faz com o comando less.

Se você não se lembra disso, aqui vai um rápido lembrete:

Arrow

Mover por uma linha

Space

Descer uma página

b

Subir uma página

g

Vá para a primeira linha

G

Vá para a última linha

100g

Vá para a centésima linha

/string

Procure a string da posição atual

n/N

Ir para a correspondência de pesquisa seguinte ou anterior

q

Saia dos registros

Se você não deseja que os logs sejam exibidos em um modo de visualização menos semelhante, você pode usar o sinalizador --no-pager. Isso exibirá logs inteiros diretamente na tela.

journalctl --no-pager

Isso não é muito útil e inundará sua tela se você tiver uma grande quantidade de logs.

Mostrar registros em ordem cronológica inversa

Como você percebeu, os logs são mostrados em ordem cronológica. Isso significa que os registros armazenados mais antigos são exibidos primeiro.

Se quiser ver os logs recentes primeiro, você pode exibir os logs do diário na ordem inversa com a opção -r:

journalctl -r

Ele ainda usa um comando menos como view. Então, pressione q para sair do modo de visualização de log.

Exibir apenas N linhas recentes de registros de diário

Em vez de mostrar todos os logs, você pode optar por exibir apenas um certo número de linhas do log usando a opção -n.

Por exemplo, o comando abaixo exibirá as 25 linhas mais recentes dos logs:

journalctl -n 25

Mostrar registros do diário em tempo real

Visualizar logs recentes é uma coisa, se você quiser ver os logs em tempo real, você pode usar a opção -f do comando journalctl:

journalctl -f

Assim como a opção -f do comando tail, isso exibirá os logs em tempo real no modo follow.

Use o comando Ctrl+C para sair da visualização em tempo real.

Exibir logs no horário UTC

Por padrão, os logs do diário são mostrados na hora local do seu sistema. Se a hora do seu sistema estiver definida para um horário diferente de UTC e você quiser ver os logs em UTC, você pode fazer isso usando o sinalizador --utc.

journalctl --utc

Mostrar apenas mensagens do kernel com -k

O diário do systemd acumula logs de diferentes fontes. Se você quiser apenas ver os logs do kernel Linux, você pode usar a opção -k.

journalctl -k

Dica: use sudo para ver todos os registros do diário

O Systemd protege que tipo de log mostrar para qual usuário.

Pode mostrar alguns logs, mas não todos os logs se você for um usuário regular:

abhishek@linux-console:~$ journalctl -u ssh
Hint: You are currently not seeing messages from other users and the system.
      Users in groups 'adm', 'systemd-journal' can see all messages.
      Pass -q to turn off this notice.
-- Logs begin at Mon 2020-06-22 12:05:47 UTC, end at Tue 2020-07-14 11:59:29 UTC. --
-- No entries --

Se quiser acessar todos os logs, você deve usar sudo se for um usuário sudo:

sudo journalctl -u ssh

Mostrar mensagens de uma sessão de inicialização específica

Este é um excelente recurso do jounrald. O comando journalctl permite acessar logs pertencentes a uma sessão de inicialização específica usando a opção -b.

Você pode listar todas as sessões de inicialização com o sinalizador --list-boots.

journalctl --list-boots

A saída mostrará as sessões de inicialização com o tempo de inicialização e um número inteiro atribuído às sessões de inicialização:

  -5 513008ead8464c23aab732a2feed5277 Sun 2020-07-12 20:43:38 IST—Sun 2020-07-12 22:40:02 IST
  -4 caff16e3f46a4479b5287fb9e294f610 Mon 2020-07-13 07:36:04 IST—Mon 2020-07-13 19:13:44 IST
  -3 5665f41cc50a4dec9955efacc2596d68 Mon 2020-07-13 20:30:55 IST—Mon 2020-07-13 22:20:34 IST
  -2 c7d17407b0bd476a930af503f64b6006 Tue 2020-07-14 07:58:41 IST—Tue 2020-07-14 18:50:04 IST
  -1 7ab5e04518ec455abe0e2c86fdaa46fa Tue 2020-07-14 21:19:27 IST—Tue 2020-07-14 22:42:11 IST
   0 91856e86d4ee4e828717913deb288568 Wed 2020-07-15 08:11:51 IST—Wed 2020-07-15 17:14:10 IST

A sessão de inicialização 0 são as sessões de inicialização atuais. Sessão de inicialização -1 é a última sessão inicializada e assim por diante.

journalctl -b -2

Imagine tentar fazer isso no antigo sistema syslog!

Você não pode apenas obter os logs de inicialização como os que você vê em /var/log/boot.log. No entanto, os logs de inicialização estarão sempre no início dos logs se você estiver na visualização da sessão de inicialização.

Filtrar logs de diário para um serviço systemd específico

A filtragem é um ponto forte dos logs de diário. Você pode filtrar logs com base nos serviços do systemd.

journalctl -u service_name

Por exemplo, se quiser ver os logs gerados por SSH, você pode usá-lo assim:

journalctl -u ssh

Você precisará saber o nome do serviço systemd, é claro.

Filtrar logs por um determinado intervalo de tempo

Este é outro exemplo da capacidade de filtragem de strings dos logs do diário. Você pode filtrar logs por um determinado período de tempo e há várias maneiras de fazer isso.

Você pode usar linguagem natural para filtrar os logs. Termos como ontem, hoje e amanhã são reconhecidos.

journalctl --since=yesterday --until=now

Você também pode especificar a combinação de data ou hora:

journalctl --since "2020-07-10"

Você também pode especificar um período de tempo com as datas e horas:

journalctl --since "2020-07-10 15:10:00" --until "2020-07-12"

O horário começa às 00:00:00 e determina o dia e a data.

Você também pode usar um tempo relativo como -1h20min para especificar 1 hora e 20 minutos no passado.

Filtrar logs com base em UID, GID e PID

Se você estiver depurando um problema, poderá verificar os logs de um determinado processo usando seu PID.

Os logs do diário também podem ser filtrados por ID do usuário (UID), ID do grupo (GID) e ID do processo (PID). Abaixo está um exemplo:

journalctl _PID=1234

Dica: Combine mais de uma opção para uma visualização de registro mais personalizada

Você pode combinar várias opções para visualizar os logs desejados.

Por exemplo, se quiser ver apenas os logs SSH de ontem em carimbos de data/hora UTC, você pode usar:

sudo journalctl -u ssh --since=yesterday --utc

Outro uso comum é filtrar logs com base em sessões de inicialização. Se quiser ver apenas os logs SSH na sessão atual, você pode usar:

sudo journalctl -u ssh -b0

As possibilidades são infinitas e você pode combinar as opções de acordo com sua necessidade.

Usando journalctl -xe para visualizar os últimos logs

Freqüentemente, você encontrará pessoas sugerindo o uso do comando journalctl -xe.

  • -e: vai para o final dos logs do diário

  • -x: Mostra informações extras nas entradas de log (se disponíveis)

Algumas entradas de log possuem informações adicionais que não são exibidas na visualização normal do log. Usar a opção -x pode exibir tais informações.

O que você vê como uma única linha como esta:

Jul 09 16:33:40 linux-console systemd[1]: Started Run anacron jobs.

Poderia exibir mais informações como esta:

Jul 09 16:33:40 linux-console systemd[1]: Started Run anacron jobs.
-- Subject: A start job for unit anacron.service has finished successfully
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- A start job for unit anacron.service has finished successfully.
-- 
-- The job identifier is 3702.

As informações adicionais ajudam a explicar o contexto de um erro ou evento de log e as possíveis soluções.

Mostrar apenas erros em logs com journalctl

Para mostrar todos os erros na sessão atual, você pode usar:

journalctl -p 3 -xb
  • -p 3: filtra logs para prioridade 3 (que é erro)

  • -x: fornece informações adicionais sobre o log (se disponível)

  • b: desde a última inicialização (que é a sessão atual)

Você também pode usar outro nível de prioridade para obter logs de depuração, aviso ou até mesmo de nível crítico. Esta tabela lista todos os níveis de prioridade.

0

emergir

1

alerta

2

crítico

3

errar

4

aviso

5

perceber

6

informações

7

depurar

Você também pode exibir logs para uma faixa de gravidade. Por exemplo, se quiser ver todos os logs de avisos, avisos e informações da sessão atual, você pode usar:

journalctl -p 4..6 -b0

Você também poderia ter usado warning..info no comando acima em vez de 4..6.

Verifique quanto espaço em disco os logs estão ocupando

O diário coleta logs de várias fontes e armazena logs de vários níveis, incluindo logs de depuração. Acredite em mim, embora a retenção de logs ajude na análise e auditoria, eles podem ocupar uma quantidade considerável de espaço em disco.

Você pode verificar quanto espaço em disco os logs do diário estão ocupando com este comando journalctl:

journalctl --disk-usage

Você pode ter uma surpresa (ou um choque) ao ver o resultado:

abhishek@linux-console:~$ journalctl --disk-usage 
Archived and active journals take up 2.8G in the file system.

2,8 GB? Isso é muito. Você pode querer limpar os logs do diário.

Aproveite a análise de log com o comando journalctl

Existem muito mais opções e uso do comando journalctl e não posso cobrir todas elas. Eu recomendo a leitura de sua página de manual se você quiser mais detalhes sobre ela.

Acredito que lhe dei o suficiente para usar o comando journalctl para análise regular de log. Espero que gostem deste tutorial detalhado sobre o Journald.

Se você tiver sugestões ou dúvidas, não hesite em deixar um comentário.

Artigos relacionados: