嵌入式大杂烩周记紧张是一些实用项目学习分享,每周一篇,每篇一个主题。
内容紧张来源于我们之前网络的资料:
https://gitee.com/zhengnianli/EmbedSummary

zlog是一个高可靠性、高性能、线程安全、灵巧、观点清晰的纯C日志函数库。
zlog在效率、功能、安全性上大大超过了log4c,并且是用c写成的,具有比较好的通用性。
zlog有这些特性:
syslog分类模型,比log4j模型更加直接了当日志格式定制,类似于log4j的pattern layout多种输出,包括动态文件、静态文件、stdout、stderr、syslog、用户自定义输出函数运行时手动、自动刷新配置文件(同时担保安全)高性能,在作者的条记本上达到25万条日志每秒, 大概是syslog(3)合营rsyslogd的1000倍速率用户自定义等级多线程和多进程环境下担保安全转档精确到微秒大略调用包装dzlog(一个程序默认只用一个分类)MDC,线程键-值对的表,可以扩展用户自定义的字段自诊断,可以在运行时输出zlog自己的日志和配置状态不依赖其他库,只假如个POSIX系统就成(当然还要一个C99兼容的vsnprintf)zlog仓库链接:
https://github.com/HardySimpson/zlog
zlog利用手册:
http://hardysimpson.github.io/zlog/UsersGuide-CN.html
license:LGPL-2.1。
关于开源软件协议干系文章:常用的开源协议有哪些?
zlog的利用1、x86平台利用首先是编译安装zlog。
我们可以按照默认路径安装:
git clone git@github.com:HardySimpson/zlog.gitcd zlog make sudo make install
也可以安装到指定路径,这里我们大略验证一下,以是安装到指定路径。安装到指定路径build_x86:
git clone git@github.com:HardySimpson/zlog.gitcd zlog mkdir build_x86make sudo make PREFIX=../build_x86 install
安装完成,得到:
为了能让运用程序运行时找到zlog的库,我们可以把libzlog.so的路径添加到系统动态链接库加载器可以找到的目录下,修正 /etc/ld.so.conf 文件,在里面添加libzlog.so的路径,如:
/home/LinuxZn/tmp/zlog/build_x86/lib
实行 sudo ldconfig 命令生效。
我们只是临时利用一下,也可以不这么添加。运用程序运行之前,利用export命令修正 LD_LIBRARY_PATH 变量,添加libzlog.so的路径至LD_LIBRARY_PATH变量并在当前终端生效。
下面进行测试:
我们新建一个zlog_test文件夹,为了方便利用zlog,我们把上面编译安装得到的build_x86全体文件夹复制到zlog_test文件夹下;然后新建一个test.c与test.conf文件:
test.c:
#include <stdio.h>#include "zlog.h"int main(int argc, char argv){ int rc; zlog_category_t zc; rc = zlog_init("test.conf"); if (rc) { printf("init failed\n"); return -1; } zc = zlog_get_category("my_cat"); if (!zc) { printf("get cat fail\n"); zlog_fini(); return -2; } zlog_info(zc, "微信公众号:嵌入式大杂烩"); zlog_info(zc, "hello, zlog"); zlog_fini(); return 0;}
test.conf:
[rules]my_cat.INFO >stdout
编译:
gcc test.c -o test_zlog -I ./build_x86/include -L ./build_x86/lib/ -lzlog -lpthread
-I:指定头文件路径-L:指定动态库的路径。-lxxx:链接时须要xxx库。
运行,涌现如下缺点:
./test_zlog: error while loading shared libraries: libzlog.so.1.2: cannot open shared object file: No such file or directory
那是由于找不到libzlog.so库,就如我们上面说的,利用export命令:
export LD_LIBRARY_PATH=./build_x86/lib:$LD_LIBRARY_PATH
再次运行:
至此,zlog我们已经用起来了。
zlog之以是功能很强大,一部分缘故原由是可以通过一个与工程相绑定的.conf配置文件。在配置文件里可以进行log的干系配置,比如log格式、log等级定义等。
zlog的配置文件及干系利用在zlog利用手册中有详细的解释:
http://hardysimpson.github.io/zlog/UsersGuide-CN.html
下面一起看一些zlog配置文件的根本内容。
zlog有3个主要的观点:
分类(Category) 用于区分不同的输入。代码中的分类变量的名字是一个字符串,在一个程序里面可以通过获取不同的分类名的category用来后面输出不同分类的日志,用于不同的目的。格式(Format) 是用来描述输出日志的格式,比如是否有带有韶光戳,是否包含文件位置信息等,上面的例子里面的格式simple便是大略的用户输入的信息+换行符。规则(Rule) 则是把分类、级别、输出文件、格式组合起来,决定一条代码中的日志是否输出,输出到哪里,以什么格式输出。上面例子中的:
zc = zlog_get_category("my_cat");
对应conf文件里的:
[rules]my_cat.INFO >stdout
zlog的conf文件有一定的编写格式,例子如:
# comments[global]strict init = truebuffer min = 1024buffer max = 2MBrotate lock file = /tmp/zlog.lockdefault format = "%d.%us %-6V (%c:%F:%L) - %m%n"file perms = 600[levels]TRACE = 10CRIT = 130, LOG_CRIT[formats]simple = "%m%n"normal = "%d %m%n" [rules]default. >stdout; simple. "%12.2E(HOME)/log/%c.log", 1MB12; simplemy_.INFO >stderr;my_cat.!ERROR "/var/log/aa.log"my_dog.=DEBUG >syslog, LOG_LOCAL0; simplemy_mice. $user_define;
配置参数是可选,不用全部配置。这里我们重点看一下formats与rule。
上面的例子中,没有对formats,就会按照默认的格式输出,默认的格式便是:
"%d %V [%p:%F:%L] %m%n"
详细的如:
2022-03-19 04:23:43 INFO [86557:test.c:35] 微信"大众号:嵌入式大杂烩
我们想要定制输出的格式便是配置formats,例如,针对上面的demo,我们想修正log前面的韶光戳精确到us,则配置文件修正为:
[formats]simple = "%d.%us %m%n"[rules]my_cat.INFO >stdout;simple
formats详细的转换字符如(详细可查阅利用手册):
规则便是把分类、级别、输出文件、格式组合起来。例如上面规则的意思便是把simple格式的log输出至标准输出。
下面我们修正规则把log输出至文件:
[formats]simple = "%d.%us %m%n"[rules]my_cat.INFO "./log/test.log"
这表示把log输出至当前目录下log文件夹下的test.log中:
关于规则的输出动作(详细可查阅利用手册):
zlog也支持log切割功能,log循环存储,防止log存爆硬盘。下面大略看一下zlog的log切割并循环存储的功能:
[formats]simple = "%d.%us %m%n"[rules]my_cat.INFO "./log/demo.log",1KB5~"./log/demo.log.#r";simple
上面标明当log存储超过1KB时,则存放到另一个文件,在5个文件来回循环,r代表逆序,如先存满demo.log4,再存demo.log3。
把上面的代码改为:
#include <stdio.h>#include <unistd.h>#include "zlog.h"int main(int argc, char argv){ int rc; zlog_category_t zc; rc = zlog_init("test.conf"); if (rc) { printf("init failed\n"); return -1; } zc = zlog_get_category("my_cat"); if (!zc) { printf("get cat fail\n"); zlog_fini(); return -2; } zlog_info(zc, "微信公众年夜众号:嵌入式大杂烩"); int i = 0; while (1) { zlog_info(zc, "hello, zlog, %d", i++); usleep(1000); } zlog_fini(); return 0;}
编译、运行:
有时候我们不须要定制一些繁芜的配置,我们也可以按照默认配置,这样代码可以精简一些。这时候,须要利用其余一组API来初始化及打印:
int dzlog_init(const char confpath, const char cname);dzlog_info(format, ...);
dzlog是忽略分类(zlog_category_t)的一组大略zlog接口。它采取内置的一个默认分类。
例子如:
#include <stdio.h>#include "zlog.h"int main(int argc, char argv){ int rc; rc = dzlog_init("test.conf", "my_cat"); if (rc) { printf("init failed\n"); return -1; } dzlog_info("微信"大众年夜众号:嵌入式大杂烩"); dzlog_info("hello, zlog"); zlog_fini(); return 0;}
最大略的配置文件:
[rules]my_cat. >stdoutc
编译、运行:
更多的API可查看zlog.h。
其余,我们上面编译的得到的安装文件中bin文件夹下有一个zlog-chk-conf工具,这个工具可以用来验证我们的配置文件是否编写精确:
以上便是关于zlog配置文件的一些先容,更多的利用解释可以阅读其利用手册。
2、arm平台利用(1)方法一在其它平台利用,有如下几个版本:
auto tools版本:
https://github.com/bmanojlovic/zlog
cmake版本:
https://github.com/lisongmin/zlog
windows版本:
https://github.com/lopsd07/WinZlog
在arm平台上利用,可以下载auto tools版本或者cmake版本。
类似的编译、安装办法我们之前的文章也有写:
实用 | 一个高性能通信库的大略利用分享
Protobuf:一种更小、更快、更高效的协议
protobuf-c在嵌入式Linux平台的利用实例分享
(2)方法二在zlog的根目录实行如下命令编译、安装arm版本的zlog至build_arm中:
mkdir build_armmake CC=arm-linux-gnueabihf-gccsudo make PREFIX=../build_arm install
得到:
确认是否是arm版本的:
编译、运行测试:
以上便是本次的分享,文章如有缺点,欢迎指出,感激!
咱们下期见~
往期推举:
嵌入式大杂烩周记 第 4 期:cola_os
嵌入式大杂烩周记 第 5 期:SmartLink
嵌入式大杂烩周记 第 6 期:FlexibleButton