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

C++ 如何使用log4cplus检索日志条目?,c++,visual-c++,log4cplus,C++,Visual C++,Log4cplus,log4cplus功能强大,但我不知道如何使用它检索日志条目?有什么特色吗?log4cplus提供的API或类似的东西吗?提前谢谢。嗯,我不确定你到底想要什么。log4cplus文档提供了使用它的示例。例如: BasicConfigurator config; config.configure(); Logger logger = Logger::getInstance("mylogger"); LOG4CPLUS_WARN(logger, "Hello, World!"); 这样,您将在控

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

嗯,我不确定你到底想要什么。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);
开始吧。如果你需要更多信息,请告诉我

我的2美分

编辑:

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

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


另一种方法是编写一个log4cplus DBMS追加器,并使用SQL库读取它们。我知道没有标准的API可以在log4cplus中恢复日志。

是的,有一种方法可以做到这一点,但不是现成的。实现抽象类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 */
\ifndef STRINGAPPENDER\u H
#定义梯边梁
#包括
#包括
#包括
#包括
#包括
#包括
#包括
/*我从FileAppender派生,因为我需要访问下面的流,
*也可以自由地从Appender派生
*/
类StringAppender:public log4cplus::FileAppender{
公众:
log4cplus::tofstream&out;
StringAppender(std::string&name):log4cplus::FileAppender(name),
out(log4cplus::FileAppender::out){}
虚拟void追加(const log4cplus::spi::InternalLoggingEvent&event)
{
//在这里实现您的逻辑。您可以将事件存储在std::vector中
log4cplus::FileAppender::append(事件);
}
std::string retrieve_last_message(){/*以实现*/}
虚拟空关闭(){}
虚拟~StringAppender(){}
};
#endif/*STRINGAPPENDER\u 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...  
}
#包括
#包括
#包括
int main(){
std::string filename=“test.log”;
log4cplus::SharedAppenderPtr append_1(新的StringAppender(文件名));
log4cplus::Logger log=log4cplus::Logger::getRoot();
log.addAppender(append_1);
//我想让流公开的原因
//我的库测试boost::test中需要它
unit_test_log.set_stream(((StringAppender&)*append_1.get()).out);
//一些测试流程。。。
}

谢谢。但是我想要的是如何检索旧的日志条目。让我把我的问题说得更具体些,我想知道上个月发生了什么,我该怎么做?有可用的功能吗?@hittle:请参阅我编辑的答案。log4cplus AFAIK中没有API。使用DailRollingFileAppender并阅读您需要的文件。我同意答案是好的。我看不到任何东西值得一个
-1
@wilx:谢谢:)顺便问一下,你是log4cplus的维护者吗?你使用什么日志附加器(如何存储日志)?关于日志附加器的另一个问题。