嵌入式大杂烩周记 第 7 期:zlog 嵌入式教程全套视频
liebian365 2024-10-31 15:19 6 浏览 0 评论
大家好,我是杂烩君。
嵌入式大杂烩周记主要是一些实用项目学习分享,每周一篇,每篇一个主题。
内容主要来源于我们之前收集的资料:
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
安装完成,得到:
为了能让应用程序运行时找到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 = 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
*.* "%12.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
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",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;
}
编译、运行:
有时候我们不需要定制一些复杂的配置,我们也可以按照默认配置,这样代码可以精简一些。这时候,需要使用另外一组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版本。
类似的编译、安装方式我们之前的文章也有写:
(2)方法二
在zlog的根目录执行如下命令编译、安装arm版本的zlog至build_arm中:
mkdir build_arm
make CC=arm-linux-gnueabihf-gcc
sudo make PREFIX=../build_arm install
得到:
确认是否是arm版本的:
编译、运行测试:
以上就是本次的分享,文章如有错误,欢迎指出,谢谢!
咱们下期见~
往期推荐:
相关推荐
- 快递查询教程,批量查询物流,一键管理快递
-
作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...
- 一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递
-
对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...
- 快递查询单号查询,怎么查物流到哪了
-
输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...
- 3分钟查询物流,教你一键批量查询全部物流信息
-
很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...
- 快递单号查询,一次性查询全部物流信息
-
现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...
- 快递查询工具,批量查询多个快递快递单号的物流状态、签收时间
-
最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...
- 快递查询软件,自动识别查询快递单号查询方法
-
当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...
- 教你怎样查询快递查询单号并保存物流信息
-
商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...
- 简单几步骤查询所有快递物流信息
-
在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...
- 物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号
-
最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...
- 连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息
-
快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...
- 快递查询教程,快递单号查询,筛选更新量为1的单号
-
最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...
- 掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析
-
在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...
- 从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息
-
在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...
- 物流单号查询,在哪里查询快递
-
如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)