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

9 c debugging

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

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

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

qrd*_*rdl 11

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;
Run Code Online (Sandbox Code Playgroud)

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

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中引入.


cse*_*ton 3

log4j 有一个非常好的 C 端口log4c