简单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)...);
}

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

相关推荐
软件黑马王子3 小时前
C#初级教程(4)——流程控制:从基础到实践
开发语言·c#
cpp_learners3 小时前
QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,压缩进度
qt·zlib·加密压缩·quazip
闲猫3 小时前
go orm GORM
开发语言·后端·golang
李白同学5 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
黑子哥呢?6 小时前
安装Bash completion解决tab不能补全问题
开发语言·bash
青龙小码农6 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿6 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
彳卸风7 小时前
Unable to parse timestamp value: “20250220135445“, expected format is
开发语言
数巨小码人7 小时前
QT SQL框架及QSqlDatabase类
jvm·sql·qt
dorabighead7 小时前
JavaScript 高级程序设计 读书笔记(第三章)
开发语言·javascript·ecmascript