log4cplus 很强大,但是我不知道如何用它来检索日志条目?有什么特点吗?log4cplus 提供的任何 API 或类似的东西?提前致谢。
问问题
5241 次
2 回答
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 示例以开始。如果您需要更多信息,请告诉我。
我的 2 美分
编辑:
井日志的存储取决于您的附加程序。您可以拥有一个标准文件 (FileAppender),或一组文件 (RollingFileAppender) 等。这样,您可以通过查看文件来查看旧日志。您还可以使用系统日志,或编写自己的附加程序
以编程方式,它使用 DailyRollingFileAppender 的一种方式。然后您可以打开与特定日期相对应的文件,并通过读取文件内容来获取您的日志。
另一种方法是编写 log4cplus DBMS appender 并使用 SQL lib 来读取它们。我知道没有标准的 API 可以重新登录 log4cplus。
于 2011-08-26T07:21:46.870 回答
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...
}
于 2012-03-22T13:18:30.227 回答