/* EINA - EFL data type library * Copyright (C) 2007-2008 Jorge Luis Zapata Muga, Cedric Bail * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; * if not, see . */ #ifndef EINA_LOG_H_ #define EINA_LOG_H_ #include #include #include #include #include "eina_types.h" #define EINA_COLOR_LIGHTRED "\033[31;1m" #define EINA_COLOR_RED "\033[31m" #define EINA_COLOR_LIGHTBLUE "\033[34;1m" #define EINA_COLOR_BLUE "\033[34m" #define EINA_COLOR_GREEN "\033[32;1m" #define EINA_COLOR_YELLOW "\033[33;1m" #define EINA_COLOR_ORANGE "\033[0;33m" #define EINA_COLOR_WHITE "\033[37;1m" #define EINA_COLOR_LIGHTCYAN "\033[36;1m" #define EINA_COLOR_CYAN "\033[36m" #define EINA_COLOR_RESET "\033[0m" #define EINA_COLOR_HIGH "\033[1m" /** * @page tutorial_log_page Log Tutorial * * @section tutorial_log_introduction Introduction * * The Eina Log module provides logging facilities for libraries and * applications. It provides colored logging, basic logging levels (error, * warning, debug, info, critical) and loggers - called logging domains - * which will be covered in next sections. * * @section tutorial_log_basic_usage Basic Usage * * Log messages can be displayed using the following macros: * * @li EINA_LOG_ERR(), * @li EINA_LOG_INFO(), * @li EINA_LOG_WARN(), * @li EINA_LOG_DBG(). * * Here is an example: * * @include eina_log_02.c * * If you compiled Eina without debug mode, execution will yield only one log * message, which is "argument is negative". * * Here we introduce the concept of logging domains (or loggers), which might * already be familiar to readers. It is basically a way to separate a set of * log messages into a context (e.g. a module) and provide a way of controlling * this set as a whole. * * For example, suppose you have 3 different modules in your application and you * want to get logging only from one of them (e.g. create some sort of filter). * For achieving that, all you need to do is create a logging domain for each * module so that all logging inside a module can be considered as a whole. * * Logging domains are specified by a name, color applied to the name and the * level. The first two (name and color) are set through code, that is, inside * your application/module/library. * * The level is used for controlling which messages should appear. It * specifies the lowest level that should be displayed (e.g. a message * with level 11 being logged on a domain with level set to 10 would be * displayed, while a message with level 9 wouldn't). * * The domain level is set during runtime (in contrast with the name and * color) through the environment variable EINA_LOG_LEVELS. This variable * expects a list in the form domain_name1:level1,domain_name2:level2,... . For * example: * * @verbatim EINA_LOG_LEVELS=mymodule1:5,mymodule2:2,mymodule3:0 ./myapp@endverbatim * * This line would set mymodule1 level to 5, mymodule2 level to 2 and mymodule3 * level to 0. * * There's also a global logger to which EINA_LOG_(ERR, DBG, INFO, CRIT, WARN) * macros do log on. It is a logger that is created internally by Eina Log with * an empty name and can be used for general logging (where logging domains do * not apply). * * Since this global logger doesn't have a name, you can't set its level through * EINA_LOG_LEVELS variable. Here we introduce a second environment variable * that is a bit more special: EINA_LOG_LEVEL. * * This variable specifies the level of the global logging domain and the level * of domains that haven't been set through EINA_LOG_LEVELS. Here's an example: * * @verbatim EINA_LOG_LEVEL=3 EINA_LOG_LEVELS=module1:10,module3:2 ./myapp@endverbatim * * Supposing you have modules named "module1", "module2" and "module3", this * line would result in module1 with level 10, module2 with level 3 and module3 * with level 2. Note that module2's level wasn't specified, so it's level is * set to the global level. This way we can easily apply filters to multiple * domains with only one parameter (EINA_LOG_LEVEL=num). * * The global level (EINA_LOG_LEVEL) can also be set through code, using * eina_log_level_set() function. * * While developing your libraries or applications, you may notice that * EINA_LOG_DOM_(ERR, DBG, INFO, CRIT, WARN) macros also print out * messages from eina itself. Here we introduce another environment variable * that is a bit more special: EINA_LOG_LEVELS_GLOB. * * This variable allows you to disable the logging of any/all code in eina itself. * This is useful when developing your libraries or applications so that you can * see your own domain's messages easier without having to sift through a lot of * internal eina debug messages. Here's an example: * * @verbatim EINA_LOG_LEVEL=3 EINA_LOG_LEVELS_GLOB=eina_*:0 ./myapp@endverbatim * * This will disable eina_log output from all internal eina code thus allowing * you to see your own domain messages easier. * * @section tutorial_log_advanced_display Advanced usage of print callbacks * * The log module allows the user to change the way * eina_log_print() displays the messages. It suffices to pass to * eina_log_print_cb_set() the function used to display the * message. That function must be of type #Eina_Log_Print_Cb. As a * custom data can be passed to that callback, powerful display * messages can be displayed. * * It is suggested to not use __FILE__, __func__ or __LINE__ when * writing that callback, but when defining macros (like * EINA_LOG_ERR() and other macros). * * Here is an example of custom callback, whose behavior can be * changed at runtime: * * @include eina_log_03.c * @example eina_log_02.c * @example eina_log_03.c */ /** * @addtogroup Eina_Log_Group Log * * @brief Full-featured logging system. * * Eina provides eina_log_print(), a standard function to manage all * logging messages. This function may be called directly or using the * helper macros such as EINA_LOG_DBG(), EINA_LOG_ERR() or those that * take a specific domain as argument EINA_LOG_DOM_DBG(), * EINA_LOG_DOM_ERR(). Internally, eina_log_print() will call the * function defined with eina_log_print_cb_set(), that defaults to * eina_log_print_cb_stderr(), but may be changed to do whatever you * need, such as networking or syslog logging. * * The logging system is thread safe once initialized with * eina_log_threads_enable(). The thread that calls this function * first is considered "main thread" and other threads will have their * thread id (pthread_self()) printed in the log message so it is easy * to detect from where it is coming. * * Log domains is the Eina way to differentiate messages. There might * be different domains to represent different modules, different * feature-set, different categories and so on. Filtering can be * applied to domain names by means of @c EINA_LOG_LEVELS environment * variable or eina_log_domain_level_set(). * * The different logging levels serve to customize the amount of * debugging one want to take and may be used to automatically call * abort() once some given level message is printed. This is * controlled by environment variable @c EINA_LOG_ABORT and the level * to be considered critical with @c EINA_LOG_ABORT_LEVEL. These can * be changed with eina_log_abort_on_critical_set() and * eina_log_abort_on_critical_level_set(). * * The default maximum level to print is defined by environment * variable @c EINA_LOG_LEVEL, but may be set per-domain with @c * EINA_LOG_LEVELS. It will default to #EINA_LOG_ERR. This can be * changed with eina_log_level_set(). * * To use the log system Eina must be initialized with eina_init() and * later shut down with eina_shutdown(). Here is a straightforward * example: * * @include eina_log_01.c * * Compile this code with the following command: * * @verbatim gcc -Wall -o eina_log_01 eina_log_01.c `pkg-config --cflags --libs eina`@endverbatim * * Now execute the program with: * * @verbatim EINA_LOG_LEVEL=2 ./eina_log_01@endverbatim * * You should see a message displayed in the terminal. * * For more information, you can look at the @ref tutorial_log_page. * * @example eina_log_01.c */ /** * @addtogroup Eina_Tools_Group Tools * * @{ */ /** * @defgroup Eina_Log_Group Log * * @{ */ /** * EINA_LOG_DOMAIN_GLOBAL is the general purpose log domain to be * used, it is always registered and available everywhere. */ EAPI extern int EINA_LOG_DOMAIN_GLOBAL; #ifndef EINA_LOG_DOMAIN_DEFAULT /** * @def EINA_LOG_DOMAIN_DEFAULT * This macro defines the domain to use with the macros EINA_LOG_DOM_DBG(), * EINA_LOG_DOM_INFO(), EINA_LOG_DOM_WARN(), EINA_LOG_DOM_ERR() and * EINA_LOG_DOM_CRIT(). * * If not defined prior to the inclusion of this header, then it * defaults to #EINA_LOG_DOMAIN_GLOBAL. * * @note One may like to redefine this in its code to avoid typing too * much. In this case the recommended way is: * * @code * #include * #undef EINA_LOG_DOMAIN_DEFAULT * #define EINA_LOG_DOMAIN_DEFAULT _log_dom * static int _log_dom = -1; * * int main(void) * { * eina_init(); * _log_dom = eina_log_domain_register("mydom", EINA_COLOR_CYAN); * EINA_LOG_ERR("using my own domain"); * return 0; * } * @endcode * * @warning If one defines the domain prior to inclusion of this * header, the defined log domain symbol must be defined * prior as well, otherwise the inlined functions defined by * Eina will fail to find the symbol, causing build failure. * * @code * #define EINA_LOG_DOMAIN_DEFAULT _log_dom * static int _log_dom = -1; // must come before inclusion of Eina.h! * #include * * int main(void) * { * eina_init(); * _log_dom = eina_log_domain_register("mydom", EINA_COLOR_CYAN); * EINA_LOG_ERR("using my own domain"); * return 0; * } * @endcode * */ # define EINA_LOG_DOMAIN_DEFAULT EINA_LOG_DOMAIN_GLOBAL #endif /* EINA_LOG_DOMAIN_DEFAULT */ /** * @def EINA_LOG(DOM, LEVEL, fmt, ...) * Logs a message on the specified domain, level and format. * * @note If @c EINA_LOG_LEVEL_MAXIMUM is defined, then messages larger * than this value will be ignored regardless of current domain * level, the eina_log_print() is not even called! Most * compilers will just detect the two integers make the branch * impossible and remove the branch and function call all * together. Take this as optimization tip and possible remove * debug messages from binaries to be deployed, saving on hot * paths. Never define @c EINA_LOG_LEVEL_MAXIMUM on public * header files. */ #ifdef EINA_ENABLE_LOG # ifdef EINA_LOG_LEVEL_MAXIMUM # define EINA_LOG(DOM, LEVEL, fmt, ...) \ do { \ if (LEVEL <= EINA_LOG_LEVEL_MAXIMUM) { \ eina_log_print(DOM, LEVEL, __FILE__, __func__, __LINE__, \ fmt, ## __VA_ARGS__); } \ } while (0) # else # define EINA_LOG(DOM, LEVEL, fmt, ...) \ eina_log_print(DOM, \ LEVEL, \ __FILE__, \ __func__, \ __LINE__, \ fmt, \ ## __VA_ARGS__) # endif #else #define EINA_LOG(DOM, LEVEL, fmt, ...) \ do { (void) DOM; (void) LEVEL; (void) fmt; } while (0) #endif /** * @def EINA_LOG_DOM_CRIT(DOM, fmt, ...) * Logs a message with level CRITICAL on the specified domain and format. */ #define EINA_LOG_DOM_CRIT(DOM, fmt, ...) \ EINA_LOG(DOM, EINA_LOG_LEVEL_CRITICAL, fmt, ## __VA_ARGS__) /** * @def EINA_LOG_DOM_ERR(DOM, fmt, ...) * Logs a message with level ERROR on the specified domain and format. */ #define EINA_LOG_DOM_ERR(DOM, fmt, ...) \ EINA_LOG(DOM, EINA_LOG_LEVEL_ERR, fmt, ## __VA_ARGS__) /** * @def EINA_LOG_DOM_INFO(DOM, fmt, ...) * Logs a message with level INFO on the specified domain and format. */ #define EINA_LOG_DOM_INFO(DOM, fmt, ...) \ EINA_LOG(DOM, EINA_LOG_LEVEL_INFO, fmt, ## __VA_ARGS__) /** * @def EINA_LOG_DOM_DBG(DOM, fmt, ...) * Logs a message with level DEBUG on the specified domain and format. */ #define EINA_LOG_DOM_DBG(DOM, fmt, ...) \ EINA_LOG(DOM, EINA_LOG_LEVEL_DBG, fmt, ## __VA_ARGS__) /** * @def EINA_LOG_DOM_WARN(DOM, fmt, ...) * Logs a message with level WARN on the specified domain and format. */ #define EINA_LOG_DOM_WARN(DOM, fmt, ...) \ EINA_LOG(DOM, EINA_LOG_LEVEL_WARN, fmt, ## __VA_ARGS__) /** * @def EINA_LOG_CRIT(fmt, ...) * Logs a message with level CRITICAL on the default domain with the specified * format. */ #define EINA_LOG_CRIT(fmt, ...) \ EINA_LOG(EINA_LOG_DOMAIN_DEFAULT, \ EINA_LOG_LEVEL_CRITICAL, \ fmt, \ ## __VA_ARGS__) /** * @def EINA_LOG_ERR(fmt, ...) * Logs a message with level ERROR on the default domain with the specified * format. */ #define EINA_LOG_ERR(fmt, ...) \ EINA_LOG(EINA_LOG_DOMAIN_DEFAULT, EINA_LOG_LEVEL_ERR, fmt, ## __VA_ARGS__) /** * @def EINA_LOG_INFO(fmt, ...) * Logs a message with level INFO on the default domain with the specified * format. */ #define EINA_LOG_INFO(fmt, ...) \ EINA_LOG(EINA_LOG_DOMAIN_DEFAULT, EINA_LOG_LEVEL_INFO, fmt, ## __VA_ARGS__) /** * @def EINA_LOG_WARN(fmt, ...) * Logs a message with level WARN on the default domain with the specified * format. */ #define EINA_LOG_WARN(fmt, ...) \ EINA_LOG(EINA_LOG_DOMAIN_DEFAULT, EINA_LOG_LEVEL_WARN, fmt, ## __VA_ARGS__) /** * @def EINA_LOG_DBG(fmt, ...) * Logs a message with level DEBUG on the default domain with the specified * format. */ #define EINA_LOG_DBG(fmt, ...) \ EINA_LOG(EINA_LOG_DOMAIN_DEFAULT, EINA_LOG_LEVEL_DBG, fmt, ## __VA_ARGS__) /** * @typedef Eina_Log_Domain * The domain used for logging. */ typedef struct _Eina_Log_Domain Eina_Log_Domain; /** * @struct _Eina_Log_Domain * The domain used for logging. */ struct _Eina_Log_Domain { int level; /**< Max level to log */ const char *domain_str; /**< Formatted string with color to print */ const char *name; /**< Domain name */ size_t namelen; /**< strlen(name) */ /* Private */ Eina_Bool deleted : 1; /**< Flags deletion of domain, a free slot */ /* Add new members here. */ const char *color; /**< Color to use when printing in this domain */ }; /** * Enable logging module to handle threads. * * There is no disable option on purpose, if it is enabled, there is * no way back until you call the last eina_shutdown(). * * There is no function to retrieve if threads are enabled as one is * not supposed to know this from outside. * * After this call is executed at least once, if Eina was compiled * with threads support then logging will lock around debug messages * and threads that are not the main thread will have its identifier * printed. * * The main thread is considered the thread where the first * eina_init() was called. */ EAPI void eina_log_threads_enable(void); /** * @typedef Eina_Log_Level * List of available logging levels. */ /** * @enum _Eina_Log_Level * List of available logging levels. */ typedef enum _Eina_Log_Level { EINA_LOG_LEVEL_CRITICAL, /**< Critical log level */ EINA_LOG_LEVEL_ERR, /**< Error log level */ EINA_LOG_LEVEL_WARN, /**< Warning log level */ EINA_LOG_LEVEL_INFO, /**< Information log level */ EINA_LOG_LEVEL_DBG, /**< Debug log level */ EINA_LOG_LEVELS, /**< Count of default log levels */ EINA_LOG_LEVEL_UNKNOWN = (-2147483647 - 1) /**< Unknown level */ } Eina_Log_Level; /** * @typedef Eina_Log_Print_Cb * Type for print callbacks. */ typedef void (*Eina_Log_Print_Cb)(const Eina_Log_Domain *d, Eina_Log_Level level, const char *file, const char *fnc, int line, const char *fmt, void *data, va_list args); /** * @typedef Eina_Log_State * List of available log states. */ /** * @enum _Eina_Log_State * List of available log states. */ typedef enum _Eina_Log_State { EINA_LOG_STATE_START, EINA_LOG_STATE_STOP } Eina_Log_State; /* * Customization */ /** * Sets logging method to use. * * @param[in] cb The callback to call when printing a log. * @param[in] data The data to pass to the callback. * * By default, eina_log_print_cb_stderr() is used. * * @note MT: Safe to call from any thread. * * @note MT: Given function @a cb will be called protected by mutex. * This means you're safe from other calls but you should never * call eina_log_print(), directly or indirectly. */ EAPI void eina_log_print_cb_set(Eina_Log_Print_Cb cb, void *data) EINA_ARG_NONNULL(1); /** * @brief Sets the default log level. * * @param[in] level The log level. * * This function sets the log level @p level. It is used in * eina_log_print(). * * @note this is initially set to envvar EINA_LOG_LEVEL by eina_init(). * * @see eina_log_level_get() */ EAPI void eina_log_level_set(int level); /** * @brief Gets the default log level. * * @return The log level that limits eina_log_print(). * * @see eina_log_level_set() */ EAPI int eina_log_level_get(void) EINA_WARN_UNUSED_RESULT; /** * @brief Determines if a given @p level should be logged. * * @param[in] level The log level to check * * @return #EINA_TRUE if the @p level should be logged, else #EINA_FALSE. * * @see eina_log_level_set() */ static inline Eina_Bool eina_log_level_check(int level); /** * @brief Checks if current thread is the main thread. * * If there is no thread support (compiled with --disable-pthreads) or * threads were not enabled, then #EINA_TRUE is returned. The only case where * #EINA_FALSE is returned is when threads were successfully enabled but the * current thread is not the one that called eina_log_threads_init() (the * main thread). * * @return #EINA_TRUE if the current thread is the one that called * eina_log_threads_init(), otherwise #EINA_FALSE. */ EAPI Eina_Bool eina_log_main_thread_check(void) EINA_CONST EINA_WARN_UNUSED_RESULT; /** * @brief Enables or disables colored text in the logs. * * @param[in] disabled If #EINA_TRUE, color logging should be disabled. * * @note this is initially set to envvar EINA_LOG_COLOR_DISABLE by eina_init(). * * @see eina_log_color_disable_get() */ EAPI void eina_log_color_disable_set(Eina_Bool disabled); /** * @brief Determines if color logging is enabled or disabled. * * @return If #EINA_TRUE, color logging is disabled. * * @see eina_log_color_disable_set() */ EAPI Eina_Bool eina_log_color_disable_get(void) EINA_WARN_UNUSED_RESULT; /** * @brief Sets if originating file name logging should be disabled. * * @param[in] disabled If #EINA_TRUE, file name logging should be disabled. * * @note this is initially set to envvar EINA_LOG_FILE_DISABLE by eina_init(). * * @see eina_log_file_disable_get() */ EAPI void eina_log_file_disable_set(Eina_Bool disabled); /** * @brief Gets if originating file name logging should be disabled. * * @return If #EINA_TRUE, file name logging should be disabled. * * @see eina_log_file_disable_set() */ EAPI Eina_Bool eina_log_file_disable_get(void) EINA_WARN_UNUSED_RESULT; /** * @brief Sets if originating function name logging should be disabled. * * @param[in] disabled If #EINA_TRUE, function name logging should be disabled. * * @note this is initially set to envvar EINA_LOG_FUNCTION_DISABLE by * eina_init(). * * @see eina_log_function_disable_get() */ EAPI void eina_log_function_disable_set(Eina_Bool disabled); /** * @brief Gets if originating function name logging should be disabled. * * @return If #EINA_TRUE, function name logging should be disabled. * * @see eina_log_function_disable_set() */ EAPI Eina_Bool eina_log_function_disable_get(void) EINA_WARN_UNUSED_RESULT; /** * @brief Sets if critical messages should abort the program. * * @param[in] abort_on_critical If #EINA_TRUE, messages with level equal * or smaller than eina_log_abort_on_critical_level_get() will * abort the program. * * @note this is initially set to envvar EINA_LOG_ABORT by * eina_init(). * * @see eina_log_abort_on_critical_get() * @see eina_log_abort_on_critical_level_set() */ EAPI void eina_log_abort_on_critical_set(Eina_Bool abort_on_critical); /** * @brief Gets if critical messages should abort the program. * * @return If #EINA_TRUE, any messages with level equal or smaller * than eina_log_abort_on_critical_level_get() will abort the * program. * * @see eina_log_abort_on_critical_set() * @see eina_log_abort_on_critical_level_set() */ EAPI Eina_Bool eina_log_abort_on_critical_get(void) EINA_WARN_UNUSED_RESULT; /** * @brief Sets level that triggers abort if abort-on-critical is set. * * @param[in] critical_level Levels equal or smaller than the given * value will trigger program abortion if * eina_log_abort_on_critical_get() returns #EINA_TRUE. * * @note this is initially set to envvar EINA_LOG_ABORT_LEVEL by * eina_init(). * * @see eina_log_abort_on_critical_level_get() * @see eina_log_abort_on_critical_get() */ EAPI void eina_log_abort_on_critical_level_set(int critical_level); /** * @brief Gets level that triggers abort if abort-on-critical is set. * * @return Critical level equal or smaller than value will trigger * program abortion if eina_log_abort_on_critical_get() * returns #EINA_TRUE. * * @see eina_log_abort_on_critical_level_set() * @see eina_log_abort_on_critical_get() */ EAPI int eina_log_abort_on_critical_level_get(void) EINA_WARN_UNUSED_RESULT; /** * @brief Sets the domain level given its name. * * This call has the same effect as setting * EINA_LOG_LEVELS=<@p domain_name>:<@p level> * * @param[in] domain_name Domain name to change the level. It may be of * a still not registered domain. If the domain is not registered * yet, it will be saved as a pending set and applied upon * registration. * @param[in] level Level to use to limit eina_log_print() for given domain. */ EAPI void eina_log_domain_level_set(const char *domain_name, int level) EINA_ARG_NONNULL(1); /** * @brief Gets the domain level given its name. * * @param[in] domain_name Domain name to retrieve the level. It may be of * a still not registered domain. If the domain is not * registered yet, but there is a pending value, either from * eina_log_domain_level_set(),EINA_LOG_LEVELS environment * variable or from EINA_LOG_LEVELS_GLOB, these are * returned. If nothing else was found, then the global/default * level (eina_log_level_get()) is returned. * * @return Level to use to limit eina_log_print() for given * domain. On error (@p domain_name == NULL), * EINA_LOG_LEVEL_UNKNOWN is returned. * * @see eina_log_domain_level_set() * @see eina_log_domain_registered_level_get() */ EAPI int eina_log_domain_level_get(const char *domain_name) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1); /** * @brief Gets the domain level given its identifier. * * @param[in] domain Identifier, so it must be previously registered with * eina_log_domain_register(). It's a much faster version of * eina_log_domain_level_get(), but relies on domain being * present. * * @return #EINA_TRUE if level should be printed, #EINA_FALSE if not. * (domain's level is greater or equal @a level). */ EAPI int eina_log_domain_registered_level_get(int domain) EINA_WARN_UNUSED_RESULT; /** * @brief Sets the domain level given its identifier. * * @param[in] domain Identifier, so it must be previously registered with * eina_log_domain_register(). It's a much faster version of * eina_log_domain_level_get(), but relies on domain being * present. * @param[in] level Level to use to limit eina_log_print() for given domain. * @since 1.10 */ EAPI void eina_log_domain_registered_level_set(int domain, int level); static inline Eina_Bool eina_log_domain_level_check(int domain, int level); /* * Logging domains */ /** * @param[in] name Domain name * @param[in] color Color of the domain name * * @return Domain index that will be used as the DOMAIN parameter on log * macros. A negative return value means an error occurred. * * @note MT: Safe to call from any thread. */ EAPI int eina_log_domain_register(const char *name, const char *color) EINA_ARG_NONNULL(1); /** * @brief Forgets about a logging domain registered by eina_log_domain_register() * * @param[in] domain Domain identifier as reported by eina_log_domain_register(), * must be >= 0. * * @note MT: Safe to call from any thread. */ EAPI void eina_log_domain_unregister(int domain); /* * Logging functions. */ /** * @brief Prints out log message using given domain and level. * * @note Usually you'll not use this function directly but the helper * macros EINA_LOG(), EINA_LOG_DOM_CRIT(), EINA_LOG_CRIT() and * so on. See eina_log.h * * @param[in] domain Logging domain to use or @c EINA_LOG_DOMAIN_GLOBAL if * you registered none. It is recommended that modules and * applications have their own logging domain. * @param[in] level Message level, those with level greater than user * specified value (eina_log_level_set() or environment * variables EINA_LOG_LEVEL, EINA_LOG_LEVELS) will be ignored. * @param[in] file Filename that originated the call, must @b not be @c NULL. * @param[in] function Function that originated the call, must @b not be @c NULL. * @param[in] line Originating line in @a file. * @param[in] fmt Printf-like format to use. Should not provide trailing * '\n' as it is automatically included. * @param[in] ... Variadic args. * * @note MT: This function may be called from different threads if * eina_log_threads_enable() was called before. */ EAPI void eina_log_print(int domain, Eina_Log_Level level, const char *file, const char *function, int line, const char *fmt, ...) EINA_ARG_NONNULL(3, 4, 6) EINA_PRINTF(6, 7) EINA_NOINSTRUMENT; /** * @brief Prints out log message using given domain and level. * * @note Usually you'll not use this function directly but the helper * macros EINA_LOG(), EINA_LOG_DOM_CRIT(), EINA_LOG_CRIT() and * so on. See eina_log.h * * @param[in] domain Logging domain to use or @c EINA_LOG_DOMAIN_GLOBAL if * you registered none. It is recommended that modules and * applications have their own logging domain. * @param[in] level Message level, those with level greater than user * specified value (eina_log_level_set() or environment * variables EINA_LOG_LEVEL, EINA_LOG_LEVELS) will be ignored. * @param[in] file Filename that originated the call, must @b not be @c NULL. * @param[in] fnc Function that originated the call, must @b not be @c NULL. * @param[in] line Originating line in @a file. * @param[in] fmt Printf-like format to use. Should not provide trailing * '\n' as it is automatically included. * @param[in] args The arguments needed by the format. * * @note MT: this function may be called from different threads if * eina_log_threads_enable() was called before. * * @see eina_log_print() */ EAPI void eina_log_vprint(int domain, Eina_Log_Level level, const char *file, const char *fnc, int line, const char *fmt, va_list args) EINA_ARG_NONNULL(3, 4, 6) EINA_NOINSTRUMENT; /* * Logging methods (change how logging is done). */ /** * @brief Alternative logging method, this will output to standard output stream. * * @param[in] d The domain. * @param[in] level The level. * @param[in] file The file which is logged. * @param[in] fnc The function which is logged. * @param[in] line The line which is logged. * @param[in] fmt The output format to use. * @param[in] data Not used. * @param[in] args The arguments needed by the format. * * This method will colorize output based on domain provided color and * message logging level. To disable color, set environment variable * EINA_LOG_COLOR_DISABLE=1. Similarly, to disable file and line * information, set EINA_LOG_FILE_DISABLE=1 or * EINA_LOG_FUNCTION_DISABLE=1 to avoid function name in output. It is * not acceptable to have both EINA_LOG_FILE_DISABLE and * EINA_LOG_FUNCTION_DISABLE at the same time, in this case just * EINA_LOG_FUNCTION_DISABLE will be considered and file information * will be printed anyways. * * @note MT: If threads are enabled, this function is called within locks. * @note MT: Threads different from main thread will have thread id * appended to domain name. */ EAPI void eina_log_print_cb_stdout(const Eina_Log_Domain *d, Eina_Log_Level level, const char *file, const char *fnc, int line, const char *fmt, void *data, va_list args) EINA_ARG_NONNULL(1); /** * @brief Default logging method, this will output to standard error stream. * * @param[in] d The domain. * @param[in] level The level. * @param[in] file The file which is logged. * @param[in] fnc The function which is logged. * @param[in] line The line which is logged. * @param[in] fmt The output format to use. * @param[in] data Not used. * @param[in] args The arguments needed by the format. * * This method will colorize output based on domain provided color and * message logging level. * * To disable color, set environment variable * EINA_LOG_COLOR_DISABLE=1. To enable color, even if directing to a * file or when using a non-supported color terminal, use * EINA_LOG_COLOR_DISABLE=0. If EINA_LOG_COLOR_DISABLE is unset (or * -1), then Eina will disable color if terminal ($TERM) is * unsupported or if redirecting to a file. * Similarly, to disable file and line * information, set EINA_LOG_FILE_DISABLE=1 or * EINA_LOG_FUNCTION_DISABLE=1 to avoid function name in output. It is * not acceptable to have both EINA_LOG_FILE_DISABLE and * EINA_LOG_FUNCTION_DISABLE at the same time, in this case just * EINA_LOG_FUNCTION_DISABLE will be considered and file information * will be printed anyways. * * @note MT: If threads are enabled, this function is called within locks. * @note MT: Threads different from main thread will have thread id * appended to domain name. */ EAPI void eina_log_print_cb_stderr(const Eina_Log_Domain *d, Eina_Log_Level level, const char *file, const char *fnc, int line, const char *fmt, void *data, va_list args) EINA_ARG_NONNULL(1); /** * @brief Alternative logging method, this will output to given file stream. * * @param[in] d The domain. * @param[in] level Not used. * @param[in] file The file which is logged. * @param[in] fnc The function which is logged. * @param[in] line The line which is logged. * @param[in] fmt The output format to use. * @param[in] data The file which will store the output (as a FILE *). * @param[in] args The arguments needed by the format. * * This method will never output color. * * @note MT: If threads are enabled, this function is called within locks. * @note MT: Threads different from main thread will have thread id * appended to domain name. */ EAPI void eina_log_print_cb_file(const Eina_Log_Domain *d, Eina_Log_Level level, const char *file, const char *fnc, int line, const char *fmt, void *data, va_list args) EINA_ARG_NONNULL(1); /** * @brief Alternative logging method, this will output to systemd journal. * * @param[in] d The domain. * @param[in] level Not used. * @param[in] file The file which is logged. * @param[in] fnc The function which is logged. * @param[in] line The line which is logged. * @param[in] fmt The output format to use. * @param[in] data The file which will store the output (as a FILE *). * @param[in] args The arguments needed by the format. * * This method will never output color. * * @note If systemd journal is not there it will display error on stderr. * @note If the process has been started by systemd this will be the default logging method. * * @since 1.8 */ EAPI void eina_log_print_cb_journald(const Eina_Log_Domain *d, Eina_Log_Level level, const char *file, const char *fnc, int line, const char *fmt, void *data, va_list args) EINA_ARG_NONNULL(1); /** * @brief Configures console color of given file. * * @param[in] fp File to configure console color (usually stderr or stdout). * @param[in] color A VT color code such as EINA_COLOR_RED or EINA_COLOR_RESET. * * @note If color is disabled, nothing is done. See * eina_log_color_disable_get() * @note On windows, both @a fp and @a color is converted automatically. * * @since 1.7 */ EAPI void eina_log_console_color_set(FILE *fp, const char *color) EINA_ARG_NONNULL(1, 2); /** String that indicates the log system is initializing. */ extern EAPI const char *_eina_log_state_init; /** String that indicates the log system is shutting down. */ extern EAPI const char *_eina_log_state_shutdown; /** * @def EINA_LOG_STATE_INIT * String that indicates the log system is initializing */ #define EINA_LOG_STATE_INIT _eina_log_state_init /** * @def EINA_LOG_STATE_SHUTDOWN * String that indicates the log system is shutting down */ #define EINA_LOG_STATE_SHUTDOWN _eina_log_state_shutdown /** * @brief Starts or stops the timing of a phase. * * @param[in] domain The domain. * @param[in] state State indicating if we are starting or stopping a phase. * @param[in] phase The name of the phase to be used in the log. * * @note One domain can be in only one phase at a time. * @note If you change the name of the phase, it is assumed that * the previous phase has stopped. * @note The phase name should be available for all the life of the timing. * @since 1.8 */ EAPI void eina_log_timing(int domain, Eina_Log_State state, const char *phase) EINA_ARG_NONNULL(1, 3); #include "eina_inline_log.x" /** * @} */ /** * @} */ #endif /* EINA_LOG_H_ */