最近在C语言开发的项目中需要建立一个比较完善的日志系统,方便研发及后期维护管理。于是就找到了zlog,zlog是一个高可靠性、高性能、线程安全、灵活、概念清晰的纯C日志函数库。
其优势及详细用法直接看手册(zlog使用手册中文版): http://hardysimpson.github.io/zlog/UsersGuide-CN.html
若链接进不去可自行下载:https://download.csdn.net/download/fangye945a/10902503
一、zlog的下载、编译与安装
# git clone https://github.com/HardySimpson/zlog.git //下载源码包
# cd zlog //进入工程目录
# mkdir build_linux build_arm //创建文件夹用于存放工程输出内容
# vim src/makefile //修改makefile中的PREFIX为自己创建的目录,如下图所示
# make //默认gcc编译,若需要交叉编译指定编译工具链即可:make CC=arm-linux-xxx-gcc
# make install //将生成的库和工具拷贝至自己创建的目录
默认安装路径是/usr/local,修改安装路径为自己创建的目录路径:
编译出arm和linux两个版本的库如下图所示:
二、zlog的使用
只需要包含zlog.h头文件即可使用,根据配置文件输出日志信息。如下为忽略分类(zlog_category_t)的一组简单zlog接口dzlog写的示例程序。
#include
#include "zlog.h"
int main(int argc,char *argv[])
{
int rc;
rc = dzlog_init("zlog.conf", "my_class"); //指定配置文件路径及类型名 初始化zlog
if (rc)
{
printf("init failed\n");
return -1;
}
dzlog_info("hello, zlog info"); //打印普通信息
dzlog_error("hello, zlog error");//打印错误信息
dzlog_warn("hello, zlog warning"); //打印报警信息
dzlog_debug("hello, zlog debug"); //打印调试信息
zlog_fini(); //释放zlog
return 0;
}
动态编译:gcc main.c -o test_zlog -I ../include -L ../lib/ -lzlog
静态编译:gcc main.c -o test_zlog -I ../include -L ../lib/ -static -lzlog -lpthread //需要依赖线程库
三、zlog配置文件
大部分的zlog的行为都取决于配置文件,比如把日志打到哪里去,用什么格式,怎么转档,都由配置文件来决定。
以如下配置文件为例:
[global]
strict init = true
buffer min = 1024
buffer max = 2MB
rotate lock file = /tmp/zlog.lock
default format = "%d.%us %-6V (%c:%F:%L) - %m%n"
file perms = 600
[rules]
my_class.* >stdout;
其中:[global]为全局参数
• strict init
如果"strict init"是true,zlog_init()将会严格检查所有的格式和规则,任何错误都会导致zlog_init() 失败并且返回-1。当"strict init"是false的时候,zlog_init()时会忽略错误的格式和规则。这个参数默认为true
• 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
详细可参考下表:
字符 |
效果 |
例子 |
%c |
分类名 |
aa_bb |
%d() |
打日志的时间。这个后面要跟一对小括号()内含说明具体的日期格式。就像%d(%F)或者%d(%m-%d %T)。如果不跟小括号,默认是%d(%F%T)。括号内的格式和 strftime(2)的格式一致。详见5.4.3 |
%d(%F) 2011-12-01 %d(%m-%d %T) 12-01 17:17:42 %d(%T) 17:17:42.035 %d 2012-02-14 17:03:12 %d() |
%E() |
获取环境变量的值 |
%E(USER) simpson |
%ms |
毫秒,3位数字字符串 取自gettimeofday(2) |
013 |
%us |
微秒,6位数字字符串 取自gettimeofday(2) |
002323 |
%F |
源代码文件名,来源于__FILE__宏。在某些编译器下 __FILE__是绝对路径。用%f来去掉目录只保留文件名,或者编译器有选项可以调节 |
test_hello.c 或者在某些编译器下 /home/zlog/src/test/test_hello.c |
%f |
源代码文件名,输出$F最后一个’/’后面的部分。当然这会有一定的性能损失 |
test_hello.c |
%H |
主机名,来源于 gethostname(2) |
zlog-dev |
%L |
源代码行数,来源于__LINE__宏 |
135 |
%m |
用户日志,用户从zlog函数输入的日志。 |
hello, zlog |
%M |
MDC (mapped diagnostic context),每个线程一张键值对表,输出键相对应的值。后面必需跟跟一对小括号()内含键。例如%M(clientNumber) ,clientNumbe是键。 详见 7.1 |
%M(clientNumber) 12345 |
%n |
换行符,目前还不支持windows换行符 |
\n |
%p |
进程ID,来源于getpid() |
2134 |
%U |
调用函数名,来自于__func__(C99)或者__FUNCTION__(gcc),如果编译器支持的话。 |
main |
%V |
日志级别,大写 |
INFO |
%v |
日志级别,小写 |
info |
%t |
16进制表示的线程ID,来源于pthread_self() "0x%x",(unsigned int) pthread_t |
0xba01e700 |
%T |
相当于%t,不过是以长整型表示的 "%lu", (unsigned long) pthread_t |
140633234859776 |
%% |
一个百分号 |
% |
%[其他字符] |
解析为错误,zlog_init()将会失败 |
• file perms
这个指定了创建日志文件的缺省访问权限。必须注意的是最后的产生的日志文件的权限
为"file perms"& ~umask。默认为600,只允许当前用户读写。
[levels]
用于定义用户自己的日志等级,建议和用户自定义的日志记录宏一起使用。若不自定义等级可不写。
语法为: (level string) = (level int), (syslog level, optional)
(level int)必须在[1,253]这个范围内,越大越重要。(syslog level)是可选的,如果不设默认为LOG_DEBUG。
zlog有6个默认的级别:"DEBUG", "INFO", "NOTICE", "WARN", "ERROR"和"FATAL"。
[format]
格式(Format)是用来描述输出日志的格式,比如是否有带有时间戳,是否包含文件位置信息等。
[rules]
规则(Rule)则是把分类、级别、输出文件、格式组合起来,决定一条代码中的日志是否输出,输出到哪里,以什么格式输出。
修改完配置文件后,往往需要检查配置文件是否合法,zlog工程在编译输出的bin目录下提供了命令行工具。
使用方法:./zlog-chk-conf xxx.conf
输出:--[zlog.conf] syntax right
则表示配置文件语法正确。
zlog详细配置方法可参考手册或者该博客:https://blog.csdn.net/yangzhenzhen/article/details/8439459
四、输出结果