zlog编译与配置使用示例

Zlog是一个纯C的日志函数库,适用于嵌入式Linux系统,具有高可靠性、高性能和线程安全的特点。文章介绍了Zlog的编译过程,包括普通Linux和交叉编译,并提供了DEMO测试代码。同时,详细讲解了Zlog的配置,包括分类、格式和规则,展示了不同配置下的日志输出效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 zlog简介

嵌入式linux上开发,想找个C的日志库,最终选择了zlog,详细的介绍请网上自找,这里只简单的介绍下。

zlog是一个高可靠性、高性能、线程安全、灵活、概念清晰的纯C日志函数库。

zlog的目标是成为一个简而精的日志函数库,不会直接支持网络输出或者写入数据库,不会直接支持日志内容的过滤和解析。

zlog编译

源码下载地址


https://github.com/HardySimpson/zlog/releases

这里下载的是zlog-1.2.16版本。

普通linux编译

tar -zxvf zlog-1.2.16.tar.gz
cd zlog-1.2.16
make
sudo make install

也可以指定自己想要的路径

tar -zxvf zlog-1.2.16.tar.gz
cd zlog-1.2.16
make PREFIX=/usr/local/
sudo make PREFIX=/usr/local/ install

交叉编译

以sigmastar ssc335/337交叉编译工具链为例

tar -zxvf zlog-1.2.16.tar.gz
cd zlog-1.2.16
mkdir installdir
make PREFIX=./installdir/  CC=arm-buildroot-linux-uclibcgnueabihf-gcc
sudo make PREFIX=./installdir/ install

DEMO测试代码

 创建源码文件testzlog.c,代码如下

#include <stdio.h> 
#include "zlog.h"

int main(int argc, char** argv)
{
    int rc;
    zlog_category_t *c;

    rc = zlog_init("zlog.conf");
    if (rc) {
        printf("init failed\n");
        return -1;
    }

    c = zlog_get_category("my_cat");
    if (!c) {
        printf("get cat fail\n");
        zlog_fini();
        return -2;
    }

    zlog_debug(c, "debug level log");
    zlog_info(c, "info level log");
    zlog_warn(c, "warning level log");
    zlog_error(c, "error level log");

    zlog_fini();

    return 0;
}


注意其中的2个函数,
zlog_init()用来加载zlog库的配置文件,
zlog_get_category()用来从配置文件规则中找到对应名称的分类配置。

编译DEMO

gcc testzlog.c -I/usr/local/include -L/usr/local/lib -lzlog -lpthread -o testzlog

链接需要zlog库不用多说,需要pthread库是因为zlog库有锁的使用。
测试DEMO怎么使用在下一章节zlog配置里详细讲,因为同一个代码,日志效果会因配置文件不同而呈现不同。

 

zlog配置

zlog里面有三个重要的概念:
分类(Category) 用于区分不同的输入,代码中的分类变量的名字是一个字符串,在一个程序里面可以通过获取不同的分类名的category用来后面输出不同分类的日志,用于不同的目的。
格式(Format) 是用来描述输出日志的格式,比如是否有带有时间戳, 是否包含文件位置信息等。
规则(Rule) 是把分类、级别、输出文件、格式组合起来,决定一条代码中的日志是否输出,输出到哪里,以什么格式输出。

配置示例

创建配置文件zlog.conf,内容如下

[formats]
dbg_fmt = "%m%n"
log_fmt = "%d([%Y/%m/%d %T])%m%n"

[rules]
my_cat.debug    >stdout; dbg_fmt
my_log.info    "/home/kevin/tempdir/testzlog/aa.log", 1M; log_fmt

格式(Format)说明

[formats]全部的配置格式串说明请参阅官方指导文档,这里只列出一些常用配置说明,格式串可以组合来达到自己想要的一个格式化效果。

[formats]常用配置说明

format格式串

说明

%m

用户输入的日志内容

%n

表示换行

%d

日期时间 2020-03-12 21:21:32

特殊用法,后面跟小括号说明:

%d(%Y/%m/%d %T)  = 2020/03/12 21:21:32

%d(%Y/%m/%d %H:%M:%S)  = 2020/03/12 21:21:32

%d(%F)  = 2020-03-12

%d(%T)  = 21:21:32

%ms

毫秒时间,3位数

%us

微秒时间,6位数

%F

文件名,有的环境是完整地址文件名,有的只是文件名

%f

纯文件名,不含地址路径

%U

函数名

%L

行号

%V

大写日志等级"DEBUG", "INFO", "NOTICE", "WARN", "ERROR"和"FATAL"

%v

小写日志等级

配置示例1

[formats]
dbg_fmt = "%m%n"

配置示例1日志样例

debug level log

info level log

warning level log

error level log

配置示例2

[formats]
dbg_fmt = "[%d]%m%n"

配置示例2日志样例

[2023-03-12 19:13:53]debug level log

[2023-03-12 19:13:53]info level log

[2023-03-12 19:13:53]warning level log

[2023-03-12 19:13:53]error level log

配置示例3

[formats]
dbg_fmt = "%d %V[%F:%U:%L] %m%n"

配置示例3日志样例

2023-03-12 19:13:53 DEBUG[testzlog.c:main:22]debug level log

2023-03-12 19:13:53 INFO[testzlog.c:main:23]info level log

2023-03-12 19:13:53 WARN[testzlog.c:main:24]warning level log

2023-03-12 19:13:53 ERROR[testzlog.c:main:25]error level log

规则(Rule)说明

规则是一个统合型配置行,语法是:

(category).(level) (output), (options, optional); (format name, optional)

用于描述怎么把分类、级别、输出文件、格式组合起来。

rule配置行用3种颜色分成3块,下面分别说明:

第一块,是分类与等级 (category).(level)

其中的(category)是分类名称,对应代码中

zlog_get_category("my_cat");

代码接口指示zlog去配置文件中找到名字是"my_cat"的分类。

另外(level)对应日志等级,等级有"DEBUG", "INFO", "NOTICE", "WARN", "ERROR"和"FATAL",配置文件中的级别是大小写不敏感的。

(level)表达式示例

含义

*

所有等级的日志都输出

my_cat.debug

代码内等级>=debug的日志都输出

my_cat.=debug

代码内等级==debug的日志才输出

my_cat.!debug

代码内等级!=debug的日志才输出

第二块是输出 (output), (options, optional);

表示log输出到哪里的配置,只列举常用的

(output)

输出说明

(options, optional)

扩展说明

>stdout

标准输出

无意义

>stderr

标准错误输出

无意义

"文件路径"

输出到文件

10M * 3 ~ "filename.#r.log"

转档的文件大小是10M,3个日志文件循环,#r指循环文件名倒序排列

第三块是格式化名称 (format name, optional)

表示日志按怎样的格式输出,详细说明参考前面章节格式(Format)说明

示例1说明

[formats]
dbg_fmt = "%d %m%n"
[rules]
my_cat.DEBUG   >stdout; dbg_fmt

my_cat分类,日志等级大于等于DEBUG,按dbg_fmt格式配置输出到标准输出

2023-03-12 19:13:53 debug level log

2023-03-12 19:13:53 info level log

2023-03-12 19:13:53 warning level log

2023-03-12 19:13:53 error level log

示例2说明

[formats]
dbg_fmt = "%d %m%n"
[rules]
my_cat.WARN   "/home/kevin/log.txt"; dbg_fmt

my_cat分类,日志等级大于等于WARN,按dbg_fmt格式配置输出到log文件/home/kevin/log.txt

2023-03-12 19:13:53 warning level log

2023-03-12 19:13:53 error level log

示例3说明

[formats]
dbg_fmt = "%d %m%n"
[rules]
my_cat.WARN   "/home/kevin/log.txt", 1M * 3 ~ "/home/kevin/log.txt.#r"; dbg_fmt

按照日志大小切分。日志文件名(/home/kevin/log.txt)的逗号后

第一个参数(1M)表示文件达到多大后开始进行转档;

第二个参数(3)表示保留多少个存档文件(0代表不删除任何存档文件,当心空间占满问题);

第三个参数(/home/kevin/log.txt.#r )表示转档的文件名,其中#r表示存档文件的序号,r是rolling的缩写,还可以放#s,是sequence的缩写。转档文件名必须包含#r或者#s。

在Sequence情况 下

log.txt (new)

log.txt.2 (less new)

log.txt.1

log.txt.0 (old)

而在Rolling的情况下

log.txt (new)

log.txt.0 (less new)

log.txt.1

log.txt.2 (old)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值