日志管理模块
来源:互联网 发布: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
- 日志管理模块
- node日志管理模块log4js
- python模块——logging(日志管理)
- python模块——logging(日志管理)
- python模块——logging(日志管理)
- python模块——logging(日志管理)
- python模块——logging(日志管理)
- python日志管理模块logging学习
- 商城项目用拦截器实现日志管理模块
- slf4j+logback搭建超实用的日志管理模块
- 后台管理系统操作日志模块设计思路
- IIS 7 新的日志报表,数据库管理,和其他很酷的管理模块
- 日志管理
- 日志管理
- 日志管理
- 日志管理
- 日志管理
- 日志管理
- 一句开场白来开始重新开始我的博客园生涯吧
- hdu 3018 欧拉回路
- JNI视频教程 笔记(二)
- google服务框架
- 海量数据处理常用思路和方法
- 日志管理模块
- 自定义 setDateFormat 显示格式
- ubuntu10.04 Git服务器搭建之Repo
- xcode5时代如何设置Architectures和Valid Architectures
- Java程序中的“内存泄漏”问题
- ST32F103C8T6调试之IDE安装
- 无限互联iOS开发视频教程V2.0
- ubuntu10.04 Git服务器搭建之内部下载说明
- 通过cloudera-manager来安装hadoop