一、zlog简介
zlog是一个C语言的日志函数库,具有高可靠性、高性能、线程安全、灵活、概念清晰等优势。另外,开发者可以通过灵活的配置,实现日志记录同时向控制台输出、控制单个日志文件大小、日志按等级分别输出等实用的功能。
由于zlog的定位是一个精简的日志函数库,所以向网络的输出、向数据库的输出这种复杂而耗时的操作都不会在这个库里面实现。这样做的好处是可以保证你的应用程序不被写日志操作拖慢。而复杂的功能可以再集成脚本实现。
zlog的项目主页:https://github.com/HardySimpson/zlog
zlog使用手册:https://hardysimpson.github.io/zlog/UsersGuide-CN.html
二、zlog安装方法
使用git获取zlog库的方法如下:
git clone https://github.com/HardySimpson/zlog.git cd zlog vim src/makefile
这里需要将PREFIX进行适当的配置。默认路径是/usr/local。如果仅为当前用户安装,则不需要修改;但如果你是和我一样,需要为所有用户安装这个库,就需要将这里改为/usr。
图1 makefile中的配置信息
make make install
这样zlog库就在系统中安装完成了。
三、使用zlog库
要使用zlog库,只需要在代码开头增加
#include "zlog.h"
并且在编译的时候增加两个动态链接库
gcc zlogdemo.c -o zlogdemo -I -I/usr/include -L /usr/lib -lzlog
注:-I 和 -L 的路径要和安装时的路径相匹配。
可能会用到的几个重要的函数API如下:
int zlog_init(const char *confpath);
功能:从配置文件confpath中读取配置信息到内存。
参数:
const char *confpath:配置文件的路径
返回值:
0:初始化成功;-1:初始化失败
zlog_category_t *zlog_get_category(const char *cname)
功能:从zlog的全局分类表里面找到分类,用于以后输出日志。
参数:
const char *cname:分类名称
返回值:
NULL:匹配失败;非NULL:匹配成功,返回zlog_category_t的指针
void zlog_fini(void)
功能:清理所有zlog API申请的内存,关闭它们打开的文件。
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, ...);
功能:增加一条新日志。
参数:
zlog_category_t * category:分类标识
const char *file:日志发生的源文件名称
size_t filelen:日志发生的源文件名称长度
const char *func:日志发生的函数名称
size_t funclen:日志发生的函数名称长度
long line:日志发生位置位于源文件的行数
int level:日志重要级别
const char *format:日志的格式化字符串(后面跟随可变的参数)
这个写日志的函数看起来有些过于复杂了,zlog库中提供了一系列的宏帮助开发者更方便的使用,包括了
zlog_fatal(cat, format, ...)
zlog_error(cat, format, ...)
zlog_warn(cat, format, ...)
zlog_notice(cat, format, ...)
zlog_info(cat, format, ...)
zlog_debug(cat, format, ...)
以zlog_fatal为例,zlog_fatal(cat, format, args...)实际相当于这样使用了zlog函数
zlog(cat, __FILE__, sizeof(__FILE__)-1,
__func__, sizeof(__func__)-1, __LINE__,
ZLOG_LEVEL_FATAL, format, args...)
其中,ZLOG_LEVEL_FATAL是一组用于表示日志等级的枚举值其中的一个,这组枚举值的具体定义如下:
typedef enum { ZLOG_LEVEL_DEBUG = 20, ZLOG_LEVEL_INFO = 40, ZLOG_LEVEL_NOTICE = 60, ZLOG_LEVEL_WARN = 80, ZLOG_LEVEL_ERROR = 100, ZLOG_LEVEL_FATAL = 120 } zlog_level;
四、代码实现
#include <stdio.h> #include <stdlib.h> #include "zlog.h" zlog_category_t *g_zc; int main() { int rc; rc = zlog_init("log.ini"); if (rc) { printf("init failed\n"); exit(-1); } g_zc = zlog_get_category("zlogdemo"); if (!g_zc) { printf("get category fail\n"); zlog_fini(); exit(-2); } zlog_info(g_zc, "Zlog info message!"); zlog_warn(g_zc, "Zlog warn message!"); zlog_error(g_zc, "Zlog error message!"); zlog_fini(); }
log.ini配置文件的配置信息如下:
#DEBUG = 20, LOG_DEBUG #INFO = 40, LOG_INFO #NOTICE = 60, LOG_NOTICE #WARN = 80, LOG_WARNING #ERROR = 100, LOG_ERR #FATAL = 120, LOG_ALERT #UNKNOWN = 254, LOG_ERR [global] default format = "%d.%us %-6V (%F:%L) - %m%n" [rules] zlogdemo.info "../log/zlogdemo.log", 1MB ~ "../log/zlogdemo-%d(%Y%m%d).#2s.log" zlogdemo.info >stdout;
程序编译运行之后,会在控制台输出如下信息:
图2 zlogdemo在控制台里输出的信息
另外在~/zlogdemo/log目录下会输出名为”zlogdemo.log”的日志文件,其中输出的日志信息如下所示:
图3 zlogdemo在日志文件里输出的信息