2013年2月18日月曜日

.net環境でのログ出力方法

GeneXusは標準でアプリケーションログの出力機能が搭載されていません。システムを開発する上でログ出力は必須の機能ですので、.net環境におけるログの出力方法を以下にまとめました。 前提としては、Webアプリケーション(web.configに設定を記述)ですが、バッチ処理等にも応用できます(client.exe.configに設定を記述)。


[追記] 「log4net出力設定のON」の部分、ジェネレーターのプロパティ設定を追記しました。(2013.2.26)




 1.Log4net

 .net環境におけるログ出力といえばLog4netがスタンダードですが、GeneXusも標準でlog4net.dllをバンドルしています。(ビルドするとターゲットディレクトリ下のbinディレクトリに出力されます) 今回はこれをそのまま使用します。

 2.外部オブジェクト

log4net.dllをGeneXusから利用するために外部オブジェクトを作成します。必要なオブジェクトは以下の通りです。
  ・LogManager(Loggerを取得するオブジェクト)
  ・Logger(ログ出力用オブジェクト)
こちらからlog4net.xpzをダウンロードし、ナレッジベースにインポートして下さい。 

3.使い方

&Logger = &LogManager.GetLogger("Genexus.Programs.SubsystemA")

&Logger.Debug("Debug message")
&Logger.Error("Error message")
&Logger.Fatal("Fatal message")
&Logger.Info("Info message")
&Logger.Warn("Warn message")
LogManager、Logger双方の外部オブジェクトを変数として宣言します。
GetLoggerメソッドのパラメータがログを出力する単位の指定になります。「GeneXus.Programs」はGeneXusが自動生成するweb.configの名前空間名になるので固定とし、それ以降にアプリ内固有の名前を指定してください。(サブシステムやチーム、担当者など)

4.設定

4-1.web.config
log4net出力設定のON
ジェネレーターのプロパティ「log level」の値により、web.configファイルの「log4net」タグのアトリビュート「threshold(スレッシュホールド:しいき値)」が設定されます。
但し、この設定により、GeneXusフレームワークに仕込んであるログ出力もONになります。ディフォルトの出力先(Client.log)にはこのフレームワーク側のログ出力とアプリ側のログ出力が混在する事になります。アプリケーション側のみのログファイルを出力したい場合は、下記4-2、4-3の設定をします。



  <log4net threshold="OFF"> → <log4net threshold="ALL">
web.configを直接変更する事は可能ですが、ビルドのたびに上書きされるので要注意。自分で追記した設定(以下4-2、4-3)はGeneXusが変更を加えることはありません。   

4-2.appender( ログ出力先の設定 )
    <appender name="SubsystemA_RollingFile" type="log4net.Appender.RollingFileAppender">
      <file value="subsystem_A.log" />
      <appendToFile value="true" />
      <maximumFileSize value="9000KB" />
      <maxSizeRollBackups value="4" />
      <rollingStyle value="Size" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d{HH:mm:ss,fff} [%t] %-5p %c{1} - %m%n" />
      </layout>
    </appender>
 複数種類定義する事により、出力先を複数設定する事が可能です。この例ではログファイルとして出力する設定です。詳しくはLog4netの情報を参照ください。

4-3.出力レベルの設定
    <logger name="GeneXus.Programs.SubsystemA">
      <level value="INFO" />
      <appender-ref ref="SubsystemA_RollingFile" />
    </logger>
    <logger name="GeneXus.Programs.SubsystemB">
      <level value="DEBUG" />
      <appender-ref ref="SubsystemB_RollingFile" />
    </logger>
    <root>
      <level value="FATAL" />
      <appender-ref ref="RollingFile" />
    </root>

 GetLoggerのパラメータで指定された名前空間ごとに出力先(appender)と出力レベル(FATAL/ERROR/WARN/INFO/DEBUG)を指定します。ディフォルトの設定はrootに記述します。




[注意]当ブログの投稿はあくまでも情報提供であり、動作の保証をするものではありません。また当情報を元にした実装により何らかの問題が発生した場合でも当方は一切の保証は致しません。

1 件のコメント:

  1. いつも参考にさせていただいております。
    log4j環境でのログ出力方法についても記載していただけると助かります。
    log4j-1.2.15.jarをGeneXusから利用するための外部オブジェクトの.xpzファイルがあれば助かります。

    返信削除