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中写入
LIBS += -L$$PWD/log4cpp/lib/ -llog4cppINCLUDEPATH += $$PWD/log4cpp/include
DEPENDPATH += $$PWD/log4cpp/include
下面直接上代码
//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
//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);// 文件Appenderlog4cpp::PatternLayout* fileLayout = new log4cpp::PatternLayout();fileLayout->setConversionPattern("%d [%p] %m%n");m_fileAppender = new log4cpp::RollingFileAppender("fileAppender",logFileName.toStdString(),10 * 1024 * 1024, // 10MB5); // 保留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 = EMERGm_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)
{
}
//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();
结束
这样可以看到在文件中输出的日志和在控制台输出的日志