目次
下記ライブラリを使って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に移行したいですね。