2011-08-26 93 views
2

log4cplus功能強大,但我不知道如何檢索它的日誌條目?有沒有任何功能?任何API或類似log4cplus提供的東西?提前致謝。如何使用log4cplus檢索日誌條目?

+2

什麼日誌的appender做你使用(你如何存儲你的日誌)? – tauran

+0

關於你的日誌appender的另一個問題。 –

回答

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。

+0

謝謝。但我想要的是如何檢索舊的日誌條目。讓我提出更具體的問題,我想知道上個月會發生什麼,我該怎麼做?任何可用功能? – hittlle

+0

@hittle:看到我編輯的答案。在log4cplus AFAIK中沒有API。使用DailyRollingFileAppender並閱讀您需要的文件。 – neuro

+0

@downvoter:解釋你的downvote,這樣的答案可以做得更好... – neuro

0

是的,有辦法做到這一點,但不是開箱即用。實現抽象類追加程序,做任何你需要的還有剛剛通過實施追加虛函數,也爲你所需要的功能提供了一個接口:

#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 */ 
在cliente代碼

#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... 
}