オウルです。
ASP.NET Core では、組み込みやサード パーティ製のさまざまなログプロバイダーと連携するログ API がサポートされています。公式ページにはログプロバイダーの一覧がありますよ。「はじめての ASP.NET Core 作りながら学習」では、その中で便利な NLog を使用します。
NLog
NLogとは
NLog is a flexible and free logging platform for various .NET platforms, including .NET standard. NLog makes it easy to write to several targets. (database, file, console) and change the logging configuration on-the-fly.
NLogは、.NET standardを含むさまざまな.NETプラットフォーム用の柔軟でフリーのログ記録プラットフォームです。 NLogは、いくつかのターゲットへの書き込みを簡単にします。 (データベース、ファイル、コンソール)ログ記録設定をオンザフライで変更します。
NLogパッケージのダウンロード
Visual Studio のメニュー / ツール / NuGet パッケージマネジャー / ソリューションの NuGet パッケージの管理をクリックします。
NLog.Web.AspNetCore パッケージ
NLog パッケージをダウンロードしてインストールします(下の画像①~③)
NLog パッケージ
NLog パッケージをダウンロードしてインストールします(下の画像①~③)
NLog.config の作成
NLog.config は、ログファイルの場所、ログレベルなどを管理する設定ファイルです。次の手順に従って作成します。
作成方法
- ソリューションエクスプローラーから MVC プロジェクトを右クリック
- 追加 / 新しい項目をクリック
- XMLファイルを選択して、名前を NLog.config 、[追加] ボタンをクリック
設定内容
作成した NLog.config に追記します。下記をコピーして貼り付けてください。コメントに「任意のパスに変更します」とある箇所を修正します。またログは日付でローテーションするように設定します。
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 37 38 39 40 41 42 43 44 45 46 |
<?xml version="1.0" encoding="utf-8" ?> <!-- internalLogFile を任意のパスに変更します --> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogLevel="info" internalLogFile="C:/Develop/Repository/AppLogs/BlueOwl.DrawingMemory.WebMvc/internal-nlog.txt"> <!-- the targets to write to --> <targets> <!-- write logs to file --> <!-- fileName を任意のパスに変更します --> <target xsi:type="File" name="allfile" fileName="C:/Develop/Repository/AppLogs/BlueOwl.DrawingMemory.WebMvc/nlog-all-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" archiveFileName="C:/Develop/Repository/AppLogs/BlueOwl.DrawingMemory.WebMvc/archives/log-all.{#}.txt" archiveEvery="Day" archiveNumbering="Date" archiveDateFormat="yyyyMMdd" maxArchiveFiles="3" concurrentWrites="false" keepFileOpen="false" /> <!-- another file log, only own logs. Uses some ASP.NET core renderers --> <!-- fileName を任意のパスに変更します --> <target xsi:type="File" name="ownFile-web" fileName="C:/Develop/Repository/AppLogs/BlueOwl.DrawingMemory.WebMvc/nlog-own-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" archiveFileName="C:/Develop/Repository/AppLogs/BlueOwl.DrawingMemory.WebMvc/archives/log-own.{#}.txt" archiveEvery="Day" archiveNumbering="Date" archiveDateFormat="yyyyMMdd" maxArchiveFiles="3" concurrentWrites="false" keepFileOpen="false" /> </targets> <!-- rules to map from logger name to target --> <rules> <!--All logs, including from Microsoft--> <logger name="*" minlevel="Trace" writeTo="allfile" /> <!--Skip non-critical Microsoft logs and so log only own logs--> <logger name="Microsoft.*" maxLevel="Info" final="true" /> <!-- BlackHole without writeTo --> <logger name="*" minlevel="Trace" writeTo="ownFile-web" /> </rules> </nlog> |
常にコピーする
ビルドするときに、NLog.config を「常にコピーする」ように設定します。ソリューションエクスプローラーで NLog.config を選択して、下段のプロパティ画面から設定します。
ログ出力
これで Nlog を利用する下準備が出来たので、ここからコードを追加していきます。
Program.cs にコード追加
Program.cs の場所
プロジェクトの直下に Program.cs があります。この Program.cs にコードを追加していきます。
Mainメソッド
Program.cs を見ると、void Main(string[] args) が定義されています。Main メソッドは、一般的にアプリのエントリ ポイントとなります。この Main メソッド にコードを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public static void Main(string[] args) { // [ add code ] load NLog.config var logger = NLog.Web.NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger(); try { logger.Debug("Start Main"); CreateWebHostBuilder(args).Build().Run(); } catch (Exception ex) { // [ add code ] NLog: catch setup errors logger.Error(ex, "Stopped program because of exception"); } finally { // [ add code ] Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux) NLog.LogManager.Shutdown(); } } |
CreateWebHostBuilderメソッド
ログプロバイダーを追加しているところです。既定のプロジェクト テンプレートでは、 CreateDefaultBuilder が呼び出されます。デフォルトで3つのログ プロバイダーを追加しています。せっかくなので Git Hub の CreateDefaultBuilder のログ プロバイダーの実装箇所を見てみましょう。
1 2 3 4 5 6 7 |
.ConfigureLogging((hostingContext, logging) => { logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); logging.AddConsole(); logging.AddDebug(); logging.AddEventSourceLogger(); }). |
はい、”コンソール”、”デバッグ”、”EventSource (ASP.NET Core 2.2 以降)” の3つのログ プロバイダーが追加されていますね。
今回は ClearProviders を呼び出し、プロバイダーをクリアします。そして、NLog を DI (Dependency Injection)します。
公式サイトやインターネットの情報を見ると、DI、依存関係の挿入などの用語が頻繁にでてきます。DIとは、”Dependency Injection”の略称で ASP.NET Core では DI ソフトウェア設計パターンがサポートされているのです。この DI は、今は意味不明でも大丈夫です。今後の実装に頻出するので焦る必要はありません。コーディングを進めていくうちに、自然と理解できるようになるはずです。
1 2 3 4 5 6 7 8 9 10 11 |
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() // [ add code ] .ConfigureLogging(logging => { logging.ClearProviders(); logging.SetMinimumLevel(LogLevel.Trace); }) // [ add code ] .UseNLog(); |
CreateDefaultBuilder はホストを設定するところなので重要です。「はじめての ASP.NET Core 作りながら学習」では、デフォルトのままで動作させるタスクが多いです。唯一、UseStartup を拡張することになるかと思います。
デバックでログ出力を確認する
ここまでで NLog の準備が完了しました。それではデバック実行してログが出力されることを確認してみましょう。次の3ファイルが出力されていれば OK です。
- internal-nlog
- nlog-all-[year]-[month]-[day]
- nlog-own-[year]-[month]-[day]
nlog-all-[year]-[month]-[day] を見ると、先頭行にログレベルが DEBUG で Start Main とあるはずです。これは、Program.cs の Main メソッドに追加したコードですね。これでログ出力は完了です。次回は、コントローラーとビューの作成を紹介したいと思います。ついに UI (画面)に突入です!また、コントローラー作成時に今回のNLog を DI してコントローラーで使用できるようにします。