当前位置:  开发笔记 > 编程语言 > 正文

多文件C程序,如何最好地实现可选的日志记录?

如何解决《多文件C程序,如何最好地实现可选的日志记录?》经验,为你挑选了1个好方法。

我有一个多文件C程序.我希望用户能够在运行时指定不同的调试级别.

实现这个的最佳方法是什么?

我正在考虑将调试(级别,"消息")类型函数导出并在任何地方使用.还有更好的/其他想法吗?



1> qrdl..:

Jonathan的建议很好但是从C99开始我们就有了可变参数宏,所以不需要对调试宏使用双括号.

我使用的是日志标头的简易版本:

#define LOG_FATAL    (1)
#define LOG_ERR      (2)
#define LOG_WARN     (3)
#define LOG_INFO     (4)
#define LOG_DBG      (5)

#define LOG(level, ...) do {  \
                            if (level <= debug_level) { \
                                fprintf(dbgstream,"%s:%d:", __FILE__, __LINE__); \
                                fprintf(dbgstream, __VA_ARGS__); \
                                fprintf(dbgstream, "\n"); \
                                fflush(dbgstream); \
                            } \
                        } while (0)
extern FILE *dbgstream;
extern int  debug_level;

所以,无论我需要记录什么,我只需添加一行

LOG(LOG_ERR, "I/O error %s occured while opening file %s", strerror(errno), filename);

在程序初始化期间,您需要指定dbgstream(通常默认为stderr)和的值debug_level.

对于真正的项目而不是fprintf多次调用我只是从LOG宏调用我的函数并传递__FILE__,__LINE__并且__VA_ARGS_作为参数 - 该函数还在日志行中打印日期,时间和pid,并且不是fflush()每次都执行 - 仅当缓冲计数器超过预设值时 - 显着提高测井性能.

但请注意,某些编译器可能不支持可变参数宏,因为它仅在C99中引入.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有