X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=common%2Ftdm_log.c;h=ac7666de2e48dd0fa2f271ed84de66100b12f963;hb=ca91f10db2ce407718e436839fdf9501197edd15;hp=c843c9b931ee9859c220547133c81f8823997013;hpb=5ecd7fb59c26446e6f7a83cd2278b0cecd5393bf;p=platform%2Fcore%2Fuifw%2Flibtdm.git diff --git a/common/tdm_log.c b/common/tdm_log.c index c843c9b..ac7666d 100644 --- a/common/tdm_log.c +++ b/common/tdm_log.c @@ -9,7 +9,7 @@ * Taeheon Kim , * YoungJun Cho , * SooChan Lim , - * Boram Park + * Boram Park * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the @@ -43,13 +43,12 @@ #include #include #include +#include #include "tdm.h" #include "tdm_log.h" #include "tdm_macro.h" -//#define TDM_CONFIG_ASSERT - #define LOG_MAX_LEN 4076 #define COLOR_RED "\x1b[31m" /* for error */ @@ -60,62 +59,143 @@ #undef LOG_TAG #define LOG_TAG "TDM" -static unsigned int dlog_enable; -static unsigned int debug_level = TDM_LOG_LEVEL_INFO; +static unsigned int dlog_enable = 1; +static unsigned int color_enable = 1; -static unsigned int need_check_env = 1; +static unsigned int assert_level = TDM_LOG_LEVEL_NONE; -static void -_tdm_log_check_env(void) -{ - const char *str; - char *end; +static unsigned int log_lock_init; +static pthread_mutex_t log_lock; - str = getenv("TDM_DEBUG_LEVEL"); - if (str) - debug_level = strtol(str, &end, 10); +unsigned int tdm_log_debug_level = TDM_LOG_LEVEL_INFO; - str = getenv("TDM_DEBUG"); - if (str && (strstr(str, "1"))) - debug_level = TDM_LOG_LEVEL_DBG; +static int stdout_fd = -1; - str = getenv("TDM_DLOG"); - if (str && (strstr(str, "1"))) - dlog_enable = 1; +EXTERN void +tdm_log_enable_color(unsigned int enable) +{ + color_enable = enable; + TDM_INFO("color_enable: %d", color_enable); } EXTERN void tdm_log_enable_dlog(unsigned int enable) { + const char *str = getenv("TDM_DLOG"); + if (str) + enable = (str[0] == '1') ? 1 : 0; dlog_enable = enable; + TDM_INFO("dlog_enable: %d", dlog_enable); } EXTERN void -tdm_log_enable_debug(unsigned int enable) +tdm_log_set_debug_level(int level) { - if (enable) - debug_level = TDM_LOG_LEVEL_DBG; - else - debug_level = TDM_LOG_LEVEL_INFO; + const char *str = getenv("TDM_DEBUG_LEVEL"); + if (str) + level = str[0] - '0'; + tdm_log_debug_level = level; + TDM_INFO("debug_level: %d", tdm_log_debug_level); } EXTERN void -tdm_log_set_debug_level(int level) +tdm_log_set_assert_level(int level) { - debug_level = level; + const char *str = getenv("TDM_ASSERT_LEVEL"); + if (str) + level = str[0] - '0'; + assert_level = level; + TDM_INFO("assert_level: %d", assert_level); } EXTERN void -tdm_log_print(int level, const char *fmt, ...) +tdm_log_set_path(const char *path) { - va_list arg; + TDM_INFO("log_path: %s", path); + + if (!path) { + if (stdout_fd != -1) { + fflush(stdout); + close(STDOUT_FILENO); + dup2(stdout_fd, STDOUT_FILENO); + close(stdout_fd); + stdout_fd = -1; + } + } else { + char fd_name[TDM_PATH_LEN]; + int log_fd = -1; + FILE *log_fl; + + snprintf(fd_name, TDM_PATH_LEN, "%s", path); + + log_fl = fopen(fd_name, "a"); + if (!log_fl) { + TDM_ERR("failed: open file(%s)\n", fd_name); + return; + } + + if (stdout_fd == -1) { + fflush(stdout); + stdout_fd = dup(STDOUT_FILENO); + if (stdout_fd < 0) { + TDM_ERR("dup failed: %m\n"); + fclose(log_fl); + return; + } + } - if (need_check_env) { - need_check_env = 0; - _tdm_log_check_env(); + setvbuf(log_fl, NULL, _IOLBF, 512); + log_fd = fileno(log_fl); + + close(STDOUT_FILENO); + dup2(log_fd, STDOUT_FILENO); + fclose(log_fl); + TDM_INFO("log_path: %s done", path); + } +} + +static void +_tdm_log_vprint_stdout(int level, const char *fmt, va_list ap) +{ + if (!log_lock_init) { + log_lock_init = 1; + pthread_mutex_init(&log_lock, NULL); } - if (level > debug_level) + if (level > tdm_log_debug_level) + return; + + char *lvl_str[] = {"TDM_NON", "TDM_ERR", "TDM_WRN", "TDM_INF", "TDM_DBG"}; + char *color[] = {COLOR_RESET, COLOR_RED, COLOR_YELLOW, COLOR_GREEN, COLOR_RESET}; + + pthread_mutex_lock(&log_lock); + + if (color_enable) + printf("%s", color[level]); + printf("[%s]", lvl_str[level]); + if (color_enable) + printf(COLOR_RESET); + vprintf(fmt, ap); + printf("\n"); + pthread_mutex_unlock(&log_lock); +} + + +EXTERN void +tdm_log_printf(int level, const char *fmt, ...) +{ + va_list arg; + va_start(arg, fmt); + _tdm_log_vprint_stdout(level, fmt, arg); + va_end(arg); +} + +EXTERN void +tdm_log_print(int level, const char *fmt, ...) +{ + va_list arg; + + if (level > tdm_log_debug_level) return; if (dlog_enable) { @@ -137,25 +217,19 @@ tdm_log_print(int level, const char *fmt, ...) return; } va_start(arg, fmt); - dlog_vprint(dlog_prio, LOG_TAG, fmt, arg); + __dlog_vprint(LOG_ID_SYSTEM, dlog_prio, LOG_TAG, fmt, arg); va_end(arg); } else { - struct timespec ts; - char *lvl_str[] = {"TDM_NON", "TDM_ERR", "TDM_WRN", "TDM_INF", "TDM_DBG"}; - char *color[] = {COLOR_RESET, COLOR_RED, COLOR_YELLOW, COLOR_GREEN, COLOR_RESET}; - - clock_gettime(CLOCK_MONOTONIC, &ts); - - printf("%s", color[level]); - printf("[%s]", lvl_str[level]); - printf(COLOR_RESET"[%d.%06d]", (int)ts.tv_sec, (int)ts.tv_nsec / 1000); va_start(arg, fmt); - vprintf(fmt, arg); + _tdm_log_vprint_stdout(level, fmt, arg); va_end(arg); } -#ifdef TDM_CONFIG_ASSERT - if (level < 3) - assert(0); -#endif + assert(level > assert_level); +} + +EXTERN void +tdm_log_reset(void) +{ + pthread_mutex_unlock(&log_lock); }