Poco::FileChannel

ログローテーションを実現するための Poco::FileChannel を紹介します。

ログをとる場合、ローテーションを行って幾つかのファイルを履歴として残したりしますが、
Poco::FileChannelPoco::Logger と合わせて使うことにより、ログローテーションが簡単に
実現できます。

LogRotationTest.cpp

Poco::SplitterChannel を使って、ログ出力を Poco::ConsoleChannelPoco::FileChannel の両者に
 分岐。
Poco::FileChannelsetProperty で、ローテーションのプロパティを指定。
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日からのダウンロード数:862

Subversion

・フリーの Subversion ホスティングサービス Assemblaで、ソースコードを管理しています。

Reference

5分で使えるLoggingフレームワーク – POCO::Foundation -
2. ロギングフレームワークの使い方

Powered by POCO Copyright © 2010 Round Square Inc. All rights reserved.


Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">