LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2714|回复: 6

[经验分享]程序日志中自动记录所在函数名、文件名、行号

[复制链接]
发表于 2007-5-15 04:28:04 | 显示全部楼层 |阅读模式
在后台程序运行出问题时,详尽的日志是抓错不可缺少的帮手,这里提供一个能自动记录日志触发点文件名、行号、函数名的方法,关键是利用C99新增的预处理标识符__VA_ARGS__

  1. #include <stdio.h>

  2. #define LOG_DEBUG "DEBUG"
  3. #define LOG_TRACE "TRACE"
  4. #define LOG_ERROR "ERROR"
  5. #define LOG_INFO  "INFOR"
  6. #define LOG_CRIT  "CRTCL"

  7. #define LOG(level, format, ...) \
  8.     do { \
  9.         fprintf(stderr, "[%s|%s@%s,%d] " format "\n", \
  10.             level, __func__, __FILE__, __LINE__, ##__VA_ARGS__ ); \
  11.     } while (0)

  12. int main()
  13. {
  14.     LOG(LOG_DEBUG, "a=%d", 10);
  15.     return 0;
  16. }

  17. 运行结果:
  18. [DEBUG|main@a.c,17] a=10
复制代码

限制是format不能是变量,必须是常量字符串,如果要记录一个变量字符串,不能像printf那样printf(s)了,要LOG("DEBUG", "%s", s)

我实际用的时候,结合ACE的策略日志服务,实现了运行时配置日志记录级别、日志文件个数、日志文件大小,当然每条日志还有时间、pid、tid
发表于 2007-5-15 08:51:55 | 显示全部楼层
Post by x11
在后台程序运行出问题时,详尽的日志是抓错不可缺少的帮手,这里提供一个能自动记录日志触发点文件名、行号、函数名的方法,关键是利用C99新增的预处理标识符__VA_ARGS__

  1. #include <stdio.h>

  2. #define LOG_DEBUG "DEBUG"
  3. #define LOG_TRACE "TRACE"
  4. #define LOG_ERROR "ERROR"
  5. #define LOG_INFO  "INFOR"
  6. #define LOG_CRIT  "CRTCL"

  7. #define LOG(level, format, ...) \
  8.     do { \
  9.         fprintf(stderr, "[%s|%s@%s,%d] " format "\n", \
  10.             level, __func__, __FILE__, __LINE__, ##__VA_ARGS__ ); \
  11.     } while (0)

  12. int main()
  13. {
  14.     LOG(LOG_DEBUG, "a=%d", 10);
  15.     return 0;
  16. }

  17. 运行结果:
  18. [DEBUG|main@a.c,17] a=10
复制代码

限制是format不能是变量,必须是常量字符串,如果要记录一个变量字符串,不能像printf那样printf(s)了,要LOG("DEBUG", "%s", s)

我实际用的时候,结合ACE的策略日志服务,实现了运行时配置日志记录级别、日志文件个数、日志文件大小,当然每条日志还有时间、pid、tid



应用这些特殊的标识符和预处理宏来记录日志确实很漂亮,能够非常方便地定位问题
回复 支持 反对

使用道具 举报

发表于 2007-5-15 09:50:37 | 显示全部楼层
程序员都喜欢这篇文章。赞。。。。
回复 支持 反对

使用道具 举报

发表于 2007-5-15 10:25:28 | 显示全部楼层
如何查看C99都定义了哪些宏呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-15 11:47:47 | 显示全部楼层
Post by skykingf
如何查看C99都定义了哪些宏呢

C99新特性 http://hi.baidu.com/harite/blog/ ... 80fb10728b651d.html
回复 支持 反对

使用道具 举报

发表于 2007-5-15 20:40:26 | 显示全部楼层
主要是__func__, __FILE__, __LINE__  这几个宏在起作用的
回复 支持 反对

使用道具 举报

发表于 2007-5-15 22:48:35 | 显示全部楼层
不错
顶一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表