log4cplus在VS项目中的使用
2019-03-06 23:17 清晨、午后 阅读(3331) 评论(0) 编辑 收藏 举报log4cplus是C++编写的开源的日志系统,宣称具有线程安全、灵活、以及多粒度控制的特点,通过将日志划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期。你可以选择将日志输出到屏幕、文件、甚至是远程服务器;通过指定策略对日志进行定期备份等等(该段为引用其他文章)。
1.编译log4cplus库
在网上下载log4cplus库(我下载了 log4cplus-1.2.1.zip) ,解压后在 msvc10 目录下由vs的工程 .sln文件,使用VS打开(我用vs2013),
打开和工程包含内容如上,其中log4cplus为动态库工程,log4cplusS为动态库工程,可以根据需要进行编译(我测试了静态库动态库都可以正常使用)。编译完成后如下目录会产生.lib、.dll文件(只有编译动态库时产生.dll)。
头文件在 \log4cplus_1.2.1\include 目录下
接下来就可以在自己的工程中引用该库了(关于引用动态库静态库的方法此处不赘述,《dll、lib编译与加载》中有描述)
2.log4cplus的初级应用
配置文件 logconfig.property
配置文件1
#RootLogger配置格式:log4cplus.rootLogger=[LogLevel],appenderName1,appenderName2,...,如此处LogLevel为DEBUG,appenderName1为 rootLogger
log4cplus.rootLogger=DEBUG,rootLogger
#设置日志追加到文件尾
log4cplus.appender.rootLogger=log4cplus::RollingFileAppender
#log4cplus.appender.rootLogger=log4cplus::ConsoleAppender #设置直接在控制台输出
#设置日志文件大小
log4cplus.appender.rootLogger.MaxFileSize=100MB
#设置生成日志最大个数
log4cplus.appender.rootLogger.MaxBackupIndex=2
#设置输出日志路径
log4cplus.appender.rootLogger.File=rootLogger.log
log4cplus.appender.rootLogger.layout=log4cplus::PatternLayout
#设置日志打印格式
log4cplus.appender.rootLogger.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
#设置日志级别范围
log4cplus.appender.rootLogger.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.rootLogger.filters.1.LogLevelMin=TRACE
log4cplus.appender.rootLogger.filters.1.LogLevelMax=FATAL
log4cplus.appender.rootLogger.filters.1.AcceptOnMatch=true
log4cplus.appender.rootLogger.filters.2=log4cplus::spi::DenyAllFilter
#=====================================================================================
log4cplus.logger.test=DEBUG,test
log4cplus.appender.test=log4cplus::RollingFileAppender
log4cplus.appender.test.File=test.log
log4cplus.appender.test.layout=log4cplus::PatternLayout
log4cplus.appender.test.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.test.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.test.filters.1.LogLevelMin=TRACE
log4cplus.appender.test.filters.1.LogLevelMax=FATAL
log4cplus.appender.test.filters.1.AcceptOnMatch=true
log4cplus.appender.test.filters.2=log4cplus::spi::DenyAllFilter
log4cplus.appender.test.MaxFileSize=100MB
log4cplus.appender.test.MaxBackupIndex=2
#如何防止自定义的logger和root重复写入日志
log4cplus.additivity.test=false
test
#include <log4cplus/logger.h> #include <log4cplus/configurator.h> #include <log4cplus/layout.h> #include <log4cplus/loggingmacros.h> #include <log4cplus/helpers/stringhelper.h> #pragma comment(lib, "..\\..\\log4cplus_1.2.1\\msvc10\\Win32\\bin.Debug\\log4cplusSD.lib") #define MY_LOG_FILE_PATH "E:\\VS_test\\threads\\threads2\\logconfig.property" //配置文件路径 int main(int argc, char *argv[]) { log4cplus::initialize(); //初始化日志 log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE_PATH)); //读取配置文件 log4cplus::Logger logger = log4cplus::Logger::getRoot(); //根记录器始终被实例化并可用。它的名字是"root" LOG4CPLUS_FATAL(logger, "DeleteService failed,errCode=[" << 1 << "]"); //打印级别为FATAL的日志 LOG4CPLUS_DEBUG(logger, " Service is removed"); //打印级别为DEBUG的日志 system("pause"); return 0; }
结果
2019-03-05 23:27:49:841.235|FATAL|19336|e:\vs_test\threads\threads2\main.cpp:18|DeleteService failed,errCode=[1]| 2019-03-05 23:27:49:852.238|DEBUG|19336|e:\vs_test\threads\threads2\main.cpp:19| Service is removed|
3.封装一个简单的类,配置文件用上文中的 配置文件1 (以下忘记在哪里复制的,如有侵权敬请联系删除)
MyLogger.h
#ifndef Logger_H #define Logger_H #include <log4cplus/logger.h> #include <log4cplus/configurator.h> #include <log4cplus/layout.h> #include <log4cplus/loggingmacros.h> #include <log4cplus/helpers/stringhelper.h> #ifdef WIN32 #include <windows.h> #pragma comment(lib, "..\\..\\log4cplus-1.2.1\\msvc10\\Win32\\bin.Debug\\log4cplusSD.lib") unsigned CharToTchar(const char * _char, TCHAR * tchar) { if (nullptr == _char || nullptr == tchar) return 1; int iLength; iLength = MultiByteToWideChar(0, 0, _char, strlen(_char) + 1, NULL, 0); MultiByteToWideChar(0, 0, _char, strlen(_char) + 1, tchar, iLength); return 0; } #else #endif #define MY_LOG_FILE_PATH "..\\src\\logconfig.property" class MyLogger { private: MyLogger() { log4cplus::initialize(); log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE_PATH)); rootLog = log4cplus::Logger::getRoot(); char test[16] = "test"; #ifdef WIN32 TCHAR tTest[16]; unsigned uRet = CharToTchar(test, tTest); if (0 == uRet) logger_1 = log4cplus::Logger::getInstance(tTest); #else logger_1 = log4cplus::Logger::getInstance(test); #endif } ~MyLogger() { if (m_logger) { delete m_logger; } } static MyLogger* m_logger; public: static MyLogger * getInstance() { if (m_logger == NULL) { m_logger = new MyLogger(); } return m_logger; } log4cplus::Logger rootLog; log4cplus::Logger logger_1; }; MyLogger* MyLogger::m_logger = NULL; #endif //Logger_H
main.cpp
#include "MyLogger.h" int main(int argc, char *argv[]) { MyLogger * myLoger = NULL; myLoger = MyLogger::getInstance(); LOG4CPLUS_FATAL(myLoger->rootLog, "DeleteService failed,errCode=[" << 1 << "]"); LOG4CPLUS_DEBUG(myLoger->rootLog, " Service is removed"); LOG4CPLUS_DEBUG(myLoger->logger_1, " Service "); system("pause"); return 0; }