文档章节

纯C日志函数库--zlog上手指南

难易
 难易
发布于 2012/03/29 15:57
字数 1104
阅读 7349
收藏 20

zlog是一个高性能、线程安全、灵活、概念清晰的纯C日志函数库。作者编写的初衷是因为log4c不给力,而log4j、log4cxx等log4系列的日志函数库在概念上不正确。zlog继承了unix操作系统中syslog的伟大传统,将日志系统的分类、级别、输出方向、输出格式完全解耦。

1.安装

下载 https://github.com/downloads/HardySimpson/zlog/zlog-latest-stable.tar.gz

解压, 安装

$ tar -zxvf zlog-latest-stable.tar.gz
$ cd zlog-x.x.x/
$ ./configure --enable-test # 把测试程序和案例也编译下,反正不安装 
$ make
$ sudo make install
# 默认安装在/usr/local/下,包括libzlog.so和zlog.h
把测试程序和案例也编译下,反正不安装

默认安装在/usr/local/下,包括libzlog.so和zlog.h

# add one line
$ sudo vi /etc/ld.so.conf
/usr/local/lib
$ sudo ldconfig

在你的程序运行之前,保证libzlog.so在系统的动态链接库加载器可以找到的目录下。上面的命令适用于linux,别的系统自己想办法。


2.介绍一下配置文件

zlog里面有三个重要的概念,category,format,rule

分类(Category)用于区分不同的输入,代码中的分类变量的名字是一个字符串,在一个程序里面可以通过获取不同的分类名的category用来后面输出不同分类的日志,用于不同的目的。

格式(Format)是用来描述输出日志的格式,比如是否有带有时间戳, 是否包含文件位置信息等,上面的例子里面的格式simple就配置成简单的用户输入的信息+换行符。

规则(Rule)则是把分类、级别、输出文件、格式组合起来,决定一条代码中的日志是否输出,输出到哪里,以什么格式输出。简单而言,规则里面的分类字符串和代码里面的分类变量的名字一样就匹配,当然还有更高级的纲目分类匹配。规则彻底解耦了各个元素之间的强绑定,例如log4j就必须为每个分类指定一个级别(或者从父分类那里继承),这在多层系统需要每一层都有自己的级别要求的时候非常不方便。

现在试着写配置文件,配置文件名无所谓,放在哪里也无所谓,反正在zlog_init()的时候可以指定

$ cat /etc/zlog.conf
[formats]
simple  =   "%m%n"
[rules]
my_cat.DEBUG            >stdout; simple

在目前的配置文件的例子里面,可以看到my_cat分类,>=debug等级的日志会被输出到stdout(标准输出),并且输出的格式是simple这个格式,也就是用户输入信息+换行符。如果要输出到文件并控制文件大小为1兆,规则的配置应该是

my_cat.DEBUG            "/var/log/aa.log", 1M; simple

3.在代码中使用

$ vi test_hello.c

#include <stdio.h> 

#include "zlog.h"

int main(int argc, char** argv)
{
	int rc;
	zlog_category_t *c;

	rc = zlog_init("/etc/zlog.conf");  /* 路径要和上面创建的一致,可以不放在/etc下 */
	if (rc) {
		printf("init failed\n");
		return -1;
	}

	c = zlog_get_category("my_cat");
	if (!c) {
		printf("get cat fail\n");
		zlog_fini();
		return -2;
	}

	ZLOG_INFO(c, "hello, zlog");

	zlog_fini();

	return 0;
}


4.编译、然后运行!

$ cc -c -o test_hello.o test_hello.c -I/usr/local/include
$ cc -o test_hello test_hello.o -L/usr/local/lib -lzlog
$ ./test_hello
hello, zlog

5.高级功能

 *  syslog分类模型,比log4j模型更加直接了当
 *  日志格式定制,类似于log4j的pattern layout
 *  多种输出,包括动态文件、静态文件、stdout、stderr、syslog、用户自定义输出函数
 *  运行时手动或自动刷新配置(同时保证安全)
 *  高性能,在我的笔记本上达到72'000条日志每秒, 大概是syslog(3)配合rsyslogd的200倍速度 
 *  用户自定义等级
 *  多线程和多进程环境下保证安全转档
 *  精确到微秒
 *  简单调用包装dzlog(一个程序默认只用一个分类)
 *  MDC,线程键-值对的表,可以扩展用户自定义的字段
 *  自诊断,可以在运行时输出zlog自己的日志和配置状态
 *  不依赖其他库,只要是个POSIX系统就成(当然还要一个C99兼容的vsnprintf)

6.相关链接:

下载: https://github.com/downloads/HardySimpson/zlog/zlog-latest-stable.tar.gz

zlog使用手册: https://github.com/downloads/HardySimpson/zlog/UsersGuide-CN.pdf

问题讨论区: https://github.com/HardySimpson/zlog/issues

英文主页: http://hardysimpson.github.com/zlog

中文主页: http://www.oschina.net/p/zlog

作者博客: http://my.oschina.net/HardySimpson/blog

作者email: HardySimpson1984@gmail.com

© 著作权归作者所有

共有 人打赏支持
难易

难易

粉丝 260
博文 44
码字总数 100878
作品 2
杭州
程序员
加载中

评论(98)

do_mybest
do_mybest
请问fsync period的值是指的次数吗,如果为0,就由操作系统决定是吗?
mymiss
mymiss

引用来自“难易”的评论

引用来自“mymiss”的评论

今天试了试 果然很不错呀~~赞赞,撒花撒花~~
ps: 可以使用全局变量的zlog_catagory_t* 么,如果不用全局变量的话希望线程输出内容需要吧这个 catagory 的指针传递给线程么?~

可以在线程里面再get,不需要传递

这样哦,我写了个全局变量.. 谢谢~
难易
难易

引用来自“mymiss”的评论

今天试了试 果然很不错呀~~赞赞,撒花撒花~~
ps: 可以使用全局变量的zlog_catagory_t* 么,如果不用全局变量的话希望线程输出内容需要吧这个 catagory 的指针传递给线程么?~

可以在线程里面再get,不需要传递
mymiss
mymiss
今天试了试 果然很不错呀~~赞赞,撒花撒花~~
ps: 可以使用全局变量的zlog_catagory_t* 么,如果不用全局变量的话希望线程输出内容需要吧这个 catagory 的指针传递给线程么?~
mymiss
mymiss
测试用例里面 “my_cat”是输出日志的文件名么? 另外多线程输出需要加锁么?就是说多线程运行情况都想输出到同一个文件里面的话。
mymiss
mymiss
测试用例里面 “my_cat”是输出日志的文件名么? 另外多线程输出需要加锁么?就是说多线程运行情况都想输出到同一个文件里面的话。
mymiss
mymiss
找到了这个安装的东西 打算试试看~
janse_zyd
janse_zyd

引用来自“难易”的评论

引用来自“janse_zyd”的评论

static int zlog_rotater_seq_files(zlog_rotater_t * a_rotater)
这个接口好像有点问题,当指定最大的存档文件时,有可能出现如下两种情况:
1、实际存档文件大于最大存档文件
2、存档文件的序号大于最大序号

不是很明白你的意思,转档有两种模式:Sequence和Rolling,详见:
http://hardysimpson.github.io/zlog/UsersGuide-CN.html#htoc26

就是假如我设定最大存档文件个数为5时,实际存档文件大于5或者有可能会出现存档文件编号大于5的情况,
难易
难易

引用来自“janse_zyd”的评论

static int zlog_rotater_seq_files(zlog_rotater_t * a_rotater)
这个接口好像有点问题,当指定最大的存档文件时,有可能出现如下两种情况:
1、实际存档文件大于最大存档文件
2、存档文件的序号大于最大序号

不是很明白你的意思,转档有两种模式:Sequence和Rolling,详见:
http://hardysimpson.github.io/zlog/UsersGuide-CN.html#htoc26
难易
难易

引用来自“janse_zyd”的评论

引用来自“难易”的评论

引用来自“janse_zyd”的评论

zlog2.0能否考虑多个进程同时写一个日志文件,每个过程中的日志,保证不同进程不互相穿插在一起?增加日志缓存或者文件锁

增加缓存是有,每个进程的每个线程都可以指定每次缓存多少条日志或者长度后输出。
这样能保证相邻的几十条日志是同一个线程写的。
但不能由api来指定要输出的一块日志,这样会导致接口过于复杂,并且用锁会导致效率低下。
不知我这么说是否满足你的使用场景和需求?

暂时满足不了需求,我希望是能通过api来实现

目前有用户自定义输出的功能,详见:
http://hardysimpson.github.io/zlog/UsersGuide-CN.html#htoc40
zlog 0.9.1发布,纯C日志函数库

相对于zlog 0.9.0,本次发布只修改了一个接口函数的命名,即zlogupdate改名为zlogreload,把API稳定下来。 zlog是一个高性能、线程安全、灵活、概念清晰的纯C日志函数库。作者编写的初衷是因...

难易
2012/04/09
948
0
zlog 1.0.0 发布,纯C日志函数库

在经过2个月的思考、相亲、考试、发呆、编码之后,zlog于儿童节发布1.0.0版!(代码规模也从7千行到了8千行) 首先祝大家儿童节快乐! 1.0.0版提供了如下新的特性 大幅改写了不少组件初始化和...

难易
2012/06/01
595
0
纯C日志函数库--zlog上手指南

zlog是个概念清晰的日志函数库,在效率、功能、安全性上大大超过了log4c,并且是用c写成的,具有比较好的通用性

难易
2012/03/29
3.3K
20
纯C日志函数库--zlog

zlog是一个高性能、线程安全、灵活、概念清晰的纯C日志函数库。 事实上,在C的世界里面没有特别好的日志函数库(就像JAVA里面的的log4j,或者C++的log4cxx)。C程序员都喜欢用自己的轮子。p...

难易
2012/03/26
31.4K
5
zlog 1.2.3 发布,纯 C 日志函数库

zlog 1.2.3 发布,这是一个bugfix 版本。zlog是一个高性能、线程安全、灵活、概念清晰的纯C日志函数库。 zlog 主要特性: * syslog分类模型,基于规则路由过滤,比log4j模型要正确高效,详见...

oschina
2012/10/01
631
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

新工作与老项目

新的工作不知不觉的干了一个多月了。怎么说呢,跟想象中的差别不少,本来想的能进来跟大公司的同事能有很多交流,能在团队中跟大牛学习更快。结果公司的这个项目上只有两个程序员,项目是十年...

zypy333
15分钟前
0
0
mysql 在windows的安装

mysql 在windows的安装。 mysql64位的server的下载地址是: https://dev.mysql.com/downloads/mysql/ 使用的是5.7版本。 下载安装包,解压至D:\mysql\mysql-5.7.23-winx64\ 在D:\mysql\mysq...

lxzh504
27分钟前
1
0
云技术、大数据(hadoop)入门常见问题回答

当我们学习一门新技术的时候,我们总是产生各种各样的问题,这些问题整理出来,包括该 1.如何学习hadoop? 2.hadoop常见问题? 3.还有hbase、hive安装使用等? 你知道搭建hadoop平台需要些什...

董黎明
27分钟前
1
0
小程序自定义底部tab

场景 1.tabBar是在内页而非首页,这时就不得不自定义一个tabBar了 2.自定义风格 3.子页数量超过5个,得到更多了tab 4.改变点击tab默认事件,比如出登录界面,或者弹出上拉子菜单等 步骤 1.照...

萤火的萤火
33分钟前
1
0
shell炫技

1.为脚本添加“--help” #!/bin/shif [ ${#@} -ne 0 ] && [ "${@#"--help"}" = "" ]; then printf -- '...help...\n'; exit 0;fi; 2.输出字体添加颜色 https://misc.flogisoft.com......

HJCui
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部