简单Qt日志接口

cpp 复制代码
#ifndef LOGGER_H
#define LOGGER_H

#include <QObject>
#include <QFile>
#include <QTextStream>
#include <QMutex>
#include <QQueue>
#include <QThread >

class Logger : public QObject {
    Q_OBJECT

public:
    static Logger* getInstance();
    void startLogging();
    void log(const QString& message, const QString& val, const char* file, int line);

private:
    explicit Logger(QObject *parent = nullptr);
    QFile logFile;
    QTextStream logStream;
    QMutex mutex;
    QQueue<QString> logQueue;
    bool logging;

    void processLogQueue();

    static Logger* instance;
};

class LoggerThread : public QThread {
public:
    void run() override {
        Logger::getInstance()->startLogging();
    }
};

#define LOG(message, val) Logger::getInstance()->log(message, val, __FILE__, __LINE__)

#endif // LOGGER_H
cpp 复制代码
#include "logger.h"
#include <QFileInfo>

Logger* Logger::instance = nullptr;

Logger::Logger(QObject *parent) : QObject(parent), logging(false) {
    logFile.setFileName("out.log");
}

Logger* Logger::getInstance() {
    if (instance == nullptr) {
        instance = new Logger();
    }
    return instance;
}

void Logger::startLogging() {
    if (logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) {
        logStream.setDevice(&logFile);
        logging = true;
        processLogQueue();
    } else {
        qCritical() << "Error opening log file.";
    }
}

void Logger::log(const QString& message, const QString& val, const char* file, int line) {
        QFileInfo fileInfo(file);
        QString msg = QString("[%1] [%2:%3] %4 %5")
                      .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz"))
                      .arg(fileInfo.fileName())
                      .arg(QString::number(line))
                      .arg(message)
                      .arg(val);

    {
        QMutexLocker locker(&mutex);
        logQueue.enqueue(msg);
    }

    if (logging) {
        processLogQueue();
    }
}

void Logger::processLogQueue() {
    while (!logQueue.isEmpty()) {
        logStream << logQueue.dequeue() << endl;
    }
}
cpp 复制代码
#include <QCoreApplication>
#include <QDebug>
#include "logger.h"

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    LoggerThread loggerThread;
    loggerThread.start();
    loggerThread.wait(); // 等待线程完成
    
    QString strVal = "test";
    LOG("This is a log message.", strVal );
    LOG("Another log message.", strVal );

    return app.exec();
}

进一步拓展,可以随机输入不确定的参数:

cpp 复制代码
#define LOG(...) Logger::getInstance()->log(__VA_ARGS__, __FILE__, __LINE__)

void Logger::log(const char* file, int line, const QString& message) {
    QFileInfo fileInfo(file);
    QString msg = QString("[%1] [%2:%3] [Thread ID: %4] %5")
                      .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz"))
                      .arg(fileInfo.fileName())
                      .arg(line)
                      .arg(QThread::currentThreadId())
                      .arg(message);

    {
        QMutexLocker locker(&mutex);
        logQueue.enqueue(msg);
    }

    if (logging) {
        processLogQueue();
    }
}

template<typename T, typename... Args>
void Logger::log(const char* file, int line, const QString& message, T&& value, Args&&... args) {
    QString newValue = QString::fromUtf8(QByteArray::number(value));
    log(file, line, message + " " + newValue, std::forward<Args>(args)...);
}

下一步还可以输入不同类型来确定打印,可以使用模板函数来处理等等;

相关推荐
IvanCodes8 分钟前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
aramae2 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
qq_2518364574 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
郑州光合科技余经理5 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
知识分享小能手5 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
+VX:Fegn08956 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
阿里嘎多学长6 小时前
2026-09-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
江湖人称菠萝包8 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter9-Qt Charts
笔记·qt·qt5
扶尔魔ocy8 小时前
【QT android】环境安装及第一个QT项目
qt·andriod开发
weixin_307779138 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab