QT日志库:log4Qt及Qt自带日志库使用

介绍

Log4Qt是使用Trolltech Qt Framework的Apache Software Foundation Log4j包的C ++端口。它旨在供开源和商业Qt项目使用。所以 Log4Qt 是Apache Log4J 的Qt移植版,所以看Log4J的资料应该是最直接有效的(因为 Log4Qt的直接资料太少了)。

Log4Qt主要是用来记录日志(有助于程序调试)。有3个主要的组件:

1、Logger

提供日志记录服务,可以有多个Logger存在,每个有它们自己的名字。Logger间存在隶属关系,有一个Logger称为根Logger。

2、Appender

用来指明将日志记录到什么地方:比如,控制台、文件、数据库,等等

3、Layout

控制日志的输出格式,可以类比一下C中的printf哈。

下载log4qt源码

源码下载

当前最新版本为log4qt-0.3.zip,这源码包最后修改日期为2009年3月1日。

Sourceforge 下载地址:

https://sourceforge.net/projects/log4qt/

或者

https://github.com/devbean/log4qt

或者

https://gitee.com/mirrors/log4qt

编译为动态库

使用qtCreater打开pro文件:文件路径:qt_log\log4qt\tests\log4qttest.pro

Qt4版本日志移植到qt5编译过程出现错误

错误一:识别QtMsgHandler类

"error: 'QtMsgHandler' does not name a type"

错误二:QObject类未声明

点击跳转到错误文件,添加QObject

错误三:QTextCodec编码错误
错误四:操作符"<<"歧义
错误五:qInstallMsgHandle未声明
错误六:Qt编译错误: 'UnicodeUTF8' is not a member of 'QApplication'
错误七:error: undefined reference to `vtable for

原因:

子类没有实现父类的纯虚函数;在Qt中,首先要想到的是在一个类中添加了新的继承QObject,并添加了 Q_OBJECT 宏,然后执行构造或重新构造,都会造成这个错误。根本原因是,只执行构造或重新构造,都不会编译新添加的宏Q_OBJECT。因此在这之前要执行qmake让moc编译器去预编译Q_OBJECT然后再执行构造&#xff0c;就不再报错了。

项目使用

pro文件中添加

cpp 复制代码
#log start
LIBS +=-LD:\C++\plugins\dll/ -lhlog4qt1
INCLUDEPATH +=D:\C++\plugins\include
#log end

main.cpp

cpp 复制代码
    /* 根据指定的日志配置文件初始化日志 */
    Log4Qt::PropertyConfigurator::configure( "./mylog.conf");

    Log4Qt::Logger *mylog1 = Log4Qt::Logger::logger("Mylog1");
    /* 处理qt调试输出信息,将qDebug之类的信息重定向到日志文件 */
    Log4Qt::LogManager::setHandleQtMessages(true);

    /* 日志输出 */
    mylog1->debug("log debug");
    mylog1->info("log info");
    mylog1->warn("log warn");
    mylog1->error("log error");
    mylog1->fatal("log fatal");



    qDebug("qDebug");
    qInfo("qInfo");
    qWarning("qWarning");
    qCritical("qCritical");
    qFatal("qCritical");
    qDebug()<<"qDebug()";

QT自带日志库

cpp 复制代码
#include <QMutex>
#include <QMutexLocker>
#include <QFile>
#include <QTextStream>
#include <QMessageLogContext>

class SaveLog
{
public:
    static SaveLog* Instance()
    {
        static SaveLog instance;
        return &instance;
    }

    bool getUseContext() const { return useContext; }
    void setUseContext(bool value) { useContext = value; }

    void save(const QString &log)
    {
        // 将日志内容保存到文件
        QFile file("log.txt");
        if (file.open(QIODevice::Append)) {
            QTextStream out(&file);
            out << log << "\n";
            file.close();
        }
    }

private:
    SaveLog() : useContext(true) {}
    bool useContext;
};

// 日志处理函数
void Log(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    static QMutex mutex;
    QMutexLocker locker(&mutex);
    QString content;

    switch (type) {
        case QtDebugMsg:
        case QtInfoMsg:
            content = QString("Debug/Info: %1").arg(msg);
            break;
        case QtWarningMsg:
            content = QString("Warning: %1").arg(msg);
            break;
        case QtCriticalMsg:
            content = QString("Critical: %1").arg(msg);
            break;
        case QtFatalMsg:
            content = QString("Fatal: %1").arg(msg);
            break;
    }

#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
    if (SaveLog::Instance()->getUseContext() && context.line != -1) {
        content = QString("%1 (%2, %3, %4)")
                  .arg(content)
                  .arg(context.file)
                  .arg(context.line)
                  .arg(context.function);
    }
#endif

    SaveLog::Instance()->save(content);
}

// 安装日志钩子
void start()
{
    qInstallMessageHandler(Log);

}
// 卸载日志钩子
void stop()
{
    qInstallMessageHandler(nullptr);
}

使用

cpp 复制代码
    start();
    qDebug()<<"hehe";
    qInfo()<<"你好";
    qWarning()<<"finish";
    qCritical()<<"critical";
//    qFatal("fatal");
    qDebug()<<"ttt";

    stop();
相关推荐
songgz27 分钟前
洋葱式双向解析器演示(Ruby)
开发语言·后端·ruby
秋邱31 分钟前
AR 应用流量增长与品牌 IP 打造:从被动接单到主动获客
开发语言·人工智能·后端·python·ar·restful
源代码•宸31 分钟前
GoLang并发示例代码2(关于逻辑处理器运行顺序)
服务器·开发语言·经验分享·后端·golang
郑州光合科技余经理8 小时前
同城系统海外版:一站式多语种O2O系统源码
java·开发语言·git·mysql·uni-app·go·phpstorm
一只乔哇噻8 小时前
java后端工程师+AI大模型开发进修ing(研一版‖day60)
java·开发语言·人工智能·学习·语言模型
LNN20228 小时前
Linuxfb+Qt 输入设备踩坑记:解决 “节点存在却无法读取“ 问题
开发语言·qt
qq_401700418 小时前
Qt单实例程序-----禁止程序多开
qt
foxsen_xia9 小时前
go(基础06)——结构体取代类
开发语言·算法·golang
巨人张9 小时前
C++火柴人跑酷
开发语言·c++
ID_180079054739 小时前
基于 Python 的 Cdiscount 商品详情 API 调用与 JSON 核心字段解析(含多规格 SKU 提取)
开发语言·python·json