C++用のログ出力ライブラリとして、log4cppがある。使うまでの準備と使用例をまとめる。
準備
- SourceForgeのサイトからlog4cppのソースコードをダウンロードする。 本投稿ではバージョン1.1.1を使用。
- 任意のフォルダに展開する。
- log4cpp\msvc10配下のmsvc10.slnを開く。 本投稿ではVisual Studio Express 2013 for Windows Desktopを使用。 プロジェクトのアップグレードに関連するメッセージが表示される。OKを押して進む。
- log4cppプロジェクトをビルドする。
log4cpp\msvc10\log4cpp\Releaseフォルダ配下に以下のファイルが生成されていることを確認する。
- log4cpp.lib
- log4cpp.dll
使用
- Visual StudioにてVisual C++新規プロジェクトを作成する。
- プロジェクトのプロパティページの[リンカー]-[入力]にて、生成されたlog4cpp.libを追加ライブラリとして指定する。
- ログ出力フォーマットファイルを用意。
log4cpp.properties
# log4cpp.properties
log4cpp.rootCategory=DEBUG, rootAppender
log4cpp.appender.rootAppender=RollingFileAppender
log4cpp.appender.rootAppender.fileName=log4cppSample.log
log4cpp.appender.rootAppender.maxFileSize=10000000
log4cpp.appender.rootAppender.maxBackupIndex=5
log4cpp.appender.rootAppender.layout=PatternLayout
log4cpp.appender.rootAppender.layout.ConversionPattern=%d [%-5p] %m%n
- ロガーを提供するクラスを追加。
Log.h
#pragma once
#include <log4cpp/Category.hh>
#include <log4cpp/PropertyConfigurator.hh>
class Log
{
private:
Log();
public:
~Log();
static log4cpp::Category& getLogger();
};
Log.cpp
#include "stdafx.h"
#include "Log.h"
Log::Log()
{
}
Log::~Log()
{
}
log4cpp::Category& Log::getLogger()
{
std::string initFileName = "log4cpp.properties";
log4cpp::PropertyConfigurator::configure(initFileName);
return log4cpp::Category::getRoot();
}
- ログを出力したいクラスにて、上のロガー提供クラスからロガーを入手。 そしてログ出力。
log4cppSample.cpp
int _tmain(int argc, _TCHAR* argv[])
{
log4cpp::Category& logger = Log::getLogger();
logger.warn("Storm is coming");
Base* pBase = new Base();
Base* pDerived = new Derived();
pBase->printLog();
pDerived->printLog();
logger.shutdown();
delete pDerived;
delete pBase;
return 0;
}
Base.cpp
void Base::printLog()
{
log4cpp::Category& logger = Log::getLogger();
logger.info("This is Base");
}
Derived.cpp
void Derived::printLog()
{
log4cpp::Category& logger = Log::getLogger();
logger.info("This is Derived");
}
- ログ出力例
log4cppSample.log
2015-07-04 14:06:05,900 [WARN ] Storm is coming
2015-07-04 14:06:05,903 [INFO ] This is Base
2015-07-04 14:06:05,904 [INFO ] This is Derived