我的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消息,因此它似乎将两条消息连接成一条消息。这是正常的行为吗?是否有解决方案强制每个消息独立生成?
答案 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/。