例外のログ出力方法

エラー発生時に例外情報をログ出力することが良くあります。そのコード例を見てみましょう。

例外情報をログ出力するコード(C#)

//エラーを発生させる
try {
    int i = 0;
    i = 1 / i;
} catch (Exception ex) {
    //例外のログを出力
    _logger.ErrorException("0除算エラー" , ex);
}
例外情報を出力する場合、NLogではErrorExceptionのようなExceptionで終わるメソッドを呼び出します。第1引数には出力するメッセージ、第2引数にはExceptionクラスを指定します。さらに、ターゲットのlayout属性を下記のように変更します。

例外情報をログ出力する設定例(NLog.config)

<target name="file" xsi:type="File"
layout="${message} ${exception:format=tostring}"    
fileName="${basedir}/log.txt" />

layout属性はログメッセージのレイアウトを設定します。デフォルトは「${longdate}|${level:uppercase=true}|${logger}|${message}」ですが、ここでは「${message} ${exception:format=tostring}"」と変更しています。これで、ExceptionクラスにToStringメソッドを実行した結果がログに出力されます。

NLog.configのサンプル設定

最後に、NLog.configの設定例を紹介しておきます。

NLog.configの設定例

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<!--出力先(ターゲット)の設定-->
<targets>

    <!--ファイル(10KByte毎ローテーション)-->
    <target name="file" xsi:type="File" 
    layout="${longdate} ${level:uppercase=true:padding=-5} [${threadid}] ${logger} - ${message} ${exception:format=tostring}"
    fileName="${basedir}/logs/log.txt" 
    archiveFileName="${basedir}/logs/${date:format=yyyyMMdd}/log.{###}.txt"
    archiveAboveSize="10240"
    archiveNumbering="Sequence"
    maxArchiveFiles="20" />

    <!--フォームのリッチテキストコントロール(色つき)-->
    <target name="rich" xsi:type="RichTextBox"
    formName="Form1"
    controlName="richTextBox1"
    useDefaultRowColoringRules="true" />

    <!--デバッガー/出力ウィンドウ-->
    <target name="debugger" xsi:type="Debugger"/>

    <!--「致命的」という文字を含む時のみ出力するフィルタ-->
    <target name="eventlog" xsi:type="FilteringWrapper" 
        condition="contains('${message}','致命的')">
        <!--イベントログ-->
        <target xsi:type="EventLog" 
            source="NLog Sample" 
            log="Application" />
    </target>

</targets>

<!--出力ルールの設定-->
<rules>
    <logger name="Sample.*" minlevel="Info" writeTo="file,rich,debugger" />
    <logger name="*" levels="Error,Fatal" writeTo="eventlog" />
</rules>

</nlog>

難しく見えるかもしれませんがVSのインテリセンスを活用すると比較的簡単に記述できます。詳細を知りたい場合は、インストールフォルダのサンプルとマニュアルを参考にすると良いでしょう。

実行結果(リッチテキストボックスにログが出力される)

以上、ログ出力ツールのNLogを紹介してきました。NLogは導入が簡単なうえに、開発で十分に活用できる機能が備わっています。NLogに興味を持たれた方はダウンロードして試してみてはいかがでしょうか。