开发语言:Linux下C语言,gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
操作系统:Centos 6.5 64bit
源码地址:https://github.com/liberalman/mqtt/tree/master/libertymqtt
一.日志模块
文件路径:src/log.c
这里贴出核心代码
#ifdef _DEBUG
char log_time[24];
char log_extens[64];
#define _log(log_level, format, args...) \
_get_logtime(log_time);\
snprintf(log_extens, 63, "%s|%s:%d|%s()", log_time, __FILE__, __LINE__, __FUNCTION__);\
_log_printf(log_level, log_extens, format, ##args);
#else
_log(log_level, format, args...) _log_printf(log_level, "", format, ##args);
#endif
void _get_logtime(char *buf){
struct tm *now;
struct timeb tb;
ftime(&tb);
now = localtime(&tb.time);
snprintf(buf, 23, "%04d-%02d-%02d %02d:%02d:%02d.%03d", now->tm_year+1900,now->tm_mon+1,now->tm_mday, now->tm_hour, now->tm_min , now->tm_sec, tb.millitm);
}
void _log_printf(log_level_t level, const char *externs, const char *fmt, ...){
if (_log_level & level){ // 匹配打印级别
if(!_is_init)
init();
va_list argp;
Lock(&cs_log);
va_start(argp,fmt);
if (NULL==fmt||0==fmt[0])
return;
_vsnprintf(logstr,MAXLINSIZE,fmt,argp);
printf("%s|%s|%s", log_level_str[level], externs, logstr);
pf=fopen(logfilename1, "a");
if (NULL!=pf) {
fprintf(pf,"%s|%s|%s", log_level_str[level], externs, logstr);
if (ftell(pf)>MAXLOGSIZE) {
fclose(pf);
if (rename(logfilename1,logfilename2)) {
remove(logfilename2);
rename(logfilename1,logfilename2);
}
} else {
fclose(pf);
}
}
va_end(argp);
Unlock(&cs_log);
}
}
编译的时候在Makefile中的CFLAGS加上-D_DEBUG参数,就可以打印日期和函数名、行号什么的,不加就只打印用户数据。那么如何使用呢,请调用如下函数
_log(DEBUG, "%s\n", logbuf);
这样会在根目录下生成libertymqtt_1.log文件,同时打印终端也会有日志输出内容
[root@centos6~]#DEBUG|2016-06-22 15:11:45.10|src/main.c:23|main()|version 1.0
其中DEBUG是日志级别,分别是
NONE = 0 不输出日志
INFO = 1 信息
DEBUG = 2 调试
WARNING = 3 警告
ERROR = 4 错误
调用日志函数是要加同步锁的,会影响性能,上线的时候尽量关闭INFO、DEBUGE等日志级别,保留ERROR的就行了。那么如何调节等级呢
static log_level_t _log_level = NONE | INFO | WARNING | DEBUG | ERROR ;
这是日志等级的定义,如果我们要只打印ERROR的话,可以这样定义
static log_level_t _log_level = ERROR ;
则DEBUG、INFO等别的日志不会被打印,只会打印遇到ERROR的日志。
如果要打印DEBUG和ERROR两种日志,则
static log_level_t _log_level = ERROR | DEBUG ;
这样遇到这两种日志都会打印了。
始于2015-05-17,北京;更新至2016-06-22,杭州。