2. ロギングフレームワークの使い方

ロギングフレームワークの使い方を詳解します。参考情報のCodeZineの記事でロギングフレームワークそのものは詳しく説明されています。ただ、残念なことに実際にはどのように使うのがベストなのか説明がありません。
Log4Jと同じように、ソース内で記述するログ出力処理はできるだけ少なく、でもプロパティファイルの設定によってコンソールやファイルにログ出力する方法を説明します。

その方法はとても簡単で、SplitterChannelを使う設定をプロパティファイルに記述するだけです。プロパティファイルは指定しない場合は、実行ファイルと同じディレクトリの{実行ファイル名}.propertiesが読み込まれます。
プロパティファイルの記述例は以下のようになります。

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
logging.loggers.root.channel.class = ConsoleChannel
logging.loggers.app.name = Application
logging.loggers.app.channel = c0
logging.formatters.f1.class = PatternFormatter
logging.formatters.f1.pattern = %Y/%m/%d %H:%M:%S[%q] %s - %t
logging.channels.c0.class = SplitterChannel
logging.channels.c0.channel1 = c1
logging.channels.c0.channel2 = c2
logging.channels.c1.class = ConsoleChannel
logging.channels.c1.formatter = f1
logging.channels.c2.class = FileChannel
logging.channels.c2.path = ./Logging.log
logging.channels.c2.formatter = f1

ログ出力をするサンプルプログラムです。

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "Poco/Util/Application.h"
#include "Poco/Util/Option.h"
#include "Poco/Util/OptionSet.h"
#include "Poco/Util/HelpFormatter.h"
#include "Poco/Util/AbstractConfiguration.h"
#include "Poco/AutoPtr.h"
#include <iostream>
using Poco::Util::Application;
using Poco::Util::Option;
using Poco::Util::OptionSet;
using Poco::Util::HelpFormatter;
using Poco::Util::AbstractConfiguration;
using Poco::Util::OptionCallback;
using Poco::AutoPtr;
class Logging: public Application
    /// This sample demonstrates some of the features of the Util::Application class,
    /// such as configuration file handling and command line arguments processing.
    ///
    /// Try Logging --help (on Unix platforms) or Logging /help (elsewhere) for
    /// more information.
{
public:
    Logging(): _helpRequested(false)
    {
    }
protected:
    void initialize(Application& self)
    {
        loadConfiguration(); // load default configuration files, if present
        Application::initialize(self);
        // add your own initialization code here
    }
    void uninitialize()
    {
        // add your own uninitialization code here
        Application::uninitialize();
    }
    void reinitialize(Application& self)
    {
        Application::reinitialize(self);
        // add your own reinitialization code here
    }
    void defineOptions(OptionSet& options)
    {
        Application::defineOptions(options);
        options.addOption(
            Option("help", "h", "display help information on command line arguments")
                .required(false)
                .repeatable(false)
                .callback(OptionCallback<Logging>(this, &Logging::handleHelp)));
        options.addOption(
            Option("config-file", "f", "load configuration data from a file")
                .required(false)
                .repeatable(true)
                .argument("file")
                .callback(OptionCallback<Logging>(this, &Logging::handleConfig)));
    }
    void handleHelp(const std::string& name, const std::string& value)
    {
        _helpRequested = true;
        displayHelp();
        stopOptionsProcessing();
    }
    void handleConfig(const std::string& name, const std::string& value)
    {
        loadConfiguration(value);
    }
    void displayHelp()
    {
        HelpFormatter helpFormatter(options());
        helpFormatter.setCommand(commandName());
        helpFormatter.setUsage("OPTIONS");
        helpFormatter.setHeader("A logging application that demonstrates how to use logging.");
        helpFormatter.format(std::cout);
    }
    int main(const std::vector<std::string>& args)
    {
        if (!_helpRequested)
        {
            logger().trace("trace ログ出力です");
            logger().debug("debug ログ出力です");
            logger().information("info ログ出力です");
            logger().warning("warn ログ出力です");
            logger().error("error ログ出力です");
            logger().fatal("fatal ログ出力です");
        }
        return Application::EXIT_OK;
    }
private:
    bool _helpRequested;
};
POCO_APP_MAIN(Logging)

終わりに、ロギングについての参考情報のポインタを示します。
http://codezine.jp/article/detail/1901

Comments are closed.