简介

一个开源的日志系统,最新版本1.2.18:

https://github.com/HardySimpson/zlog

使用文档

特性

日志格式定制,类似于log4j的pattern layout

多种输出,包括动态文件、静态文件、stdout、stderr、syslog、用户自定义输出函数

运行时手动、自动刷新配置文件(同时保证安全)

高性能

用户自定义等级

多线程和多进程环境下保证安全转档

精确到微秒

简单调用包装dzlog(一个程序默认只用一个分类)

MDC,线程键-值对的表,可以扩展用户自定义的字段

自诊断,可以在运行时输出zlog自己的日志和配置状态

log模型

分类(Category)

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

zlog_init("test.conf");
zlog_get_category("my_cat");

格式(Format)

用来描述输出日志的格式,比如是否有带有时间戳,是否包含文件位置信息等。

[formats]

simple = "%m%n" 

规则(Rule)

把分类、级别、输出文件、格式组合起来,决定一条代码中的日志是否输出,输出到哪里,以什么格式输出。

[rules]
my_cat.DEBUG    >stdout; simple

配置文件

[]代表一个节的开始,四个小节的顺序不能变,依次为global-levels-formats-rules

[global]

全局参数,可忽略

default format

default format = "%d.%us %-6V (%c:%F:%L) - %m%n"

设置缺省的日志格式,默认值为:"%d %V [%p:%F:%L] %m%n",输出形式如下:

2024-12-26 05:52:27 INFO [5826:../test/main.c:32] hello, zlog

todo

[levels]

用户自定义loglevel,可忽略。

默认等级如下:

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; 

loglevel 定义方式如下

(level string) = (level int), (syslog level, optional)

name为等级的名称(字符串)。

level为整数,必须位于[1,253]之间,其他数字是非法的。数字越大代表越重要。

syslog_level指当需要输出到syslog的时候,自定义的等级会以syslog_level输出到syslog。

例子:TRACE = 30, LOG_DEBUG

todo

[formats]

定义日志的格式,可忽略,默认格式可以通过[global]部分的参数default format设置。

(name) = "(actual formats)"

(name)必须由数字和字母组成,下划线"_"也算字母。

(actual format)前后需要有双引号。 (actual formats)可以由转换字符组成。

基本配置文件

[formats]
simple = "%d %V [%p:%f:%L] %m%n"
[rules]
*.* >syslog,LOG_LOCAL0
logcat.* "/tmp/<logfile>.log";simple
logcat.ERROR "/dev/console";simple

千万不要在守护进程的规则里面加上>stdout或>stderr。这会产生不可预料的结果……如果一定要输出到终端,用"/dev/console"代替。

zlog简单封装

configure.ac定义zlog的默认配置文件路径

AC_DEFINE([ZLOG_INIT_CFG], ["/etc/<module>/zlog.cfg"], [zlog init file])

makefile.am安装zlog.cfg到指定路径

configdir = ${sysconfdir}/<module>
config_DATA = zlog.cfg

头文件定义zlog的init和deinit,通过宏定义输出log信息到文件或者串口。

#ifndef __LOG_H__
#define __LOG_H__
#include <zlog.h>
extern zlog_category_t *logcat;
void logcat_init();
void logcat_finit();

#define LOGCAT_INFO(fmt, args...)   zlog_info(logcat, fmt, ##args)
#define LOGCAT_ERROR(fmt, args...)  zlog_error(logcat, fmt, ##args)
#define LOGCAT_HEXDUMP(buf, len)    hzlog_info(logcat, buf, len)
#endif
#include <stdlib.h>
#include <config.h>
#include "log.h"

#pragma message( "ZLOG_INIT_CFG : " ZLOG_INIT_CFG )

zlog_category_t *logcat = NULL;
void logcat_init()
{
    int rc = zlog_init(ZLOG_INIT_CFG);
    if(rc)
    {
        printf("can't init from\n %s\n", ZLOG_INIT_CFG);
        exit(1);
    }

    logcat = zlog_get_category("logcat");
    if(NULL == logcat)
    {
        printf("can't get category\n");
        zlog_fini();
        exit(1);
    }
}

void logcat_finit()
{
    zlog_fini();
}

Q.E.D.