第三方库使用--libzlog日志库

2019-07-13 03:38发布

libzlog日志库

          zlog是一个高性能、线程安全、灵活、概念清晰的纯C日志函数库。    特性:
            *多种输出,包括动态文件、静态文件、stdout、stderr、syslog、用户自定义输出函数
            *运行时手动或自动刷新配置
            *用户自定义等级
            *多线程和多进程环境下保证安全转档
            *精确到微妙

编译和安装zlog

        链接:https://pan.baidu.com/s/1QAX8B-BQuwbYx5vXBnhnqA 密码:6zt9        $ tar -zxvf zlog-latest-stable.tar.gz
        $ cd zlog-1.2.*/
        $ make
        $ sudo make install
        or
        $ sudo make PREFIX=/usr/local/ installPREFIX指明了安装的路径,安转完之后为了让你的程序能找到zlog动态库
        $ sudo vi /etc/ld.so.conf
        /usr/local/lib
        $ sudo ldconfig

zlog帮助文档下载

链接:https://pan.baidu.com/s/1dOO-TVMEIWbNdnxwdGMQkg 密码:o3eq
示例zlog的初始化#ifndef __LOG_H__ #define __LOG_H__ #include extern zlog_category_t *log_handle; //level = 20 #define DGB(...) zlog_debug(log_handle, __VA_ARGS__) //level = 80 #define WAR(...) zlog_warn(log_handle, __VA_ARGS__) //level = 100 #define ERR(...) zlog_error(log_handle, __VA_ARGS__) int open_log(char *conf, char *mode); void close_log(); #endif #include "log.h" #include #include #include zlog_category_t *log_handle = NULL; int open_log(char *conf, char *mode) { printf("open_log:%s ", conf); if (!conf) { fprintf(stdout, " log_conf_file is null!!! "); return -1; } if (zlog_init(conf)) { fprintf(stdout, " zlog_init error!!! "); return -2; } log_handle = zlog_get_category(mode); if (NULL == log_handle) { fprintf(stdout, " zlog_get_category error!!! "); return -3; } return 1; } void close_log() { zlog_fini(); } 日志等级
zlog_init()
    该函数从配置文件confpath中读取配置信息到内存。如果confpath为NULL,会寻找环境变量ZLOG_CONF_PATH的值作为配置文件名。如果环境变量ZLOG_CONF_PATH也没有,所有日志以内置格式写到标准输出上。每个进程只有第一次调用zlog_inti()是有效的,后面的多余调用都会失败并不做任何事情。    成功返回0。失败,返回-1。详细错误会被写在由环境变量ZLOG_PROFILE_ERROR指定的错误日志里。
zlog_get_category():分类操作
    
    zlog_get_category()从zlog的全局分类表里找到分类,用于以后输出日志。如果没有的话,就建一个。然后它会遍历所有的规则,寻找和cname匹配的规则并绑定。       配置文件规则中的分类名匹配cname的规律描述如下:        1. * 匹配任意cname。        2. 以下划线_结尾的分类名同时匹配本级分类和下级分类。例如aa_匹配aa, aa_,aa_bb, aa_bb_cc这几个cname。        3. 不以下划线_结尾的分类名精确匹配cname。例如aa_bb匹配aa_bb这个cname。        4. ! 匹配目前还没有规则的cname。     每个zlog_category_t *对应的规则,在zlog_reload()的时候会被自动重新计算。     不用担心内存释放,zlog_fini() 最后会清理一切.     如果成功,返回zlog_category_t的指针。如果失败,返回NULL。详细错误会被写在由环境变量ZLOG_PROFILE_ERROR指定的错误日志里面。

zlog_fini()

    zlog_fini()清理所有zlog API申请的内存,关闭它们打开的文件。使用次数不限。

zlog的配置文件

[global] strict init = true buffer min = 1024 buffer max = 0 rotate lock file = /tmp/zlog.lock [formats] simple = "%m%n" simple2 = "%d(%F %T) %5V |%m%n" [rules] f_cat.* "/home/sunshine/myproject/log/mystrans.log";simple2 o_cat.* >stdout;simple2 strict init:    如果"strict init"是 true,zlog_init()将会严格检查所有的格式和规则,任何错误都会导致 zlog_init() 失败并且返回-1。当"strict init"是 false 的时候,zlog_init()会忽略错误的格式和规则。这个参数默认为 true。rotate lock file:
    这个选项指定了一个锁文件,用来保证多进程情况下日志安全转档。zlog会在zlog_init()时候以读写权限打开这个文件。确认你执行程序的用户有权限创建和读写这个文件。
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 file perms:
    这个指定了创建日志文件的缺省访问权限。必须注意的是最后的产生的日志文件的权限为"file perms"& ~umask。默认为600,只允许当前用户读写。规则(rules)    输出规则:
        默认6个级别:"DEBUG", "INFO", "NOTICE", "WARN", "ERROR"和"FATAL"。配置文
件中的级别是大小写不敏感的。        o_cat.*               所有等级
        o_cat.debug      代码内等级>=debug
        o_cat.=debug    代码内等级==debug
        o_cat.!debug     代码内等级!=debug    输出动作:
        标准输出        >stdout
        标准错误输出  >stderr
        文件               "文件路径"