VS2019中C++项目调用第3方日志插件log4cplus方法

	日志log可以记录项目运行时信息以及帮助程序员发现项目中的问题。此文章以VS2019中C++项目,调用第3方日志log4cplus插件,记录完整用法。

1.log4cplus下载与编译

2.log4cplus日志库的二次封装

log4cplus下载与编译

点击此处下载:下载地址
当前最新的是2.1.1版本,进入下载zip文件解压即可。
在这里插入图片描述

解压之后的操作方法见文章:C++第三方日志库log4cplus的安装与使用超详解
得到编译好的文件主要由2类:include文件夹、依赖项文件夹,将这两类文件按上述文章放到工程项目需要位置,并配置好项目属性。注意文章中提到的注意事项。
项目编译时如果出现LNK2019、LNK2001的错误,详见文章:vs报错“错误 LNK2019 无法解析的外部符号”的几种原因及解决方案
另外针对log4cplus补充一点,log4cplus编译的字符集要与项目的字符集一致,即log4cplus编译采用多字节字符集,项目也需要采用多字节字符集,同时,注意:项目-属性-C/C+±预处理器-预处理器定义中不要有UNICODE、_UNICODE,有的话,即使你选了多字节,实际项目为Unicode,这样log4cplus编译与项目便不一致。下图标记的地方请注意检查。
在这里插入图片描述

log4cplus日志库的二次封装

按上述文章测试好仅表明log4cplus下载与编译没问题,但实际项目中并不会这么使用log4cplus日志,因此,需要对文件进行二次封装,简单封装方式如下:Log4CPlus封装类操作和使用
如果一个解决方案中有多个项目,一个项目作为启动项目,其他项目作为生成动态库项目,则我需要再在每个项目下添加封装好的cpp文件,否则编译会报错,针对此问题,将cpp文件与h文件合并到h文件中,即只需要在调用的地方添加#include xxx.h即可,修改如下:

#ifndef LOGUTILS_H
#define LOGUTILS_H

#include <Log4/include/log4cplus/loglevel.h>
#include <Log4/include/log4cplus/ndc.h>
#include <Log4/include/log4cplus/logger.h>
#include <Log4/include/log4cplus/configurator.h>
#include <iomanip>
#include <Log4/include/log4cplus/fileappender.h>
#include <Log4/include/log4cplus/layout.h>
#include <Log4/include/log4cplus/loggingmacros.h>
#include <sstream>
#include <iostream>
#include <Log4/include/log4cplus/log4cplus.h>
#include <Log4/include/log4cplus/consoleappender.h>
#include <Log4/include/log4cplus/log4cplus.h>


using namespace log4cplus;
using namespace log4cplus::helpers;

#include <memory>

#define PATH_SIZE 128 

//配置文件路径及名称
#define LOG4CPLUS_CONFIG_FILE "配置文件路径+文件名+后缀"


/// 记录追踪日志
#define LOG4_TRACE(msg)   \
{ \
	CLogUtils::instance(); \
	LOG4CPLUS_TRACE(CLogUtils::instance()->_logger, msg); \
}
/// 记录调试日志
#define LOG4_DEBUG(msg)   \
{ \
	CLogUtils::instance(); \
	LOG4CPLUS_DEBUG(CLogUtils::instance()->_logger, msg); \
}
/// 记录信息日志
#define LOG4_INFO(msg)    \
{ \
	CLogUtils::instance();\
	LOG4CPLUS_INFO(CLogUtils::instance()->_logger, msg);\
}
/// 记录告警日志
#define LOG4_WARN(msg) \
{ \
	CLogUtils::instance(); \
	LOG4CPLUS_WARN(CLogUtils::instance()->_logger, msg); \
}
/// 记录错误日志
#define LOG4_ERROR(msg)   \
{ \
	CLogUtils::instance(); \
	LOG4CPLUS_ERROR(CLogUtils::instance()->_logger, msg); \
}
/// 记录致命日志
#define LOG4_FATAL(msg)  \
{ \
	CLogUtils::instance(); \
	LOG4CPLUS_FATAL(CLogUtils::instance()->_logger, msg); \
}

using namespace std;


class CLogUtils
{
public:
	inline static CLogUtils* instance()
	{
		static CLogUtils* m_lpCLogUtils = new CLogUtils;
		return m_lpCLogUtils;
	}

	log4cplus::Logger _logger;
private:
	inline CLogUtils()
	{
		log4cplus::initialize();
		log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(LOG4CPLUS_CONFIG_FILE));
		_logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("TestAppender"));
		
	}
	inline ~CLogUtils()
	{
		log4cplus::Logger::shutdown();
	}
};

#endif //LOGUTILS_H

如果输出的消息中需要用占位符进行替换,例如文章C使用宏定义封装printf实现日志功能,示例代码片段如下:

	LOG4_DEBUG("test success :%s","dsajghfksdj");
	LOG4_DEBUG("test success :%d", 1564);
	LOG4_DEBUG("test success :%f", 1.02466);
	LOG4_DEBUG("test success" );

则此时上述封装替换对应部分如下:

#define LOG_TRACE(format,...)	\
{\
	CLogUtils::instance(); \
	LOG4CPLUS_TRACE_FMT(CLogUtils::_logger,format, ##__VA_ARGS__);\
}


#define LOG4_DEBUG(format,...)	\
{\
	CLogUtils::instance(); \
	LOG4CPLUS_DEBUG_FMT(CLogUtils::_logger,format, ##__VA_ARGS__);\
}

#define LOG4_INFO(format,...)\
{\
	CLogUtils::instance(); \
	LOG4CPLUS_INFO_FMT(CLogUtils::_logger,format, ##__VA_ARGS__);\
}

#define LOG4_WARN(format,...) \
{ \
	CLogUtils::instance(); \
	LOG4CPLUS_WARN_FMT(CLogUtils::_logger,  ##__VA_ARGS__); \
}
#define LOG4_ERROR(format,...)   \
{ \
	CLogUtils::instance(); \
	LOG4CPLUS_ERROR_FMT(CLogUtils::_logger,  ##__VA_ARGS__); \
}
/// 记录致命日志
#define LOG4_FATAL(format,...)  \
{ \
	CLogUtils::instance(); \
	LOG4CPLUS_FATAL_FMT(CLogUtils::_logger,  ##__VA_ARGS__); \
}

在 log4cplus 中,占位符可以是整数型、浮点型、字符串型等,但它们都必须在格式字符串中使用正确的占位符类型来匹配。

例如,%d 是 int 的占位符,%f 是 double 的占位符,%s 是 const char* 的占位符。如果你占位符用的是%d,而实际替换的参数为字符串,则替换信息会乱码。
实际工程项目中,输出的Log信息出现需要替换的信息,即需要添加占位符的情况较多,因此,推荐使用占位符的封装方式

配置文件config.txt是需要自己创建配置的,后缀名也可以改成其他的,上述代码LOG4CPLUS_CONFIG_FILE 定义的便是路径+配置文件,例如:#define LOG4CPLUS_CONFIG_FILE "D:\\Program Files\\config.txt",使用示例如下:

log4cplus.logger.TestAppender = ALL, Test

#FileAppender对象
log4cplus.appender.Test = log4cplus::TimeBasedRollingFileAppender

# Appender 类属性
log4cplus.appender.Test.Threshold = ALL

# FileAppender类属性

# 输出文件位置
log4cplus.appender.Test.FilenamePattern = D:/LOg/%d{yyyy-MM-dd.log}
log4cplus.appender.Test.MaxHistory=365
log4cplus.appender.Test.Schedule=DAILY
log4cplus.appender.Test.RollOnClose=false
#缓冲刷新标志,如果为true表示每向文件写一条记录就刷新一次缓存,避免文件写的过程中出现了错误
log4cplus.appender.Test.ImmediateFlush = true
#是否接着之前文件后面写
log4cplus.appender.Test.Append = true
#是否创建目录
log4cplus.appender.Test.CreateDirs = true
#最大文件大小
log4cplus.appender.Test.MaxFileSize = 1000MB 
#最大文件个数
log4cplus.appender.Test.MaxBackupIndex = 10
# layout类属性
log4cplus.appender.Test.layout = log4cplus::PatternLayout
log4cplus.appender.Test.layout.ConversionPattern = [%D{%Y-%m-%d %H:%M:%S}] %-5p %m %n

上述只是根据实际工程需要将log存储到本地,存储文件名:年-月-日.log,即每天生成一份,每一份文件再创建之后,接着写文件中的内容,并不会被覆盖。
至于文件中的参数含义,详见文章:C++第三方日志库log4cplus基本语法介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值