update booster code for logger system and makefile
5 files modified
1 files added
| | |
| | | /* 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); |
| | | |
| | |
| | | return rc; |
| | | } |
| | | |
| | | void logger_term(void) |
| | | { |
| | | if(!logger) |
| | | return ; |
| | | |
| | | logger_close(); |
| | | |
| | | logger = NULL; |
| | | } |
| | | |
| | | void logger_raw(const char *fmt, ...) |
| | | { |
| | |
| | | #define FILENAME_LEN 64 |
| | | #endif |
| | | |
| | | #define DBG_LOG_FILE "stderr" /* Debug mode log file is console */ |
| | | #define LOG_STDERR "stderr" /* Debug mode log file is console */ |
| | | |
| | | #define LOG_ROLLBACK_SIZE 512 /* Default rollback log size */ |
| | | #define LOG_ROLLBACK_NONE 0 /* Set rollback size to 0 will not rollback */ |
| | |
| | | enum |
| | | { |
| | | LOG_LEVEL_DISB = 0, /* Disable "Debug" */ |
| | | LOG_LEVEL_FATAL, /* Debug Level "Fatal" */ |
| | | LOG_LEVEL_ERROR, /* Debug Level "ERROR" */ |
| | | LOG_LEVEL_WARN, /* Debug Level "warnning" */ |
| | | LOG_LEVEL_NRML, /* Debug Level "Normal" */ |
| | | LOG_LEVEL_DEBUG, /* Debug Level "Debug" */ |
| | | LOG_LEVEL_INFO, /* Debug Level "Information" */ |
| | | LOG_LEVEL_TRACE, /* Debug Level "Trace" */ |
| | | LOG_LEVEL_MAX, |
| | | }; |
| | | |
| | |
| | | extern char *log_str[]; |
| | | |
| | | /* log_size unit is KB */ |
| | | extern int logger_init(logger_t *logger, char *filename, int level, int log_size); |
| | | extern int logger_open(void); |
| | | extern void logger_set_time_format(char *time_format); |
| | | extern int logger_reopen(void); |
| | | extern void logger_close(void); |
| | | extern void logger_term(void); |
| | | extern void logger_raw(const char *fmt, ...); |
| | | extern int log_open(logger_t *logger, char *filename, int level, int log_size); |
| | | extern int log_reopen(void); |
| | | extern void log_close(void); |
| | | |
| | | /* lowlvel API */ |
| | | extern void logger_raw(const char *fmt, ...); |
| | | extern void logger_min(int level, char *fmt, ...); |
| | | extern void logger_line(int level, char *file, int line, char *fmt, ...); |
| | | extern void logger_str(int level, const char *msg); |
| | |
| | | #define LOG_FILE_LINE /* Log the file and line */ |
| | | |
| | | #ifdef LOG_FILE_LINE |
| | | #define log_trace(fmt, ...) logger_line(LOG_LEVEL_TRACE, __FILE__, __LINE__, fmt, ##__VA_ARGS__) |
| | | #define log_info(fmt, ...) logger_line(LOG_LEVEL_INFO, __FILE__, __LINE__, fmt, ##__VA_ARGS__) |
| | | #define log_dbg(fmt, ...) logger_line(LOG_LEVEL_DEBUG, __FILE__, __LINE__, fmt, ##__VA_ARGS__) |
| | | #define log_nrml(fmt, ...) logger_line(LOG_LEVEL_NRML, __FILE__, __LINE__, fmt, ##__VA_ARGS__) |
| | | #define log_warn(fmt, ...) logger_line(LOG_LEVEL_WARN, __FILE__, __LINE__, fmt, ##__VA_ARGS__) |
| | | #define log_err(fmt, ...) logger_line(LOG_LEVEL_ERROR, __FILE__, __LINE__, fmt, ##__VA_ARGS__) |
| | | #define log_fatal(fmt, ...) logger_line(LOG_LEVEL_FATAL, __FILE__, __LINE__, fmt, ##__VA_ARGS__) |
| | | #else |
| | | #define log_trace(fmt, ...) logger_min(LOG_LEVEL_TRACE, fmt, ##__VA_ARGS__) |
| | | #define log_info(fmt, ...) logger_min(LOG_LEVEL_INFO, fmt, ##__VA_ARGS__) |
| | | #define log_dbg(fmt, ...) logger_min(LOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__) |
| | | #define log_nrml(fmt, ...) logger_min(LOG_LEVEL_NRML, fmt, ##__VA_ARGS__) |
| | | #define log_warn(fmt, ...) logger_min(LOG_LEVEL_WARN, fmt, ##__VA_ARGS__) |
| | | #define log_err(fmt, ...) logger_min(LOG_LEVEL_ERROR, fmt, ##__VA_ARGS__) |
| | | #define log_fatal(fmt, ...) logger_min(LOG_LEVEL_FATAL, fmt, ##__VA_ARGS__) |
| | | #endif |
| | | |
| | | #endif /* ----- #ifndef _LOGGER_H_ ----- */ |
| | |
| | | @rm -f *.o |
| | | @rm -f *.a |
| | | |
| | | distclean: |
| | | @make clean |
| | | @rm -f cscope.* tags |
New file |
| | |
| | | /********************************************************************************* |
| | | * Copyright: (C) 2021 LingYun IoT System Studio |
| | | * All rights reserved. |
| | | * |
| | | * Filename: logger.c |
| | | * Description: This file is logger system sample code. |
| | | * |
| | | * Version: 1.0.0(17/07/21) |
| | | * Author: Guo Wenxue <guowenxue@gmail.com> |
| | | * ChangeLog: 1, Release initial version on "17/07/21 15:51:04" |
| | | * |
| | | ********************************************************************************/ |
| | | #include "logger.h" |
| | | |
| | | #define LOG_FILE "test.log" |
| | | |
| | | int main (int argc, char **argv) |
| | | { |
| | | int rv; |
| | | logger_t log; |
| | | |
| | | #ifdef LOG_FILE |
| | | if( log_open(&log, "test.log", LOG_LEVEL_NRML, 512) < 0 ) |
| | | #else |
| | | if( log_open(&log, LOG_STDERR, LOG_LEVEL_DEBUG, LOG_ROLLBACK_NONE) < 0 ) |
| | | #endif |
| | | { |
| | | fprintf(stderr, "initialise logger system failure, rv=%d\n", rv); |
| | | return -1; |
| | | } |
| | | |
| | | log_info("logger level [information] message\n"); |
| | | log_dbg ("logger level [ debug ] message\n"); |
| | | log_nrml("logger level [ normal ] message\n"); |
| | | log_warn("logger level [ warnning ] message\n"); |
| | | log_err ("logger level [ error ] message\n"); |
| | | |
| | | log_close(); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | |
| | | |
| | | clean: |
| | | @rm -f ${BINARIES} |
| | | @rm -f *.log |
| | | |
| | | distclean: |
| | | @make clean |
| | | @rm -f cscope.* tags |
| | |
| | | { |
| | | if (mkdir(ipc_dir, mode) < 0) |
| | | { |
| | | log_fatal("cannot create %s: %s\n", ipc_dir, strerror(errno)); |
| | | log_err("cannot create %s: %s\n", ipc_dir, strerror(errno)); |
| | | return -1; |
| | | } |
| | | |
| | |
| | | } |
| | | else |
| | | { |
| | | log_fatal("cannot create %s: %s\n", pid_file, strerror(errno)); |
| | | log_err("cannot create %s: %s\n", pid_file, strerror(errno)); |
| | | return -1; |
| | | } |
| | | |
| | |
| | | } |
| | | else |
| | | { |
| | | log_fatal("Can't open PID record file %s: %s\n", pid_file, strerror(errno)); |
| | | log_err("Can't open PID record file %s: %s\n", pid_file, strerror(errno)); |
| | | return -1; |
| | | } |
| | | return pid; |
| | |
| | | |
| | | if (record_daemon_pid(pid_file) < 0) |
| | | { |
| | | log_fatal("Record PID to file \"%s\" failure.\n", pid_file); |
| | | log_err("Record PID to file \"%s\" failure.\n", pid_file); |
| | | return -2; |
| | | } |
| | | |