log4cplus は強力ですが、ログ エントリを取得する方法がわかりません。特徴はありますか?log4cplus が提供する API などはありますか? 前もって感謝します。
2 に答える
ええと、あなたが正確に何を望んでいるのかわかりません。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 を使用する方法の 1 つです。次に、特定の日付に対応するファイルを開き、ファイルの内容を読み取ってログを取得できます。
もう 1 つの方法は、log4cplus DBMS アペンダーを作成し、SQL ライブラリを使用してそれらを読み取ることです。log4cplus でログを取得するための標準 API がないことを私は知っています。
はい、それを行う方法はありますが、すぐに使用できるわけではありません。抽象クラス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...
}