ログローテーションを実現するための Poco::FileChannel を紹介します。
ログをとる場合、ローテーションを行って幾つかのファイルを履歴として残したりしますが、
Poco::FileChannel を Poco::Logger と合わせて使うことにより、ログローテーションが簡単に
実現できます。
LogRotationTest.cpp
・Poco::SplitterChannel を使って、ログ出力を Poco::ConsoleChannel と Poco::FileChannel の両者に
分岐。
・Poco::FileChannel の setProperty で、ローテーションのプロパティを指定。
・Poco::Util::MapConfiguration で設定を渡し、デフォルト値引数付きの getString を呼ぶことで、指定の
無いプロパティはデフォルトに設定。
・ここでは、
160バイトを超えたらローテーション
圧縮無し
だけ指定し、それ以外はデフォルトテーブルの設定。
#include <Poco/Logger.h> #include <Poco/PatternFormatter.h> #include <Poco/FormattingChannel.h> #include <Poco/ConsoleChannel.h> #include <Poco/SplitterChannel.h> #include <Poco/FileChannel.h> #include <Poco/AutoPtr.h> #include <Poco/Format.h> #include <Poco/Util/MapConfiguration.h> #include <Poco/LocalDateTime.h> #include <Poco/DateTimeFormatter.h> #include <Poco/Timezone.h> #include <Poco/Thread.h> #include <string> #include "ScopedLogMessage.h" const char* const kKeyDefaultValue[][2] = { {"path", "rotated.log"} , {"rotation", "1024"} , {"archive", "timestamp"} , {"times", "local"} , {"compress", "true"} , {"purgeAge", "10 days"} , {"purgeCount", "10"} }; const std::size_t kNumKeyDefaultValue = sizeof(kKeyDefaultValue)/sizeof(kKeyDefaultValue[0]); void PrepareConsoleLoggerWithRotatedLogFile( const std::string& name , const Poco::Util::MapConfiguration* config , int level=Poco::Message::PRIO_INFORMATION) { Poco::AutoPtr<Poco::SplitterChannel> splitterChannel(new Poco::SplitterChannel); Poco::AutoPtr<Poco::Channel> consoleChannel(new Poco::ConsoleChannel); Poco::AutoPtr<Poco::FileChannel> rotatedFileChannel(new Poco::FileChannel); for(std::size_t i=0; i<kNumKeyDefaultValue; ++i) { rotatedFileChannel->setProperty(kKeyDefaultValue[i][0] , config->getString(kKeyDefaultValue[i][0], kKeyDefaultValue[i][1])); } splitterChannel->addChannel(consoleChannel); splitterChannel->addChannel(rotatedFileChannel); Poco::AutoPtr<Poco::Formatter> formatter(new Poco::PatternFormatter("%w %b %e %H:%M:%S.%i %Y: %t")); formatter->setProperty("times", "local"); Poco::AutoPtr<Poco::Channel> formattingChannel(new Poco::FormattingChannel(formatter, splitterChannel)); Poco::Logger::create(name, formattingChannel, level); } int main(int /*argc*/, char** /*argv*/) { Poco::AutoPtr<Poco::Util::MapConfiguration> config(new Poco::Util::MapConfiguration); config->setString("rotation", "160"); config->setString("compress", "false"); PrepareConsoleLoggerWithRotatedLogFile( Poco::Logger::ROOT , config , Poco::Message::PRIO_INFORMATION); ScopedLogMessage msg("LogRotationTest ", "start", "end"); for(int i=0; i<10; ++i) { msg.Message(Poco::format(" LogRotationTest %d", i)); Poco::Thread::sleep(100); } return 0; } |
Results of execution
コンソール出力
Tue May 25 21:00:00.660 2010: [0] LogRotationTest start Tue May 25 21:00:00.669 2010: [0] LogRotationTest 0 Tue May 25 21:00:00.769 2010: [0] LogRotationTest 1 Tue May 25 21:00:00.869 2010: [0] LogRotationTest 2 Tue May 25 21:00:00.970 2010: [0] LogRotationTest 3 Tue May 25 21:00:01.071 2010: [0] LogRotationTest 4 Tue May 25 21:00:01.171 2010: [0] LogRotationTest 5 Tue May 25 21:00:01.272 2010: [0] LogRotationTest 6 Tue May 25 21:00:01.372 2010: [0] LogRotationTest 7 Tue May 25 21:00:01.472 2010: [0] LogRotationTest 8 Tue May 25 21:00:01.573 2010: [0] LogRotationTest 9 Tue May 25 21:00:01.673 2010: [0] LogRotationTest end |
rotated.log ファイルの内容
Tue May 25 21:00:01.472 2010: [0] LogRotationTest 8 Tue May 25 21:00:01.573 2010: [0] LogRotationTest 9 Tue May 25 21:00:01.673 2010: [0] LogRotationTest end |
rotated.log.20100525210000870 ファイルの内容
Tue May 25 21:00:00.660 2010: [0] LogRotationTest start Tue May 25 21:00:00.669 2010: [0] LogRotationTest 0 Tue May 25 21:00:00.769 2010: [0] LogRotationTest 1 |
rotated.log.20100525210001171 ファイルの内容
Tue May 25 21:00:00.869 2010: [0] LogRotationTest 2 Tue May 25 21:00:00.970 2010: [0] LogRotationTest 3 Tue May 25 21:00:01.071 2010: [0] LogRotationTest 4 |
rotated.log.20100525210001473 ファイルの内容
Tue May 25 21:00:01.171 2010: [0] LogRotationTest 5 Tue May 25 21:00:01.272 2010: [0] LogRotationTest 6 Tue May 25 21:00:01.372 2010: [0] LogRotationTest 7 |
Downloads
・ここをクリックすると、makefile や VC++ プロジェクトなど一式がダウンロードできます。
(2010.06.05 11:53 updated)
・2010年5月25日からのダウンロード数:1183
Subversion
・フリーの Subversion ホスティングサービス Assemblaで、ソースコードを管理しています。
Reference
・5分で使えるLoggingフレームワーク – POCO::Foundation –
・2. ロギングフレームワークの使い方
![]() |
Copyright © 2010 Round Square Inc. All rights reserved. |
---|
0 Comments.