Назад | Перейти на главную страницу

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

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

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

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

добавлено

Это быстрое и грязное решение. Вы можете получить лоты почты. Я бы посоветовал добавить 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 &

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

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

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

Следующий скрипт отправит все новые записи в /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

Есть замечательная утилита 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.

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

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