zlog是一个高性能、线程安全、灵活、概念清晰的纯C日志函数库。
特性:
*多种输出,包括动态文件、静态文件、stdout、stderr、syslog、用户自定义输出函数
*运行时手动或自动刷新配置
*用户自定义等级
*多线程和多进程环境下保证安全转档
*精确到微妙
链接:https://pan.baidu.com/s/1QAX8B-BQuwbYx5vXBnhnqA 密码:6zt9
$ tar -zxvf zlog-latest-stable.tar.gz
$ cd zlog-1.2.*/
$ make
$ sudo make install
or
$ sudo make PREFIX=/usr/local/ install
PREFIX指明了安装的路径,安转完之后为了让你的程序能找到zlog动态库
$ sudo vi /etc/ld.so.conf
/usr/local/lib
$ sudo ldconfig
链接:https://pan.baidu.com/s/1dOO-TVMEIWbNdnxwdGMQkg 密码:o3eq
示例
zlog的初始化
#ifndef __LOG_H__
#define __LOG_H__
#include
extern zlog_category_t *log_handle;
//level = 20
#define DGB(...) zlog_debug(log_handle, __VA_ARGS__)
//level = 80
#define WAR(...) zlog_warn(log_handle, __VA_ARGS__)
//level = 100
#define ERR(...) zlog_error(log_handle, __VA_ARGS__)
int open_log(char *conf, char *mode);
void close_log();
#endif
#include "log.h"
#include
#include
#include
zlog_category_t *log_handle = NULL;
int open_log(char *conf, char *mode)
{
printf("open_log:%s\n", conf);
if (!conf)
{
fprintf(stdout, "\nlog_conf_file is null!!!\n");
return -1;
}
if (zlog_init(conf))
{
fprintf(stdout, "\nzlog_init error!!!\n");
return -2;
}
log_handle = zlog_get_category(mode);
if (NULL == log_handle)
{
fprintf(stdout, "\nzlog_get_category error!!!\n");
return -3;
}
return 1;
}
void close_log()
{
zlog_fini();
}
日志等级
zlog_init()
该函数从配置文件confpath中读取配置信息到内存。如果confpath为NULL,会寻找环境变量ZLOG_CONF_PATH的值作为配置文件名。如果环境变量ZLOG_CONF_PATH也没有,所有日志以内置格式写到标准输出上。每个进程只有第一次调用zlog_inti()是有效的,后面的多余调用都会失败并不做任何事情。
成功返回0。失败,返回-1。详细错误会被写在由环境变量ZLOG_PROFILE_ERROR指定的错误日志里。
zlog_get_category():分类操作
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 *对应的规则,在zlog_reload()的时候会被自动重新计算。
不用担心内存释放,zlog_fini() 最后会清理一切.
如果成功,返回zlog_category_t的指针。如果失败,返回NULL。详细错误会被写在由环境变量ZLOG_PROFILE_ERROR指定的错误日志里面。
zlog_fini()清理所有zlog API申请的内存,关闭它们打开的文件。使用次数不限。
[global]
strict init = true
buffer min = 1024
buffer max = 0
rotate lock file = /tmp/zlog.lock
[formats]
simple = "%m%n"
simple2 = "%d(%F %T) %5V |%m%n"
[rules]
f_cat.* "/home/sunshine/myproject/log/mystrans.log";simple2
o_cat.* >stdout;simple2
strict init:
如果"strict init"是 true,zlog_init()将会严格检查所有的格式和规则,任何错误都会导致 zlog_init() 失败并且返回-1。当"strict init"是 false 的时候,zlog_init()会忽略错误的格式和规则。这个参数默认为 true。
rotate lock file:
这个选项指定了一个锁文件,用来保证多进程情况下日志安全转档。zlog会在zlog_init()时候以读写权限打开这个文件。确认你执行程序的用户有权限创建和读写这个文件。
buffer min • buffer max:
zlog 在堆上为每个线程申请缓存。"buffer min"是单个缓存的最小值,zlog_init()的时候申请这个长度的内存。写日志的时候,如果单条日志长度大于缓存,缓存会自动扩充,直到到"buffer max"。单条日志再长超过"buffer max"就会被截断。如果 "buffer max" 是 0,意味着不限制缓存,每次扩充为原先的 2 倍,直到这个进程用完所有内存为止。缓存大小可以加上 KB, MB 或 GB 这些单位。默认来说"buffer min"是 1K , "buffer max" 是 2MB。 • rotate lock file 这个选项指定了一个锁文件,用来保证多进程情况下日志安全转档。zlog 会在 zlog_init() 时候以读写权限打开这个文件。
default format:
这个参数是缺省的日志格式,默认值为:"%d %V [%p:%F:%L] %m%n"
这种格式产生的输出类似这样:2012-02-14 17:03:12 INFO [3758:test_hello.c:39] hello, zlog
file perms:
这个指定了创建日志文件的缺省访问权限。必须注意的是最后的产生的日志文件的权限为"file perms"& ~umask。默认为600,只允许当前用户读写。
规则(rules)
输出规则:
默认6个级别:"DEBUG", "INFO", "NOTICE", "WARN", "ERROR"和"FATAL"。配置文
件中的级别是大小写不敏感的。
o_cat.* 所有等级
o_cat.debug 代码内等级>=debug
o_cat.=debug 代码内等级==debug
o_cat.!debug 代码内等级!=debug
输出动作:
标准输出 >stdout
标准错误输出 >stderr
文件 "文件路径"