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

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/ install

PREFIX指明了安装的路径,安转完之后为了让你的程序能找到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 <zlog.h>

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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>

zlog_category_t *log_handle = NULL;


int open_log(char *conf, char *mode)
{
	printf("open_log:%s\n", conf);
	if (!conf)
	{
		fprintf(stdout, "\nlog_conf_file is null!!!\n");
		return -1;
	}
	if (zlog_init(conf))
	{
		fprintf(stdout, "\nzlog_init error!!!\n");
		return -2;
	}
	log_handle = zlog_get_category(mode);
	if (NULL == log_handle)
	{
		fprintf(stdout, "\nzlog_get_category error!!!\n");
		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

        文件               "文件路径"

猜你喜欢

转载自blog.csdn.net/qq_33408113/article/details/80214689