Уровни вывода сообщений ядра

We use cookies. Read the Privacy and Cookie Policy

Уровни вывода сообщений ядра

Главное отличие между функциями printk() и printf() — это возможность в первой указывать уровень вывода сообщений ядра (loglevel). Ядро использует уровень вывода сообщений для принятия решения о том, выводить сообщение на консоль или нет. Ядро выводит на консоль все сообщение с уровнями меньшими, или равными, соответствующему значению для консоли (console loglevel). Уровень вывода сообщений можно указывать следующим образом.

printk(KERN_WARNING "Это предупреждение! ");

printk(KERN_DEBUG "Это отладочное сообщение! ");

printk("Мы не указали значения loglevel! ");

Строки KERN_WARNING и KERN_DEBUG определены через препроцессор в заголовочном файле <linux/kernel.h>. Эти макросы раскрываются в строки, соответственно "<4>" и "<7>", которые объединяются со строкой формата в самом начале сообщения, выводимого функцией printk(). После этого на основании уровня вывода сообщения и уровня вывода консоли (значение переменной console_loglevel) ядро принимает решение выводить информацию на консоль или нет. В табл. 18.1 приведен полный список возможных значений уровня вывода сообщений.

Таблица 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>Это предупреждение! ");

printk("<7>Это отладочное сообщение! ");

printk("<4>Мы не указали значения loglevel! ");

Как вы будете использовать функцию printk() зависит только от вас. Конечно, обычные сообщения, которые должны быть видимы, должны иметь соответствующий уровень вывода. Отладочные сообщения, которые в большом количестве встраиваются в самые разные места кода с целью разобраться с проблемой — "допустим ошибка здесь", "пробуем", "работает" — могут иметь любой уровень вывода. Один вариант — оставить уровень при котором сообщения выводятся на консоль равным значению этого параметра по умолчанию, а уровень вывода ваших сообщений установить в значение KERN_CRIT, или что-то около этого. Можно поступить и наоборот — для отладочных сообщений установить уровень KERN_DEBUG и поднять уровень при котором сообщения выводятся на консоль. Каждый из вариантов имеет свои положительные и отрицательные стороны — вам решать.

Уровни вывода сообщений определены в файле <linux/kernel.h>.