【嵌入式Linux】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");

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值