* the GNU General Public License.
*
* Copyright 2008 Develer S.r.l. (http://www.develer.com/)
- * All Rights Reserved.
+ *
* -->
*
+ * \defgroup logging Logging facilities
+ * \ingroup core
+ * \{
* \brief Logging system module.
*
* This module implement a simple interface to use the multi level logging system.
* The log message have the priority order, like this:
*
- * - error message (most hight)
+ * - error message (highest)
* - warning message
- * - info message (most low)
- *
- * With this priority system we can log only the message that have egual or major
- * priority than log level that you has been configurate. Further you can have a
- * differ log level for each module that you want. To do this you just need to
- * define LOG_LEVEL in cfg of select module.
- * When you set a log level, the system logs only the message that have priority
- * egual or major that you have define, but the other logs function are not include
- * at compile time, so all used logs function are linked, but the other no.
- *
- * To use logging system you should include this module in your drive and use
- * a LOG_ERROR, LOG_WARNING and LOG_INFO macros to set the level log of the message.
+ * - info message (lowest)
+ *
+ * With this priority system we log only the messages that have priority higher
+ * or equal to the log level that has been configurated; messages below the
+ * selected log level are not included at compile time, so no time and space
+ * is wasted on unused functions.
+ *
+ * Furthermore you can define different log levels for each module. To do this
+ * you just need to define LOG_LEVEL in the configuration file for the
+ * selected module.
+ *
+ * This module provides two types of macros:
+ *
+ * - LOG_* macros: these macros allow formatted output, using the same format
+ * as kprintf
+ * - LOG_*B macros: these macros allow to optionally compile a block of code
+ * depending on the logging level chosen
+ *
+ * To use the logging system you should include this module in your driver
+ * and use one of the LOG_ERR, LOG_WARN and LOG_INFO macros to output error
+ * messages.
* Then you should define a LOG_LEVEL and LOG_VERBOSE costant in your
* \c cfg/cfg_\<your_cfg_module_name\>.h using the follow policy:
*
- * - in your file \c cfg/cfg_\<cfg_module_name\>.h, you define the logging
+ * - in your file \c cfg/cfg_\<cfg_module_name\>.h, define the logging
* level and verbosity mode for your specific module:
*
* \code
+ * /// Module logging level.
+ * #define <cfg_module_name>_LOG_LEVEL LOG_LVL_INFO
*
- * **
- * * Logging level definition.
- * *
- * * Use 0 to log only the error messages
- * * Use 1 to log the error and warning messages
- * * Use 2 to log all messages
- * *
- * #define <cfg_module_name>_LOG_LEVEL 2
- *
- * **
- * * Set logging verbosity.
- * *
- * * If verbose is zero print short log messages.
- * *
- * #define <cfg_module_name>_LOG_VERBOSE 1
- *
+ * /// Module logging format.
+ * #define <cfg_module_name>_LOG_FORMAT LOG_FMT_VERBOSE
* \endcode
*
- * - then, in the module that you use a logging macros you should define
- * a LOG_LEVEL and LOG_VERBOSE using the previous value that you have define
- * in cfg_<cfg_module_name>.h header. After this you should include the cfg/log.h
- * module:
+ * - then, in the module where you use the logging macros you should define
+ * the macros LOG_LEVEL and LOG_FORMAT and you should include cfg/log.h
+ * module, as demonstrated in the following example:
*
* \code
- *
- * // Define logging setting (for cfg/log.h module).
- * #define LOG_LEVEL <cfg_module_name>_LOG_LEVEL
- * #define LOG_VERBOSE <cfg_module_name>_LOG_VERBOSE
+ * // Define log settings for cfg/log.h.
+ * #define LOG_LEVEL <cfg_module_name>_LOG_LEVEL
+ * #define LOG_FORMAT <cfg_module_name>_LOG_FORMAT
* #include <cfg/log.h>
- *
* \endcode
*
- * if you include a log.h module without define the LOG_LEVEL and LOG_VERBOSE
- * macros, the module use the default setting (see below).
+ * if you include a log.h module without defining the LOG_LEVEL and LOG_VERBOSE
+ * macros, the module uses the default settings.
*
- * WARNING: when use the log.h module, and you want to set a your log level
- * make sure to include this module after a \c cfg_<cfg_module_name>.h, because the
- * LOG_LEVEL and LOG_VERBOSE macros must be defined before to include log module,
- * otherwise the log module use a default settings.
- *
- * \version $Id$
+ * WARNING: when using the log.h module make sure to include this module after
+ * a \c cfg_<cfg_module_name>.h, because the LOG_LEVEL and LOG_VERBOSE macros
+ * must be defined before including the log module. Otherwise the log module
+ * will use the default settings.
*
* \author Daniele Basile <asterix@develer.com>
+ *
+ * $WIZ$
*/
#ifndef CFG_LOG_H
#include <cfg/debug.h>
-
-// Use a default setting if nobody have define a log level
+// Use a default setting if nobody defined a log level
#ifndef LOG_LEVEL
#define LOG_LEVEL LOG_LVL_ERR
#endif
-// Use a default setting if nobody have define a log verbosity
-#ifndef LOG_VERBOSITY
-#define LOG_VERBOSITY LOG_SILENT
+// Use a default setting if nobody defined a log format
+#ifndef LOG_FORMAT
+#define LOG_FORMAT LOG_FMT_TERSE
#endif
/**
-* Multi level logging system.
-*
-* You can use these macro directy or using the cfg/log.h module
-* that provide a simple interface for using the logging multilevel system.
-* The priority level is order form error messages (hight priority) to info messages
-* (low priority), so if you choose a low level log message you can see also all message
-* that have a hight priority.
-*
-* \{
-*/
-/// Logging level definition
-#define LOG_LVL_ERR 0
-#define LOG_LVL_WARN 1
-#define LOG_LVL_INFO 2
-
-/// Logging verbose mode
-#define LOG_VERBOSE 1
-#define LOG_SILENT 0
-
-
-#if LOG_VERBOSITY == LOG_VERBOSE
- #define LOG_PRINT(str_level, str,...) kprintf("%s(%s():%d): "str, str_level, __func__, __LINE__, ## __VA_ARGS__)
-
-#elif LOG_VERBOSITY == LOG_SILENT
- #define LOG_PRINT(str_level, str,...) kprintf("%s: "str, str_level, ## __VA_ARGS__)
-
-#else
- #error No log verbosity defined
-
-#endif
-
-/**
- * Log message level select.
+ * \name Logging level definition
+ *
* When you choose a log level messages you choose
* also which print function are linked.
- * If you choose a low level of log you link all log function (error, warning and info),
- * but if choose a hight level you link only that have the priority egual or hight.
- * The priority level go from error (most hight) to info (most low) (see cfg/debug.h
- * for more detail).
+ * When using a log level, you link all log functions that have a priority
+ * higher or equal than the level you chose.
+ * The priority level go from error (highest) to info (lowest).
*
+ * $WIZ$ log_level = "LOG_LVL_NONE", "LOG_LVL_ERR", "LOG_LVL_WARN", "LOG_LVL_INFO"
+ * \{
*/
-#define LOG_ERR(str,...) LOG_PRINT("ERR", str, ## __VA_ARGS__)
+#define LOG_LVL_NONE 0
+#define LOG_LVL_ERR 1
+#define LOG_LVL_WARN 2
+#define LOG_LVL_INFO 3
+/** \} */
-#if (LOG_LEVEL <= LOG_LVL_INFO)
- #define LOG_WARN(str,...) LOG_PRINT("WARN", str, ## __VA_ARGS__)
- #define LOG_INFO(str,...) LOG_PRINT("INFO", str, ## __VA_ARGS__)
+/**
+ * \name Logging format
+ *
+ * There are two logging format: terse and verbose. The latter prepends
+ * function names and line number information to each log entry.
+ *
+ * $WIZ$ log_format = "LOG_FMT_VERBOSE", "LOG_FMT_TERSE"
+ * \{
+ */
+#define LOG_FMT_VERBOSE 1
+#define LOG_FMT_TERSE 0
+/** \} */
+
+#if LOG_FORMAT == LOG_FMT_VERBOSE
+ #define LOG_PRINT(str_level, str,...) kprintf("%s():%d:%s: " str, __func__, __LINE__, str_level, ## __VA_ARGS__)
+#elif LOG_FORMAT == LOG_FMT_TERSE
+ #define LOG_PRINT(str_level, str,...) kprintf("%s: " str, str_level, ## __VA_ARGS__)
+#else
+ #error No LOG_FORMAT defined
+#endif
-#elif (LOG_LEVEL <= LOG_LVL_WARN)
- #define LOG_WARN(str,...) LOG_PRINT("WARN", str, ## __VA_ARGS__)
- #define LOG_INFO(str,...) /* Nothing */
+#if LOG_LEVEL >= LOG_LVL_ERR
+ /**
+ * Output an error message
+ */
+ #define LOG_ERR(str,...) LOG_PRINT("ERR", str, ## __VA_ARGS__)
+ /**
+ * Define a code block that will be compiled only when LOG_LEVEL >= LOG_LVL_ERR
+ */
+ #define LOG_ERRB(x) x
+#else
+ INLINE void LOG_ERR(UNUSED_ARG(const char *, fmt), ...) { /* nop */ }
+ #define LOG_ERRB(x) /* Nothing */
+#endif
-#else /* LOG_LEVEL <= LOG_LVL_ERR */
- #define LOG_WARN(str,...) /* Nothing */
- #define LOG_INFO(str,...) /* Nothing */
+#if LOG_LEVEL >= LOG_LVL_WARN
+ /**
+ * Output a warning message
+ */
+ #define LOG_WARN(str,...) LOG_PRINT("WARN", str, ## __VA_ARGS__)
+ /**
+ * Define a code block that will be compiled only when LOG_LEVEL >= LOG_LVL_WARN
+ */
+ #define LOG_WARNB(x) x
+#else
+ INLINE void LOG_WARN(UNUSED_ARG(const char *, fmt), ...) { /* nop */ }
+ #define LOG_WARNB(x) /* Nothing */
+#endif
+#if LOG_LEVEL >= LOG_LVL_INFO
+ /**
+ * Output an informative message
+ */
+ #define LOG_INFO(str,...) LOG_PRINT("INFO", str, ## __VA_ARGS__)
+ /**
+ * Define a code block that will be compiled only when LOG_LEVEL >= LOG_LVL_INFO
+ */
+ #define LOG_INFOB(x) x
+#else
+ INLINE void LOG_INFO(UNUSED_ARG(const char *, fmt), ...) { /* nop */ }
+ #define LOG_INFOB(x) /* Nothing */
#endif
+/** \} */
-#endif /* CFG_LOG_H */
+#endif /* CFG_LOG_H */