C#のトレースログ設定

投稿者: | 2021年7月27日

下記ライブラリを使って2つの外部ファイルからトレースログを設定する方法について解説します。

  • Microsoft.Extentions.Logging.Configuration・・・appsetting.json
  • NLog.Extentions.Logging・・・・・・・・・・・NLog.config

C#では色々なトレースログをする手段がありますが、この2つのライブラリを選定した理由はこちらの記事で解説
C#.Netでのログ記録まとめ

アプリケーション設定ファイル(appsetting.json)

設定値はこちらの一般的な規定値のままで良いと思います。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning"
    }
  },
  "AllowedHosts": "*"
}

Infomationログをすべて出力する設定だと、データベースのInfomationログが出力されてログがデータベースの操作情報でログ溢れるため。Micorosftで始まるクラスのログはWarning以上にするという設定項目になっています。

詳しい説明は下記の公式リファレンスへ
.NET Core および ASP.NET Core でのログ記録

NLog設定ファイル(NLog.config)

こちらのサイトを参考に設定項目を作成しました。
NLog 設定項目 詳細

テストログにもトレース情報を残したいので、アプリケーションプロジェクト用とテストプロジェクト用の2つを作成します。

アプリケーションプロジェクト用

クライアントサイドで設定したいトレースログを書き並べてみた。

  • デバッグに出力して開発環境でリアルタイムでトレースログを確認できるようにする
  • テキストに出力して本番環境でトレースログを確認できるようにする
  • トレースログでストレージを圧迫しないように古いログは削除して10日間分だけ残す
  • デバッグとテキストのトレースログは同一のものとする
  • テキスト出力の出力先はルートフォルダはアプリケーション側で指定できるようにする
  • InnerExceptionは最大5個までトレースする

上記の条件で設定を構築すると、こんな感じに仕上がりました。

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <targets>
    <target 
      name="File" 
      xsi:type="File" 
      fileName="${gdc:LogPath}${date:format=yyyy-MM-dd}.log"
      layout="${time} ${uppercase:${level}} ${logger} ${message} ${onexception:${exception:format=shortType,message:maxInnerExceptionLevel=5:innerFormat=shortType,message}}"
      maxArchiveFiles="10"
      />
    <target
      name="OutputDebugString"
      xsi:type="OutputDebugString"
      layout="${time} ${uppercase:${level}} ${logger} ${message} ${onexception:${exception:format=shortType,message:maxInnerExceptionLevel=5:innerFormat=shortType,message}}"
      />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" maxlevel="Fatal" writeTo="File" />
    <logger name="*" minlevel="Debug" maxlevel="Fatal" writeTo="OutputDebugString" />
  </rules>
</nlog>

ちなみに、トレースログの出力フォルダ先ルートパスは下記コードで設定できます。

NLog.GlobalDiagnosticsContext.Set("LogPath", "C:\\Folder\\");

テストプロジェクト用(NUnit)

NUnitではコンソールに書き出す処理でテストログが出力される仕様であるため、上記の設定ファイルとの違いはコンソールにも書き出す処理を追加したぐらいで、ほとんど差はないです。

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <!-- 
      layout="${processtime} ${uppercase:${level}} ${logger} ${message} ${onexception:${exception:format=type,message,method:maxInnerExceptionLevel=5:innerFormat=shortType,message,method}}"
      layout="${processtime} ${uppercase:${level}} ${logger} ${message} ${exception:format=type,message,method:maxInnerExceptionLevel=5,innerFormat=shortType,message,method}"
    -->
  <targets>
    <target 
      name="File" 
      xsi:type="File" 
      fileName="Logs\${gdc:TestName}.log"
      deleteOldFileOnStartup="true"
      header="[Start : ${longdate}]"
      layout="${processtime} ${uppercase:${level}} ${logger} ${message} ${onexception:${exception:format=shortType,message:maxInnerExceptionLevel=5:innerFormat=shortType,message}}"
      footer="[End : ${longdate}]"
      maxArchiveFiles="1"
    />
    <target
      name="OutputDebugString"
      xsi:type="OutputDebugString"
      layout="${processtime} ${uppercase:${level}} ${logger} ${message} ${onexception:${exception:format=shortType,message:maxInnerExceptionLevel=5:innerFormat=shortType,message}}"
      />
    <target
      name="Console"
      xsi:type="Console"
      layout="${processtime} ${uppercase:${level}} ${logger} ${message} ${onexception:${exception:format=shortType,message:maxInnerExceptionLevel=5:innerFormat=shortType,message}}"
      />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" maxlevel="Fatal" writeTo="File" />
    <logger name="*" minlevel="Debug" maxlevel="Fatal" writeTo="OutputDebugString" />
    <logger name="*" minlevel="Debug" maxlevel="Fatal" writeTo="Console" />
  </rules>
</nlog>

蛇足ですがNLogとMicorosfot.Extentions.LoggingがまだXUnitに対応していないので、XUnitよりNUnitのほうがテストログ出力の使い勝手がいいです。この辺のライブラリが整備されたらXUnitに移行したいですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)