从零开发MQTT服务(一)

开发语言: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,杭州。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值