The Contiki‐NG logging system

Using the logging system

Contiki-NG comes with a logging system that supports per-module log levels. It is implemented as os/sys/log.c, os/sys/log.h and os/sys/log-conf.h. The different log levels, for any given module, are:

  • LOG_LEVEL_NONE: Logs disabled,

  • LOG_LEVEL_ERR: Errors,

  • LOG_LEVEL_WARN: Errors and warnings,

  • LOG_LEVEL_INFO: Errors, warnings, and information logs,

  • LOG_LEVEL_DBG: All the above and debug messages.

The file log-conf.h shows the different modules that currently support logging: LOG_CONF_LEVEL_RPL for RPL, etc. Log levels can be set from a project-conf.h file (see doc:configuration), with for instance #define LOG_CONF_LEVEL_RPL LOG_LEVEL_WARN. See log-conf.h for more logging options, such as compact address logging, inclusion of the line of code that issues the log, etc.

Finally, the log level can be changed at run-time, e.g. using the Shell (tutorial:shell). The log level for a given module can be set with log_set_level. Note that it is not possible to set at run-time a log level greater than what was compiled. Only lower log levels are possible. To enable any level at run-time, compile Contiki-NG with the maximum log level for all modules (this will however result in a larger ROM usage, and may not be practical on some platform).

Supporting the logging system in a module

To support per-module logging, .c files that implement must set the following:

#include "sys/log.h"
#define LOG_MODULE "Test"

The first line includes the logging module. The second line defines the string used as a prefix for all logs of this module (use max 10 chars, for aligned output). The log level is then set to LOG_LEVEL_INFO. For examples of multi-file modules, see e.g. the RPL-Lite .c files.

To issue a log, use:

LOG_ERR("some error code (%u)\n", 42);
LOG_WARN("some warning\n");
LOG_INFO("some information\n");
LOG_DBG("some debug message\n");

At run-time, when the log level is set to e.g. LOG_LEVEL_ERR, this results in:

[ ERR: Test] some error code (42)

To append a string to the current line, use the variant of the macros that are suffixed with _. For instance:

LOG_ERR("some error message.. ");

Will issue:

[ ERR: Test] some error message.. continued

Finally, the module provides macros suffixed with _LLADDR and _6ADDR for convenient logging of link-layer addresses and IPv6 addresses, respectively. Example usage:

LOG_INFO("adding global IP address ");

Note the final LOG_INFO_("\n");, needed to end the line as none of the LOG_ macros add a \n. This example will issue, e.g.:

[INFO: Test] adding global IP address fd00::aaaa:bbbb:cccc:dddd

or, with LOG_CONF_WITH_COMPACT_ADDR enabled:

[INFO: Test] adding global IP address 6G-dddd