基于log4cplus库封装日志管理
这算是我正式上班后的第一篇CSDN文章,这也是一个上级安排的工作,也参考了很多的文章,会在本篇文章最后列出几篇文章。
log4cplus下载和编译
下载地址
我下载的是最新的logcplus _2.0.7
link
作者的GitHub地址
link
编译运行
下载过后自行解压就行,我用的是CMake的GUI做批量处理,解压好的文件下有一个cmakelist.txt的文件这个应该是32位和64都可以。
成功后直接点击打开工程就好了,或者找到你build的路径,在Vs下进行生成即可,下图那么多的项目我们只需要对log4cplus的项目生成即可,其余demo有需要的可以参考。最后生成的生成我们需要的静态库和动态库。
封装log4cplus
头文件
#pragma once
#define LOG_I log::Initializers().getInstance
#define logi log::Initializers().Info
enum LogType
{
PLUGIN = 0,
LOG = 1
};
class log
{
public:
log();
~log();
static inline Wukonglog& Initializers()
{
static Wukonglog _instance;
return _instance;
}
void getInstance();
void Info(int,const char* szFormat,...);
};
cpp文件
#include "log.h"
#include<Windows.h>
using namespace log4cplus;
#define _ARGS_ \
log4cplus::Logger m_LogPlugin = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("plugin"));\
log4cplus::Logger m_LogAll = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("logall"));\
char buff[1024]; \
memset(buff, 0, sizeof(buff)); \
va_list args; \
va_start(args, Format); \
vsprintf_s(buff, Format, args);\
va_end(args); \
log::log() {}
log::~log() {
log4cplus::Logger m_LogPlugin = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("plugin"));
log4cplus::Logger m_LogAll = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("logall"));
LOG4CPLUS_INFO(m_LogAll, "LogAll system Finish...");
LOG4CPLUS_INFO(m_LogPlugin, "LogPlugin system Finish...");
}
void log::getInstance() {
//log4cplus::initialize();
log4cplus::Initializer();//初始化
log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("logconfigure.ini"));//导入配置文件
log4cplus::Logger m_LogPlugin = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("plugin"));
log4cplus::Logger m_LogAll = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("logall"));
LOG4CPLUS_INFO(m_LogAll, "LogAll system start.");
LOG4CPLUS_INFO(m_LogPlugin, "LogPlugin system start.");
}
void log::Info(int logtype, const char* Format, ...) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
_ARGS_
if (logtype)
LOG4CPLUS_INFO(m_LogAll, buff);
else
LOG4CPLUS_INFO(m_LogPlugin, buff);
}
log4cplus配置(与代码部分匹配)
在你的文本文件中写入如下面的文本,在初始化log4cplu后调用配置函数将配置导入log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("logconfigure.ini"));
log4cplus.logger.logall=ALL,loglog,logConsole
#logConsole
log4cplus.appender.logConsole=log4cplus::ConsoleAppender
##控制台过滤输出范围
log4cplus.appender.logConsole.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.logConsole.filters.1.LogLevelMin=INFO
log4cplus.appender.logConsole.filters.1.LogLevelMax=ERROR
#格式
log4cplus.appender.logConsole.layout=log4cplus::PatternLayout
log4cplus.appender.logConsole.layout.ConversionPattern=[%D{%Y-%m-%d %H:%M:%S:%q}][%-4p] %-30m[%c]%n
#loglog
log4cplus.appender.loglog=log4cplus::TimeBasedRollingFileAppender
log4cplus.appender.loglog.FilenamePattern=wukonglog\wukonglog%d{MM-dd}.log
log4cplus.appender.loglog.Schedule=DAILY
log4cplus.appender.loglog.MaxHistory=14
log4cplus.appender.loglog.Append=true
log4cplus.appender.loglog.RollOnClose=false
log4cplus.appender.loglog.CreateDirs=true
log4cplus.appender.loglog.MaxFileSize=10MB
log4cplus.appender.loglog.MaxBackupIndex=5
log4cplus.appender.loglog.layout=log4cplus::PatternLayout
log4cplus.appender.loglog.layout.ConversionPattern=[%D{%Y-%m-%d %H:%M:%S:%q}][%-4p] %-30m%n
总结
我想要一个能输出两个不同的日志,一个负责主程序的问题,一个负责通讯程序的日志,但是每个日志在程序运行时都能输出到控制台上,这样可以快速定位问题。这几句话特别重要,这样在pluin中输出的文本日志就不会重复输出到控制台显示的日志中去了。
log4cplus.logger.logall=ALL,loglog,logConsole
log4cplus.logger.plugin=ALL,logplugin,logConsole
##不向上层传输日志
log4cplus.additivity.plugin=false
因为之前没有封装过单例类的问题,都是生成动态类的,所以在此花了不少时间。
参考文章:
https://blog.csdn.net/yizhangbiao/article/details/81541582 link
https://blog.csdn.net/kakiebu/article/details/105501833 link