日志管理模块

来源:互联网 发布:java游戏下载宝软 编辑:程序博客网 时间:2024/04/29 16:53

日志管理模块的主要功能:

(1)在多线程的情况下,按照日志级别正常保存日志信息,记录格式如下:

  <日期 时间> [ 日志级别 ] <源文件名称:行号> 日志信息。

(2)可动态调整日志级别、自动日志开关;

(3)在自动日志开关打开的状态下:可按照日期分割日志文件,日志文件不存在时自动生成新的文件。


直接上代码:

sm_log.h

/* *  SMDFS: SaiMin Distributed File System *  Copyright (C) 2013-2014  He Saisong <hesaisong@gmail.com> */#ifndef __SM_LOG_H#define __SM_LOG_H#include "sm_core.h"#ifdef __cplusplusextern "C" {#endif#define SM_LOG_DEBUG7#define SM_LOG_INFO6 #define SM_LOG_NOTICE5 #define SM_LOG_WARN4 #define SM_LOG_ERROR3 #define SM_LOG_CRIT2 #define SM_LOG_ALERT1 #define SM_LOG_EMERG0 #define SM_LOG_FILE_NAME_LENGTH 255#define SM_LOG_BUF_LENGTH 1024typedef struct sm_log_s{int fd;pthread_mutex_t lock;char log_file[SM_LOG_FILE_NAME_LENGTH];char log_file_src[SM_LOG_FILE_NAME_LENGTH];volatile char level;volatile bool autolog;char buf[SM_LOG_BUF_LENGTH];time_t log_file_time;char level_str[8][15];}sm_log_t;sm_log_t * sm_log_init(char * file_name, char level, bool autolog);void sm_log_f(sm_log_t ** log, char * file_name, long line_number, const char * function_name, char level, char * fmt, ...);#ifdef __cplusplus#define sm_log(log, level, args...) sm_log_f(&(log), __FILE__, __LINE__, __func__, (level), args)#else#define sm_log(log, level, ...) sm_log_f(&(log), __FILE__, __LINE__, __func__, (level), __VA_ARGS__)#endif#define sm_log_level_reset_d(log, new_level)    \            pthread_mutex_lock(&(log->lock));   \            log->level = new_level;             \            pthread_mutex_unlock(&(log->lock));#define sm_log_autolog_reset_d(log, new_autolog)    \            pthread_mutex_lock(&(log->lock));   \            log->autolog = new_autolog;         \            pthread_mutex_unlock(&(log->lock));int sm_log_level_show(char * info, sm_log_t * log);int sm_log_level_reset(char * info, sm_log_t * log, char * arg);int sm_log_autolog_show(char * info, sm_log_t * log);int sm_log_autolog_reset(char * info, sm_log_t * log, char * arg);void sm_log_destroy(sm_log_t * log);#ifdef __cplusplus}#endif#endif

sm_log.c

/* *  SMDFS: SaiMin Distributed File System *  Copyright (C) 2013-2014  He Saisong <hesaisong@gmail.com> */#include "sm_core.h"sm_log_t * sm_log_init(char * file_name, char level, bool autolog){/* check input parameter */if (unlikely(NULL == file_name) || (level > 7)){return NULL;}openlog("sm_log_open", LOG_CONS | LOG_PID, 0);/* malloc log */sm_log_t * log;log = malloc(sizeof(sm_log_t));if (unlikely(NULL == log)){syslog(LOG_CRIT, "sm_log_open: Can't malloc for log.");closelog();return NULL;}/* get current log file name */time_t now;now = time(NULL);log->log_file_time = now;struct tm * p_tm;p_tm = localtime(&now);snprintf(log->log_file, SM_LOG_FILE_NAME_LENGTH, "%s-%d-%02d-%02d.log", file_name, p_tm->tm_year + 1900, p_tm->tm_mon + 1, p_tm->tm_mday);snprintf(log->log_file_src, SM_LOG_FILE_NAME_LENGTH, "%s", file_name);/* open log file */log->fd = open(log->log_file, O_RDWR | O_CREAT | O_APPEND);if (unlikely(-1 == log->fd)){syslog(LOG_CRIT, "sm_log_open: Can't open log file %s.", log->log_file);free(log);log = NULL;closelog();return NULL;}/* change log file privilege */chmod(log->log_file, 0644);/* init log lock */if (unlikely(0 != pthread_mutex_init(&(log->lock), NULL))) {syslog(LOG_CRIT, "sm_log_open: Init log lock error.");close(log->fd);free(log);log = NULL;closelog();return NULL;}/* init log */log->level = level;log->autolog = autolog;sprintf(log->level_str[0], "%s", "SM_LOG_EMERG");sprintf(log->level_str[1], "%s", "SM_LOG_ALERT");sprintf(log->level_str[2], "%s", "SM_LOG_CRIT");sprintf(log->level_str[3], "%s", "SM_LOG_ERROR");sprintf(log->level_str[4], "%s", "SM_LOG_WARN");sprintf(log->level_str[5], "%s", "SM_LOG_NOTICE");sprintf(log->level_str[6], "%s", "SM_LOG_INFO");sprintf(log->level_str[7], "%s", "SM_LOG_DEBUG");closelog();return log;}void sm_log_f(sm_log_t ** log, char * file_name, long line_number, const char * function_name, char level, char * fmt, ...){/* check log level and logger */if ((NULL == log) || (level > (*log)->level)){return;}/* get current time */time_t now;now = time(NULL);struct tm * n;n = localtime(&now);/* auto open new log */if ((*log)->autolog){struct tm * l;l = localtime(&((*log)->log_file_time));struct stat s;if ((n->tm_year > l->tm_year) || (n->tm_mon > l->tm_mon) || (n->tm_mday > l->tm_mday) || (-1 == stat((*log)->log_file, &s))){sm_log_t * new;new = sm_log_init((*log)->log_file_src, (*log)->level, (*log)->autolog);sm_log_destroy((*log));*log = new;}}/* lock */pthread_mutex_lock(&((*log)->lock));/* get log time */int len;len = sprintf((*log)->buf, "<%d-%02d-%02d %02d:%02d:%02d> [ %s ] <%s:%ld  %s> ", n->tm_year + 1900, n->tm_mon + 1, n->tm_mday, n->tm_hour, n->tm_min, n->tm_sec, (*log)->level_str[level], file_name, line_number, function_name);/* get log info */va_list ap;va_start(ap, fmt);vsnprintf((*log)->buf + len, SM_LOG_BUF_LENGTH - len, fmt, ap);va_end(ap);/* set end of log buf */len = strlen((*log)->buf);if (len < SM_LOG_BUF_LENGTH- 3){(*log)->buf[len] = '\n';(*log)->buf[len + 1] = '\0';}/* write log */write((*log)->fd, (*log)->buf, strlen((*log)->buf));bzero(&((*log)->buf), SM_LOG_BUF_LENGTH);/* unlock */pthread_mutex_unlock(&((*log)->lock)); }void sm_log_destroy(sm_log_t * log){/* lock */pthread_mutex_lock(&(log->lock));close(log->fd);/* unlock */pthread_mutex_unlock(&(log->lock)); /* destroy */pthread_mutex_destroy(&(log->lock));free(log);log = NULL;return;}int sm_log_level_show(char * info, sm_log_t * log){/* check input parameter */if (unlikely((NULL == info) || (NULL == log))){return -1;}/* get current log file name */    time_t now;    now = time(NULL);    struct tm * p_tm;    p_tm = localtime(&now);    sprintf(info, "%s", SM_UP_STRING);    sprintf(info, "%sCurrent time  %d.%02d.%02d %02d:%02d:%02d\r\n\r\n",            info, p_tm->tm_year + 1900, p_tm->tm_mon + 1, p_tm->tm_mday, p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);    sprintf(info, "%scurrent log level  : %s\r\n%s", info, log->level_str[log->level], SM_DOWN_STRING);return 0;}int sm_log_level_reset(char * info, sm_log_t * log, char * arg){/* check input parameter */if (unlikely((NULL == info) || (NULL == log) || (NULL == arg))){return -1;}/* get current log file name */    time_t now;    now = time(NULL);    struct tm * p_tm;    p_tm = localtime(&now);    sprintf(info, "%s", SM_UP_STRING);    sprintf(info, "%sCurrent time  %d.%02d.%02d %02d:%02d:%02d\r\n\r\n",            info, p_tm->tm_year + 1900, p_tm->tm_mon + 1, p_tm->tm_mday, p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);    if (0 == strcmp(arg, "SM_LOG_DEBUG"))    {        sm_log_level_reset_d(log, 7);        sprintf(info, "%sreset log level to %s successfully!\r\n%s", info, arg, SM_DOWN_STRING);    }    else if (0 == strcmp(arg, "SM_LOG_INFO"))    {        sm_log_level_reset_d(log, 6);        sprintf(info, "%sreset log level to %s successfully!\r\n%s", info, arg, SM_DOWN_STRING);    }else if (0 == strcmp(arg, "SM_LOG_NOTICE"))    {        sm_log_level_reset_d(log, 5);        sprintf(info, "%sreset log level to %s successfully!\r\n%s", info, arg, SM_DOWN_STRING);    }    else if (0 == strcmp(arg, "SM_LOG_WARN"))    {        sm_log_level_reset_d(log, 4);        sprintf(info, "%sreset log level to %s successfully!\r\n%s", info, arg, SM_DOWN_STRING);    }    else if (0 == strcmp(arg, "SM_LOG_ERROR"))    {        sm_log_level_reset_d(log, 3);        sprintf(info, "%sreset log level to %s successfully!\r\n%s", info, arg, SM_DOWN_STRING);    }else if (0 == strcmp(arg, "SM_LOG_CRIT"))    {        sm_log_level_reset_d(log, 2);        sprintf(info, "%sreset log level to %s successfully!\r\n%s", info, arg, SM_DOWN_STRING);    }    else if (0 == strcmp(arg, "SM_LOG_ALERT"))    {        sm_log_level_reset_d(log, 1);        sprintf(info, "%sreset log level to %s successfully!\r\n%s", info, arg, SM_DOWN_STRING);    }    else if (0 == strcmp(arg, "SM_LOG_EMERG"))    {        sm_log_level_reset_d(log, 0);        sprintf(info, "%sreset log level to %s successfully!\r\n%s", info, arg, SM_DOWN_STRING);    }else    {        sprintf(info, "%sreset log level failed, invalid parameter <%s>!\r\n%s", info, arg, SM_DOWN_STRING);    }return 0;}int sm_log_autolog_show(char * info, sm_log_t * log){/* check input parameter */if (unlikely((NULL == info) || (NULL == log))){return -1;}/* get current log file name */    time_t now;    now = time(NULL);    struct tm * p_tm;    p_tm = localtime(&now);    sprintf(info, "%s", SM_UP_STRING);    sprintf(info, "%sCurrent time  %d.%02d.%02d %02d:%02d:%02d\r\n\r\n",            info, p_tm->tm_year + 1900, p_tm->tm_mon + 1, p_tm->tm_mday, p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);if (log->autolog){    sprintf(info, "%scurrent log autolog  : true\r\n%s", info, SM_DOWN_STRING);}else{    sprintf(info, "%scurrent log autolog  : false\r\n%s", info, SM_DOWN_STRING);}return 0;}int sm_log_autolog_reset(char * info, sm_log_t * log, char * arg){/* check input parameter */if (unlikely((NULL == info) || (NULL == log) || (NULL == arg))){return -1;}/* get current log file name */    time_t now;    now = time(NULL);    struct tm * p_tm;    p_tm = localtime(&now);    sprintf(info, "%s", SM_UP_STRING);    sprintf(info, "%sCurrent time  %d.%02d.%02d %02d:%02d:%02d\r\n\r\n",            info, p_tm->tm_year + 1900, p_tm->tm_mon + 1, p_tm->tm_mday, p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);    if (0 == strcmp(arg, "false"))    {        sm_log_autolog_reset_d(log, false);        sprintf(info, "%sreset log autolog to false successfully!\r\n%s", info, SM_DOWN_STRING);} else if (0 == strcmp(arg, "true"))    {        sm_log_autolog_reset_d(log, true);        sprintf(info, "%sreset log autolog to true successfully!\r\n%s", info, SM_DOWN_STRING);    }    else{        sprintf(info, "%sreset log autolog failed, invalid parameter <%s>!\r\n%s", info, arg, SM_DOWN_STRING);}return 0;}/*//gcc -o log sm_log.c -lpthreadmain(){sm_log_t * log;log = sm_log_init("log_test", SM_LOG_INFO, 1);while (1){sm_log(log, SM_LOG_DEBUG, "%s", "debug");sm_log(log, SM_LOG_INFO, "%s", "info");sm_log(log, SM_LOG_NOTICE, "%s", "notice");sm_log(log, SM_LOG_WARN, "%s", "warn");sm_log(log, SM_LOG_ERROR, "%s", "error");sm_log(log, SM_LOG_CRIT, "%s", "crit");sm_log(log, SM_LOG_ALERT, "%s", "alert");sm_log(log, SM_LOG_EMERG, "%s", "emerg");sleep(1);}sm_log_destroy(log);}*/


0 0