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.
Facilidades Descrição auth Para autenticação authpriv cron Sistema de agendamento de tarefas daemon Sistema de daemon rodando no Linux ftp Para ambientes com ftp server kern Mensagens geradas pelo Kernel local[0-7] Para uso do administrador lpr Para sistema de impressão mail Para sistema de email (quando tem mail server) news syslog Atualmente ficam mensagens mais genéricas de log. user Mensagens relativas aos usuários. Priority
É o nível de prioridade do log, sendo, do mais alto nível para o mais baixo:
Priority Description emerg ou panic Sistema está inutilizável. alert Ação deve ser tomada imediatamente crit Condições críticas err Condição de erro warning Condição de aviso notice Condição normal, mas significativa info Mensagens informativas debug Depuraçã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áquinausername
.
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
Arquivos | Descrição |
---|---|
dmesg | Reconhecimento de Hardware pelo Kernel. |
messages (nem sempre disponível) | Considerado o principal arquivo de log. |
lastlog | Informações sobre os ultimos logins dos usuários. |
wtmp | Informaçõ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ções | Descrição |
---|---|
-b | Logs de boot |
_TRANSPORT=kernel | Logs do Kernel |
_UID=0 | Logs referente ao root |
--since "today" | Logs de hoje |
--since "1 hour ago" | Logs de 1 hora atrás |
--disk-usage | Mostra quanto do disco os logs estão consumindo. |
--vacuum-size 10M | Limpa os logs que estão arquivados, apenas os arquivados, deixando apenas 10M de log. |
--verify | Verifica se os logs não estão corrompidos. |
--sync | Grava 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
.