一、日志库下载
下载地址: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();
结束
这样可以看到在文件中输出的日志和在控制台输出的日志