赞
踩
嵌入式linux上开发,想找个C的日志库,最终选择了zlog,详细的介绍请网上自找,这里只简单的介绍下。
zlog是一个高可靠性、高性能、线程安全、灵活、概念清晰的纯C日志函数库。
zlog的目标是成为一个简而精的日志函数库,不会直接支持网络输出或者写入数据库,不会直接支持日志内容的过滤和解析。
https://github.com/HardySimpson/zlog/releases
这里下载的是zlog-1.2.16版本。
- 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
创建源码文件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里面有三个重要的概念:
分类(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
[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
规则是一个统合型配置行,语法是:
(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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。