Monitorando a saída do dmesg

2

Eu acho que quando algo dá errado em um nível baixo em um dos meus servidores linux, eu posso ver mensagens sobre isso no buffer de anel do kernel . Estes podem ser visualizados a partir da linha de comando usando o comando dmesg .

Eu estou querendo saber se existe uma maneira fácil de fazer com que meus servidores me enviem um email sempre que algo for adicionado ao buffer de anel do kernel?

Agora eu tenho um script que é executado a cada hora, faz uma cópia da saída do dmesg e executa um diff no arquivo da hora anterior. Infelizmente isso não funciona tão bem, porque como as linhas são anexadas ao final da saída do dmesg, outras linhas são truncadas desde o início. Além disso, se eu tiver muita mensagem, ela simplesmente parará de me notificar completamente.

  • Existe uma maneira melhor de fazer isso?

  • Alguém mais acha que é importante ver essas mensagens quando elas acontecem?

adicionado

  • as informações relatadas pelo comando dmesg são as mesmas que em um dos arquivos de log? (Se sim, então a solução é mais fácil do que eu pensava)
por Brent 12.06.2009 / 00:57

6 respostas

1

O script a seguir enviará novas entradas para /var/log/kern.log para o usuário root.
Colocá-lo em /etc/cron.hourly enviará um email a cada hora, mas somente se houver novas mensagens do kernel.

#!/bin/bash

MAILTO=root
LOG=/var/log/kern.log

OFFSET_FILE=$0.offset
if [ ! -f $OFFSET_FILE ]; then echo 0 > $OFFSET_FILE; fi
OFFSET='cat $OFFSET_FILE'
FILESIZE='cat $LOG|wc -c'

# Check if log has been rotated
if [ "$OFFSET" -gt "$FILESIZE" ]; then
  OFFSET=0
  echo 0 > $OFFSET_FILE
fi
if [ "$FILESIZE" -gt "$OFFSET" ]; then
  tail -c+$OFFSET $LOG|sed "s/^/  /"|mail $MAILTO -s "new kernel alerts"
  echo $FILESIZE > $OFFSET_FILE
fi
    
por 12.06.2009 / 21:24
2

Existem várias ferramentas criadas para reunir essas informações e relatá-las regularmente.

Eu acho a ferramenta Lire (do sistema LogReport ) uma boa ferramenta de relatórios, mas você também pode estar interessado em < a href="http://logcheck.org/"> Logcheck e Logwatch . Todos são software livre e podem ser instalados diretamente da maioria dos repositórios de pacotes GNU / Linux.

    
por 12.06.2009 / 01:12
2

Esta é uma solução rápida e suja. Você pode obter lotes de e-mail. Eu aconselharia a adição de alguns comandos grep e / ou grep -v . Claro que você pode usar essa técnica para outros arquivos de log também. Adicione este comando no seu /etc/rc.d/rc.local ou no equivalente do seu sistema (depois de testá-lo a partir da linha de comando).

sudo tail -F /var/log/messages | while read line ; do echo "$line"|mail -s Subject recipient; done &

edit : alterado para maiúsculo F para fazer cauda seguir o arquivo pelo nome para poder manipular a rotação do registro.

    
por 12.06.2009 / 02:07
0

Existe um bom utilitário chamado cronolog (1) que lê um fluxo e o divide com base em um modelo de data. Exemplo de um dos meus arquivos de configuração do Apache:

CustomLog "|/usr/bin/cronolog -z0 /var/log/apache2/example.org/%Y/%Y-%m-%dZ.access_log" combined

Isso dividirá todos os logs do Apache em um formato example.org/yyyy/yy-mm-ddZ.access_log, o que facilita a vida em geral.

Agora, como isso pode ser usado em sua situação: Inicie um processo que registre tudo o que acontece em / var / log / messages:

tail -F /var/log/messages | cronolog -z0 /var/log/mylog/dmesg/%Y-%m-%d_%H.log &

Isso dividirá a saída em arquivos com o formato de nome de arquivo

/var/log/mylog/dmesg/yyyy-mm-dd_hh.log

A cada dois minutos após a hora, execute um script do cron que verifique se há um arquivo de log gerado na última hora. Algo parecido com isto:

#!/bin/bash

# This script is executed every XX:02 from cron

LOGDIR=/var/log/mylog/dmesg
# Get date string five minutes ago
LOGDATE=$(date -u +"%Y-%m-%d_%H" -d "5 min ago")

if [ -e $LOGDIR/$LOGDATE.log ]; then
    mail -s "dmesg log for $LOGDATE" [email protected] <$LOGDIR/$LOGDATE.log
fi

Se nenhum arquivo for encontrado, nenhum email será enviado. Com este sistema, você também terá backups do seu log no diretório $ LOGDIR.

    
por 12.06.2009 / 03:35
0

Se você não tem um kern.log e gostaria de criar e manter um, edite /etc/syslog.conf e adicione o seguinte

kern.* -/var/log/kern.log

Tente 'man 5 syslog.conf' se quiser mais ajuda para configurar o syslogd.

Além disso, a amostra ( link ) é outra ferramenta que pode ser facilmente configurada para exibir arquivos de log.

    
por 23.06.2009 / 16:03
0

O StackKrish está no caminho certo, mas ainda não envia e-mails. Para fazer isso você pode usar algo como syslog-ng que permite logar comandos para um programa com o destino program (). Se você não quiser fazer isso, você pode obter o syslogd regular para logar em um pipe nomeado / fifo que pode ser conectado a um script simples que enviaria o e-mail.

    
por 23.06.2009 / 17:14