blob: f17332b1c2de888949a1986a18fb0ed1c6a67ace [file] [log] [blame]
/*
* Copyright (c) 2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
/** @file sys_log.h
* @brief Logging macros.
*/
#ifndef __SYS_LOG_H
#define __SYS_LOG_H
#ifdef __cplusplus
extern "C" {
#endif
#define SYS_LOG_LEVEL_OFF 0
#define SYS_LOG_LEVEL_ERROR 1
#define SYS_LOG_LEVEL_WARNING 2
#define SYS_LOG_LEVEL_INFO 3
#define SYS_LOG_LEVEL_DEBUG 4
/* Determine this compile unit log level */
#if !defined(SYS_LOG_LEVEL)
/* Use default */
#define SYS_LOG_LEVEL CONFIG_SYS_LOG_DEFAULT_LEVEL
#elif (SYS_LOG_LEVEL < CONFIG_SYS_LOG_OVERRIDE_LEVEL)
/* Use override */
#undef SYS_LOG_LEVEL
#define SYS_LOG_LEVEL CONFIG_SYS_LOG_OVERRIDE_LEVEL
#endif
/**
* @brief System Log
* @defgroup system_log System Log
* @{
*/
#if defined(CONFIG_SYS_LOG) && (SYS_LOG_LEVEL > SYS_LOG_LEVEL_OFF)
#define IS_SYS_LOG_ACTIVE 1
extern void (*syslog_hook)(const char *fmt, ...);
void syslog_hook_install(void (*hook)(const char *, ...));
/* decide print func */
#if defined(CONFIG_SYS_LOG_EXT_HOOK)
#define SYS_LOG_BACKEND_FN syslog_hook
#else
#include <misc/printk.h>
#define SYS_LOG_BACKEND_FN printk
#endif
/* Should use color? */
#if defined(CONFIG_SYS_LOG_SHOW_COLOR)
#define SYS_LOG_COLOR_OFF "\x1B[0m"
#define SYS_LOG_COLOR_RED "\x1B[0;31m"
#define SYS_LOG_COLOR_YELLOW "\x1B[0;33m"
#else
#define SYS_LOG_COLOR_OFF ""
#define SYS_LOG_COLOR_RED ""
#define SYS_LOG_COLOR_YELLOW ""
#endif /* CONFIG_SYS_LOG_SHOW_COLOR */
/* Should use log lv tags? */
#if defined(CONFIG_SYS_LOG_SHOW_TAGS)
#define SYS_LOG_TAG_ERR " [ERR]"
#define SYS_LOG_TAG_WRN " [WRN]"
#define SYS_LOG_TAG_INF " [INF]"
#define SYS_LOG_TAG_DBG " [DBG]"
#else
#define SYS_LOG_TAG_ERR ""
#define SYS_LOG_TAG_WRN ""
#define SYS_LOG_TAG_INF ""
#define SYS_LOG_TAG_DBG ""
#endif /* CONFIG_SYS_LOG_SHOW_TAGS */
/* Log domain name */
#if !defined(SYS_LOG_DOMAIN)
#define SYS_LOG_DOMAIN "general"
#endif /* SYS_LOG_DOMAIN */
/**
* @def SYS_LOG_NO_NEWLINE
*
* @brief Specifies whether SYS_LOG should add newline at the end of line
* or not.
*
* @details User can define SYS_LOG_NO_NEWLINE no prevent the header file
* from adding newline if the debug print already has a newline character.
*/
#if !defined(SYS_LOG_NO_NEWLINE)
#define SYS_LOG_NL "\n"
#else
#define SYS_LOG_NL ""
#endif
/* [domain] [level] function: */
#define LOG_LAYOUT "[%s]%s %s: %s"
#define LOG_BACKEND_CALL(log_lv, log_color, log_format, color_off, ...) \
SYS_LOG_BACKEND_FN(LOG_LAYOUT log_format "%s" SYS_LOG_NL, \
SYS_LOG_DOMAIN, log_lv, __func__, log_color, ##__VA_ARGS__, color_off)
#define LOG_NO_COLOR(log_lv, log_format, ...) \
LOG_BACKEND_CALL(log_lv, "", log_format, "", ##__VA_ARGS__)
#define LOG_COLOR(log_lv, log_color, log_format, ...) \
LOG_BACKEND_CALL(log_lv, log_color, log_format, \
SYS_LOG_COLOR_OFF, ##__VA_ARGS__)
#define SYS_LOG_ERR(...) LOG_COLOR(SYS_LOG_TAG_ERR, SYS_LOG_COLOR_RED, \
##__VA_ARGS__)
#if (SYS_LOG_LEVEL >= SYS_LOG_LEVEL_WARNING)
#define SYS_LOG_WRN(...) LOG_COLOR(SYS_LOG_TAG_WRN, \
SYS_LOG_COLOR_YELLOW, ##__VA_ARGS__)
#endif
#if (SYS_LOG_LEVEL >= SYS_LOG_LEVEL_INFO)
#define SYS_LOG_INF(...) LOG_NO_COLOR(SYS_LOG_TAG_INF, ##__VA_ARGS__)
#endif
#if (SYS_LOG_LEVEL == SYS_LOG_LEVEL_DEBUG)
#define SYS_LOG_DBG(...) LOG_NO_COLOR(SYS_LOG_TAG_DBG, ##__VA_ARGS__)
#endif
#else
/**
* @def IS_SYS_LOG_ACTIVE
*
* @brief Specifies whether SYS_LOG is in use or not.
*
* @details This macro expands to 1 if SYS_LOG was activated for current .c
* file, 0 otherwise.
*/
#define IS_SYS_LOG_ACTIVE 0
/**
* @def SYS_LOG_ERR
*
* @brief Writes an ERROR level message to the log.
*
* @details Lowest logging level, these messages are logged whenever sys log is
* active. it's meant to report severe errors, such as those from which it's
* not possible to recover.
*
* @param ... A string optionally containing printk valid conversion specifier,
* followed by as many values as specifiers.
*/
#define SYS_LOG_ERR(...) { ; }
#endif /* CONFIG_SYS_LOG */
/* create dummy macros */
#if !defined(SYS_LOG_WRN)
/**
* @def SYS_LOG_WRN
*
* @brief Writes a WARNING level message to the log.
*
* @details available if SYS_LOG_LEVEL is SYS_LOG_LEVEL_WARNING or higher.
* It's meant to register messages related to unusual situations that are
* not necessarily errors.
*
* @param ... A string optionally containing printk valid conversion specifier,
* followed by as many values as specifiers.
*/
#define SYS_LOG_WRN(...) { ; }
#endif
#if !defined(SYS_LOG_INF)
/**
* @def SYS_LOG_INF
*
* @brief Writes an INFO level message to the log.
*
* @details available if SYS_LOG_LEVEL is SYS_LOG_LEVEL_INFO or higher.
* It's meant to write generic user oriented messages.
*
* @param ... A string optionally containing printk valid conversion specifier,
* followed by as many values as specifiers.
*/
#define SYS_LOG_INF(...) { ; }
#endif
#if !defined(SYS_LOG_DBG)
/**
* @def SYS_LOG_DBG
*
* @brief Writes a DEBUG level message to the log.
*
* @details highest logging level, available if SYS_LOG_LEVEL is
* SYS_LOG_LEVEL_DEBUG. It's meant to write developer oriented information.
*
* @param ... A string optionally containing printk valid conversion specifier,
* followed by as many values as specifiers.
*/
#define SYS_LOG_DBG(...) { ; }
#endif
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* __SYS_LOG_H */