Skip to main content

108.2 Sistemas de log


Vamos ver como funciona o sistema de log no Linux, atualmente temos 2 disponíveis, um deles é o Rsyslog, o mais atualmente usado hoje em dia e o outro é o Syslog, que veio do BSD, migrado para o Linux e seu aprimoramento é o Rsyslog.


Também temos o syslog-ng, usa o mesmo padrão do syslog, mas sua implementação e configuração é um pouco diferente e ainda temos o Systemd-journal que é uma implementação do Systemd.



Rsyslog


O arquivo de configuração fica em /etc/rsyslog.conf, aqui ficam configurações mais genéricas do próprio rsyslog, já em /etc/rsyslog.d/50-default.conf ficam as configurações especificas de arquivo de log para cada nível, sendo eles: warn, info, err, notice, emerg e debug.


Mas você pode configurar um arquivo de log especifico para uma aplicação e deixar separado desse arquivo, bastando colocar dentro de /etc/rsyslog.d/.


O padrão usado nos arquivos de log é o seguinte:

facility.priority <destino>

  • Facility

    É quem está gerando o log, por exemplo: cron, mail, auth, kern (kernel) e por ai vai.

    FacilidadesDescrição
    authPara autenticação
    authpriv
    cronSistema de agendamento de tarefas
    daemonSistema de daemon rodando no Linux
    ftpPara ambientes com ftp server
    kernMensagens geradas pelo Kernel
    local[0-7]Para uso do administrador
    lprPara sistema de impressão
    mailPara sistema de email (quando tem mail server)
    news
    syslogAtualmente ficam mensagens mais genéricas de log.
    userMensagens relativas aos usuários.

  • Priority

    É o nível de prioridade do log, sendo, do mais alto nível para o mais baixo:

    PriorityDescription
    emerg ou panicSistema está inutilizável.
    alertAção deve ser tomada imediatamente
    critCondições críticas
    errCondição de erro
    warningCondição de aviso
    noticeCondição normal, mas significativa
    infoMensagens informativas
    debugDepuração de mensagens

  • Destino

    É para onde vamos enviar nossos logs, pode ser um arquivo (é o mais comum), pode ser uma console /dev/tty, uma máquina remota usando UDP @IP, uma máquina remota usando TCP @@IP ou um usuário conectado na máquina username.


Vamos criar um log para teste:

# Criando um arquivo de log:
$ sudo vim /etc/rsyslog.d/10-testlog.conf

#### Colocar no arqivo ####
# De local0 até local7 são logs que nós mesmos podemos criar!
local0.warn /var/log/testlog
#### FIM ####

# Reinicie o rsyslog:
$ sudo systemctl restart rsyslog.service

# Agora vamos usar a ferramenta 'logger':
$ sudo logger -p local0.warn "Teste de log"
# O '-p' é para informar a priority.
# Voce pode usar o '-t <tag>' para inserir uma tag.

# Verifique se o arquivo foi criado:
$ cat /var/log/testlog
Jun 14 15:45:11 ubuntu2004 vagrant: Teste de log

Dentro do arquivo de configuração, antes do arquivo de log, se você colocar um -, isso vai significar que o log não será gravada de imediato em arquivo, ficando num buffer, isso é feito para performar melhor o uso dos logs.



Logs remotos


Vamos construir um sistemas para enviar logs para outro host na rede, o sistema é bem simples.


  • No cliente

    # No final do arquivo '/etc/rsyslog.conf', adicione a linha abaixo:
    *.* @@IP

    # Os 2 '@' significam que vamos usar conexões TCP.

  • No Servidor

    # Como vamos usar conexões TCP, no arquivo '/etc/rsyslog.conf', descomente as linhas abaixo:
    module(load="imtcp")
    input(type="imtcp" port="514")

Reinicie o rsyslog em ambas as máquina sudo systemctl restart rsyslog. Pronto, o sistema de logs remotos já está funcionando.

# No cliente crie um log:
logger "Test 2"

#### Esse log vai ser registrado em '/var/log/syslog'
# Tanto no cliente como no server.


Principais arquivos de log

ArquivosDescrição
dmesgReconhecimento de Hardware pelo Kernel.
messages (nem sempre disponível)Considerado o principal arquivo de log.
lastlogInformações sobre os ultimos logins dos usuários.
wtmpInformações sobre quem está logado e o que está fazendo.
auth.log (ou somente auth)Logs de autenticação do sistema.


Logrotate


É um sistema para rotacionar os logs, ele vai comprimir, apagar, enviar para outro lugar os logs antigos, assim você nao ficam com um sistema abarrotado de logs no sistema.


Por exemplo, quando voce ver isso abaixo, os arquivos compactados estão assim por causa do logrotate.

$ ls -lh /var/log/dmesg*
-rw-r--r-- 1 root adm 44K Jun 14 10:14 /var/log/dmesg
-rw-r--r-- 1 root adm 43K Apr 2 09:48 /var/log/dmesg.0
-rw-r--r-- 1 root adm 13K Apr 2 09:42 /var/log/dmesg.1.gz
-rw-r--r-- 1 root adm 13K Apr 2 09:40 /var/log/dmesg.2.gz

Configuração padrão:

$ cat /etc/logrotate.conf 
# see "man logrotate" for details
# rotate log files weekly
weekly

# use the adm group by default, since this is the owning group
# of /var/log/syslog.
su root adm

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
#dateext

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# system-specific logs may be also be configured here.

Vamos criar um arquivo de exemplo:

# AplicaçaoX:
sudo vim /etc/logrotate.d/aplicaçãox

#### Cole a saída abaixo ####
/var/log/etherpad-lite/*.log
{
rotate 4 # Manter os 4 ultimos registros
weekly # Rotacionar semanalmente
missingok # Tudo bem se não encontrar o arquivo de log.
notifempty # Não vai rotacionar se o arquivo estiver vazio.
compress # Comprimir os arquivos '.gz'
delaycompress # Não comprimir o penultimo log, somente anterior a ele.
postrotate # Depois de rotacionar, execute a linha abaixo:
restart aplicaçãox >/dev/null 2>&1 || true
endscript
}
#### FIM ####

O logrotate não possui um daemon, nems serviço, ele é um agendamento no cron.

$ sudo systemctl list-timers logrotate.timer
NEXT LEFT LAST PASSED UNIT ACTIVATE>
Tue 2021-06-15 00:00:00 -03 7h left Mon 2021-06-14 14:42:18 -03 1h 36min ago logrotate.timer logrotat>

1 timers listed.
Pass --all to see loaded but inactive timers, too.


Systemd-Journal


A questão do Journal não tem relação alguma com o journaling implementada por alguns filesystems. É apenas uma forma de registrar em log, mas é do systemd.

O arquivo de configuração fica em /etc/systemd/journald.conf.

$ cat /etc/systemd/journald.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See journald.conf(5) for details.

[Journal]
#Storage=auto (grava em disco e em memoria)
#Compress=yes (vai compactar)
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
#SystemMaxUse= (quanto do disco ele vai usar, o maximo) 10%
#SystemKeepFree= (quanto deve ficar livre para nao ocupar todo o FS) 15%
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse= (mesmo que em SystemMasUse, mas aqui fica em memoria)
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes (vai redirecionar as mensagens que receber para o rsyslog)
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K
#ReadKMsg=yes

Para ler os logs, usamos o comando journalctl.

OpçõesDescrição
-bLogs de boot
_TRANSPORT=kernelLogs do Kernel
_UID=0Logs referente ao root
--since "today"Logs de hoje
--since "1 hour ago"Logs de 1 hora atrás
--disk-usageMostra quanto do disco os logs estão consumindo.
--vacuum-size 10MLimpa os logs que estão arquivados, apenas os arquivados, deixando apenas 10M de log.
--verifyVerifica se os logs não estão corrompidos.
--syncGrava em disco todos os logs que ainda estão na memória.

A integração entre systemd-journal e rsyslog é feita através de um socket que fica em /run/systemd/journal/syslog, lá tem outros sockets também.



systemd-cat


Joga uma saída direto para o journal do systemd, jogando direto em log, similar ao comando logger.