简介
一个开源的日志系统,最新版本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, zlogtodo
[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();
}