Qt Log4qt实现的日志记录

戏子无情 提交于 2020-01-23 00:59:24

0. 前言

很久没有更新博客, 现在转Qt方向, 重新开始写代码, 博客也不能落下, 每天的学习坚持记录在这里.

Log4qt 是一个日志记录的第三方库, 可以实现debug, error, info, warn 四种日志类型的输出, 使用也很方便.

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

下载后将lo4qt文档导入项目即可

log封装类是用的红模仿博主的, 感谢分享

此案例是在qt5下实现的, qt4的等以后再加

 

1. 实现效果

在build目录下会生成log文件夹, 有四个txt文件

在程序中调用API即可, info 的函数如下调用

Log::instance()->info("信息测试日志系统当中...");

 

2. 运行环境

win10 qt5.14.0

 

3. 目录结构

4. 源码编译

main.cpp

#include <QCoreApplication>
#include <QTextCodec>
#include <QThread>
#include "log.h"
#include "define.h"

using namespace Log4Qt;

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

    QThread::currentThread()->setObjectName("主线程");

    QTextCodec *codec = QTextCodec::codecForName("GBK");
    QTextCodec::setCodecForLocale(codec);

    Log::instance()->init(QCoreApplication::applicationDirPath() + "/" +"etc/log.conf");
    Log::instance()->debug("调试测试日志系统当中...");
    Log::instance()->info("信息测试日志系统当中...");
    Log::instance()->warn("警告测试日志系统当中...");
    Log::instance()->error("错误测试日志系统当中...");

    return a.exec();
}

define.h

// 开发过程中暂时使用qDebug替代 1-使用debug打印输出  0-使用日志输出
#if 0

// 以文件行列记录信息,非以类名对象形式
#define LOG_DEBUG(msg) qDebug() << QString("[%1][%2][%3][%4]%5")  \
                                           .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"))  \
                                           .arg(QString("%1:%2:%3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__))  \
                                           .arg(QThread::currentThread()->objectName())  \
                                           .arg("DEBUG")  \
                                           .arg(msg);

#define LOG_INFO(msg) qDebug() << QString("[%1][%2][%3][%4]%5")  \
                                           .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"))  \
                                           .arg(QString("%1:%2:%3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__))  \
                                           .arg(QThread::currentThread()->objectName())  \
                                           .arg("INFO")  \
                                           .arg(msg);

#define LOG_WARN(msg) qDebug() << QString("[%1][%2][%3][%4]%5")  \
                                           .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"))  \
                                           .arg(QString("%1:%2:%3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__))  \
                                           .arg(QThread::currentThread()->objectName())  \
                                           .arg("WARN")  \
                                           .arg(msg);

#define LOG_ERROR(msg) qDebug() << QString("[%1][%2][%3][%4]%5")  \
                                           .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"))  \
                                           .arg(QString("%1:%2:%3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__))  \
                                           .arg(QThread::currentThread()->objectName())  \
                                           .arg("ERROR")  \
                                           .arg(msg);


// 以类名对象形式记录信息
#define LOG_OBJECT_DEBUG(msg) qDebug() << QString("[%1][%2][%3][%4]%5")  \
                                           .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"))  \
                                           .arg(QString("%1::%2:%3").arg(this->metaObject()->className()).arg(__FUNCTION__).arg(__LINE__))  \
                                           .arg(QThread::currentThread()->objectName())  \
                                           .arg("DEBUG")  \
                                           .arg(msg);

#define LOG_OBJECT_INFO(msg) qDebug() << QString("[%1][%2][%3][%4]%5")  \
                                           .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"))  \
                                           .arg(QString("%1::%2:%3").arg(this->metaObject()->className()).arg(__FUNCTION__).arg(__LINE__))  \
                                           .arg(QThread::currentThread()->objectName())  \
                                           .arg("INFO")  \
                                           .arg(msg);

#define LOG_OBJECT_WARN(msg) qDebug() << QString("[%1][%2][%3][%4]%5")  \
                                           .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"))  \
                                           .arg(QString("%1::%2:%3").arg(this->metaObject()->className()).arg(__FUNCTION__).arg(__LINE__))  \
                                           .arg(QThread::currentThread()->objectName())  \
                                           .arg("WARN")  \
                                           .arg(msg);

#define LOG_OBJECT_ERROR(msg) qDebug() << QString("[%1][%2][%3][%4]%5")  \
                                           .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"))  \
                                           .arg(QString("%1::%2:%3").arg(this->metaObject()->className()).arg(__FUNCTION__).arg(__LINE__))  \
                                           .arg(QThread::currentThread()->objectName())  \
                                           .arg("ERROR")  \
                                           .arg(msg);


// 写入日志系统
#else

// 以文件行列记录信息,非以类名对象形式
#define LOG_DEBUG(msg) Log::instance()->debug(QString("[%1]%2").arg(QString("%1:%2:%3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__)).arg(msg));

#define LOG_INFO(msg) Log::instance()->info(msg);

#define LOG_WARN(msg) Log::instance()->warn(msg);

#define LOG_ERROR(msg) Log::instance()->error(msg);


// 以类名对象形式记录信息
#define LOG_OBJECT_DEBUG(msg) Log::instance()->debug(QString("[%1]%2").arg(QString("%1::%2:%3").arg(this->metaObject()->className()).arg(__FUNCTION__).arg(__LINE__)).arg(msg));

#define LOG_OBJECT_INFO(msg) Log::instance()->info(msg);

#define LOG_OBJECT_WARN(msg) Log::instance()->warn(msg);

#define LOG_OBJECT_ERROR(msg) Log::instance()->error(msg);


#endif

log.h

#define LOG_H

#include <QObject>
#include <QMutex>
#include <QMutexLocker>
#include <QCoreApplication>

#include "log4qt/logger.h"
#include "log4qt/basicconfigurator.h"

/************************************************************\
 * 类名:Log
 * 描述:封装log4qt开源库类
 * 注意:模块已带log4qt for qt4 和 qt5两个版本;
 *      模块已带log4qt配置文件,分为4级别:DEBUG > INFO > WARN > ERROR
 * 信号:
 * 函数:
 *      instance() - 获取日志唯一实例
 * 槽函数:
 *      slot_init() - 初始化加载配置文件
 *      slot_debug() - 调试级别日志
 *      slot_info() - 信息级别日志
 *      slot_warn() - 警告级别日志
 *      slot_error() - 错误级别日志
 *
 * 作者:红模仿
 * 联系方式:QQ21497936
 * 博客地址:https://blog.csdn.net/qq21497936
 *      日期          版本号        描述
 *  2019年04月09日    v1.0.0     基础日志模块
\************************************************************/


class Log : public QObject
{
    Q_OBJECT
public:
    explicit Log(QObject *parent = nullptr);

signals:

public slots:
    static Log * instance();

public slots:
    void init(QString configFilePath);

public slots:
    void debug(QString msg);
    void info(QString msg);
    void warn(QString msg);
    void error(QString msg);

private:
    static Log *_pInstance;
    static QMutex _mutex;
    static Log4Qt::Logger * _pLoggerDebug;
    static Log4Qt::Logger * _pLoggerInfo;
    static Log4Qt::Logger * _pLoggerWarn;
    static Log4Qt::Logger * _pLoggerError;
    static QString _configFilePath;

};

log.cpp

#include "log.h"
#include "log4qt/log4qt.h"
#include "log4qt/propertyconfigurator.h"

Log * Log::_pInstance = 0;
QMutex Log::_mutex;
Log4Qt::Logger * Log::_pLoggerDebug = 0;
Log4Qt::Logger * Log::_pLoggerInfo = 0;
Log4Qt::Logger * Log::_pLoggerWarn = 0;
Log4Qt::Logger * Log::_pLoggerError = 0;
QString Log::_configFilePath;

Log::Log(QObject *parent) : QObject(parent)
{
    // 一定要配置文件,不然运行起来会直接当掉
    Log4Qt::BasicConfigurator::configure();
}

Log *Log::instance()
{
    if(!_pInstance)
    {
        QMutexLocker mutexLocker(&_mutex);
        if(!_pInstance)
        {
            Log *pInstance = new Log();
            _pInstance = pInstance;
        }
    }
    return _pInstance;
}

void Log::init(QString configFilePath)
{
    _configFilePath = configFilePath;
     Log4Qt::PropertyConfigurator::configure(_configFilePath);
    _pLoggerDebug = Log4Qt::Logger::logger("debug");
    _pLoggerInfo = Log4Qt::Logger::logger("info");
    _pLoggerWarn = Log4Qt::Logger::logger("warn");
    _pLoggerError = Log4Qt::Logger::logger("error");
}

void Log::debug(QString msg)
{
    _pLoggerDebug->debug(msg);
}

void Log::info(QString msg)
{
    _pLoggerInfo->info(msg);
}

void Log::warn(QString msg)
{
    _pLoggerWarn->warn(msg);
}

void Log::error(QString msg)
{
    _pLoggerError->error(msg);
}

5. 配置文件

在build目录下创建etc文件夹, 新建log.conf

log.conf

log4j.logger.debug=CONSOLE,debug
log4j.appender.debug=org.apache.log4j.RollingFileAppender
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.appendFile=true
log4j.appender.debug.Encoding=UTF-8
log4j.appender.debug.File=log/debug.txt
log4j.appender.debug.MaxFileSize=4096KB
log4j.appender.debug.MaxBackupIndex=7
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.zzz}[%t][%p] %m%n
 
log4j.logger.info=CONSOLE,info
log4j.appender.info=org.apache.log4j.RollingFileAppender
log4j.appender.info.Threshold=DEBUG
log4j.appender.info.appendFile=true
log4j.appender.info.Encoding=UTF-8
log4j.appender.info.File=log/info.txt
log4j.appender.info.MaxFileSize=4096KB
log4j.appender.info.MaxBackupIndex=7
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.zzz}[%t][%p] %m%n
 
log4j.logger.warn=CONSOLE,warn
log4j.appender.warn=org.apache.log4j.RollingFileAppender
log4j.appender.warn.Threshold=DEBUG
log4j.appender.warn.appendFile=true
log4j.appender.warn.Encoding=GBK
log4j.appender.warn.File=log/warn.txt
log4j.appender.warn.MaxFileSize=4096KB
log4j.appender.warn.MaxBackupIndex=2
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.zzz}[%t][%p] %m%n
 
 
log4j.logger.error=CONSOLE,error
log4j.appender.error=org.apache.log4j.RollingFileAppender
log4j.appender.error.Threshold=DEBUG
log4j.appender.error.appendFile=true
log4j.appender.error.Encoding=UTF-8
log4j.appender.error.File=log/error.txt
log4j.appender.error.MaxFileSize=4096KB
log4j.appender.error.MaxBackupIndex=2
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.zzz}[%t][%p] %m%n
 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!