赞
踩
本篇仅仅是zlog的学习笔记,有错误请指正!
当程序执行下面的语句的时候 zlog_category_t *c; c = zlog_get_category("my_zlog"); zlog_info(c, "hello, zlog"); zlog会找到c的名字是"my_zlog",对应的配置文件中的规则是 [rules] my_zlog.DEBUG >stdout; simple 然后库会检查,目前这条日志的级别是否符合规则中的级别来决定是否输出。因为INFO>=DEBUG,所以这条日志会被输出。并且根据这条规则,会被输出到stdout(标准输出) ,输出的格式是simple,在配置文件中定义是 [formats] simple = "%m%n" 最后在屏幕上打印 hello, zlog 这就是整个过程。用户要做就是写自己的信息。日志往哪里输出,以什么格式输出,都是库和配置文件来完成的。
大部分的zlog的行为取决于配置文件:把日志打到哪里去,用什么格式,怎么转档。
[]代表一个节的开始,四个小节的顺序不能变,依次为global-levels-formats-rules。
其中,global和levels可不写。
全局参数以[global]开头。这一节可以忽略不写。
这一节以[levels]开始。用于定义用户自己的日志等级,建议和用户自定义的日志记录宏一起使用。这一节可以忽略不写。
语法为:(level string) = (level int), (syslog level, optional)
(level int)必须在[1,253]这个范围内,越大越重要。(syslog level)是可选的,如果不设默认为LOG_DEBUG。
这一节以[formats]开始。用来定义日志的格式。语法为:(name) = “(actual formats)”
(name)被后面的规则使用。(name)必须由数字和字母组成,下划线"_"也算字母。(actual format)前后需要有双引号。 (actual formats)可以由转换字符组成。
这一节以[rules]开头。这个描述了日志是怎么被过滤、格式化以及被输出的。这节可以忽略不写,不过这样就没有日志输出了,所以不建议省略。
语法是:(category).(level) (output), (options, optional); (format name, optional)
当zlog_init()被调用的时候,所有规则都会被读到内存中。当zlog_get_category()被调用,规则就被被分配给分类。在实际写日志的时候,例如zlog_info()被调用的时候,就会比较这个INFO和各条规则的等级,来决定这条日志会不会通过这条规则输出。当zlog_reload()被调用的时候,配置文件会被重新读入,包括所有的规则,并且重新计算分类对应的规则。
表达式 | 含义 |
---|---|
* | 所有等级 |
aa.debug | 代码内等级>=debug |
aa.=debug | 代码内等级==debug |
aa.!debug | 代码内等级!=debug |
总结 | 配置文件规则分类 | 匹配的代码分类 | 不匹配的代码分类 |
---|---|---|---|
*匹配所有 | * . * | aa, aa_bb, aa_cc, xx, yy | NONE |
以_结尾的分类匹配本级及下级分类 | aa_.* | aa,aa_bb, aa_bb_cc | xx, yy |
不以_结尾的精确匹配分类名 | aa.* | aa | aa_bb, aa_bb_cc |
!匹配那些没有找到规则的分类 | !.* | xx | aa(as it matches rules above) |
动作 | 输出字段 | 附加选项 |
---|---|---|
标准输出 | >stdout | 无意义 |
标准错误输出 | >stderr | 无意义 |
输出到syslog | >syslog | syslog设施(facilitiy):LOG_USER(default), LOG_LOCAL[0-7]必填 |
管道输出 | cat | |
文件 | “文件路径” | 文件转档 |
同步IO文件 | “文件路径” | |
用户自定义输出 | $name | "path"动态或者静态的用于record输出 |
int zlog_init(const char *confpath);
/*从配置文件confpath中读取配置信息到内存。
如果confpath为NULL,会寻找环境变量ZLOG_CONF_PATH的值作为配置文件名。
如果环境变量ZLOG_CONF_PATH也没有,所有日志以内置格式写到标准输出上。
每个进程只有第一次调用zlog_init()是有效的,后面的多余调用都会失败并不做任何事情。*/
int zlog_reload(const char *confpath);
/*从confpath重载配置,并根据这个配置文件来重计算内部的分类规则匹配、重建每个线程的缓存、并设置原有的用户自定义输出函数。
可以在配置文件发生改变后调用这个函数。这个函数使用次数不限。如果confpath为NULL,会重载上一次zlog_init()或者zlog_reload()
使用的配置文件。如果zlog_reload()失败,上一次的配置依然有效。所以zlog_reload()具有原子性。*/
void zlog_fini(void);
/*清理所有zlog API申请的内存,关闭它们打开的文件。使用次数不限。*/
返回值:如果成功,zlog_init()和zlog_reload()返回0。失败的话,zlog_init()和zlog_reload()返回-1。详细错误会被写在由环境变量ZLOG_PROFILE_ERROR指定的错误日志里面。
typedef struct zlog_category_s zlog_category_t;
zlog_category_t *zlog_get_category(const char *cname);
/*zlog_get_category()从zlog的全局分类表里面找到分类,用于以后输出日志。如果没有的话,就建一个。
然后它会遍历所有的规则,寻找和cname匹配的规则并绑定。
配置文件规则中的分类名匹配cname的规律描述如下:
1.* 匹配任意cname。
2.以下划线_结尾的分类名同时匹配本级分类和下级分类。例如aa_匹配aa, aa_, aa_bb, aa_bb_cc这几个cname。
3.不以下划线_结尾的分类名精确匹配cname。例如aa_bb匹配aa_bb这个cname。
4.! 匹配目前还没有规则的cname。*/
返回值:如果成功,返回zlog_category_t的指针。如果失败,返回NULL。详细错误会被写在由环境变量ZLOG_PROFILE_ERROR指定的错误日志里面。
下面3个函数是实际写日志的函数,输入的数据对应于配置文件中的%m。category来自于调用zlog_get_category()。
void zlog(zlog_category_t * category, const char *file, size_t filelen, const char *func, size_t funclen, long line, int level, const char *format, ...); void vzlog(zlog_category_t * category, const char *file, size_t filelen, const char *func, size_t funclen, long line, int level, const char *format, va_list args); void hzlog(zlog_category_t * category, const char *file, size_t filelen, const char *func, size_t funclen, long line, int level, const void *buf, size_t buflen);
参考资料:zlog使用手册
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。