使用zlog实现日志记录

一、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。

使用zlog实现日志记录

图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;

 

 

 

程序编译运行之后,会在控制台输出如下信息:

使用zlog实现日志记录

 

 

 图2 zlogdemo在控制台里输出的信息

 

另外在~/zlogdemo/log目录下会输出名为”zlogdemo.log”的日志文件,其中输出的日志信息如下所示:

使用zlog实现日志记录

 

 

 图3 zlogdemo在日志文件里输出的信息

 

使用zlog实现日志记录

上一篇:对象的继承


下一篇:?亲测安装php