如何在Windows上使用log4cxx RollingFileAppender

问题描述 投票:0回答:1

我正在尝试使用log4cxx在Windows C ++控制台应用程序上通过RollingFileAppender记录我的应用程序。每当大小达到1MB时,我想创建一个新的日志文件。此外,当达到所需大小时,应自动压缩文件。创建的最大文件数必须为10。之后,较旧的文件应被覆盖。

我正在使用:

  • apache-log4cxx-0.10.0
  • apr-util-1.6.1
  • apr-1.7.0

这是我的代码:

log4cxx::rolling::RollingFileAppender* fileAppender1 = new log4cxx::rolling::RollingFileAppender();
fileAppender1->setLayout(log4cxx::LayoutPtr(new log4cxx::PatternLayout(L"[%d{ISO8601}{GMT}] %-4r [%t] %c | %-5p | %m%n")));
fileAppender1->setAppend(true);

log4cxx::helpers::Pool p;
fileAppender1->activateOptions(p);

log4cxx::rolling::FixedWindowRollingPolicy* rollingPolicy = new log4cxx::rolling::FixedWindowRollingPolicy();
rollingPolicy->setMinIndex(1);
rollingPolicy->setMaxIndex(10);
rollingPolicy->setFileNamePattern(L"j_log_%i.log");

log4cxx::rolling::SizeBasedTriggeringPolicy* triggerPolicy = new log4cxx::rolling::SizeBasedTriggeringPolicy();
triggerPolicy->setMaxFileSize(1024*1024);

fileAppender1->setRollingPolicy(rollingPolicy);
fileAppender1->setTriggeringPolicy(triggerPolicy);

LoggerPtr logger(Logger::getLogger("LogConsole1"));
logger->addAppender(fileAppender1);
logger->setLevel(log4cxx::Level::getTrace());

for (int i = 0; i < 10000; i++)
{
    LOG4CXX_INFO(logger, "Created FileAppender appender");
    LOG4CXX_INFO(logger, "LOGGER1");
}

获得的结果是一个名为“ .1”(没有任何扩展名)的文件,其中包含这样的内容(似乎可以):

[[2019-09-13 07:44:58,619] 21063 [0x00003e14] LogConsole1 |信息|已创建FileAppender附加程序

[[2019-09-13 07:44:58,622] 21066 [0x00003e14] LogConsole1 |信息| LOGGER1

问题是:

  1. 文件名不正确
  2. 文件不翻转(如果文件大小超过1MB,则仅创建一个文件)
  3. 在应用程序控制台上,我看到许多异常,例如:“ log4cxx:过渡期间的异常”

我在做什么错?

c++ log4cxx
1个回答
2
投票

我不完全了解您的文件模式,但是文档在其模式中未使用“ L”字符。

在我的项目中是使用

rollingPolicy->setFileNamePattern("file.%i.log");

有时带有一个效果很好的字符串变量。

我在您的代码中找不到该配置。据我所知,您必须使用BasicConfiguration对象设置附加程序。

log4cxx::BasicConfigurator::configure(log4cxx::AppenderPtr(yourAppenderPointer));

这会将您的附加程序附加到根记录器,并适用于我的情况。这是我初始化的完整代码段。

void someclass::initLogger(std::string fileName) {

std::string::size_type found = fileName.find(".log");
std::string strippedFileName;

if (found != std::string::npos)
{
   strippedFileName = fileName.substr(0, found);
}
else
{
    strippedFileName = fileName;
    fileName = fileName + ".log";
}

//initializes for rolling file appenders
rollingFileAppender = new log4cxx::rolling::RollingFileAppender();

rollingPolicy = new log4cxx::rolling::FixedWindowRollingPolicy();
rollingPolicy->setMinIndex(1);
rollingPolicy->setMaxIndex(3);

log4cxx::LogString fileNamePattern = strippedFileName + ".%i.log";
rollingPolicy->setFileNamePattern(fileNamePattern);

trigger = new log4cxx::rolling::SizeBasedTriggeringPolicy();
trigger->setMaxFileSize(1024);

rollingFileAppender->setRollingPolicy(rollingPolicy);
rollingFileAppender->setTriggeringPolicy(trigger);

rollingFileAppender->setLayout(log4cxx::LayoutPtr(new log4cxx::PatternLayout(LOGFILE_LAYOUT_PATTERN)));
rollingFileAppender->setFile(fileName);
rollingFileAppender->setAppend(true);

//initializes for a console appender
consoleAppender = new log4cxx::ConsoleAppender(log4cxx::LayoutPtr(new log4cxx::PatternLayout(LOGFILE_LAYOUT_PATTERN)));

log4cxx::helpers::Pool p;
rollingFileAppender->activateOptions(p);

log4cxx::BasicConfigurator::configure(log4cxx::AppenderPtr(consoleAppender));
log4cxx::BasicConfigurator::configure(log4cxx::AppenderPtr(rollingFileAppender));

}

此代码通过滚动文件附加程序打印到指定的文件,并使用consoleAppender打印到终端

此文件将使用fileName.log打印一个文件,并使用fileName.i.log打印多达三个文件

© www.soinside.com 2019 - 2024. All rights reserved.