Мониторинг вывода dmesg

Я обнаружил, что когда на одном из моих Linux-серверов что-то идет не так на низком уровне, я вижу сообщения об этом в кольцевом буфере ядра. Их можно просмотреть из командной строки с помощью команды dmesg.

Мне интересно, есть ли простой способ заставить мои серверы отправлять мне электронные письма всякий раз, когда что-то добавляется в кольцевой буфер ядра?

Прямо сейчас у меня есть скрипт, который запускается каждый час, делает копию вывода dmesg и запускает diff для файла предыдущего часа. К сожалению, это не очень хорошо работает, потому что, когда строки добавляются в конец вывода dmesg, другие строки усекаются с самого начала. Кроме того, если у меня есть много одного и того же сообщения, оно просто перестает уведомлять меня вообще.

  • Есть ли лучший способ сделать это?

  • Кто-нибудь еще считает важным видеть эти сообщения, когда они происходят?

добавленной

  • информация, сообщаемая командой dmesg, такая же, как в одном из файлов журнала? (Если так, то решение проще, чем я думал)

6 ответов

Решение

Следующий скрипт отправит любые новые записи в /var/log/kern.log пользователю root.
Если вы поместите его в /etc/cron.hourly, вы будете отправлять электронные письма каждый час, но только если появляются новые сообщения ядра.

#!/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

Это быстрое и грязное решение. Вы можете получить много почты. Я бы посоветовал добавить немного grep и / или grep -v команды. Конечно, вы можете использовать эту технику и для других файлов журналов. Добавьте эту команду в свой /etc/rc.d/rc.local или эквивалент вашей системы (после того, как вы проверили его из командной строки).

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

edit: изменено на заглавную F, чтобы tail следовал за файлом по имени, чтобы иметь возможность обрабатывать ротацию логов.

Существует ряд инструментов, предназначенных для сбора этой информации и регулярного ее предоставления.

Я считаю, что инструмент Lire (из системы LogReport) является хорошим инструментом отчетности, но вас также могут заинтересовать Logcheck и Logwatch. Все они являются свободными программами и могут быть установлены непосредственно из большинства основных репозиториев пакетов GNU/Linux.

StackKrish находится на правильном пути, но по-прежнему не отправляет электронную почту. Для этого вы можете использовать что-то вроде syslog-ng, которое позволяет регистрировать команды для программы с назначением program(). Если вы не хотите этого делать, вы можете получить регулярный syslogd для входа в именованный канал /fifo, который затем можно подключить к простому сценарию, который будет отправлять электронную почту.

Есть хорошая утилита cronolog(1), которая читает поток и разбивает его по шаблону даты. Пример из одного из моих файлов конфигурации Apache:

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

Это разделит все журналы Apache на формат example.org/yyyy/yy-mm-ddZ.access_log, который в целом облегчит жизнь.

Теперь, как это можно использовать в вашей ситуации: Запустите процесс, который регистрирует все, что происходит в /var/log/messages:

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

Это разделит вывод на файлы с форматом имени файла

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

Каждые две минуты после часа запускайте скрипт из cron, который проверяет, сгенерирован ли файл журнала в последний час. Что-то вроде этого:

#!/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" my@mail.com <$LOGDIR/$LOGDATE.log
fi

Если файл не найден, письмо не отправляется. С этой системой вы также будете иметь резервные копии вашего журнала в каталоге $LOGDIR.

Если у вас нет kern.log и вы хотите создать и сохранить его, отредактируйте /etc/syslog.conf и добавьте следующее

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

Попробуйте man 5 syslog.conf, если вам нужна дополнительная помощь по настройке syslogd.

Также swatch ( http://sourceforge.net/projects/swatch/) - это еще один инструмент, который можно легко настроить для просмотра файлов журнала.

Другие вопросы по тегам