Linux - rsyslog
Uma das características notáveis do Linux é a abundante criação de logs para diversas ações realizadas no sistema. Um dos principais componentes responsáveis pelo log no Linux é o processo rsyslog
. Este processo é configurado para monitorar o que está acontecendo no computador, geralmente registrando as ações em arquivos na pasta /var/log
. Se examinarmos essa pasta, veremos vários arquivos e diretórios usados para log:
programicio@Programicio:~$ ls -l /var/log total 49200 -rw-r--r-- 1 root root 5267 Mar 20 11:22 alternatives.log drwxr-x--- 2 root adm 4096 Mar 21 07:08 apache2 -rw-r----- 1 root adm 426 Mar 21 07:08 apport.log drwxr-xr-x 2 root root 4096 Mar 20 11:22 apt -rw-r----- 1 syslog adm 141654 Mar 21 09:17 auth.log ... -rw-rw-r-- 1 root utmp 187008 Mar 21 07:09 wtmp
O conteúdo específico pode variar dependendo do sistema e do software instalado. No entanto, podemos destacar principalmente o arquivo syslog
(ou log do sistema), que registra os eventos principais do sistema.
Além do processo rsyslog
, outros processos também podem gravar logs nesta pasta. Por exemplo, o servidor web Apache grava suas mensagens em uma pasta específica aqui. Como o rsyslog
é o principal processo responsável pelo log no sistema, sua configuração é de grande importância, pois permite definir vários aspectos do log.
O arquivo principal de configuração do rsyslog
é /etc/rsyslog.conf
. Além deste arquivo, a configuração é complementada pelos arquivos do diretório /etc/rsyslog.d
. O conteúdo desses arquivos é adicionado à configuração especificada em /etc/rsyslog.conf
, permitindo que pacotes RPM ou Debian expandam a configuração sem alterar o conteúdo do arquivo /etc/rsyslog.conf
.
Vamos examinar como é a configuração em /etc/rsyslog.conf
:
programicio@Programicio:~$ cat /etc/rsyslog.conf # /etc/rsyslog.conf configuration file for rsyslog # # For more information install rsyslog-doc and see # /usr/share/doc/rsyslog-doc/html/configuration/index.html # # Default logging rules can be found in /etc/rsyslog.d/50-default.conf ################# #### MODULES #### ################# module(load="imuxsock") # provides support for local system logging #module(load="immark") # provides --MARK-- message capability # provides UDP syslog reception #module(load="imudp") #input(type="imudp" port="514") # provides TCP syslog reception #module(load="imtcp") #input(type="imtcp" port="514") # provides kernel logging support and enable non-kernel klog messages module(load="imklog" permitnonkernelfacility="on") ########################### #### GLOBAL DIRECTIVES #### ########################### # Filter duplicated messages $RepeatedMsgReduction on # # Set the default permissions for all log files. # $FileOwner syslog $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 $PrivDropToUser syslog $PrivDropToGroup syslog # # Where to place spool and state files # $WorkDirectory /var/spool/rsyslog # # Include all config files in /etc/rsyslog.d/ # $IncludeConfig /etc/rsyslog.d/*.conf
A estrutura do arquivo consiste principalmente de dois componentes: módulos e diretivas globais. No final do arquivo, podemos ver a diretiva:
$IncludeConfig /etc/rsyslog.d/*.conf
Ela inclui o conteúdo dos arquivos com extensão .conf
do diretório /etc/rsyslog.d/
. Nesse diretório, podemos encontrar o arquivo 50-default.conf
.
O arquivo 50-default.conf
define as regras básicas de log para o rsyslog
. Vamos verificar o conteúdo desse arquivo. No meu caso, ele é assim:
programicio@Programicio:~$ cat /etc/rsyslog.d/50-default.conf # Default rules for rsyslog. # # For more information see rsyslog.conf(5) and /etc/rsyslog.conf # # First some standard log files. Log by facility. # auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log #daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log #lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log #user.* -/var/log/user.log # # Logging for the mail system. Split it up so that # it is easy to write scripts to parse these files. # #mail.info -/var/log/mail.info #mail.warn -/var/log/mail.warn mail.err /var/log/mail.err # # Some "catch-all" log files. # #*.=debug;\ # auth,authpriv.none;\ # news.none;mail.none -/var/log/debug #*.=info;*.=notice;*.=warn;\ # auth,authpriv.none;\ # cron,daemon.none;\ # mail,news.none -/var/log/messages # # Emergencies are sent to everybody logged in. # *.emerg :omusrmsg:* # # I like to have messages displayed on the console, but only on a virtual # console I usually leave idle. # #daemon,mail.*;\ # news.=crit;news.=err;news.=notice;\ # *.=debug;*.=info;\ # *.=notice;*.=warn /dev/tty8
Regras de Log
As regras determinam onde os logs serão registrados para um determinado objeto (facility). Em particular, é possível estabelecer regras para os seguintes objetos:
auth
: Processa eventos relacionados à autenticação.authpriv
: Similar aoauth
, também processa eventos de autenticação.cron
: Processa mensagens criadas pelo subsistemacron
.daemon
: Registra mensagens criadas por um daemon (serviço).kern
: Registra mensagens relacionadas ao kernel, incluindo aquelas geradas pelo firewall do kernel (iptables).lpr
: Registra mensagens relacionadas ao sistema de impressão obsoletolpr
.mail
: Registra mensagens relacionadas ao serviço de correio.news
: Registra mensagens relacionadas ao protocolo NNTP (protocolo de notícias da rede).user
: Registra mensagens relacionadas ao usuário.
Prioridades
Ao registrar logs, os objetos criam mensagens com uma prioridade definida. Se uma prioridade for especificada, todas as mensagens com essa prioridade e com prioridades mais altas são registradas no arquivo de log indicado. No rsyslog
, são usadas as seguintes prioridades (em ordem crescente):
debug
: Informação de depuração, fornece detalhes sobre tudo o que o objeto faz, como chamadas de sistema e bibliotecas executadas.info
: Informação padrão sobre o que o processo está fazendo, como arquivos abertos, sem detalhes de chamadas de sistema e bibliotecas.notice
: Informação sobre erros não críticos, como a criação automática de um arquivo ausente.warn
(forma obsoleta:warning
): Informação sobre advertências durante a execução do processo, indicando que a funcionalidade normal foi interrompida, mas o objeto continua a funcionar.err
(forma obsoleta:error
): Informação sobre erros que afetam o funcionamento normal do objeto.crit
: Informação sobre situações críticas que ameaçam o funcionamento normal do computador.alert
: Informação sobre situações que podem levar à interrupção do computador.emerg
(forma obsoleta:panic
): Indica a cessação do funcionamento normal do computador.
Para configurar o log no arquivo de configuração, combina-se o objeto com a prioridade no formato:
objeto.prioridade
A prioridade mencionada também inclui todas as prioridades mais altas. Por exemplo:
kern.info
Essa entrada se refere a mensagens informativas e a mensagens com prioridade mais alta geradas pelo kernel.
Pode-se especificar vários objetos em uma linha, separados por vírgula. Por exemplo, a entrada a seguir se refere a mensagens informativas tanto do kernel quanto do processo cron
:
kern,cron.info
Como alternativa, pode-se referir a todos os objetos usando um asterisco, como no exemplo a seguir:
*.crit
Especificar uma prioridade por padrão também inclui o registro de prioridades mais altas. No entanto, se for necessário definir uma regra de log apenas para uma prioridade específica, sem incluir mensagens de prioridades mais altas, usa-se o sinal de igual:
mail.=info
Nesse caso, são registradas mensagens informativas relacionadas ao correio, mas mensagens com prioridades mais altas não são registradas.
Também é possível usar o operador de exclusão para a prioridade e para cada prioridade superior, colocando um ponto de exclamação antes do nome da prioridade:
mail.!info
Arquivos de Log
Quando ocorre um evento, uma ação é executada sobre ele. Normalmente, essa ação significa que a mensagem é enviada para algum lugar. O arquivo de configuração permite definir o local de log para várias combinações de objetos e prioridades. Geralmente, os locais de log são arquivos. Ao especificar o nome de um arquivo, as mensagens são registradas nesse arquivo, cujo nome é fornecido como um caminho absoluto. Para que cada mensagem não seja registrada imediatamente no arquivo, pode-se colocar um sinal de menos -
antes do nome do arquivo. Isso indica que as alterações são primeiro armazenadas em buffer antes de serem gravadas no arquivo real. Por exemplo:
kern.* -/var/log/kern.log
Nesse caso, todas as mensagens (de todas as prioridades) relacionadas ao kernel são registradas no arquivo /var/log/kern.log
com bufferização prévia.
O ponto e vírgula ;
é usado como separador, e a barra invertida \
garante que a próxima parte seja interpretada como pertencente à mesma linha:
#*.=debug;\ # auth,authpriv.none;\ # news.none;mail.none -/var/log/debug
Ou, por exemplo, no arquivo de configuração há uma linha assim:
*.*;auth,authpriv.none -/var/log/syslog
A expressão *.*
indica todos os objetos e todas as prioridades. Mas então auth,authpriv.none
é adicionado. Isso significa que o log para o objeto auth/authpriv
é excluído dessa regra. Assim, os eventos para todos os objetos, exceto auth/authpriv
(e todas as prioridades), são registrados com bufferização prévia no arquivo /var/log/syslog
. Portanto, ao abrir esse arquivo, encontraremos a maioria dos eventos do sistema.
Comando logger
O comando logger
permite enviar mensagens para o rsyslog
. Isso possibilita seu uso para registrar logs em scripts onde o log padrão não está disponível. Para registrar uma mensagem, basta passar a mensagem como uma string para o comando:
logger hello www.programicio.com
Após isso, no arquivo /var/log/syslog
, aparecerá uma linha semelhante a esta:
2024-03-21T09:01:15.794001+03:00 Programicio programicio: hello www.programicio.com
Ao usar o comando logger, a mensagem de log pode ser marcada com uma tag específica. Isso facilita a identificação dessas mensagens posteriormente. Para isso, utiliza-se o parâmetro -t
. Por exemplo, o comando:
logger -t hello hi www.programicio.com
marcará a mensagem "hi www.programicio.com" no arquivo syslog
com a tag hello, facilitando a busca de mensagens adicionadas com o logger. Por exemplo, a linha no syslog
será algo como:
2024-03-21T09:09:03.924923+03:00 Programicio hello: hi www.programicio.com