嵌入式进阶方向(嵌入式大杂烩周记)

大家好,我是杂烩君。

嵌入式大杂烩周记主要是一些实用项目学习分享,每周一篇,每篇一个主题。

内容主要来源于我们之前收集的资料:

https://gitee.com/zhengnianli/EmbedSummary

本期主角:zlog

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.git cd zlog make sudo make install

也可以安装到指定路径,这里我们简单验证一下,所以安装到指定路径。安装到指定路径buiLD_x86:

git clone git@github.com:HardySimpson/zlog.git cd zlog mkdir build_x86 make sudo make PREFIX=../build_x86 install

安装完成,得到:

嵌入式进阶方向(嵌入式大杂烩周记)(1)

为了能让应用程序运行时找到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文件:

嵌入式进阶方向(嵌入式大杂烩周记)(2)

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

嵌入式进阶方向(嵌入式大杂烩周记)(3)

那是因为找不到libzlog.so库,就如我们上面说的,使用export命令:

export LD_LIBRARY_PATH=./build_x86/lib:$LD_LIBRARY_PATH

再次运行:

嵌入式进阶方向(嵌入式大杂烩周记)(4)

至此,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 = true buffer min = 1024 buffer max = 2MB rotate lock file = /tmp/zlog.lock default format = "%d.%us %-6V (%c:%F:%L) - %m%n" file perms = 600 [levels] TRACE = 10 CRIT = 130, LOG_CRIT [formats] simple = "%m%n" normal = "%d %m%n" [rules] default.* >stdout; simple *.* ".2E(HOME)/log/%c.log", 1MB*12; simple my_.INFO >stderr; my_cat.!ERROR "/var/log/aa.log" my_dog.=DEBUG >syslog, LOG_LOCAL0; simple my_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

嵌入式进阶方向(嵌入式大杂烩周记)(5)

formats具体的转换字符如(详细可查阅使用手册):

嵌入式进阶方向(嵌入式大杂烩周记)(6)

规则就是把分类、级别、输出文件、格式组合起来。例如上面规则的意思就是把simple格式的log输出至标准输出。

下面我们修改规则把log输出至文件:

[formats] simple = "%d.%us %m%n" [rules] my_cat.INFO "./log/test.log"

这表示把log输出至当前目录下log文件夹下的test.log中:

嵌入式进阶方向(嵌入式大杂烩周记)(7)

关于规则的输出动作(详细可查阅使用手册):

嵌入式进阶方向(嵌入式大杂烩周记)(8)

zlog也支持log切割功能,log循环存储,防止log存爆硬盘。下面简单看一下zlog的log切割并循环存储的功能:

[formats] simple = "%d.%us %m%n" [rules] my_cat.INFO "./log/demo.log",1KB*5~"./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; }

编译、运行:

嵌入式进阶方向(嵌入式大杂烩周记)(9)

嵌入式进阶方向(嵌入式大杂烩周记)(10)

有时候我们不需要定制一些复杂的配置,我们也可以按照默认配置,这样代码可以精简一些。这时候,需要使用另外一组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

编译、运行:

嵌入式进阶方向(嵌入式大杂烩周记)(11)

更多的API可查看zlog.h。

另外,我们上面编译的得到的安装文件中bin文件夹下有一个zlog-chk-conf工具,这个工具可以用来验证我们的配置文件是否编写正确:

嵌入式进阶方向(嵌入式大杂烩周记)(12)

嵌入式进阶方向(嵌入式大杂烩周记)(13)

以上就是关于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_arm make CC=arm-linux-gnueabihf-gcc sudo make PREFIX=../build_arm install

得到:

嵌入式进阶方向(嵌入式大杂烩周记)(14)

确认是否是arm版本的:

嵌入式进阶方向(嵌入式大杂烩周记)(15)

编译、运行测试:

嵌入式进阶方向(嵌入式大杂烩周记)(16)

以上就是本次的分享,文章如有错误,欢迎指出,谢谢!

咱们下期见~

往期推荐:

嵌入式大杂烩周记 第 4 期:cola_os

嵌入式大杂烩周记 第 5 期:SmartLink

嵌入式大杂烩周记 第 6 期:FlexibleButton

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页