Уровни вывода сообщений ядра
Уровни вывода сообщений ядра
Главное отличие между функциями 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>.