forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
4.9 KiB
112 lines
4.9 KiB
.. SPDX-License-Identifier: GPL-2.0 |
|
|
|
=========================== |
|
Message logging with printk |
|
=========================== |
|
|
|
printk() is one of the most widely known functions in the Linux kernel. It's the |
|
standard tool we have for printing messages and usually the most basic way of |
|
tracing and debugging. If you're familiar with printf(3) you can tell printk() |
|
is based on it, although it has some functional differences: |
|
|
|
- printk() messages can specify a log level. |
|
|
|
- the format string, while largely compatible with C99, doesn't follow the |
|
exact same specification. It has some extensions and a few limitations |
|
(no ``%n`` or floating point conversion specifiers). See :ref:`How to get |
|
printk format specifiers right <printk-specifiers>`. |
|
|
|
All printk() messages are printed to the kernel log buffer, which is a ring |
|
buffer exported to userspace through /dev/kmsg. The usual way to read it is |
|
using ``dmesg``. |
|
|
|
printk() is typically used like this:: |
|
|
|
printk(KERN_INFO "Message: %s\n", arg); |
|
|
|
where ``KERN_INFO`` is the log level (note that it's concatenated to the format |
|
string, the log level is not a separate argument). The available log levels are: |
|
|
|
+----------------+--------+-----------------------------------------------+ |
|
| Name | String | Alias function | |
|
+================+========+===============================================+ |
|
| KERN_EMERG | "0" | pr_emerg() | |
|
+----------------+--------+-----------------------------------------------+ |
|
| KERN_ALERT | "1" | pr_alert() | |
|
+----------------+--------+-----------------------------------------------+ |
|
| KERN_CRIT | "2" | pr_crit() | |
|
+----------------+--------+-----------------------------------------------+ |
|
| KERN_ERR | "3" | pr_err() | |
|
+----------------+--------+-----------------------------------------------+ |
|
| KERN_WARNING | "4" | pr_warn() | |
|
+----------------+--------+-----------------------------------------------+ |
|
| KERN_NOTICE | "5" | pr_notice() | |
|
+----------------+--------+-----------------------------------------------+ |
|
| KERN_INFO | "6" | pr_info() | |
|
+----------------+--------+-----------------------------------------------+ |
|
| KERN_DEBUG | "7" | pr_debug() and pr_devel() if DEBUG is defined | |
|
+----------------+--------+-----------------------------------------------+ |
|
| KERN_DEFAULT | "" | | |
|
+----------------+--------+-----------------------------------------------+ |
|
| KERN_CONT | "c" | pr_cont() | |
|
+----------------+--------+-----------------------------------------------+ |
|
|
|
|
|
The log level specifies the importance of a message. The kernel decides whether |
|
to show the message immediately (printing it to the current console) depending |
|
on its log level and the current *console_loglevel* (a kernel variable). If the |
|
message priority is higher (lower log level value) than the *console_loglevel* |
|
the message will be printed to the console. |
|
|
|
If the log level is omitted, the message is printed with ``KERN_DEFAULT`` |
|
level. |
|
|
|
You can check the current *console_loglevel* with:: |
|
|
|
$ cat /proc/sys/kernel/printk |
|
4 4 1 7 |
|
|
|
The result shows the *current*, *default*, *minimum* and *boot-time-default* log |
|
levels. |
|
|
|
To change the current console_loglevel simply write the desired level to |
|
``/proc/sys/kernel/printk``. For example, to print all messages to the console:: |
|
|
|
# echo 8 > /proc/sys/kernel/printk |
|
|
|
Another way, using ``dmesg``:: |
|
|
|
# dmesg -n 5 |
|
|
|
sets the console_loglevel to print KERN_WARNING (4) or more severe messages to |
|
console. See ``dmesg(1)`` for more information. |
|
|
|
As an alternative to printk() you can use the ``pr_*()`` aliases for |
|
logging. This family of macros embed the log level in the macro names. For |
|
example:: |
|
|
|
pr_info("Info message no. %d\n", msg_num); |
|
|
|
prints a ``KERN_INFO`` message. |
|
|
|
Besides being more concise than the equivalent printk() calls, they can use a |
|
common definition for the format string through the pr_fmt() macro. For |
|
instance, defining this at the top of a source file (before any ``#include`` |
|
directive):: |
|
|
|
#define pr_fmt(fmt) "%s:%s: " fmt, KBUILD_MODNAME, __func__ |
|
|
|
would prefix every pr_*() message in that file with the module and function name |
|
that originated the message. |
|
|
|
For debugging purposes there are also two conditionally-compiled macros: |
|
pr_debug() and pr_devel(), which are compiled-out unless ``DEBUG`` (or |
|
also ``CONFIG_DYNAMIC_DEBUG`` in the case of pr_debug()) is defined. |
|
|
|
|
|
Function reference |
|
================== |
|
|
|
.. kernel-doc:: include/linux/printk.h |
|
:functions: printk pr_emerg pr_alert pr_crit pr_err pr_warn pr_notice pr_info |
|
pr_fmt pr_debug pr_devel pr_cont
|
|
|