目次
下記ライブラリを使って2つの外部ファイルからトレースログを設定する方法について解説します。
- Microsoft.Extentions.Logging.Configuration・・・appsetting.json
- NLog.Extentions.Logging・・・・・・・・・・・NLog.config
C#では色々なトレースログをする手段がありますが、この2つのライブラリを選定した理由はこちらの記事で解説
C#.Netでのログ記録まとめ
アプリケーション設定ファイル(appsetting.json)
設定値はこちらの一般的な規定値のままで良いと思います。
1 2 3 4 5 6 7 8 9 | { "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning" } }, "AllowedHosts": "*" } |
Infomationログをすべて出力する設定だと、データベースのInfomationログが出力されてログがデータベースの操作情報でログ溢れるため。Micorosftで始まるクラスのログはWarning以上にするという設定項目になっています。
詳しい説明は下記の公式リファレンスへ
.NET Core および ASP.NET Core でのログ記録
NLog設定ファイル(NLog.config)
こちらのサイトを参考に設定項目を作成しました。
NLog 設定項目 詳細
テストログにもトレース情報を残したいので、アプリケーションプロジェクト用とテストプロジェクト用の2つを作成します。
アプリケーションプロジェクト用
クライアントサイドで設定したいトレースログを書き並べてみた。
- デバッグに出力して開発環境でリアルタイムでトレースログを確認できるようにする
- テキストに出力して本番環境でトレースログを確認できるようにする
- トレースログでストレージを圧迫しないように古いログは削除して10日間分だけ残す
- デバッグとテキストのトレースログは同一のものとする
- テキスト出力の出力先はルートフォルダはアプリケーション側で指定できるようにする
- InnerExceptionは最大5個までトレースする
上記の条件で設定を構築すると、こんな感じに仕上がりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <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> |
ちなみに、トレースログの出力フォルダ先ルートパスは下記コードで設定できます。
1 | NLog.GlobalDiagnosticsContext.Set( "LogPath" , "C:\\Folder\\" ); |
テストプロジェクト用(NUnit)
NUnitではコンソールに書き出す処理でテストログが出力される仕様であるため、上記の設定ファイルとの違いはコンソールにも書き出す処理を追加したぐらいで、ほとんど差はないです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <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に移行したいですね。