如何使用log4cplus检索日志条目?

时间:2011-08-26 07:12:15

标签: c++ visual-c++ log4cplus

log4cplus功能强大,但我不知道如何用它检索日志条目?有什么特色吗?任何API或log4cplus提供的东西?提前谢谢。

2 个答案:

答案 0 :(得分:6)

好吧,我不确定你到底想要什么。 log4cplus文档为您提供了使用它的示例。例如:

BasicConfigurator config;
config.configure();

Logger logger = Logger::getInstance("mylogger");
LOG4CPLUS_WARN(logger, "Hello, World!");

这样您就可以登录控制台了。如果要配置log4cplus以记录文件中的内容,可以使用如下文件:

### logs.properties

# root logger

log4cplus.rootLogger=INFO, Main

# specific logger

log4cplus.logger.myloggerINFO, Main
log4cplus.additivity.mylogger=false

# appender that automatically rolls files

log4cplus.appender.Main=log4cplus::DailyRollingFileAppender
log4cplus.appender.Main.Schedule=DAILY
log4cplus.appender.Main.File=logs/mylogs.log
log4cplus.appender.Main.Append=true
log4cplus.appender.Main.MaxBackupIndex=100
log4cplus.appender.Main.MaxFileSize=100KB
log4cplus.appender.Main.layout=log4cplus::PatternLayout
log4cplus.appender.Main.layout.ConversionPattern=%D | %-5.5p | %-20.20c | %m|%n

在你的C ++程序中:

PropertyConfigurator config("logs.properties");
config.configure();

使用提供的宏记录内容:

logger = Logger::getInstance("mylogger");

LOG4CPLUS_DEBUG(logger, message);
LOG4CPLUS_WARN(logger, message);
LOG4CPLUS_INFO(logger, message);
LOG4CPLUS_ERROR(logger, message);

请参阅log4cplus examples开始。如果您需要更多信息,请告诉我。

我的2美分

编辑:

根据您的appender存储测井记录。您可以拥有一个标准文件(FileAppender)或一组文件(RollingFileAppender)等。这样您就可以通过查看文件来查看旧日志。您也可以使用系统日志,或编写自己的appender

以编程方式,使用DailyRollingFileAppender的一种方法。然后,您可以打开与特定日期对应的文件,并通过阅读文件内容来获取日志。

另一种方法是编写log4cplus DBMS appender并使用SQL lib来读取它们。我知道没有标准的API来重新登录log4cplus。

答案 1 :(得分:0)

是的,有办法做到这一点,但不是开箱即用的。实现抽象类Appender并通过实现append虚函数来执行您需要的任何操作,还提供了所需功能的接口:

#ifndef STRINGAPPENDER_H
#define STRINGAPPENDER_H

#include <string>
#include <log4cplus/fileappender.h>
#include <log4cplus/config.hxx>
#include <log4cplus/appender.h>
#include <log4cplus/fstreams.h>
#include <log4cplus/helpers/property.h>
#include <log4cplus/helpers/timehelper.h>

/* I derived from FileAppender for i needed access to the stream underneath, 
*  feel free to derive from Appender as well
*/
class StringAppender : public log4cplus::FileAppender {
    public:
        log4cplus::tofstream    & out;
        StringAppender(std::string & name) : log4cplus::FileAppender (name), 
                out(log4cplus::FileAppender::out){}
        virtual void append (const log4cplus::spi::InternalLoggingEvent &event)
        {
            //implement your logic here. You could store events in std::vector
            log4cplus::FileAppender::append(event);
        }
        std::string retrieve_last_message(){/*to implement*/}
        virtual void close (){}
        virtual     ~StringAppender () {}

};
#endif  /* STRINGAPPENDER_H */

在您的客户代码中:

#include <log4cplus/configurator.h>
#include <log4cplus/logger.h>
#include <StringAppender.h>
int main(){
  std::string filename = "test.log";
  log4cplus::SharedAppenderPtr append_1(new StringAppender(filename));
  log4cplus::Logger log = log4cplus::Logger::getRoot();
  log.addAppender(append_1);

  //reason i wanted the stream to be publicly available
  //i needed it in my library test boost::test
  unit_test_log.set_stream(((StringAppender &)*append_1.get()).out);
  //some testing folows...  
}