ログ出力の方法

やっぱり今回のプログラムはログを出力することが肝になるので、それを考えてみた。最初は至極簡単な自前のクラスを用意して(つまり、ファイルのオープンと書き込みとクローズだけ)、使ってみた。なんか不安(^^; そこで以前 JavaLog4J を使っていたことを思い出し、さらに Log4cxx なる C++ 用のがあったことを思い出し、検索してみたところ、もっと適切な .NETLog4J があることが判明した。やった。ということで、忘れないためのメモです。

参考URL:log4netでデバッグや障害解析に役立つログを出力する

※参考サイトは C# での記述およびバージョンが 1.1 です。うちの環境は VC++2005, .NET Framework 2.0 です。

1. 上記ZIPファイルをダウンロードする

  ダウンロード:incubating-log4net-1.2.10.zip

2. ZIPファイルを解凍したら、適当なフォルダに移動しておく。

3. Visual Studio にて、プロジェクトに「新しい参照」を追加する。

  追加するDLL:2 で移動した先の 「bin\net\2.0\release\log4net.dll」

4. AssemblyInfo.cpp に以下を追加する

// Log4net 用
[assembly:log4net::Config::XmlConfigurator(Watch=true)];

5. プロジェクトに「新しい項目」を追加して、設定を書き込む

  追加する項目:「構成ファイル(app.config)」

以下、例です。参考まで。ファイルへの出力で、DEBUGレベル以上の設定を行っています。

<configuration>
  <!-- ===================================================================== -->
  <!--                      構成ファイルの設定                               -->
  <!-- ===================================================================== -->

  <!-- log4netセクションのハンドラ設定 -->
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
  </configSections>
  <appSettings>
    <!-- log4net内部のデバッグメッセージを出力する場合、trueに設定 -->
    <add key="log4net.Internal.Debug" value="true"/>
  </appSettings>

  <log4net>

    <!-- ===================================================================== -->
    <!--                 ログ出力先の設定(アペンダーの設定)                    -->
    <!-- ===================================================================== -->

    <!-- ▼ファイル出力用[FileAppender] -->
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <param name="File" value="Fileサンプル.log" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
    </appender>

    <!-- ===================================================================== -->
    <!--     ログ出力の対象レベルと出力先の設定                                -->
    <!-- ===================================================================== -->
    <!-- ===================================================================== -->
    <!--     ▼Rootの設定                                                      -->
    <!--       ※デフォルトとなるログ出力設定                                  -->
    <!-- ===================================================================== -->
    <root>
      <!-- RootはDEBUG以上を出力 -->
      <level value="DEBUG" />
      <!-- ファイル出力 -->
      <appender-ref ref="FileAppender" />
    </root>

    <!-- ===================================================================== -->
    <!--     ▼Loggerの設定                                                    -->
    <!--       ※名前空間ごとに異なるレベルやアペンダーを選択したい場合に設定  -->
    <!-- ===================================================================== -->

    <!--
    <logger name="Log4netSample.MyTeam">
      <level value="WARN" />
      <appender-ref ref="FileAppender" />
    </logger>
    -->

  </log4net>
</configuration>

このファイル(app.config)が、ビルド時だか実行時にだかに「(アプリケーション名).exe.config」で生成されるという記述をみかけたが
自分の環境では、生成されなかった。なので、手動でそのようにコピーしたところ、正常に動作した。ちなみに、Log4J系って設定ファイルが
なくてもエラーにはならずスルーしちゃうんですよね。それはそれでよい仕様だけど、動かしたいときにどんなエラーなのかわからないから
途方にくれることがよくあった。さらにちなむと、app.config を正しく書いておかないとアプリケーションが正しく起動できなくなります。
これは Log4net とは無関係にエラーが表示されます。

6. 実際に使うためのコード

log4net::ILog^ logger = log4net::LogManager::GetLogger(System::Reflection::MethodBase::GetCurrentMethod()->DeclaringType);
logger->Debug("test");

こんな手順でファイル出力まで確認できました。
詳しいことは、参考URLで見てみてください(自分の役割は VC++ で書く部分のみかと思うので)。