linux qt 使用log4cpp库

一、日志库下载

下载地址:https://log4cpp.sourceforge.net/


二、日志库解压,编译

1.将文件夹解压出来

2.进入文件夹内部,打开终端

3.终端中依次输入以下命令

mkdir build

./configure --prefix=$(pwd)/build

make

make install
一般来说不会报错,在build目录下就可以看到生成的库

三、使用编译好的库

1.将上面生成的两个文件夹:include lib直接拷贝到测试工程目录下

(自己新建一个测试工程,不用界面)

(你可以直接放将include lib文件夹放在根目录,我这里新建一个文件夹将它们都放进去)

2.在.pro中写入

cpp 复制代码
LIBS += -L$$PWD/log4cpp/lib/ -llog4cpp

INCLUDEPATH += $$PWD/log4cpp/include
DEPENDPATH += $$PWD/log4cpp/include

下面直接上代码

cpp 复制代码
//log.h
#ifndef LOG_H
#define LOG_H
#include <QString>
#include <log4cpp/Category.hh>
#include <log4cpp/Appender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/Layout.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/RollingFileAppender.hh>

class Log
{
public:
    static Log& Instance();

    void init(QString fileName="");
    void setConsoleOutput(bool enable = true);
    void setFilePriority(log4cpp::Priority::Value priority);
    void setConsolePriority(log4cpp::Priority::Value priority);
    bool isConsoleEnable();
    Log(const Log&)=delete;
    Log&operator=(const Log&)=delete;
    void debug(const QString &message);
    void info(const QString &message);
    void error(const QString &message);
    void warn(const QString &message);
private:
    Log();
    log4cpp::Category& m_category;
    log4cpp::Appender* m_fileAppender;
    log4cpp::Appender* m_consoleAppender;
    bool m_consoleEnabled;
};

#endif // LOG_H
cpp 复制代码
//log.cpp
#include "log.h"
#include <QCoreApplication>
#include <QStandardPaths>
#include <QDir>
#include <iostream>
Log& Log::Instance()
{
    static Log log ;
    return log;
}

void Log::init(QString fileName)
{
    //文件名
    QString actualAppName = fileName.isEmpty() ? QCoreApplication::applicationName() : fileName;
    if (actualAppName.isEmpty()) {
        actualAppName = "LOG";
    }
    // 设置日志文件
    QString logFileName = QString("%1.log").arg(actualAppName);
    // 文件Appender
    log4cpp::PatternLayout* fileLayout = new log4cpp::PatternLayout();
    fileLayout->setConversionPattern("%d [%p] %m%n");

    m_fileAppender = new log4cpp::RollingFileAppender(
        "fileAppender",
        logFileName.toStdString(),
        10 * 1024 * 1024,  // 10MB
        5);                // 保留5个备份
    m_fileAppender->setLayout(fileLayout);
    m_fileAppender->setThreshold(log4cpp::Priority::DEBUG);
    m_category.addAppender(m_fileAppender);

    //启动控制台输出
    setConsoleOutput(true);
    // 输出日志头
    m_category.notice("===========================================");
    m_category.notice(QString("===  %1 Started (v%2) ===")
                          .arg(actualAppName)
                          .arg(QCoreApplication::applicationVersion())
                          .toStdString());
    m_category.notice(QString("===  Log file: %1 ===")
                          .arg(logFileName)
                          .toStdString());
    m_category.notice("===========================================");
}

void Log::setConsoleOutput(bool enable)
{
    if (enable == m_consoleEnabled) return;
    if (enable) {
        log4cpp::PatternLayout* consoleLayout = new log4cpp::PatternLayout();
        // 彩色控制台输出
        consoleLayout->setConversionPattern("\033[36m%d\033[0m [\033[32m%p\033[0m] %m%n");

        m_consoleAppender = new log4cpp::OstreamAppender("console", &std::cout);
        m_consoleAppender->setLayout(consoleLayout);
        m_consoleAppender->setThreshold(log4cpp::Priority::DEBUG);
        m_category.addAppender(m_consoleAppender);
    } else {
        if (m_consoleAppender) {
            m_category.removeAppender(m_consoleAppender);
            delete m_consoleAppender;
            m_consoleAppender = nullptr;
        }
    }

    m_consoleEnabled = enable;
}


void Log::setFilePriority(log4cpp::Priority::Value priority)
{
    //设置日志级别,低于priority级别的将不会输出
    //DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT < FATAL = EMERG
    m_category.setPriority(priority);
}

void Log::setConsolePriority(log4cpp::Priority::Value priority)
{
    if (m_consoleAppender) {
        m_consoleAppender->setThreshold(priority);
    }
}

bool Log::isConsoleEnable()
{
    return m_consoleEnabled;
}

void Log::info(const QString &message)
{
    m_category.info(message.toStdString());
}

void Log::error(const QString &message)
{
     m_category.error(message.toStdString());
}

void Log::warn(const QString &message)
{
    m_category.warn(message.toStdString());
}

void Log::debug(const QString &message)
{
     m_category.debug(message.toStdString());
}

Log::Log():m_category(log4cpp::Category::getInstance("QtLogger")),
    m_fileAppender(nullptr),
    m_consoleAppender(nullptr),
    m_consoleEnabled(false)
{
}
cpp 复制代码
//main.cpp
#include <QApplication>
#include "log.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // MainWindow w;
    // w.show();
    Log::Instance().init();
    Log::Instance().setFilePriority(log4cpp::Priority::DEBUG);
    Log::Instance().setConsolePriority(log4cpp::Priority::INFO);

    Log::Instance().debug("这是一条debug");
    Log::Instance().info("这是一条info");
    Log::Instance().error("zheshi yitiao error");


    std::cout<<"endl"<<std::endl;
    return a.exec();

结束

这样可以看到在文件中输出的日志和在控制台输出的日志