Я обнаружил, что когда что-то идет не так на низком уровне на одном из моих серверов 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, который затем можно подключить к простому скрипту, который будет отправлять электронное письмо.