Таблица 18.1. Доступные значения уровня вывода сообщений ядра (loglevel)
Значение loglevel |
Описание |
KERN_EMERG |
Аварийная ситуация |
KERN_ALERT |
Проблема, на которую требуется немедленно обратить внимание |
KERN_CRIT |
Критическая ситуация |
KERN_ERR |
Ошибка |
KERN_WARNING |
Предупреждение |
KERN_NOTICE |
Обычная ситуация, но на которую следует обратить внимание |
KERN_INFO |
Информационное сообщение |
KERN_DEBUG |
Отладочное сообщение — обычно избыточная информация |
Если уровень вывода сообщений ядра не указан, то его значение по умолчанию равно DEFAULT_MESSAGE_LOGLEVEL
, который в данный момент равен KERN_WARNING
. Так как это значение может измениться, то для своих сообщений необходимо всегда указывать уровень вывода.
Наиболее важный уровень вывода — KERN_EMERG
определен как "<0>"
, а наименее важный — KERN_DEBUG
, как "<7>"
. Например, после обработки препроцессором кода из предыдущего примера получается следующее.
printk("<4>Это предупреждение!\n");
printk("<7>Это отладочное сообщение!\n");
printk("<4>Мы не указали значения loglevel!\n");
Как вы будете использовать функцию printk()
зависит только от вас. Конечно, обычные сообщения, которые должны быть видимы, должны иметь соответствующий уровень вывода. Отладочные сообщения, которые в большом количестве встраиваются в самые разные места кода с целью разобраться с проблемой — "допустим ошибка здесь", "пробуем", "работает" — могут иметь любой уровень вывода. Один вариант — оставить уровень при котором сообщения выводятся на консоль равным значению этого параметра по умолчанию, а уровень вывода ваших сообщений установить в значение KERN_CRIT
, или что-то около этого. Можно поступить и наоборот — для отладочных сообщений установить уровень KERN_DEBUG
и поднять уровень при котором сообщения выводятся на консоль. Каждый из вариантов имеет свои положительные и отрицательные стороны — вам решать.
Уровни вывода сообщений определены в файле .
Сообщения ядра хранятся в кольцевом буфере (log buffer) размером LOG_BUF_LEN
. Этот размер можно изменять во время компиляции с помощью параметра CONFIG_LOG_BUF_SHIFT
. Для однопроцессорной машины это значение по умолчанию равно 16 Кбайт. Другими словами в ядре может хранится до 16 Кбайт системных сообщений. Если общий размер всех сообщений ядра достигает этого максимального значения и приходит новое сообщение, то оно переписывается поверх самого старого из хранящихся в буфере сообщений. Буфер сообщений ядра называется кольцевым , потому что запись и считывание сообщений выполняется по круговой схеме.
Использование кольцевого буфера предоставляет определенные преимущества. Так как одновременные операции чтения и записи в кольцевом буфере выполняются достаточно просто, то функцию printk()
можно использовать даже из контекста прерывания. Более того, это позволяет просто организовать управление системными сообщениями. Если сообщений оказывается очень много, то новые сообщения просто затирают старые. Если возникает проблема, которая проявляется в генерации большого количества сообщений, то буфер сообщений просто начинает переписывать себя вместо того, чтобы бесконтрольно занимать память. Единственный недостаток кольцевого буфера — возможность потерять сообщения, что не такая уж и большая плата за ту устойчивость, которую такое решение предоставляет.
В стандартной системе Linux для извлечения сообщений ядра из буфера используется специальный демон пространства пользователя klogd
, который направляет эти сообщения в файл журнала системных сообщений. Для чтения системных сообщений программа klogd
может считывать данные из файла /proc/kmsg
, или использовать системный вызов syslog()
. По умолчанию используется подход на основе файловой системы /proc
. Если сообщений нет, то демон klogd
блокируется на операции чтения, пока не поступит новое сообщение. Когда приходит новое сообщение, демон возвращается к выполнению, считывает сообщения и обрабатывает их. По умолчанию сообщения отправляются демону syslogd
.
Демон syslogd
добавляет полученные сообщения в конец файла журнала, по умолчанию — /var/log/messages
. Имя соответствующего файла можно настроить в конфигурационном файле /etc/syslog.conf
.
Читать дальше