| | |
| | | * |
| | | * Filename: logger.c |
| | | * Description: This file is the linux infrastructural logger system library |
| | | * |
| | | * |
| | | * Version: 1.0.0(08/08/2020~) |
| | | * Author: Guo Wenxue <guowenxue@gmail.com> |
| | | * ChangeLog: 1, Release initial version on "08/08/2020 04:24:01 PM" |
| | | * |
| | | * |
| | | ********************************************************************************/ |
| | | |
| | | #include "logger.h" |
| | |
| | | /* This library is not thread safe */ |
| | | static logger_t *logger = NULL; |
| | | |
| | | char *log_str[LOG_LEVEL_MAX + 1] = { "", "F", "E", "W", "N", "D", "I", "T", "M" }; |
| | | char *log_str[LOG_LEVEL_MAX + 1] = { "", "E", "W", "N", "D", "I", "M" }; |
| | | |
| | | #define LOG_TIME_FMT "%Y-%m-%d %H:%M:%S" |
| | | |
| | |
| | | if (sig == SIGHUP) |
| | | { |
| | | signal(SIGHUP, log_signal_handler); |
| | | log_fatal("SIGHUP received - reopenning log file [%s]", logger->file); |
| | | logger_reopen(); |
| | | log_err("SIGHUP received - reopenning log file [%s]", logger->file); |
| | | log_reopen(); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | |
| | | /* log_size unit is KB */ |
| | | int logger_init(logger_t *log, char *log_file, int level, int log_size) |
| | | int log_open(logger_t *log, char *log_file, int level, int log_size) |
| | | { |
| | | if( !log ) |
| | | struct sigaction act; |
| | | char *filemode; |
| | | |
| | | if(!log) |
| | | { |
| | | printf("ERROR: Invalid input arguments\n"); |
| | | return -1; |
| | | } |
| | | |
| | | if( log_file ) |
| | | { |
| | | strncpy(log->file, log_file, FILENAME_LEN); |
| | | log->flag |= FLAG_LOGGER_FILE; |
| | | } |
| | | else |
| | | { |
| | | strncpy(log->file, DBG_LOG_FILE, FILENAME_LEN); |
| | | log->flag |= FLAG_LOGGER_CONSOLE; |
| | | } |
| | | |
| | | log->level = level; |
| | | log->size = log_size; |
| | | |
| | | /* set static global $logger point to argument $log */ |
| | | logger = log; |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int logger_open(void) |
| | | { |
| | | struct sigaction act; |
| | | char *filemode; |
| | | |
| | | if(!logger) |
| | | /* use standard error as output */ |
| | | if( !log_file || log_file[0]=='\0' || !strcmp(log_file, LOG_STDERR)) |
| | | { |
| | | printf("ERROR: logger not initialise\n"); |
| | | return -1; |
| | | } |
| | | |
| | | log_rollback_size = logger->size <= 0 ? LOG_ROLLBACK_NONE : logger->size*1024; /* Unit KiB */ |
| | | |
| | | if ('\0' == logger->file[0]) |
| | | { |
| | | printf("ERROR: Logger filename not set\n"); |
| | | return -1; |
| | | } |
| | | |
| | | if (!strcmp(logger->file, DBG_LOG_FILE)) |
| | | { |
| | | logger->fp = stderr; |
| | | log_rollback_size = LOG_ROLLBACK_NONE; |
| | | strncpy(logger->file, LOG_STDERR, FILENAME_LEN); |
| | | logger->flag |= FLAG_LOGGER_CONSOLE; |
| | | logger->level = level; |
| | | logger->fp = stderr; |
| | | |
| | | log_rollback_size = LOG_ROLLBACK_NONE; |
| | | goto OUT; |
| | | } |
| | | |
| | | strncpy(logger->file, log_file, FILENAME_LEN); |
| | | logger->flag |= FLAG_LOGGER_FILE; |
| | | logger->level = level; |
| | | logger->size = log_size; |
| | | |
| | | log_rollback_size = log_size <= 0 ? LOG_ROLLBACK_NONE : log_size*1024; /* Unit KiB */ |
| | | |
| | | filemode = (log_rollback_size==LOG_ROLLBACK_NONE) ? "a+" : "w+"; |
| | | |
| | | logger->fp = fopen(logger->file, filemode); |
| | | if (NULL == logger->fp) |
| | | if ( !logger->fp ) |
| | | { |
| | | fprintf(stderr, "Open log file \"%s\" in %s failure: %s\n", logger->file, filemode, strerror(errno)); |
| | | return -2; |
| | |
| | | |
| | | OUT: |
| | | logger_banner("Initialize"); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | void logger_close(void) |
| | | void log_close(void) |
| | | { |
| | | if (!logger || !logger->fp ) |
| | | return; |
| | |
| | | return ; |
| | | } |
| | | |
| | | int logger_reopen(void) |
| | | int log_reopen(void) |
| | | { |
| | | int rc = 0; |
| | | char *filemode; |
| | | |
| | | if( !logger ) |
| | | return -1; |
| | | |
| | | log_rollback_size = logger->size <= 0 ? LOG_ROLLBACK_NONE : logger->size*1024; /* Unit KiB */ |
| | | |
| | | if (logger->flag & FLAG_LOGGER_CONSOLE ) |
| | | { |
| | |
| | | |
| | | if (logger->fp) |
| | | { |
| | | logger_close(); |
| | | log_close(); |
| | | filemode = log_rollback_size==LOG_ROLLBACK_NONE ? "a+" : "w+"; |
| | | logger->fp = fopen(logger->file, filemode); |
| | | |
| | | logger->fp = fopen(logger->file, filemode); |
| | | |
| | | if (logger->fp == NULL) |
| | | rc = -2; |
| | | } |
| | |
| | | return rc; |
| | | } |
| | | |
| | | void logger_term(void) |
| | | { |
| | | if(!logger) |
| | | return ; |
| | | |
| | | logger_close(); |
| | | |
| | | logger = NULL; |
| | | } |
| | | |
| | | void logger_raw(const char *fmt, ...) |
| | | { |
| | |
| | | " " |
| | | " " |
| | | " ???????????????" |
| | | "????????????????" |
| | | "????????????????" |
| | | "????????????????" |
| | | "????????????????" |
| | | "????????????????" |
| | | "????????????????" |
| | | "????????????????" |
| | | "????????????????" |
| | | "????????????????"; |
| | | |
| | | void logger_dump(int level, char *buf, int len) |