Eu tenho um aplicativo Ruby no meu servidor, vamos chamá-lo de "alpha". O aplicativo emite mensagens do syslog com o nome do programa "alfa". Desejo separar minhas mensagens de log em arquivos separados com base no tipo de mensagem, por exemplo, mensagens "auth" (logins) ou avisos de recursos do sistema.
Eu não tenho nenhuma maneira de especificar "tipo de mensagem" para o syslog que não seja o nome do meu programa, por isso estou apenas adicionando "AUTH:", "SYSTEM:" etc. no início da minha mensagem.
Usando o Google e as páginas do manual, descobri estas condições:
:programname,isequal,"alpha" /var/log/alpha.log
Isso registra todas as mensagens do aplicativo "alpha" no arquivo de log correto.
:msg,startswith," AUTH:" /var/log/alpha-auth.log
Isso registra todas as mensagens iniciadas com "AUTH:" no arquivo de log correto.
Agora, obviamente, a última condição não se aplica apenas a "alfa", mas a todas as mensagens. Eu gostaria de combinar essas condições para uma que diz "todas as mensagens de alfa que começa com AUTH: ...". É possível combinar filtros com "e" assim?
"Blocos no estilo BSD" parecem perfeitos, pois eu posso definir um bloco para o meu aplicativo e todas as condições se aplicam apenas a mensagens daquele aplicativo. Infelizmente, de acordo com os documentos, o recurso não é mais suportado (obsoleto?) e não quero depender de um recurso obsoleto. O rsyslog v7 + introduz uma alternativa para esses blocos?
Usando um filtro com base em expressões, consegui obter o resultado desejado, mas sinto que estou usando uma bazuca para matar uma mosca:
if $programname == "alpha" and $msg startswith " AUTH:" then \
/var/log/alpha-auth.log
Qual seria a maneira "correta" (ou seja, mais simples e menos propensa a erros) de fazer isso?
Eu estou usando o Debian Jessie, que atualmente significa rsyslog 8.4.2