【嵌入式Linux】zlog日志库
zlog日志库
- 1 简介
- 1.1 核心特点
- 1.2 核心概念
- 2 zlog日志库部署到项目工程
- 2.1 下载zlog源码
- 2.2 交叉编译zlog源码
- 2.3 拷贝生成的静态库文件
- 3.zlog日志使用
1 简介
zlog是轻量级,高性能的C语言日志库,专为Linux/Unix系统设计(也支持Windows系统),适合嵌入式系统,服务器后台等对日志功能有较高需求的场景。
本文介绍zlog基本概念,交叉编译并部署到QT项目中
1.1 核心特点
特性 | 说明 |
---|---|
高性能 | 异步写入、低延迟,适合高并发场景。 |
线程安全 | 多线程环境下无需额外锁机制。 |
灵活配置 | 通过配置文件动态控制日志格式、级别、输出目标(文件/控制台/网络等)。 |
日志分类 | 支持多类别(Category)日志,便于模块化管理。 |
日志轮转 | 自动按大小/时间分割日志文件,避免单个文件过大。 |
跨平台 | 支持 Linux、macOS、Windows(需 MinGW 或 MSVC 适配)。 |
1.2 核心概念
(1)日志分类(Category)
不同模块可以使用不同的日志分类(如 network、database),每个分类可独立配置级别和输出规则。
示例:
zlog_category_t *net_cat = zlog_get_category("network");
zlog_info(net_cat, "Connection established");
(2)配置文件(zlog.conf)
定义日志格式、输出目标和规则。示例:
[formats]
simple = "%d(%ms) %-6V [%c:%F:%L] %m%n" # 格式:时间、级别、分类、文件、行号、消息[rules]
my_cat.* "./logs/app.log", 10MB * 3 ~ "./logs/old/app.log.#r"; simple
network.DEBUG "192.168.1.100:514;simple" # 输出到远程 syslog 服务器
(3)日志级别
从高到低:FATAL > ERROR > WARN > NOTICE > INFO > DEBUG。
运行时可通过配置文件动态调整级别,无需重启程序。
2 zlog日志库部署到项目工程
2.1 下载zlog源码
git clone https://github.com/HardySimpson/zlog.git
2.2 交叉编译zlog源码
cd zlog
make cc={指定交叉编译器}
eg:
make cc=/workdir/anlogic/SDK_2024.10/buildroot/host/bin/aarch64-linux-gnu-gcc
交叉编译完成之后,会在zlog/Src文件夹中生成以下文件
libzlog.a ,libzlog.so libzlog.so.1 libzlog.so.1.2
查看文件属性是arm平台的格式文件
2.3 拷贝生成的静态库文件
(1)可以在QT工程项目文件夹新建libs文件夹,并将libzlog.a静态库文件拷贝该文件夹中。
注:可根据需求选择拷贝静态库文件或者动态库文件,如果考虑减小应用程序大小,可以选择拷贝.so动态库文件,但是也需要将.so动态库文件拷贝到目标机中。如果不考虑应用程序大小,对存储空间没有要求,则可以拷贝.a静态库文件
(2)修改QT工程.pro文件,指定zlog库路径
LIBS += -L$$PWD/../libs -lzlog,
3.zlog日志使用
#include <QObject>
#include <QDir>
#include <QFile>
#include <QDebug>
#include "zlog.h"//定义要写入zlog配置文件中的配置内容,配置日志格式
//以下定义两个日志的格式
#define zlogDefaultCFG "[formats] \nsimple = \"Log->%d.%ms [%f-%L] %m%n\" \n[rules] \n*.* >stdout;simple \nmy_cat.* \"/home/usr/myLog/myLog.log\", 10M*1; simple \n"//以下定义两个日志的格式
#define zlogDefaultCFG2 "[formats] \nsimple = \"GA02->%d.%ms [%f-%L] %m%n\" \n[rules] \n*.* >stdout;simple \nmy_cat.* \"/home/usr/myLog/myLog.log\", 10M*1; simple \nerr_cat.* \"/home/usr/myLog/myLog2.log\", 10M*1; simple \n"#define ZLOG_PATH "/home/usr/myLog//myLog.cfg" /*日志初始化文件*/zlog_category_t *zc;
zlog_category_t *zc_Err;
void initZlog(void)
{QDir zlogDir("/home/usr/");if (!zlogDir.exists()){QDir zlogParentDir("/home/usr");if (!zlogParentDir.mkdir("myLog")){qDebug("mkdir false");return;}}QFile zlog_config_file(ZLOG_PATH);if (!zlog_config_file.exists()){zlog_config_file.setFileName(ZLOG_PATH);if(!zlog_config_file.open(QIODevice::WriteOnly|QIODevice::Text)){qDebug("zlog config file create error");return;}else if(!zlog_config_file.write(QString(zlogDefaultCFG).toLatin1().data())){qDebug("zlog config file write error");return;}zlog_config_file.close();}QFile zlogCfgFile(ZLOG_PATH);if( !zlogCfgFile.exists() )qDebug("zlog config file does not exsit");int rc;rc = zlog_init(ZLOG_PATH);if (rc){qDebug("zlog init failed");return;}zc = zlog_get_category("my_cat");if (!zc){zlog_fini();qDebug("get my cat failed");return;}zlog_info(zc, " \n############################\r\n display process zlog init Successful ! \n############################\r\n");zc_Err = zlog_get_category("err_cat");if (!zc_Err){zlog_fini();qDebug("get err cat failed");return;}zlog_info(zc_Err, " \n############################\r\n display process Error zlog init Successful ! \n############################\r\n");}