zlog的安装与使用

       最近在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,修改安装路径为自己创建的目录路径:

zlog的安装与使用_第1张图片

编译出arm和linux两个版本的库如下图所示:

zlog的安装与使用_第2张图片

二、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

四、输出结果

你可能感兴趣的:(C语言学习)