系列参考文章
log4cplus之基本使用方法及示例
VS2019配置log4cplus
C++ 设计实现日志系统 提示:这篇文章重点看,不错
C++日志库log4cplus快速入门
log4cplus_demo
可以了解make类似的工具Scons
文章目录
前言
利用Cmake 编译相应的库,从而方便QT MINGW73_64调用,MSVC 编译器同理
一、准备
-
log3.0以上版本,编译器版本要支持c++17
-
安装cmake (cmake3.21.3版本)
-
从github下载文件Catch-master.zip和ThreadPool-master.zip log4cplus-2.0.7
二、编译步骤
1. 建立Cmake编译输出目录log4cplus
将Catch-master.zip和ThreadPool-master.zip分别解压到log4cplus源码下catch和threadpool目录
2. 设置环境变量
一个是QT 的mingw以及cmake的
3. 设置编译器
3.1 configure->选择编译器为MinGW Makefiles
3.2 点击下一步,选择好对应的gcc,g++编译器;
D:/Qt/Qt5.12.11/Tools/mingw730_64/bin/gcc.exe
D:/Qt/Qt5.12.11/Tools/mingw730_64/bin/g++.exe
4. Configure配置选项
勾选LOG4CPLUS_QT5,并设置好Qt5Core_DIR,然后点击Configure->Generate
5. 编译
上一步没报错就用mingw32-make
编译,用管理员权限打开PowerShell
三、使用步骤
1.测试库
说明:把log4cplus下bin目录生成的库文件liblog4cplusU.dll, liblog4cplusqt5debugappenderU.dll拷贝到测试工程
如果要使用qt5debugappender,请把 liblog4cplusqt5debugappenderU.dll 和
liblog4cplusqt5debugappenderU.dll.a 也加到LIBS中来
INCLUDEPATH += $$PWD\3rdparty\include
LIBS += -L$$PWD\3rdparty\libs\ -lliblog4cplusU
2.配置文件
配置文件log.properties控制日志文件的生成,写个单例日志类读取配置文件
# ALL TRACE DEBUG INFO WARN ERROR FATAL OFF
log4cplus.rootLogger = TRACE,SA
log4cplus.logger.logConsole = TRACE,LC
#For database stuff, I don't need to logging everything, it's enough printing only errors!
#log4cplus.logger.DatabaseOperations=ERROR
#log4cplus.additivity.file=false
log4cplus.appender.LC=log4cplus::ConsoleAppender
log4cplus.appender.LC.EnCoding=utf-8
log4cplus.appender.LC.layout=log4cplus::PatternLayout
log4cplus.appender.LC.layout.ConversionPattern=[%D{%Y-%m-%d %H:%M:%S}] %m [%l]%n
#设置日志追加到文件尾
log4cplus.appender.SA=log4cplus::TimeBasedRollingFileAppender
log4cplus.appender.SA.File = Mylogger.log
# 必须要先手动创建好log目录;否则无法创建文件
log4cplus.appender.SA.FilenamePattern= ./log/%d{yyyy-MM-dd_HH-mm}.log
log4cplus.appender.SA.Schedule = MINUTELY
log4cplus.appender.SA.CreateDirs = true
log4cplus.appender.SA.MaxHistory = 9999
log4cplus.appender.SA.RollOnClose = false
#设置日志文件大小
log4cplus.appender.SA.MaxFileSize = 100MB
#设置生成日志最大个数
log4cplus.appender.SA.MaxBackupIndex = 100
log4cplus.appender.SA.Append = true
log4cplus.appender.SA.layout=log4cplus::PatternLayout
log4cplus.appender.SA.layout.ConversionPattern=[%-5p][%D{%m/%d/%y %H:%M:%S:%Q}] [%t] %c - %m [%l]%n
#设置日志级别范围
log4cplus.appender.SA.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.SA.filters.1.LogLevelMin=DEBUG
log4cplus.appender.SA.filters.1.LogLevelMax=FATAL
log4cplus.appender.SA.filters.1.AcceptOnMatch=true
log4cplus.appender.SA.filters.2=log4cplus::spi::DenyAllFilter
3. 单列日志类
MyLogger.h
#ifndef MYLOGGER_H
#define MYLOGGER_H
#include <iostream>
#include <string>
#include <mutex>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/logger.h>
#include <log4cplus/initializer.h>
#include <log4cplus/log4cplus.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/layout.h>
#include <log4cplus/tchar.h>
#include <log4Cplus/configurator.h>
#include <log4Cplus/loggingmacros.h>
#include <log4Cplus/helpers/stringhelper.h>
#define MY_LOG_FILE "log.properties"
using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;
//懒汉单列模式
class MyLogger
{
public:
static MyLogger* getInstace();
//static void deleteInstance();
Logger logger;
Logger console;
private:
MyLogger();
~MyLogger(){
cout << "Destory singleton for log4cplus!!" <<endl;
}
static MyLogger *m_logger;
static mutex myMutex;
private:
//内部类来删除对象
class Garbo{
public:
Garbo(){}
~Garbo(){
if(m_logger != NULL){
delete m_logger;
m_logger = nullptr;
}
}
};
static Garbo _garbo;
};
#endif // MYLOGGER_H
MyLogger.cpp
#include "mylogger.h"
MyLogger* MyLogger::m_logger = NULL;
mutex MyLogger::myMutex;
MyLogger::Garbo MyLogger::_garbo;
MyLogger *MyLogger::getInstace()
{
if(NULL == m_logger){
lock_guard<mutex> mg(myMutex);
if(NULL == m_logger){
m_logger =new MyLogger;//在堆上建立
}
}
return m_logger;
}
MyLogger::MyLogger()
{
log4cplus::initialize();
PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE));
logger = Logger::getRoot();
console = Logger::getInstance(LOG4CPLUS_TEXT("logConsole"));
cout<<"Create Singleton for log4cplus!"<<endl;
}
4. 使用
MyLogger *pMyLogger = NULL;
pMyLogger= MyLogger::getInstace();
LOG4CPLUS_WARN(pMyLogger->logger, LOG4CPLUS_TEXT("Hello, World!"));
5.资源包
这是我编译好的Bin包和相关软件
总结
这是对QT 环境下log4cplus配置的一个说明,以及对log4cplus的一个了解!