One place for hosting & domains

      journalctl

      Como usar o Journalctl para visualizar e manipular registros do systemd


      Introdução

      Algumas das vantagens mais interessantes do systemd são aquelas envolvidas com o registro de processos e do sistema. Ao usar outros sistemas, os registros ficam geralmente dispersos, e são manuseados por daemons e processos diferentes. Isso torna a interpretação deles bastante difícil quando englobam vários aplicativos. O systemd tenta resolver esses problemas fornecendo uma solução de gerenciamento centralizada para registrar todos os processos do kernel e do userland. O sistema que coleta e gerencia esses registros é conhecido como journal (diário).

      O diário é implementado com o daemon journald, que manuseia todas as mensagens produzidas pelo kernel, initrd, serviços etc. Neste guia, vamos discutir como utilizar o utilitário journalctl, que pode ser usado para acessar e manipular os dados mantidos dentro do diário.

      Ideal geral

      Um dos motivos da existência do diário do systemd é o de centralizar o gerenciamento de registros independentemente de onde as mensagens estão sendo originadas. Como uma grande parte do processo de inicialização do sistema e gerenciamento de serviços é manuseada pelo processo systemd, faz sentido padronizar a maneira como os registros são coletados e acessados. O daemon journald coleta dados de todas as fontes disponíveis e os armazena em um formato binário para uma manipulação fácil e dinâmica.

      Isso nos dá várias vantagens significativas. Ao interagir com os dados usando um único utilitário, os administradores são capazes de exibir dinamicamente dados de registro de acordo com suas necessidades. Isso pode ser algo simples como visualizar os dados de inicialização de três inicializações de sistema atrás ou combinar as entradas de registro sequencialmente de dois serviços relacionados para consertar um problema de comunicação.

      Armazenar os dados de registro em um formato binário também faz com que eles possam ser exibidos em formatos de saída arbitrários, dependendo da sua necessidade naquele momento. Por exemplo, para o gerenciamento de registros diários, você pode estar acostumado a visualizar os registros no formato syslog padrão. No entanto, se você quiser representar interrupções de serviço em gráficos mais tarde, é possível gerar um objeto JSON para cada entrada para que seja consumível pelo seu serviço de criação de gráficos. Como os dados não são escritos no disco em texto simples, nenhuma conversão é necessária quando houver a demanda por um formato diferente.

      O diário do systemd pode ser usado com uma implementação do syslog existente, ou pode substituir a funcionalidade syslog, dependendo das suas necessidades. Embora o diário do systemd atenda a maioria das necessidades de registro de administrador, ele também pode complementar mecanismos de registro existentes. Por exemplo, pode ser que você tenha um servidor syslog centralizado que usa para compilar dados de vários servidores, mas também queira intercalar os registros de vários serviços em um único sistema com o diário do systemd. É possível fazer as duas coisas combinando essas tecnologias.

      Configurando o horário do sistema

      Um dos benefícios do uso de um diário binário para registro é a capacidade de visualizar registros em UTC ou em seu horário local à vontade. Por padrão, o systemd irá exibir resultados no horário local.

      Por conta disso, antes de começarmos com o diário, vamos garantir que o fuso horário esteja configurado corretamente. O pacote do systemd vem com uma ferramenta chamada timedatectl que pode ajudar com isso.

      Primeiramente, consulte quais fusos horários estão disponíveis com a opção list-timezones:

      timedatectl list-timezones
      

      Isso irá listar os fusos horários disponíveis no seu sistema. Depois de encontrar aquele que corresponde ao local do seu servidor, defina-o usando a opção set-timezone:

      sudo timedatectl set-timezone zone
      

      Para garantir que sua máquina esteja usando o horário correto neste momento, use o comando timedatectl sozinho, ou com a opção status. O resultado será o mesmo:

      timedatectl status
      
            Local time: Thu 2015-02-05 14:08:06 EST
        Universal time: Thu 2015-02-05 19:08:06 UTC
              RTC time: Thu 2015-02-05 19:08:06
             Time zone: America/New_York (EST, -0500)
           NTP enabled: no
      NTP synchronized: no
       RTC in local TZ: no
            DST active: n/a
      

      A primeira linha deve exibir o horário correto.

      Visualização básica de registros

      Para ver os registros que o daemon do journald coletou, use o comando journalctl.

      Quando usado sozinho, todas as entradas no diário que estão no sistema serão exibidas dentro de um pager (geralmente less (menos)) para você navegar. As entradas mais antigas estarão no topo:

      journalctl
      
      -- Logs begin at Tue 2015-02-03 21:48:52 UTC, end at Tue 2015-02-03 22:29:38 UTC. --
      Feb 03 21:48:52 localhost.localdomain systemd-journal[243]: Runtime journal is using 6.2M (max allowed 49.
      Feb 03 21:48:52 localhost.localdomain systemd-journal[243]: Runtime journal is using 6.2M (max allowed 49.
      Feb 03 21:48:52 localhost.localdomain systemd-journald[139]: Received SIGTERM from PID 1 (systemd).
      Feb 03 21:48:52 localhost.localdomain kernel: audit: type=1404 audit(1423000132.274:2): enforcing=1 old_en
      Feb 03 21:48:52 localhost.localdomain kernel: SELinux: 2048 avtab hash slots, 104131 rules.
      Feb 03 21:48:52 localhost.localdomain kernel: SELinux: 2048 avtab hash slots, 104131 rules.
      Feb 03 21:48:52 localhost.localdomain kernel: input: ImExPS/2 Generic Explorer Mouse as /devices/platform/
      Feb 03 21:48:52 localhost.localdomain kernel: SELinux:  8 users, 102 roles, 4976 types, 294 bools, 1 sens,
      Feb 03 21:48:52 localhost.localdomain kernel: SELinux:  83 classes, 104131 rules
      
      . . .
      

      É provável que você tenha páginas e páginas de dados para percorrer, que podem ser dezenas ou centenas de milhares de linhas se o systemd estiver em seu sistema há bastante tempo. Isso demonstra a quantidade de dados que está disponível no banco de dados do diário.

      O formato será conhecido por aqueles que estão acostumados com o registro padrão do syslog. No entanto, este processo coleta dados de mais fontes do que as implementações tradicionais do syslog são capazes de fazer. Ele inclui registros do processo de inicialização inicial, do kernel, do initrd e do erro padrão de aplicativo e mais. Todos eles estão disponíveis no diário.

      Note que todos os carimbos de data/hora estão sendo exibidos no horário local. Isso está disponível para toda entrada de registro agora que temos nosso horário local configurado corretamente em nosso sistema. Todos os registros são exibidos usando essas novas informações.

      Se quiser exibir os carimbos de data/hora em UTC, use o sinalizador --utc:

      journalctl --utc
      

      Filtrar o diário pela hora

      Embora ter acesso a uma grande coleção de dados seja definitivamente útil, essa grande quantidade de informações pode ser difícil ou impossível de ser inspecionada e processada mentalmente. Por conta disso, uma das características mais importantes do journalctl é suas opções de filtragem.

      Exibir registros da inicialização atual

      A opção mais básica existente que pode ser usada diariamente, é o sinalizador -b. Ele irá mostrar todas as entradas do diário que foram coletadas desde a reinicialização mais recente.

      journalctl -b
      

      Isso ajudará você a identificar e gerenciar informações pertinentes ao seu ambiente atual.

      Nos casos em que você não estiver usando esse recurso e estiver exibindo mais de um dia de inicializações, verá que o journalctl insere uma linha que se parece com esta, sempre que o sistema foi desligado:

      . . .
      
      -- Reboot --
      
      . . .
      

      Isso pode ser usado para ajudar a separar as informações em sessões de inicialização de maneira lógica.

      Inicializações passadas

      Embora seja comum querer exibir as informações da inicialização atual, certamente existem momentos em que as inicializações passadas também podem ser úteis. O diário pode salvar informações de várias inicializações anteriores, de modo que o journalctl pode ser usado para exibir essas informações facilmente.

      Algumas distribuições habilitam o salvamento de informações de inicializações anteriores por padrão, enquanto outras desativam esse recurso. Para habilitar as informações de inicialização persistentes, crie o diretório para armazenar o diário digitando:

      • sudo mkdir -p /var/log/journal

      Ou edite o arquivo de configuração do diário:

      • sudo nano /etc/systemd/journald.conf

      Na seção [Journal], defina a opção Storage= como “persistent” para habilitar o registro persistente:

      /etc/systemd/journald.conf

      . . .
      [Journal]
      Storage=persistent
      

      Quando o salvamento de inicializações anteriores está habilitado no seu servidor, o journalctl fornece alguns comandos para ajudar a trabalhar com as inicializações como uma unidade de divisão. Para ver as inicializações das quais o journald tem conhecimento, use a opção --list-boots com o journalctl:

      journalctl --list-boots
      
      -2 caf0524a1d394ce0bdbcff75b94444fe Tue 2015-02-03 21:48:52 UTC—Tue 2015-02-03 22:17:00 UTC
      -1 13883d180dc0420db0abcb5fa26d6198 Tue 2015-02-03 22:17:03 UTC—Tue 2015-02-03 22:19:08 UTC
       0 bed718b17a73415fade0e4e7f4bea609 Tue 2015-02-03 22:19:12 UTC—Tue 2015-02-03 23:01:01 UTC
      

      Isso irá exibir uma linha para cada inicialização. A primeira coluna é o deslocamento da inicialização em relação à atual que pode ser usado para identificá-la com facilidade com o journalctl. Se precisar de uma referência absoluta, o ID de inicialização está na segunda coluna. É possível identificar o tempo da sessão com as duas especificações de data/hora no final da linha.

      Para exibir informações dessas inicializações, use as informações da primeira ou segunda coluna.

      Por exemplo, para ver o diário da inicialização anterior, use o ponteiro relativo -1 com o sinalizador -b:

      journalctl -b -1
      

      Também é possível usar o ID de inicialização para retornar os dados de uma inicialização específica:

      journalctl -b caf0524a1d394ce0bdbcff75b94444fe
      

      Intervalos de tempo

      Embora a visualização de entradas de registro com base na inicialização seja incrivelmente útil, muitas vezes é desejável solicitar intervalos de tempo que não se alinham com as inicializações do sistema. Isso pode ser especialmente válido ao lidar com servidores de execução prolongada com um tempo de atividade significativo.

      É possível filtrar por limites arbitrários de data/hora usando as opções --since e --until, que restringem as entradas exibidas a aquelas que sucedem ou antecedem um determinado tempo, respectivamente.

      Os valores de data/hora podem ser usados em uma variedade de formatos. Para valores de data/hora absolutos, use o seguinte formato:

      YYYY-MM-DD HH:MM:SS
      

      Por exemplo, podemos ver todas as entradas desde 10 de janeiro de 2015 às 5:15 PM digitando:

      journalctl --since "2015-01-10 17:15:00"
      

      Se algum componente do formato acima for deixado de fora, o padrão será aplicado. Por exemplo, se a data for omitida, a data atual será empregada. Se o componente de hora estiver faltando, “00:00:00” (meia-noite) será utilizado. O campo de segundos também pode ser deixado de fora e o padrão “00” é empregado:

      journalctl --since "2015-01-10" --until "2015-01-11 03:00"
      

      O diário também compreende alguns valores relativos e seus atalhos nomeados. Por exemplo, é possível usar as palavras “yesterday” (ontem), “today” (hoje), “tomorrow” (amanhã) ou “now” (agora). É possível criar datas/horas relativas prefixando “-” ou “+” a um valor numerado ou usando palavras como “ago” (atrás) em uma construção de sentenças.

      Para obter os dados de ontem, pode-se digitar:

      journalctl --since yesterday
      

      Se tiver recebido relatórios de uma interrupção de serviço iniciada às 9:00 AM que durou até uma hora atrás, você pode digitar:

      journalctl --since 09:00 --until "1 hour ago"
      

      Como se vê, é relativamente fácil definir intervalos flexíveis de tempo para filtrar as entradas que você deseja visualizar.

      Filtrar por interesse de mensagens

      Aprendemos acima algumas maneiras de filtrar os dados do diário usando restrições de tempo. Nesta seção, vamos discutir como filtrar com base em qual serviço ou componente você está interessado. O diário do systemd oferece diversas maneiras de fazer isso.

      Por unidade

      Talvez a maneira mais útil de filtrar seja pela unidade na qual você está interessado. Podemos usar a opção -u para filtrar dessa maneira.

      Por exemplo, para ver todos os registros de uma unidade Nginx em nosso sistema, digitamos:

      journalctl -u nginx.service
      

      Normalmente, também seria interessante filtrar pela data/hora para exibir as linhas nas quais você está interessado. Por exemplo, para verificar como o serviço está funcionando hoje, digite:

      journalctl -u nginx.service --since today
      

      Esse tipo de foco torna-se extremamente útil quando se aproveita da capacidade do diário de intercalar os registros de várias unidades. Por exemplo, se seu processo Nginx estiver conectado a uma unidade PHP-FPM para processar conteúdo dinâmico, é possível fundir as entradas de ambos em ordem cronológica especificando ambas as unidades:

      journalctl -u nginx.service -u php-fpm.service --since today
      

      Isso pode facilitar a detecção de interações entre diferentes programas e sistemas de depuração, em vez de processos individuais.

      Por processo, usuário ou ID de grupo

      Alguns serviços geram uma variedade de processos filhos para funcionar. Se você tiver pesquisado o PID exato do processo em que está interessado, também é possível filtrar por ele.

      Para fazer isso, especificamos o campo _PID. Por exemplo, se o PID em que estivermos interessados for 8088, digitamos:

      journalctl _PID=8088
      

      Em outros momentos, pode ser desejável exibir todas as entradas registradas a partir de um usuário ou grupo específico. Isso pode ser feito com os filtros _UID ou _GID. Por exemplo, se seu servidor Web estiver sendo executado sob o usuário www-data, é possível encontrar o ID do usuário digitando:

      id -u www-data
      
      33
      

      Depois disso, use o ID retornado para filtrar os resultados do diário:

      journalctl _UID=33 --since today
      

      O diário do systemd possui muitos campos que podem ser usados para a filtragem. Alguns deles são passados do processo que está sendo registrado e alguns são aplicados pelo journald usando informações que ele coleta do sistema no momento do registro.

      O sublinhado inicial indica que o campo _PID pertence ao segundo tipo. O diário registra e classifica automaticamente o PID do processo que está sendo registrado para a filtragem posterior. É possível descobrir todos os campos de diário disponíveis digitando:

      man systemd.journal-fields
      

      Vamos discutir alguns deles neste guia. Por enquanto, vamos analisar mais uma opção útil relacionada com a filtragem por esses campos. A opção -F pode ser usada para mostrar todos os valores disponíveis para um campo de diário específico.

      Por exemplo, para ver quais entradas para IDs de grupo o diário do systemd possui, digite:

      journalctl -F _GID
      
      32
      99
      102
      133
      81
      84
      100
      0
      124
      87
      

      Isso irá mostrar todos os valores que o diário armazenou para o campo ID de grupo. Isso pode ajudar a construir seus filtros.

      Por caminho de componente

      Também podemos filtrar fornecendo um caminho de pesquisa.

      Se o caminho levar a um executável, o journalctl irá exibir todas as entradas relacionadas ao executável em questão. Por exemplo, para encontrar essas entradas que estão relacionadas ao executável bash, digite:

      journalctl /usr/bin/bash
      

      Normalmente, se uma unidade estiver disponível para o executável, esse método é mais organizado e fornece informações mais completas (entradas de processos filhos associados, etc). Às vezes, no entanto, isso não é possível.

      Exibir mensagens de kernel

      As mensagens de kernel, que são aquelas geralmente encontradas na saída do dmesg, também podem ser recuperadas do diário.

      Para exibir apenas essas mensagens, podemos adicionar os sinalizadores -k ou --dmesg ao nosso comando:

      journalctl -k
      

      Por padrão, isso irá exibir as mensagens do kernel da inicialização atual. É possível especificar uma outra inicialização usando os sinalizadores de seleção de inicialização discutidos anteriormente. Por exemplo, para obter as mensagens de cinco inicializações atrás, digite:

      journalctl -k -b -5
      

      Por prioridade

      Um filtro no qual os administradores de sistema estão geralmente interessados é a prioridade de mensagem. Embora seja muitas vezes útil registrar informações em um nível bastante detalhado, ao resumir as informações disponíveis, o registro de baixa prioridade pode ser confuso.

      É possível usar o journalctl para exibir apenas mensagens de uma prioridade especificada ou superior usando a opção -p. Isso permite filtrar mensagens com níveis de prioridade inferiores.

      Por exemplo, para mostrar apenas entradas registradas no nível de erro ou acima, digite:

      journalctl -p err -b
      

      Isso irá exibir todas as mensagens marcadas como erro, crítico, alerta ou emergência. O diário implementa os níveis de mensagem padrão do syslog. É possível usar o nome da prioridade ou seu valor numérico correspondente. As prioridades, ordenadas da maior para a menor, são:

      • 0: emerg
      • 1: alert
      • 2: crit
      • 3: err
      • 4: warning
      • 5: notice
      • 6: info
      • 7: debug

      Os números ou nomes acima podem ser usados de maneira intercambiável com a -p opção. A seleção de uma prioridade irá exibir mensagens marcadas no nível especificado e acima.

      Modificar a exibição do diário

      Acima, demonstramos a seleção de entradas através da filtragem. No entanto, existem outras maneiras com as quais podemos modificar o resultado. Podemos ajustar a exibição do journalctl para atender diversas necessidades.

      Truncar ou expandir o resultado

      Podemos ajustar como o journalctl exibe os dados, dizendo-lhe para reduzir ou expandir o resultado.

      Por padrão, o journalctl irá mostrar a entrada inteira no pager, permitindo que as entradas se expandam à direita da tela. Essa informação pode ser acessada pressionando a tecla de seta para a direita.

      Se preferir o resultado truncado, inserindo reticências onde as informações foram removidas, use a opção --no-full:

      journalctl --no-full
      
      . . .
      
      Feb 04 20:54:13 journalme sshd[937]: Failed password for root from 83.234.207.60...h2
      Feb 04 20:54:13 journalme sshd[937]: Connection closed by 83.234.207.60 [preauth]
      Feb 04 20:54:13 journalme sshd[937]: PAM 2 more authentication failures; logname...ot
      

      Também é possível ir na direção oposta e dizer ao journalctl para exibir todas as suas informações, mesmo se forem incluídos caracteres não imprimíveis. Podemos fazer isso com o sinalizador -a:

      journalctl -a
      

      Resultados em formato padrão

      Por padrão, o journalctl exibe o resultado em um pager para um consumo mais simples. No entanto, se você estiver planejando processar os dados com ferramentas de manipulação de texto, irá querer ser capaz de gerar resultados no formato padrão.

      Faça isso com a opção --no-pager:

      journalctl --no-pager
      

      Isso pode ser canalizado imediatamente em um utilitário de processamento ou redirecionado para um arquivo no disco, dependendo das suas necessidades.

      Formatos de saída

      Se você estiver processando entradas de diário, como mencionado acima, provavelmente será mais fácil analisar os dados se eles estiverem em um formato mais consumível. Felizmente, o diário pode ser exibido em uma variedade de formatos conforme a necessidade. Faça isso usando a opção -o com um especificador de formato.

      Por exemplo, gere um arquivo JSON a partir de entradas no diário digitando:

      journalctl -b -u nginx -o json
      
      { "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635", "__REALTIME_TIMESTAMP" : "1422990364739502", "__MONOTONIC_TIMESTAMP" : "27200938", "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d", "PRIORITY" : "6", "_UID" : "0", "_GID" : "0", "_CAP_EFFECTIVE" : "3fffffffff", "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee", "_HOSTNAME" : "desktop", "SYSLOG_FACILITY" : "3", "CODE_FILE" : "src/core/unit.c", "CODE_LINE" : "1402", "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading", "SYSLOG_IDENTIFIER" : "systemd", "MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5", "_TRANSPORT" : "journal", "_PID" : "1", "_COMM" : "systemd", "_EXE" : "/usr/lib/systemd/systemd", "_CMDLINE" : "/usr/lib/systemd/systemd", "_SYSTEMD_CGROUP" : "/", "UNIT" : "nginx.service", "MESSAGE" : "Starting A high performance web server and a reverse proxy server...", "_SOURCE_REALTIME_TIMESTAMP" : "1422990364737973" }
      
      . . .
      

      Isso é útil para análise com utilitários. Você poderia usar o formato json-pretty para ter uma melhor ideia melhor da estrutura de dados antes de passá-lo para o consumidor de JSON:

      journalctl -b -u nginx -o json-pretty
      
      {
          "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635",
          "__REALTIME_TIMESTAMP" : "1422990364739502",
          "__MONOTONIC_TIMESTAMP" : "27200938",
          "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d",
          "PRIORITY" : "6",
          "_UID" : "0",
          "_GID" : "0",
          "_CAP_EFFECTIVE" : "3fffffffff",
          "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee",
          "_HOSTNAME" : "desktop",
          "SYSLOG_FACILITY" : "3",
          "CODE_FILE" : "src/core/unit.c",
          "CODE_LINE" : "1402",
          "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading",
          "SYSLOG_IDENTIFIER" : "systemd",
          "MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5",
          "_TRANSPORT" : "journal",
          "_PID" : "1",
          "_COMM" : "systemd",
          "_EXE" : "/usr/lib/systemd/systemd",
          "_CMDLINE" : "/usr/lib/systemd/systemd",
          "_SYSTEMD_CGROUP" : "/",
          "UNIT" : "nginx.service",
          "MESSAGE" : "Starting A high performance web server and a reverse proxy server...",
          "_SOURCE_REALTIME_TIMESTAMP" : "1422990364737973"
      }
      
      . . .
      

      Os formatos a seguir podem ser usados para exibição:

      • cat: exibe apenas o campo de mensagem em si.
      • export: um formato binário adequado para transferir e fazer um backup.
      • json: JSON padrão com uma entrada por linha.
      • json-pretty: JSON formatado para uma melhor legibilidade humana
      • json-sse: saída formatada em JSON agrupada para tornar um evento enviado ao servidor compatível
      • short: o estilo de saída padrão do syslog
      • short-iso: o formato padrão aumentado para mostrar as carimbos de data/hora da ISO 8601.
      • short-monotonic: o formato padrão com carimbos de data/hora monotônicos.
      • short-precise: o formato padrão com precisão de microssegundos
      • verbose: exibe todas os campos de diário disponíveis para a entrada, incluindo aqueles que geralmente estão escondidos internamente.

      Essas opções permitem exibir as entradas do diário no formato que melhor atende às suas necessidades atuais.

      Monitoramento de processo ativo

      O comando journalctl imita a forma como muitos administradores usam tail para monitorar atividades ativas ou recentes. Essa funcionalidade está embutida no journalctl, permitindo acessar esses recursos sem precisar utilizar uma outra ferramenta.

      Exibir registros recentes

      Para exibir uma quantidade definida de registros, use a opção -n, que funciona exatamente como tail -n.

      Por padrão, ele irá exibir as 10 entradas mais recentes:

      journalctl -n
      

      Especifique o número de entradas que quer ver com um número após o -n:

      journalctl -n 20
      

      Acompanhar registros

      Para acompanhar ativamente os registros à medida que são escritos, use o sinalizador -f. Novamente, isso funciona como o esperado, caso você tenha experiência usando o tail -f:

      journalctl -f
      

      Manutenção do diário

      Você deve estar se perguntando sobre o custo do armazenamento de todos os dados que vimos até agora. Além disso, você pode estar interessado em limpar alguns registros mais antigos e liberar o espaço.

      Descobrir o uso atual em disco

      É possível descobrir a quantidade de espaço que diário está ocupando no disco usando o sinalizador --disk-usage:

      journalctl --disk-usage
      
      Journals take up 8.0M on disk.
      

      Deletar registros antigos

      Se quiser reduzir o tamanho do seu diário, você pode fazer isso de duas maneiras diferentes (disponível com a versão 218 do systemd ou superior).

      Usando a opção --vacuum-size, você pode reduzir o tamanho do diário indicando um tamanho. Isso irá remover entradas antigas até o espaço total que o diário ocupa em disco esteja no tamanho solicitado:

      sudo journalctl --vacuum-size=1G
      

      Outra maneira para reduzir o tamanho do diário é fornecendo um tempo de corte com a opção --vacuum-time. Todas as entradas além daquele momento são excluídas. Isso permite manter as entradas que foram criadas após um tempo específico.

      Por exemplo, para manter as entradas do último ano, digite:

      sudo journalctl --vacuum-time=1years
      

      Limitar a expansão do diário

      É possível configurar seu servidor para colocar limites sobre a quantidade de espaço que diário pode ocupar. Isso pode ser feito editando o arquivo /etc/systemd/journald.conf.

      Os itens a seguir podem ser usados para limitar o crescimento do diário:

      • SystemMaxUse=: especifica o espaço máximo em disco que pode ser usado pelo diário em armazenamento persistente.
      • SystemKeepFree=: especifica a quantidade de espaço que o diário deve deixar livre no armazenamento persistente ao adicionar entradas.
      • SystemMaxFileSize=: controla o tamanho máximo até o qual os arquivos de diário individuais podem crescer em armazenamento persistente antes de serem girados.
      • RuntimeMaxUse=: especifica o espaço máximo em disco que pode ser usado como armazenamento volátil (dentro do sistema de arquivos /run).
      • RuntimeKeepFree=: especifica a quantidade de espaço a ser reservada para outros usos ao escrever dados no armazenamento volátil (dentro do sistema de arquivos /run).
      • RuntimeMaxFileSize=: especifica a quantidade de espaço que um arquivo de diário individual pode ocupar em armazenamento volátil (dentro do sistema de arquivos /run) antes de ser girado.

      Ao definir esses valores, você pode controlar como o journald consome e preserva o espaço no seu servidor. Tenha em mente que o SystemMaxFileSize e o RuntimeMaxFileSize irão mirar em arquivos arquivados para alcançar os limites declarados. Isso é importante de lembrar ao interpretar contagens de arquivos após uma operação de limpeza.

      Conclusão

      Como foi visto, o diário do systemd é incrivelmente útil para coletar e gerenciar seus dados de sistema e de aplicativo. A maior parte da sua flexibilidade vem da grande quantidade de metadados que são registrados automaticamente e da natureza centralizada do registro. O comando journalctl torna mais fácil aproveitar as funcionalidades avançadas do diário e fazer análises extensas e depuração relacional de diferentes componentes de aplicativos.



      Source link

      Использование Journalctl для просмотра журналов Systemd и выполнения операций с ними


      Введение

      Некоторые из наиболее привлекательных преимуществ systemd связаны с ведением журналов процессов и системных событий. При использовании других систем журналы обычно распределяются по разным местам, обрабатываются различными демонами и инструментами, и их бывает сложно интерпретировать, когда они работают с несколькими приложениями. Systemd пытается устранить эти сложности, предоставляя решение централизованного управления для регистрации всех процессов ядра и пользовательской области. Система, собирающая эти журналы и управляющая ими, называется журнальной системой.

      Журнальная система реализована в форме демона journald, который обрабатывает все сообщения ядра, initrd, служб и т. д. В этом учебном руководстве мы покажем, как использовать утилиту journalctl для доступа данными в журнале и управления этими данными.

      Общая идея

      Одна из целей журнальной системы systemd заключается в централизации управления журналами вне зависимости от источника сообщений. Поскольку существенная часть процесса загрузки и управления службами выполняется процессом systemd, имеет смысл стандартизировать сбор данных для журналов и доступ к ним. Демон journald собирает данные из всех доступных источников и сохраняет их в двоичном формате для удобного и динамичного управления ими.

      Это дает нам ряд существенных преимуществ. Взаимодействуя с данными через одну утилиту, администраторы могут динамически выводить данные журнала в соответствии с их потребностями. Это могут быть как простые задачи, такие как просмотр данных предыдущей загрузки системы, так и более сложные задачи, например, комбинирование записей журналов двух связанных служб для устранения коммуникационной проблемы.

      Хранение данных журнала в двоичном формате также означает, что данные можно отображать в произвольном виде в зависимости от того, что требуется в текущий момент. Например, для каждодневного управления журналами вы можете использовать стандартный формат syslog, но если вы захотите составить график перебоев в работе служб, вы можете вывести все записи в формате объектов JSON для экспорта в приложение составления графиков. Поскольку данные не записываются на диск в формате обычного текста, их не нужно будет конвертировать, если вам потребуется другой формат вывода.

      Журнальную систему systemd можно использовать вместе с существующей реализацией syslog, или в качестве функциональной замены syslog, если вам это потребуется. Хотя журнальная система systemd способна удовлетворить большинство потребностей администратора, ее также можно использовать в качестве дополнения к существующим механизмам ведения журнала. Например, вы можете использовать централизованный сервер syslog для компиляции данных с нескольких серверов, но при этом также чередовать журналы нескольких служб одной системы с журналом systemd. Объединив эти технологии, вы можете выполнить обе задачи.

      Настройка времени системы

      Одно из преимуществ использования двоичного журнала заключается в возможности просмотра записей журнала как с локальным временем, так и с временем по Гринвичу (UTC). По умолчанию systemd использует для отображения результатов локальное время.

      В связи с этим, прежде чем мы начнем работу с журналом, нам нужно будет убедиться, что часовой пояс настроен правильно. Пакет systemd включает инструмент timedatectl, который может помочь с этой задачей.

      Прежде всего, нужно использовать опцию list-timezones для просмотра доступных часовых поясов:

      timedatectl list-timezones
      

      Эта опция выводит список часовых поясов, доступных в вашей системе. Когда вы найдете часовой пояс, соответствующий расположению вашего сервера, вы сможете установить его с помощью опцииset-timezone:

      sudo timedatectl set-timezone zone
      

      Чтобы убедиться, что ваша система использует правильное время, воспользуйтесь командой timedatectl без опций или с опцией status. Изображение на экране будет таким же:

      timedatectl status
      
            Local time: Thu 2015-02-05 14:08:06 EST
        Universal time: Thu 2015-02-05 19:08:06 UTC
              RTC time: Thu 2015-02-05 19:08:06
             Time zone: America/New_York (EST, -0500)
           NTP enabled: no
      NTP synchronized: no
       RTC in local TZ: no
            DST active: n/a
      

      В первой строке должно отображаться правильное время.

      Основы просмотра журнала

      Чтобы просмотреть журналы, собранные демоном journald, используйте команду journalctl.

      Когда эта команда используется отдельно, все записи журналов в системе будут выведены в многостраничном списке (обычно занимает меньше страницы), который вы сможете просматривать. Самые старые записи будут отображаться сверху:

      journalctl
      
      -- Logs begin at Tue 2015-02-03 21:48:52 UTC, end at Tue 2015-02-03 22:29:38 UTC. --
      Feb 03 21:48:52 localhost.localdomain systemd-journal[243]: Runtime journal is using 6.2M (max allowed 49.
      Feb 03 21:48:52 localhost.localdomain systemd-journal[243]: Runtime journal is using 6.2M (max allowed 49.
      Feb 03 21:48:52 localhost.localdomain systemd-journald[139]: Received SIGTERM from PID 1 (systemd).
      Feb 03 21:48:52 localhost.localdomain kernel: audit: type=1404 audit(1423000132.274:2): enforcing=1 old_en
      Feb 03 21:48:52 localhost.localdomain kernel: SELinux: 2048 avtab hash slots, 104131 rules.
      Feb 03 21:48:52 localhost.localdomain kernel: SELinux: 2048 avtab hash slots, 104131 rules.
      Feb 03 21:48:52 localhost.localdomain kernel: input: ImExPS/2 Generic Explorer Mouse as /devices/platform/
      Feb 03 21:48:52 localhost.localdomain kernel: SELinux:  8 users, 102 roles, 4976 types, 294 bools, 1 sens,
      Feb 03 21:48:52 localhost.localdomain kernel: SELinux:  83 classes, 104131 rules
      
      . . .
      

      Вероятно у вас будет возможность прокрутки множества страниц данных, включая даже десятки тысяч строк, если systemd используется в вашей системе уже давно. Это показывает, сколько данных доступно в базе данных журнала.

      Данный формат будет знаком тем, кто привык к стандартным журналам syslog. Однако при этом способе данные собираются из большего числа источников, чем поддерживают стандартные приложения syslog. Журнальная система поддерживает журналы процесса начальной загрузки, ядра, initrd, стандартные журналы ошибок и вывода приложений и т. д.

      Обратите внимание, что для всех временных меток используется локальное время. Эта возможность теперь доступна для всех записей журнала, потому что мы правильно настроили локальное время в нашей системе. Все журналы отображаются с использованием этой новой информации.

      Если вы хотите вывести временные метки в формате UTC, вы можете использовать флаг --utc:

      journalctl --utc
      

      Фильтрация журнала по времени

      Хотя доступ к такому большому набору данных несомненно полезен, просмотреть и понять такое количество информации может быть очень сложно или даже невозможно. Поэтому опции фильтрации входят в число наиболее значимых возможностей journalctl.

      Вывод журналов текущей загрузки

      Флаг -b — одна из самых простых опций, которой вы часто будете пользоваться. С его помощью вы сможете вывести для просмотра все записи журнала, собранные с момента последней перезагрузки.

      journalctl -b
      

      Это поможет вам определять, какая информация важна для текущей среды, и управлять этой информацией.

      Если вы не используете эту функцию и выводите данные более, чем за один день загрузок, вы увидите, что утилита journalctl вставляет примерно такую строку при каждом выключении системы:

      . . .
      
      -- Reboot --
      
      . . .
      

      Ее можно использовать в качестве логического разделителя информации между сеансами загрузки.

      Прошлые загрузки

      Хотя чаще всего вам будут нужны данные по текущему сеансу загрузки системы, данные по прошлым сеансам также могут оказаться полезными. Журнальная система может хранить данные множества сеансов загрузки, так что journalctl можно использовать для удобного вывода информации.

      В некоторых дистрибутивах информация о предыдущих сеансах загрузки сохраняется по умолчанию, а в других эта возможность отключена. Чтобы информация о сеансах загрузки не удалялась, вы можете создать каталог для хранения журналов с помощью следующей команды:

      • sudo mkdir -p /var/log/journal

      Также вы можете отредактировать файл конфигурации журнальной системы:

      • sudo nano /etc/systemd/journald.conf

      В разделе [Journal] установите для опции Storage= значение persistent, чтобы включить постоянное хранение журналов:

      /etc/systemd/journald.conf

      . . .
      [Journal]
      Storage=persistent
      

      Если на вашем сервере включено хранение журналов предыдущих сеансов загрузки, утилита journalctl предоставит ряд команд, которые помогут работать с сеансами загрузки как с единицами хранения. Чтобы просмотреть сеансы загрузки, о которых известно journald, используйте опцию --list-boots с командой journalctl:

      journalctl --list-boots
      
      -2 caf0524a1d394ce0bdbcff75b94444fe Tue 2015-02-03 21:48:52 UTC—Tue 2015-02-03 22:17:00 UTC
      -1 13883d180dc0420db0abcb5fa26d6198 Tue 2015-02-03 22:17:03 UTC—Tue 2015-02-03 22:19:08 UTC
       0 bed718b17a73415fade0e4e7f4bea609 Tue 2015-02-03 22:19:12 UTC—Tue 2015-02-03 23:01:01 UTC
      

      С этой опцией команда будет выводить по одной строке для каждого сеанса загрузки. Первый столбец — это относительный идентификатор сеанса загрузки, который удобно использовать для ссылки на сеанс загрузки с помощью journalctl. Если вам требуется абсолютный идентификатор, используйте значение boot ID во втором столбце. Два поля времени ближе к концу строки позволяют определить время сеанса загрузки.

      Чтобы вывести информацию из этих сеансов загрузки, вы можете использовать информацию из первого или второго столбца.

      Например, чтобы просмотреть журнал предыдущей загрузки, используйте относительный указатель -1 с флагом -b:

      journalctl -b -1
      

      Также вы можете использовать идентификатор сеанса загрузки для получения данных по сеансу загрузки:

      journalctl -b caf0524a1d394ce0bdbcff75b94444fe
      

      Временные окна

      Хотя возможность сортировки записей журнала по сеансам загрузки очень полезна, довольно часто вам могут потребоваться данные за периоды, не соответствующие сеансам загрузки системы. Это может быть особенно актуально для серверов, которые долгое время работают без перезагрузки.

      Для фильтрации временных окон можно использовать опции --since и --until, которые ограничивают вывод записями после или до указанного времени соответственно.

      Значения времени могут иметь разные форматы. Для абсолютных значений времени нужно использовать следующий формат:

      YYYY-MM-DD HH:MM:SS
      

      Например, чтобы просмотреть все записи с 10 января 2015 г. 17:15, мы введем:

      journalctl --since "2015-01-10 17:15:00"
      

      Если какие-то компоненты вышеописанного формата будут пропущены, будут применены значения по умолчанию. Например, если дата не будет указана, по умолчанию будет использоваться текущая дата. Если компонент времени отсутствует, для замены будет использоваться значение “00:00:00” (полночь). Поле секунд можно опустить, и тогда для него будет по умолчанию использовано значение “00”:

      journalctl --since "2015-01-10" --until "2015-01-11 03:00"
      

      Журнальная система также понимает определенные относительные значения и именованные ярлыки. Например, вы можете использовать слова “yesterday” (вчера), “today” (сегодня), “tomorrow”(завтра), “now” (сейчас) и т. д. Чтобы указать относительное время, следует использовать префикс «-» или «+» перед числовым значением или использовать такие слова, как «ago» (назад) при построении фраз.

      Чтобы получить данные за вчерашний день, введите:

      journalctl --since yesterday
      

      Если вы получили отчеты о перебоях в работе службы, которые начались в 9:00 и закончились час назад, вы можете ввести следующую команду:

      journalctl --since 09:00 --until "1 hour ago"
      

      Как видите, вы можете достаточно легко задавать гибкие временные интервалы для фильтрации записей, которые вам нужны.

      Фильтрация по значимости сообщений

      Мы изучили несколько возможных способов фильтрации записей в журнальной системе по временным рамкам. В этом разделе мы поговорим о фильтрации сообщений по значимым для вас службам или компонентам. Журнал systemd предоставляет много разных способов делать это.

      По единицам

      Возможно одним из наиболее полезных способов фильтрации является фильтрация по единицам, которые вас интересуют. Для такой фильтрации мы можем использовать опцию -u.

      Например, чтобы посмотреть все журналы единицы Nginx в нашей системе, мы можем ввести команду:

      journalctl -u nginx.service
      

      Обычно при этом также используется фильтрация по времени, чтобы вывести строки, которые вас интересуют. Например, чтобы проверить, как служба работает сегодня, можно ввести команду:

      journalctl -u nginx.service --since today
      

      Такая фокусировка особенно полезна, если вы используете возможности чередования записей разных единиц в журнальной системе. Например, если ваш процесс Nginx использует единицу PHP-FPM для обработки динамического контента, вы можете объединить их данные в хронологическом порядке, указав обе единицы:

      journalctl -u nginx.service -u php-fpm.service --since today
      

      Это облегчает поиск взаимодействия между разными программами, позволяя отлаживать целые системы вместо отдельных процессов.

      По процессу, пользователю или идентификатору группы

      Некоторые службы создают для своей работы множество разнообразных дочерних процессов. Если вы определили точное значение PID интересующего вас процесса, вы можете использовать его как критерий фильтрации.

      Для этого нужно указать при фильтрации поле _PID. Например, если нас интересует PID 8088, мы можем ввести:

      journalctl _PID=8088
      

      В других случаях нам может понадобиться вывести все записи, зарегистрированные для определенного пользователя или группы. Это можно сделать с помощью фильтров _UID или _GID. Например, если ваш веб-сервер работает под именем пользователя www-data, вы можете найти идентификатор пользователя с помощью следующей команды:

      id -u www-data
      
      33
      

      После этого, вы сможете использовать возвращенный идентификатор для фильтрации результатов журнальной системы:

      journalctl _UID=33 --since today
      

      Журнал systemd содержит множество полей, которые можно использовать для фильтрации. Некоторые из них передаются от регистрируемого процесса и применяются journald с использованием информации, собираемой из системы в указанное в журнале время.

      Символ подчеркивания в начале указывает, что поле _PID относится к последнему типу. Журнал автоматически регистрирует и индексирует значения PID процессов, регистрируемых для последующей фильтрации. Вы можете узнать все о доступных полях журнала, используя следующую команду:

      man systemd.journal-fields
      

      В этом руководстве мы обсудим это более подробно. Сейчас же мы рассмотрим более полезную опцию, связанную с фильтрацией по этим полям. Опцию -F можно использовать, чтобы вывести все доступные значения для указанного поля журнальной системы.

      Например, чтобы посмотреть, для каких идентификаторов групп существуют записи в журнальной системе systemd, вы можете ввести следующую команду:

      journalctl -F _GID
      
      32
      99
      102
      133
      81
      84
      100
      0
      124
      87
      

      Она покажет вам все значения, сохраненные в журнальной системе для поля group ID. Это должно помочь вам в настройке фильтров.

      По пути компонента

      Также для фильтрации можно указать путь.

      Если путь указывает на исполняемый файл, journalctl выведет все записи, связанные с этим исполняемым файлом. Например, чтобы найти записи с исполняемым файлом bash, нужно ввести команду:

      journalctl /usr/bin/bash
      

      Обычно, если единица доступна для исполняемого файла, этот метод проще и удобнее и дает более полезную информацию (записи связанных дочерних процессов и т. д.). В некоторых случаях это невозможно.

      Отображение сообщений ядра

      Также из журнальной системы можно получить сообщения ядра, обычно содержащиеся в выводе dmesg.

      Чтобы вывести только эти сообщения, можно добавить к команде флаг -k или --dmesg:

      journalctl -k
      

      По умолчанию отображаются только сообщения ядра из текущего сеанса загрузки. При этом вы можете указать другой сеанс загрузки, используя описанные выше флаги выбора загрузки. Например, чтобы получить сообщения пятого по счету сеанса загрузки, начиная с текущего, можно ввести команду:

      journalctl -k -b -5
      

      По приоритету

      Приоритет сообщений — один из тех критериев фильтрации, которые больше всего интересны системным администраторам. Хотя регистрация в журнале развернутой информации обычно полезна, при чтении этой информации записи с низким приоритетом могут отвлечь или запутать.

      Вы можете использовать journalctl с опцией -p, чтобы вывести только сообщения с указанным или более высоким приоритетом. Это позволяет убрать из выводимых результатов сообщения с более низким приоритетом.

      Например, чтобы вывести только записи с уровнем серьезности error (ошибка) или выше, введите команду:

      journalctl -p err -b
      

      Эта команда покажет вам все сообщения с пометкой error (ошибка), critical (критическая ошибка), alert (тревога) или emergency (чрезвычайная ситуация). В журнальной системе реализованы стандартные уровни ошибок syslog. Вы можете использовать название уровня приоритета или соответствующее числовое значение. Вот эти значения, от наибольшего приоритета к наименьшему:

      • 0: emerg
      • 1: alert
      • 2: crit
      • 3: err
      • 4: warning
      • 5: notice
      • 6: info
      • 7: debug

      Вышеуказанные числа или названия можно использовать с опцией -p как взаимозаменяемые. При выборе приоритета будут выведены сообщения указанного уровня и более высоких уровней.

      Изменение отображения журнальной системы

      Выше мы продемонстрировали выбор записей посредством фильтрации. Однако есть и другие способы, позволяющие изменить вывод. Мы можем настраивать отображение journalctl для различных целей.

      Сокращение или расширение области вывода

      Мы можем настроить вид вывода данных journalctl, указав, что вывод можно сжать или раскрыть.

      По умолчанию journalctl выводит на страничном модуле всю запись целиком так, что записи доходят до правого края экрана. Для доступа к этой информации следует нажать правую стрелку.

      Если вы предпочитаете урезать вывод и вставить многоточие в месте, где удалена информация, вы можете использовать опцию --no-full:

      journalctl --no-full
      
      . . .
      
      Feb 04 20:54:13 journalme sshd[937]: Failed password for root from 83.234.207.60...h2
      Feb 04 20:54:13 journalme sshd[937]: Connection closed by 83.234.207.60 [preauth]
      Feb 04 20:54:13 journalme sshd[937]: PAM 2 more authentication failures; logname...ot
      

      Также вы можете сделать и обратное, и попросить journalctl вывести всю доступную информацию вне зависимости от того, содержит ли она непечатные символы. Для этого можно использовать флаг -a:

      journalctl -a
      

      Вывод в стандартный выход

      По умолчанию journalctl показывает вывод на многостраничной панели, чтобы упростить чтение информации. Однако, если вы планируете обработать данные в текстовом редакторе, вероятно для вас будет более предпочтительным стандартный вывод.

      Для такого вывода следует использовать опцию --no-pager:

      journalctl --no-pager
      

      Полученные данные можно немедленно передать в утилиту обработки или сохранить в файле на диске в зависимости от того, что вам требуется.

      Форматы вывода

      Если вы обрабатываете записи журнала, как указано выше, вам вероятно будет проще анализировать данные в более удобном формате. К счастью, журнал можно выводить в множестве разных форматов. Для этого вы можете использовать опцию -o вместе с указателем формата.

      Например, чтобы вывести журнала в формате JSON, нужно ввести следующую команду:

      journalctl -b -u nginx -o json
      
      { "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635", "__REALTIME_TIMESTAMP" : "1422990364739502", "__MONOTONIC_TIMESTAMP" : "27200938", "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d", "PRIORITY" : "6", "_UID" : "0", "_GID" : "0", "_CAP_EFFECTIVE" : "3fffffffff", "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee", "_HOSTNAME" : "desktop", "SYSLOG_FACILITY" : "3", "CODE_FILE" : "src/core/unit.c", "CODE_LINE" : "1402", "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading", "SYSLOG_IDENTIFIER" : "systemd", "MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5", "_TRANSPORT" : "journal", "_PID" : "1", "_COMM" : "systemd", "_EXE" : "/usr/lib/systemd/systemd", "_CMDLINE" : "/usr/lib/systemd/systemd", "_SYSTEMD_CGROUP" : "/", "UNIT" : "nginx.service", "MESSAGE" : "Starting A high performance web server and a reverse proxy server...", "_SOURCE_REALTIME_TIMESTAMP" : "1422990364737973" }
      
      . . .
      

      Это полезно, если вы используете утилиты для синтаксического анализа. Вы можете использовать формат json-pretty, чтобы сделать структуру данных проще, прежде чем передавать данные потребителю JSON:

      journalctl -b -u nginx -o json-pretty
      
      {
          "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635",
          "__REALTIME_TIMESTAMP" : "1422990364739502",
          "__MONOTONIC_TIMESTAMP" : "27200938",
          "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d",
          "PRIORITY" : "6",
          "_UID" : "0",
          "_GID" : "0",
          "_CAP_EFFECTIVE" : "3fffffffff",
          "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee",
          "_HOSTNAME" : "desktop",
          "SYSLOG_FACILITY" : "3",
          "CODE_FILE" : "src/core/unit.c",
          "CODE_LINE" : "1402",
          "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading",
          "SYSLOG_IDENTIFIER" : "systemd",
          "MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5",
          "_TRANSPORT" : "journal",
          "_PID" : "1",
          "_COMM" : "systemd",
          "_EXE" : "/usr/lib/systemd/systemd",
          "_CMDLINE" : "/usr/lib/systemd/systemd",
          "_SYSTEMD_CGROUP" : "/",
          "UNIT" : "nginx.service",
          "MESSAGE" : "Starting A high performance web server and a reverse proxy server...",
          "_SOURCE_REALTIME_TIMESTAMP" : "1422990364737973"
      }
      
      . . .
      

      Для отображения можно использовать следующие форматы:

      • cat: отображает только само поле сообщения.
      • export: двоичный формат, подходящий для передачи или резервного копирования.
      • json: стандартный формат JSON с одной записью на строку.
      • json-pretty: код JSON в формате, более удобном для чтения человеком
      • json-sse: вывод в формате JSON в оболочке, совместимой с операцией add server-sent event
      • short: вывод в формате syslog по умолчанию
      • short-iso: формат по умолчанию, дополненный для отображения временных меток часов ISO 8601.
      • short-monotonic: формат по умолчанию с однотонными временными метками.
      • short-precise: формат по умолчанию с точностью до микросекунд
      • verbose: показывает все поля журнальной системы, доступные для ввода, в том числе те, которые обычно скрыты на внутреннем уровне.

      Эти опции позволяют выводить записи журнала в любом формате, который лучше всего соответствует вашим текущим потребностям.

      Мониторинг активных процессов

      Команда journalctl имитирует, сколько администраторов используют tail для мониторинга активных процессов или недавней активности. Эта функция встроена в journalctl, обеспечивая доступ к этим возможностям без подключения другого инструмента.

      Отображение последних журналов

      Чтобы вывести указанное количество записей, вы можете использовать опцию -n, которая работает как tail -n.

      По умолчанию отображается 10 последних записей:

      journalctl -n
      

      Вы можете указать желаемое количество записей, задав число после -n:

      journalctl -n 20
      

      Наблюдение за журналами

      Для активного наблюдения за журналами по мере их пополнения можно использовать флаг -f. Это будет работать именно так, как можно ожидать, если у вас есть опыт использования tail -f:

      journalctl -f
      

      Обслуживание журналов

      Вам может быть интересно, сколько места занимают все эти данные, которые мы уже видели. Более того, вы можете захотеть удалить какие-либо старые журналы и освободить место.

      Определение текущего использования дискового пространства

      Вы можете определить, сколько места занимает журнал на диске, используя флаг --disk-usage:

      journalctl --disk-usage
      
      Journals take up 8.0M on disk.
      

      Удаление старых журналов

      Если вы хотите сократить размер журнала, вы можете использовать для этого два разных способа (доступных в systemd версии 218 или выше).

      Если вы используете опцию --vacuum-size, вы можете сократить журнал, указав размер. При использовании этой опции старые записи будут удаляться, пока занимаемое журнальной системой место на диске не сократится до требуемого размера:

      sudo journalctl --vacuum-size=1G
      

      Также можно сократить размер журнала, указав время отсечки с помощью --vacuum-time. Любые записи вне этого времени удаляются. Эта опция позволяет сохранить записи, созданные после истечения определенного времени.

      Например, чтобы сохранить записи с прошлого года, вы можете ввести:

      sudo journalctl --vacuum-time=1years
      

      Ограничение расширения журналов

      Вы можете настроить свой сервер так, чтобы ограничить место, занимаемое журнальной системой. Для этого следует отредактировать файл /etc/systemd/journald.conf.

      Для ограничения роста занимаемого журнальной системой объема можно использовать следующие элементы:

      • SystemMaxUse=: указывает максимальное пространство на диске, которое может использоваться журнальной системой.
      • SystemKeepFree=: указывает пространство на диске, которое журнальная система должна оставлять свободным при добавлении записей в журналы.
      • SystemMaxFileSize=: определяет, до какого размера могут увеличиваться большие файлы журнала на диске до ротации.
      • RuntimeMaxUse=: указывает, сколько места на диске может использоваться для временного хранения (в /run filesystem).
      • RuntimeKeepFree=: указывает, сколько места на диске следует оставлять на диске для других целей при записи данных во временное хранилище (в файловой системе /run).
      • RuntimeMaxFileSize=: указывает, сколько места может занимать отдельный файл журнала во временном хранилище (в файловой системе /run) до ротации.

      Задавая эти значения, вы можете контролировать, сколько места на вашем сервере использует journald. Помните, что SystemMaxFileSize и RuntimeMaxFileSize будут применяться к архивным файлам для достижения заданных ограничений. Это важно помнить при интерпретации подсчета файлов после операции вакуумной очистки.

      Заключение

      Как видите, журнальная система systemd очень полезна для сбора данных о вашей системе и приложениях и для управления этими данными. Гибкость в основном обеспечивается за счет автоматической регистрации большого количества метаданных и централизованной структуры журналов. Команда journalctl позволяет легко использовать расширенные функции журнальной системы и проводить расширенный анализ и реляционную отладку разных компонентов приложения.



      Source link

      Use journalctl to View Your System's Logs


      Updated by Linode

      Written by Linode


      Use promo code DOCS10 for $10 credit on a new account.

      What is journalctl?

      journalctl is a command for viewing logs collected by systemd. The systemd-journald service is responsible for systemd’s log collection, and it retrieves messages from the kernel, systemd services, and other sources.

      These logs are gathered in a central location, which makes them easy to review. The log records in the journal are structured and indexed, and as a result journalctl is able to present your log information in a variety of useful formats.

      Using journalctl for the First Time

      Run the journalctl command without any arguments to view all the logs in your journal:

      journalctl
      

      If you do not see output, try running it with sudo:

      sudo journalctl
      

      If your Linux user does not have sudo privileges, add your user to the sudo group.

      Default Log Format and Ordering

      journalctl will display your logs in a format similar to the traditional syslog format. Each line starts with the date (in the server’s local time), followed by the server’s hostname, the process name, and the message for the log.

        
      Aug 31 12:00:25 debian sshd[15844]: pam_unix(sshd:session): session opened for user example_user by (uid=0)
      
      

      Your logs will be displayed from oldest to newest. To reverse this order and display the newest messages at the top, use the -r flag:

      journalctl -r
      

      Paging through Your Logs

      journalctl pipes its output to the less command, which shows your logs one page at a time in your terminal. If a log line exceeds the horizontal width of your terminal window, you can use the left and right arrow keys to scroll horizontally and see the rest of the line:

      Furthermore, your logs can be navigated and searched by using all the same key commands available in less:

      Key command Action
      down arrow key, enter, e, or j Move down one line.
      up arrow key, y, or k Move up one line.
      space bar Move down one page.
      b Move up one page.
      right arrow key Scroll horizontally to the right.
      left arrow key Scroll horizontally to the left.
      g Go to the first line.
      G Go to the last line.
      10g Go to the 10th line. Enter a different number to go to other lines.
      50p or 50% Go to the line half-way through the output. Enter a different number to go to other percentage positions.
      /search term Search forward from the current position for the search term string.
      ?search term Search backward from the current position for the search term string.
      n When searching, go to the next occurrence.
      N When searching, go to the previous occurrence.
      m<c> Set a mark, which saves your current position. Enter a single character in place of <c> to label the mark with that character.
      '<c> Return to a mark, where <c> is the single character label for the mark. Note that ' is the single-quote.
      q Quit less

      View journalctl without Paging

      To send your logs to standard output and avoid paging them, use the --no-pager option:

      journalctl --no-pager
      

      It’s not recommended that you do this without first filtering down the number of logs shown.

      Monitor New Log Messages

      Run journalctl with the -f option to view a live log of new messages as they are collected:

      journalctl -f
      

      The key commands from less are not available while in this mode. Enter Control-C on your keyboard to return to your command prompt from this mode.

      Filter journalctl Output

      In addition to searching your logs with the less key commands, you can invoke journalctl with options that filter your log messages before they are displayed.

      These filters can be used with the normal paged display, and with the --no-pager and -f options. Filters of different types can also be combined together to further narrow the output.

      Show Logs within a Time Range

      Use the --since option to show logs after a specified date and time:

      journalctl --since "2018-08-30 14:10:10"
      

      Use the --until option to show logs up to a specified date and time:

      journalctl --until "2018-09-02 12:05:50"
      

      Combine these to show logs between the two times:

      journalctl --since "2018-08-30 14:10:10" --until "2018-09-02 12:05:50"
      

      Dates and times should be specified in the YYYY-MM-DD HH:MM:SS format. If the time is omitted (i.e. only the YYYY-MM-DD date is specified), then the time is assumed to be 00:00:00.

      journalctl can also accept some alternative terms when specifying dates:

      • The terms yesterday, today, and tomorrow are recognized. When using one of these terms, the time is assumed to be 00:00:00.

      • Terms like 1 day ago or 3 hours ago are recognized.

      • The - and + symbols can be used to specify relative dates. For example, -1h15min specifies 1 hour 15 minutes in the past, and +3h30min specifies 3 hours 30 minutes in the future.

      Show Logs for a Specific Boot

      Use the -b option to show logs for the last boot of your server:

      journalctl -b
      

      Specify an integer offset for the -b option to refer to a previous boot. For example, journalctl -b -1 show logs from the previous boot, journalctl -b -2 shows logs from the boot before the previous boot, and so on.

      List the available boots:

      journalctl --list-boots
      

      Each boot listed in the output from journalctl --list-boots command includes a 32-bit boot ID. You can supply a boot ID with the -b option; for example:

      journalctl -b a09dce7b2c1c458d861d7d0f0a7c8c65
      

      If no previous boots are listed, your journald configuration may not be set up to persist log storage. Review the Persist Your Logs section for instructions on how to change this configuration.

      Show Logs for a systemd Service

      Pass the name of a systemd unit with the -u option to show logs for that service:

      journalctl -u ssh
      

      View Kernel Messages

      Supply the -k option to show only kernel messages:

      journalctl -k
      

      Change the Log Output Format

      Because the log records for systemd’s journals are structured, journalctl can show your logs in different formats. Here are a few of the formats available:

      Format Name Description
      short The default option, displays logs in the traditional syslog format.
      verbose Displays all information in the log record structure.
      json Displays logs in JSON format, with one log per line.
      json-pretty Displays logs in JSON format across multiple lines for better readability.
      cat Displays only the message from each log without any other metadata.

      Pass the format name with the -o option to display your logs in that format. For example:

      journalctl -o json-pretty
      

      Anatomy of a Log Record

      The following is an example of the structured data of a log record, as displayed by journalctl -o verbose. For more information on this data structure, review the man page for journalctl:

        
      Fri 2018-08-31 12:00:25.543177 EDT [s=0b341b44cf194c9ca45c99101497befa;i=70d5;b=a09dce7b2c1c458d861d7d0f0a7c8c65;m=9fb524664c4;t=57517dfc5f57d;x=97097ca5ede0dfd6]
          _BOOT_ID=a09dce7b2c1c458d861d7d0f0a7c8c65
          _MACHINE_ID=1009f49fff8fe746a5111e1a062f4848
          _HOSTNAME=debian
          _TRANSPORT=syslog
          PRIORITY=6
          SYSLOG_IDENTIFIER=sshd
          _UID=0
          _GID=0
          _COMM=sshd
          _EXE=/usr/sbin/sshd
          _CAP_EFFECTIVE=3fffffffff
          _SYSTEMD_CGROUP=/system.slice/ssh.service
          _SYSTEMD_UNIT=ssh.service
          _SYSTEMD_SLICE=system.slice
          SYSLOG_FACILITY=10
          SYSLOG_PID=15844
          _PID=15844
          _CMDLINE=sshd: example_user [priv
          MESSAGE=pam_unix(sshd:session): session opened for user example_user by (uid=0)
          _AUDIT_SESSION=30791
          _AUDIT_LOGINUID=1000
          _SOURCE_REALTIME_TIMESTAMP=1536120282543177
      
      

      Note

      In addition to the types of filters listed in the previous section, you can also filter logs by specifying values for the variables in the log record structure. For example, journalctl _UID=0 will show logs for user ID 0 (i.e. the root user).

      Persist Your Logs

      systemd-journald can be configured to persist your systemd logs on disk, and it also provides controls to manage the total size of your archived logs. These settings are defined in /etc/systemd/journald.conf.

      To start persisting your logs, uncomment the Storage line in /etc/systemd/journald.conf and set its value to persistent. Your archived logs will be held in /var/log/journal. If this directory does not already exist in your file system, systemd-journald will create it.

      After updating your journald.conf, load the change:

      sudo systemctl restart systemd-journald
      

      Control the Size of Your Logs’ Disk Usage

      The following settings in journald.conf control how large your logs’ size can grow to when persisted on disk:

      Setting Description
      SystemMaxUse The total maximum disk space that can be used for your logs.
      SystemKeepFree The minimum amount of disk space that should be kept free for uses outside of systemd-journald’s logging functions.
      SystemMaxFileSize The maximum size of an individual journal file.
      SystemMaxFiles The maximum number of journal files that can be kept on disk.

      systemd-journald will respect both SystemMaxUse and SystemKeepFree, and it will set your journals’ disk usage to meet whichever setting results in a smaller size.

      To view your default limits, run:

      sudo journalctl -u systemd-journald
      

      You should see a line similar to the following which describes the current limits in place:

        
      Permanent journal is using 32.0M (max allowed 2.3G, trying to leave 3.5G free of 21.2G available → current limit 2.3G).
      
      

      Note

      A parallel group of settings is used when journald.conf is set to only persist the journals in memory (instead of on disk): RuntimeMaxUse, RuntimeKeepFree, RuntimeMaxFileSize, and RuntimeMaxFiles.

      Manually Clean Up Archived Logs

      journalctl offers functions for immediately removing archived journals on disk. Run journalctl with the --vacuum-size option to remove archived journal files until the total size of your journals is less than the specified amount. For example, the following command will reduce the size of your journals to 2GiB:

      journalctl --vacuum-size=2G
      

      Run journalctl with the --vacuum-time option to remove archived journal files with dates older than the specified relative time. For example, the following command will remove journals older than one year:

      journalctl --vacuum-time=1years
      

      Run journalctl with the --vacuum-files option to remove archived journal files until the specified number of files remains. For example, the following command removes all but the 10 most recent journal files:

      journalctl --vacuum-files=10
      

      More Information

      You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials.

      Join our Community

      Find answers, ask questions, and help others.

      This guide is published under a CC BY-ND 4.0 license.



      Source link