Syslog был разработан в 1980 году как часть проекта Sendmail, но позже был использован и в других приложениях, став стандартом логгирования де-факто (протокол syslog был описан в RFC 3164 только в 2001 году, а спецификация, содержание сообщений и механизм их передачи были стандартизированы через 25 лет после создания) в UNIX-подобных системах.
Демон syslogd протоколирует события, информацию о которых ему посылают другие процессы, вызывая функцию syslogd (). В его конфигурационном файле /etc/syslog.conf определяется, какие события нужно протоколировать и каким способом.
Синтаксис этого файла:
источник.уровень действие
Источник (facility) - название процесса или группы процессов, генерирующей сообщения о событиях.
Уровень - степень серьезности сообщения (ошибка, фатальный сбой, предупреждение и т.п.).
Полный перечень источников и уровней приведен в man syslog.conf, например:
user - сообщения от пользовательских процессов,
kern – ядро,
mail – почта,
daemon – демоны,
auth – программы, связанные с аутентификацией,
lpr - подсистема печати,
local0-local7 – другие программы,
mark - специальный источник для добавления меток времени в файл протокола демоном syslogd.
Если в поле источника стоит знак "звездочка", это означает все события всех источников данного уровня, за исключением событий источника mark.
Уровни протоколирования syslogd
emerg - использовать узел невозможно,
alert - для решения проблемы необходимо срочно предпринять какие-либо действия,
crit - сообщение о критической ошибке,
err - прочие ошибочные состояния,
warning – предупреждение,
notice - предупреждение о какой-то проблеме, не рассматривается как ошибка,
info - информационное сообщение,
debug - сообщение при отладке программы или ее файла конфигурации,
none - требование не выполнять действий в отношении сообщений от указанного источника.
Если в поле уровня стоит знак "*", это означает события всех уровней данного источника, но такое указание не имеет смысла, поскольку при указании некоего уровня разрешается передача всех сообщений этого уровня и более серьезных, т.е. уровень warning на самом деле означает "warning, err, crit, alert, emerg".
Сообщение может быть записано в файл (что обычно и делается), переслано демону syslogd на другом компьютере, отправлено по почте или выведено на экран (это указывается в поле "действие").
Имя файла, начинающееся со слэша, указывает, что все сообщения должны быть записаны в этот файл.
Имя удаленного компьютера, предваренное символом @ (например, @server), означает, что все сообщения должны быть перенаправлены демону syslogd на этот компьютер. Имя “loghost" определяет компьютер, который будет регистрировать сообщения, каждый компьютер по умолчанию является лог-хостом для себя, но возможно определить в качестве loghost и другой компьютер в сети, указав его в файле /etc/hosts. Если локальный компьютер является лог-хостом, сообщения, принимаемые syslogd, будут записываться в соответствующие файлы, если нет - они будут пересылаться компьютеру, указанному как loghost.
Если в поле "действие" указан список имен пользователей, то им с помощью команды write будут отправляться сообщения, когда они находятся в системе.
Звездочка указывает, что сообщения будут отправляться помощью команды write всем пользователям, находящимся на данный момент в системе.
Для активации изменений, внесенных в /etc/syslog.conf, требуется послать сигнал HUP.
Указанный в /etc/syslog.conf уровень - минимальный для занесения события в протокол.
Пример syslog.conf:
# syslog configuration file.
#
# This file is processed by m4 so be careful to quote (`') names
# that match m4 reserved words. Also, within ifdef's, arguments
# containing commas must be quoted.
#
.err;kern.notice;auth.notice /dev/sysmsg
.err;kern.debug;daemon.notice;mail.crit /var/adm/messages
.alert;kern.err;daemon.err operator
.alert root
.emerg
# if a non-loghost machine chooses to have authentication messages
# sent to the loghost machine, un-comment out the following line:
#auth.notice ifdef(`LOGHOST', /var/log/authlog, @loghost)
mail.debug ifdef(`LOGHOST', /var/log/syslog, @loghost)
#
# non-loghost machines will use the following lines to cause "user"
# log messages to be logged locally.
#
ifdef(`LOGHOST', ,
user.err /dev/sysmsg
user.err /var/adm/messages
user.alert `root, operator'
user.emerg
)
Можно изменить его, например, указав /var/log/notice для сбора сообщений уровня notice и выше и сообщений почтовой подсистемы, /var/log/critical – для сообщений о критических ошибках, а /var/log/auth – для сообщений подсистемы аутентификации уровня warning и выше для обнаружения попыток вторжения в систему.
Для просмотра последних записей файла протокола используется команда tail с ключом f (tail -f), которая выводит последние 10 строк файла протокола и затем постоянно выдает новые строки по мере их появления после последней выведенной строки. Завершить ее работу можно нажатием комбинации клавиш "Ctrl-C".
В /var/adm/messages по умолчанию собираются сообщения, выдаваемые при загрузке системы, а также важные сообщения по ходу работы.
Каков бы ни был размер файловой системы /var, она заполнится лог-файлами, если их не укорачивать. Но укоротить файл от начала, удалив самые старые записи, нельзя, как нельзя и добавлять новые записи в начало файла. Это можно было бы осуществить с помощью копирования нужной области в новый файл и последующего переименования, но реализовать атомарность (выполнение или отказ в выполнении полностью, без прерываний) таких операций непросто и они требуют вдвое больше места в файловой системе на время работы (и алгоритма действия в случае недостатка места). Поэтому используется другой, менее ресурсоемкий алгоритм, позволяющий избежать переполнения /var: ротация системных журналов. Когда нужно укоротить журнал (это определяется по времени или размеру файла), этот файл переименовывают, и открывают новый пустой файл с тем же именем. Старые файлы можно перемещать в другой каталог или удалять.
Для этого в Solaris используется утилита logadm, которая управляется конфигурационным файлом /etc/logadm.conf - в нем указывается возможность сжатия файла, права доступа к нему, возможность отправки сигнала определенной службе, чтобы она заметила подмену журнала, если она сама, а не syslogd занимается его пополнением, и т.п.