如何防止日志消息中的log4cplus日志消息?

时间:2012-12-26 04:01:44

标签: log4cplus

我的C ++程序中有以下(简化)代码:

std::string DataRequest::toString() const {
LOG4CPLUS_TRACE(logger,
        LOG4CPLUS_TEXT("symbol=" << m_contract.symbol));

std::ostringstream oss;
oss << "id=" << reqId
    << ",symbol=" << m_contract.symbol;
return oss.str();
}

int DataService::requestData(
    DataRequest request) {

LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("requestData: " << request.toString()));
}

此代码然后生成日志消息:

TRACE symbol=AAA
INFO  symbol=AAArequestData: id=1,symbol=AAA

然而我期待

TRACE symbol=AAA
INFO  requestData: id=1,symbol=AAA

由于在log4cplus消息中生成了log4cplus消息,因此它似乎将两条消息连接成一条消息。这是正常的行为吗?是否有解决方案强制每个消息独立生成?

1 个答案:

答案 0 :(得分:2)

这是错误的代码

LOG4CPLUS_TRACE(logger,
        LOG4CPLUS_TEXT("symbol=" << m_contract.symbol));

应该阅读

LOG4CPLUS_TRACE(logger,
        LOG4CPLUS_TEXT("symbol=") << m_contract.symbol);

代替。

对于连接的消息,您使用的输出布局是什么?如果是模式布局,那么您应该在格式字符串的最后添加%n格式化程序。

修改

  

不幸的是我仍然遇到了日志的问题   消息正在连接。我认为这与事实有关   日志消息本身的调用request.toString()也有一个   调用日志消息,但由于某种原因,这两条消息正在发生   即使在代码修复后也一起打印。 :(

啊,我最初误解了这个问题。因此,您在第一次准备时正在记录第二个事件。问题是格式化是对线程本地ostringstream进行的。线程本地ostringstream用作性能增强。 (不必在每条记录的消息上构造和销毁ostringstream。)

要立即解决,您有两种选择。首先,停止此嵌套日志记录。其次,你“修复”LOG4CPLUS_*()宏不使用线程本地ostringstream或者你自己编写日志宏。要么不应该那么难。

从长远来看,我可以在日志记录宏中添加一个特殊情况,使每次使用新的ostringstream以允许您的用例。

编辑2:

我填写了一份错误报告并附上了一个实现解决方案的补丁。请参阅https://sourceforge.net/p/log4cplus/bugs/153/