系统日志的编写技巧

  写程序的时候,输出调试信息是非常重要。在C中,我们常常使用printf,而在C++中,标准的用法是cout的了。有些比较老道的做法是加个DEBUG宏,比如:

        #ifdef  __DEBUG__
        printf("hello world") ;
        #endif

       这个办法在早期时候,用的比较多,他很容易将__DEBUG__宏去掉,就不用输出非常多的信息。但很显然,每个地方都要写很多代码。而且需要编译成DEBUG和REALSE版本。

       另外一个改进型的方式就是使用函数封装他,不再使用宏,而是使用配置参数来控制是否需输出调试信息,比如:
        static int debug_out_level = 0 ;
        void debug_out(int level , const char *format , ...)
        {
             va_list _arg ;
             char _msg[8192] = {0} ;

            va_start(_arg , format) ;
            vsprintf(_msg , format , _arg) ;
            va_end(_arg) ;

            if(level < debug_out_leve)
                printf("%s" , _msg) ;
        }
 
        由于debug_out_level是变量,我们可以很容易的控制他的值,这样,就可以控制printf是否被执行。

        上面的方法很不错,但是实际上,我们有时候还需要更详细的信息,比如__FILE__,__LINE__的信息,或者当前时间等。这些信息最好不要让用户来产生,让用户依然按他们的习惯输出。

        /***********************************************************************
              debug.h
        ***********************************************************************/
        #ifndef __DEBUG_H
        #define __DEBUG_H 1
       
        extern void debug_out(int level , int msgno , const char *filename , int line , const char *format , ...) ;

        #define DEBUG_OUT(level , msgno , ...) debug_out(level , msgno , __FILE__ , __LINE__ , __VA_ARGS__)

        #endif

        /***********************************************************************
              debug.c
        ***********************************************************************/
        #include "debug.h"

        void debug_out(int level , int msgno , const char *filename , int line , const char *format , ...)
        {
            ...
        }

        DEBUG_OUT可以按照用户原来的习惯,__FILE__,__LINE__被屏蔽掉了。也许那天我们再增加个参数,也不用让用户修改DEBUG_OUT的用法。

长时间运行的程序(例如服务器程序),或者流程复杂的多线程程序,打日志几乎是必需的,然而易这个圈子我到目前为止没有见过任何一个正经的日志轮子。 关于无锁 :无锁直接在未知的项目中大量使用的话,可能会比有锁的日志安全。 关于性能 :开启自动轮替,比 CreateFile + WriteFile + 临界资源 直接慢一点, 但是要注意 ,后者没有自动轮替,而且后者的自动轮替实现起来相对复杂,而且轮替的过程中容易阻塞、死锁或者丢失日志,而打日志最重要的就是【千万不要丢失日志】。 什么是自动轮替: 英文名 LogRotate,例如日志文件隔了一天就要换一个文件,否则文件越来越大,而且也不好整理和管理。比如默认每隔一天轮替一次。 我在这个日志系统里还加入了按照文件大小轮替,比如默认 100MB 轮替一次,太大了分析起来很吃力,编辑器带不动(我的日志不会太多,所以我自己使用会按照 10MB 来轮替,但是如果你的日志很频繁,轮替大小设置太小就会影响性能了)。 关于代码 : 代码从某天想起到成型也没有多久(事实上今天才算了个雏形),没有经历过正式的项目,经历了好几个版本所以也没有整理得很好看(相对的,可读性也还算可以了)。注释不多,对原理感兴趣的可以自行面向搜索引擎理解,不懂也可以交流。 吐槽 : 易的自定义数据类型真的慢啊。。。感谢 kyozy 指点,以后能不用自定义数据类型就不用了。 最后,这是个简陋的轮子,希望各位多多扩展和贡献代码,一个人的精力有限,所涉及的项目规模和场景也有限,所以... 我觉得这是个简陋但是很有意义的源码,希望各位与我一起完成它。 源码下载: 测试看  _临时子程序()  下面的  测试_无锁日志()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值