编译log4cplus的时候没遇到任何问题,在使用的时候遇到了2个问题
LOG4CPLUS_WARN
LOG4CPLUS_DEBUG
未定义
解决方法:添加头文件
#include <log4cplus/loggingmacros.h>
error LNK2019: 无法解析的外部符号 "const log4cplus::Appender::`vbtable'" (??_8Appender@log4cplus@@7B@),该符号在函数 "public: void __thiscall log4cplus::Appender::__autoclassinit(unsigned int)" (?__autoclassinit@Appender@log4cplus@@QAEXI@Z) 中被引用
解决方法:添加于处理器定义
LOG4CPLUS_BUILD_DLL
//vLOG.H
#pragma once
#ifndef VLOG_H
#define VLOG_H
#include <log4cplus/logger.h>
#include <log4cplus/layout.h>
#include <log4cplus/loglevel.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/helpers/loglog.h>
using namespace log4cplus;
using namespace helpers;
#ifndef _DEBUG
#pragma comment(lib,"log4cplusU.lib")
#else
#pragma comment(lib,"log4cplusUD.lib")
#endif
/**
* 使用log4cplus
* @param logfile 记录的文件路径,如“main.log”
* @param format 格式化前缀,默认%d [%l] %-5p : %m %n
* @param bebug 是否打印bebug信息,默认true
* @param lv 设置日记级别
* @return
*/
void InitLog4cplus(
const wchar_t* logfile,
const bool console = true,
const bool bebug = true,
LogLevel lv = DEBUG_LOG_LEVEL,
const wchar_t* format = L"%D{%Y-%m-%d %H:%M:%S} - %m [%l]%n"
);
/**
* 获得根日志
* @return
*/
Logger GetRootLogger(void);
/**
* 获得子日志
* @param child 子日志名,如,sub;sub.sub1
* @return
*/
Logger GetSubLogger(const wchar_t* sub);
/**
* 关闭日志系统
*/
void ShutdownLogger(void);
#endif /* VLOG_H */
//vLog.cpp
/************************************************************************/
/* 使用规则: */
/* 需要log4cplus动态/静态链接库及头文件 */
/* log4cplus.lib + log4cplus.dll 为动态链接库。log4cplusS.lib为静态链接库 */
/************************************************************************/
#include "vLog.h"
void InitLog4cplus(const wchar_t* logfile, const bool console, const bool bebug,
LogLevel lv, const wchar_t* format)
/*
NOT_SET_LOG_LEVEL ( -1) :接受缺省的LogLevel,如果有父logger则继承它的
LogLevelALL_LOG_LEVEL ( 0) :开放所有log信息输出
TRACE_LOG_LEVEL ( 0) :开放trace信息输出(即ALL_LOG_LEVEL)
DEBUG_LOG_LEVEL (10000) :开放debug信息输出
INFO_LOG_LEVEL (20000) :开放info信息输出
WARN_LOG_LEVEL (30000) :开放warning信息输出
ERROR_LOG_LEVEL (40000) :开放error信息输出
FATAL_LOG_LEVEL (50000) :开放fatal信息输出
OFF_LOG_LEVEL (60000) :关闭所有log信息输出
*/ {
// 0.日志系统配置:设置显示debug信息
LogLog::getLogLog()->setInternalDebugging(bebug);
// 创建屏幕输出Appender,不采用stderror流,不采用立刻写入模式
SharedAppenderPtr pappender1(new RollingFileAppender(logfile, 1024 * 1024 * 200, 50, false));
// 生成的日志文件名称,文件最大值(最小1 * 200 M),扩展50文件个数,不采用立刻写入模式
// 2.实例化一个layout对象
// 2.1创建layout布局格式
std::auto_ptr<Layout> playout1(new PatternLayout(format));
// 3.将layout对象绑定(attach)到appender对象
// pappender.setLayout(std::auto_ptr<Layout> layout);
pappender1->setLayout(playout1);
// 4.Logger :记录器,保存并跟踪对象日志信息变更的实体,当你需要对一个对象进行记录时,就需要生成一个logger。
Logger rootLogger = Logger::getRoot();
// 5.将appender对象绑定(attach)到logger对象,如省略此步骤,标准输出(屏幕)appender对象会绑定到logger
rootLogger.addAppender(pappender1);
if (console) {
// 1.Appenders :挂接器,与布局器紧密配合,将特定格式的消息输出到所挂接的设备终端 (如屏幕,文件等等)。
SharedAppenderPtr pappender2(new ConsoleAppender(false, false));
std::auto_ptr<Layout> playout2(new PatternLayout(format));
pappender2->setLayout(playout2);
rootLogger.addAppender(pappender2);
}
// 6.设置logger的优先级,如省略此步骤,各种有限级的消息都将被记录
rootLogger.setLogLevel(lv);
}
Logger GetRootLogger(void) {
return Logger::getRoot();
}
Logger GetSubLogger(const wchar_t* sub) {
return Logger::getInstance(sub);
}
void ShutdownLogger(void) {
Logger::getRoot().shutdown();
}
//main.cpp
// ConsoleApplication13.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "vLog.h"
int main ( _In_ int _Argc, _In_reads_ ( _Argc ) _Pre_z_ char ** _Argv, _In_z_ char ** _Env )
{
//加入log4cplus
//初始化log4cplus
InitLog4cplus ( L"main.log" );
//日志对象,测试1
log4cplus::Logger test1 = GetSubLogger ( L"TEST1" );
//日志对象,测试1 第一次测试
log4cplus::Logger test1_01 = GetSubLogger ( L"TEST1.01" );
// 类型日志记录
LOG4CPLUS_DEBUG ( test1_01, "you can log like this :" << "hello" << 100 << '!' );
//关闭日志
LOG4CPLUS_WARN(test1_01,"hello,Word");
ShutdownLogger();
}