Как получить записи журнала, используя log4cplus? - PullRequest
2 голосов
/ 26 августа 2011

log4cplus является мощным, но я не знаю, как получить записи журнала с ним?Есть ли какие-то особенности?Какие-нибудь API или подобные вещи, предоставляемые log4cplus?Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 26 августа 2011

Ну, я не уверен, что именно вы хотите. В документации 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) и т. Д. Таким образом, вы просматриваете старые журналы, просматривая ваши файлы. Вы также можете использовать системные журналы или написать свой собственный appender

Программно, один способ использовать DailyRollingFileAppender. Затем вы можете открыть файл, соответствующий определенной дате, и получить свои журналы, прочитав содержимое файла.

Другой способ - написать приложение для СУБД log4cplus и использовать библиотеку SQL для их чтения. Я не знаю ни одного стандартного API для возврата журнала в log4cplus.

0 голосов
/ 22 марта 2012

Да, есть способ сделать это, но не из коробки. Реализуйте абстрактный класс 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...  
}
...