首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Windows上使用log4cxx RollingFileAppender

如何在Windows上使用log4cxx RollingFileAppender
EN

Stack Overflow用户
提问于 2019-09-13 08:10:44
回答 1查看 777关注 0票数 0

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

我在用:

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

这是我的密码:

代码语言:javascript
运行
复制
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 x00003e14创建FileAppender附录

2019年-09-13 07:44:58,622 21066 0x00003e14 LogConsole1 INFO / LOGGER1

问题是:

  1. 该文件没有正确的名称。
  2. 该文件不会翻滚(如果文件的大小超过1MB,也只创建一个文件)
  3. 在应用程序控制台上,我看到许多异常,如:"log4cxx:翻转期间的异常“

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2020-04-08 14:17:56

我不完全理解您的文件模式,但文档在它们的模式中不使用"L“字符。

在我的项目中是使用的

代码语言:javascript
运行
复制
rollingPolicy->setFileNamePattern("file.%i.log");

有时使用字符串变量,这是很好的。

我找不到您的代码片段中的配置。据我所知,您必须使用BasicConfiguration对象来设置附录。

代码语言:javascript
运行
复制
log4cxx::BasicConfigurator::configure(log4cxx::AppenderPtr(yourAppenderPointer));

这将把您的附录附加到根记录器中,并适用于我的情况。下面是我初始化的完整代码片段。

代码语言:javascript
运行
复制
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打印最多三个文件

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57919687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档