【问题标题】:How do I log several variables with log4cpp at once?如何使用 log4cpp 一次记录多个变量?
【发布时间】:2012-03-10 10:45:56
【问题描述】:

如何使用 log4cpp 记录多个字符串?

例如如果我想将所有 argv 记录到 main:

#include <iostream>
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/PatternLayout.hh>

using namespace std;

int main(int argc, char* argv[]) {
    log4cpp::Appender *appender = new log4cpp::FileAppender("FileAppender","mylog");
    log4cpp::PatternLayout *layout = new log4cpp::PatternLayout();
    layout->setConversionPattern("%d: %p - %m %n");
    log4cpp::Category& category = log4cpp::Category::getInstance("Category");
    appender->setLayout(layout);
    category.setAppender(appender);
    category.setPriority(log4cpp::Priority::INFO); 

    category.info("program started"); // this works fine, I see it in the logfile

    for(int i=0; i<argc; ++i) {
        // next line does not compile:
        category.info("argv["<<i<<"] = '"<<argv[i]<<"'");
    }

    return 0;
}   

线

category.info("argv["<<i<<"] = '"<<argv[i]<<"'");

不编译。显然,记录器不能作为 ostream 工作。什么是 log4cpp 方式来记录这样的东西,最好是一次?

【问题讨论】:

    标签: c++ logging log4cpp


    【解决方案1】:

    你有两个选择:

    • 使用printf-style formatting:

      for (int i = 0; i < argc; ++i)
      {   
          category.info("argv[%d] = '%s'", i, argv[i]);
      }  
      
    • 使用infoStream():

      for (int i = 0; i < argc; ++i)
      {
          category.infoStream() << "argv[" << i << "] = '" << argv[i] << "'";
      }  
      

    我会选择后者。

    【讨论】:

    • 即:预先格式化一个字符串(使用 printf 或 ostringstream),然后记录该字符串?
    • @JörgBeyer:不需要预先格式化。请查看我的更新答案。
    • 酷,category.infoStream() 是我想要的,但没有找到。
    • 如果不应该记录 Info 消息,infoStream() 如何执行?它会构建消息并在之后删除它吗?我可以想象在这种情况下格式版本更快。
    • @RüdigerStevens:抱歉,我没有查看实现,但如果您遇到性能问题,我建议进行分析。
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多