From: Enlightenment S. <no-...@en...> - 2009-09-02 23:28:11
|
Log: eina_log improvements: docs, micro optimizations and stderr logging by default. * more docs. * do not getenv("EINA_LOG_ABORT") everytime, just at init. * EINA_UNLIKELY() in some critical paths (not that big impact anyway) * eina_log_print_cb_stderr() and use it by default. Author: barbieri Date: 2009-09-02 16:28:00 -0700 (Wed, 02 Sep 2009) New Revision: 42196 Modified: trunk/eina/src/include/eina_log.h trunk/eina/src/lib/eina_log.c Modified: trunk/eina/src/include/eina_log.h =================================================================== --- trunk/eina/src/include/eina_log.h 2009-09-02 23:11:22 UTC (rev 42195) +++ trunk/eina/src/include/eina_log.h 2009-09-02 23:28:00 UTC (rev 42196) @@ -191,6 +191,7 @@ 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(2, 3, 5); 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); +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); 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); /** Modified: trunk/eina/src/lib/eina_log.c =================================================================== --- trunk/eina/src/lib/eina_log.c 2009-09-02 23:11:22 UTC (rev 42195) +++ trunk/eina/src/lib/eina_log.c 2009-09-02 23:28:00 UTC (rev 42196) @@ -338,6 +338,7 @@ // Disable color flag (can be changed through the env var // EINA_LOG_ENV_COLOR_DISABLE). static Eina_Bool _disable_color = EINA_FALSE; +static Eina_Bool _abort_on_critical = EINA_FALSE; // List of domains registered static Eina_Log_Domain *_log_domains = NULL; @@ -345,7 +346,7 @@ static int _log_domains_allocated = 0; // Default function for printing on domains -static Eina_Log_Print_Cb _print_cb = eina_log_print_cb_stdout; +static Eina_Log_Print_Cb _print_cb = eina_log_print_cb_stderr; static void *_print_cb_data = NULL; #ifdef DEBUG @@ -593,6 +594,14 @@ * eina_log_shutdown() must be called to shut down the log * module. * + * The default logging method is eina_log_print_cb_stderr(), which + * will output fancy colored messages to standard error stream. See + * its documentation on how to disable coloring. + * + * This module will optionally abort program execution if message + * level is below or equal to @c EINA_LOG_LEVEL_CRITICAL and + * @c EINA_LOG_ABORT=1. + * * @see eina_init() */ EAPI int @@ -607,6 +616,9 @@ if ((tmp = getenv(EINA_LOG_ENV_COLOR_DISABLE)) && (atoi(tmp) == 1)) _disable_color = EINA_TRUE; + if ((tmp = getenv(EINA_LOG_ENV_ABORT)) && (atoi(tmp) == 1)) + _abort_on_critical = EINA_TRUE; + // Global log level if ((level = getenv(EINA_LOG_ENV_LEVEL))) _log_level = atoi(level); @@ -670,6 +682,11 @@ return --_eina_log_init_count; } +/** + * Sets logging method to use. + * + * By default, eina_log_print_cb_stderr() is used. + */ EAPI void eina_log_print_cb_set(Eina_Log_Print_Cb cb, void *data) { @@ -768,7 +785,41 @@ d->deleted = 1; } +/** + * Default logging method, this will output to standard error stream. + * + * 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 + */ 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, + __UNUSED__ void *data, va_list args) +{ + EINA_SAFETY_ON_NULL_RETURN(d); + + // Normalize levels for printing. Negative leveled messages go will have + // same color as CRITICAL and higher than debug will be regular blue. + if (level < 0) level = 0; + else if (level > 4) level = 5; + + fprintf(stderr, + "%s %s%s:%d %s()%s ", d->domain_str, + (!_disable_color) ? _colors[level] : "", + file, line, fnc, + (!_disable_color) ? EINA_COLOR_RESET: ""); + vprintf(fmt, args); +} + +/** + * Alternative logging method, this will output to standard output stream. + * + * 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 + */ +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, __UNUSED__ void *data, va_list args) @@ -787,6 +838,11 @@ vprintf(fmt, args); } +/** + * Alternative logging method, this will output to given file stream. + * + * This method will never output color. + */ EAPI void eina_log_print_cb_file(const Eina_Log_Domain *d, __UNUSED__ Eina_Log_Level level, const char *file, const char *fnc, int line, const char *fmt, @@ -814,8 +870,8 @@ EINA_SAFETY_ON_NULL_RETURN(fnc); EINA_SAFETY_ON_NULL_RETURN(fmt); - if (domain >= _log_domains_count) return; - if (domain < 0) return; + if (EINA_UNLIKELY(domain >= _log_domains_count)) return; + if (EINA_UNLIKELY(domain < 0)) return; d = &_log_domains[domain]; @@ -825,6 +881,7 @@ _print_cb(d, level, file, fnc, line, fmt, _print_cb_data, args); va_end(args); - if ((getenv(EINA_LOG_ENV_ABORT) && level <= EINA_LOG_LEVEL_CRITICAL)) + if (EINA_UNLIKELY(_abort_on_critical) && + EINA_UNLIKELY(level <= EINA_LOG_LEVEL_CRITICAL)) abort(); } |