こんにちは、たびとです。
来月は、.NET 6 と Visual Studio 2022 がリリースされるようで、 どのような変化を遂げたのかが気になるところです。
前回ログビューワである Log2Console を取り上げました。 そこで、今回は、Visual Studio 2019 を使って、 NLogを使ったログを出力するプログラムを実際に作ります。
この記事の対象者
- NLog (ロギングユーティリティ)に興味のある方、使ってみたい方
- Visual Studio によるアプリ開発をやっている方、またはこれからやりたい方
- log4net の開発休止宣言騒ぎで、将来的に別の手段を考えている方
プロジェクトを作成する
Visual Studio 2019 を用いて、.NET Core のコンソールアプリケーションを作成します。
Visual Studio 2019 を起動し、「新しいプロジェクトの作成(N)」をクリックします。
コンソールアプリケーション(.NET Core)を選択し、「次へ(N)」ボタンをクリックします。
新しいプロジェクトのプロジェクト名に「NLogSample」と入力し、「次へ(N)」ボタンをクリックします。
ターゲット フレームワークは .NET 5.0(現在)を選択し、「作成(C)」ボタンをクリックします。 サンプルプロジェクト「NLogSample」ができあがります。
NLog をインストールする
Visual Studio 2019 のメニューから「ツール(T) - NuGet パッケージマネージャ(N) - ソリューションの NuGet パッケージの管理(N)...」 を選択します。
パッケージの参照画面から NLog を検索し、プロジェクトにインストールします。
インストールの確認画面が出力されたら、OKボタンをクリックします。
これでプロジェクトに NLog がインストールされます。
NLog を設定する
NLog の設定は、NLog.config と app.config のどちらにも定義できますが、 NLog.config の方が別のプロジェクトにもコピーするだけで使えるので、 NLog.config を使います。
詳細は、以下のサイトを参考にしてください。
Configuration file · NLog/NLog Wiki · GitHub
実行モジュールと同じ場所に NLog.config を出力する
ソリューション エクスプローラー画面の NLogSample を右クリックします。 「追加(D) - 新しい項目(W)...」を選択します。
「全般 - アプリケーション構成ファイル」を選択し、app.config を NLog.config に変更します。
ソリューション エクスプローラー画面で、NLog.config を選択し、右クリックメニューのプロパティ(R)を選択します。 プロパティのビルドアクションを「 コンテンツ 」、出力ディレクトリにコピーを「 新しい場合はコピーする 」に変更します。 これで、ビルド時に実行ファイルと同じ場所に NLog.config が出力されるようになります。
NLog の出力先を設定する
NLog はファイル以外にも、コンソールやビューワに出力することができます。 今回は、ファイル・コンソール・Log2Consoleの3カ所に出力します。
先ほど作った 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" autoReload="true" throwExceptions="true" internalLogLevel="Off" internalLogFile="../logs/nlog_internal.log"> <targets> <!-- ファイル --> <target name="logFile" xsi:type="File" encoding="UTF-8" writeBom="true" lineEnding="Default" layout="${longdate} ${level:uppercase=true:padding=-5} [${threadid}] ${logger} - ${message} ${exception:format=tostring}" fileName="../logs/${processname}.log" archiveFileName="../logs/backup/${processname}_{###}.log" archiveEvery="Day" archiveNumbering="Sequence" maxArchiveFiles="10" /> <!-- Console --> <target name="console" xsi:type="ColoredConsole" layout="${longdate} ${level:uppercase=true:padding=-5} ${message}" /> <!-- Viewer(Log2Console, etc...) --> <target name="tcpOutlet" xsi:type="NLogViewer" address="tcp4://localhost:4505"/> </targets> <rules> <logger name="*" minlevel="Trace" writeTo="logFile" /> <logger name="*" minlevel="Trace" writeTo="console" /> <logger name="*" minlevel="Trace" writeTo="tcpOutlet" /> </rules> </nlog>
ファイル (target File)
ログファイルに出力します。 今回設定しているパラメータは以下の通り。
- name - rules の出力先に設定するために任意の名前を指定します。
- xsi:type - ファイルへ出力するためのタイプ ”File” を指定します。
- encoding - ファイル出力のエンコーディングを指定します。
- writeBom - BOM(バイトオーダーマーク)の有り無しを指定します。 BOM有りだと文字コード判定が容易なので、エディタの文字化けが防げます。
- lineEnding - OSに合わせた改行コードが指定できます。Default(OSに合わせる), CR, CRLF, LF, None から選択します。
- layout - ログのフォーマットを指定します。必要に応じて編集してください。
- fileName - ログファイルの出力先を指定します。
{processname}
変数でプロセス名をファイルに名にしています。 - archiveFileName - バックアップ先のファイル名を指定します。
{###}
変数は数字の連番になります。 - archiveEvery - 指定の時間でログファイルを切り替えます。Day, Hour, Minute, Month, None などから選択します。
- archiveNumbering - 連番の番号の付け方を Rolling, Sequence から選択します。
- maxArchiveFile - 保存するアーカイブファイルの最大数を指定します。デフォルトは 0 です。
コンソール (target ColoredConsole)
コンソールに出力します。GUIの時は設定しなくても構いません。 画面サイズに合わせて、layout を見直してください。
NLogビューワ (target NLogViewer)
NLog のビューワへネットワーク経由で送信します。 後述の Log2Console の場合を例に address の設定を説明します。
tcp://host:port - TCP(IPv4/IPv6自動選択)で送信します。 ただし、Log2Console は出力されないことがあるため、IPv4の場合は tcp4 を指定してください。
tcp4://host:port - TCP/IPv4 で送信します。
- tcp6://host:port - TCP/IPv6 で送信します。
NLog によるログ出力を試してみる
いよいよ、NLog サンプルを作って、実際にログ出力を確認します。
簡単な出力プログラムを作成する
Program.cs が NLog を出力できるように修正します。 NLog.config と同様に Program.cs を削除して、コピー&ペーストします。
using System; namespace NLogSample { class Program { static NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger(); static void Main(string[] args) { _logger.Trace("Trace ログです。"); _logger.Debug("Debug ログです。"); _logger.Info("Info ログです。"); _logger.Warn("Warn ログです。"); _logger.Error("Error ログです。"); _logger.Fatal("Fatal ログです。"); try { var a = 0; Console.WriteLine(10 / a); // エラーを発生させる } catch (Exception ex) { _logger.Error(ex, "エラーが発生しました。"); } } } }
7行目に NLog の宣言をしています。「using NLog;」を付けても構いません。 11行目から16行目は、NLogで出力できるログレベルを全て記述しています。 try - catch は例外発生時に Exception の内容をログに記録する例を記述しています。
実行して確認する
メニューアイコンのデバッグ実行ボタンをクリックして実行します。 F5キーを押してもOKです。
コンソールを確認する
コンソールの実行結果です。NLogの内容がコンソールにも正しく表示されていることが確認できます。
ログファイルを確認する
次に、定義したログファイル(プロセス名.log)を確認するため、以下の配下にある「NLogSample.log」ファイルを確認します。 ここにも正しく表示されていることが確認できます。 ちなみに、Visual Studio Code で見るとカラー表示されるので見やすいです。
場所:C:\Users\ユーザ名\source\repos\NLogSample\NLogSample\bin\Debug\net5.0\logs
Log2Console を確認する
最後に、Log2Console への出力結果を確認します。ここにも正常に出力されることが確認できます。 ただし、Log2Console は事前に起動しておく必要があります。
Log2Console をご存じない方、詳細メッセージの日本語が文字化けして使えないと思っている方は、 前回の記事を参考にしてください。
Log2Console は、大量のログを一気に出力すると、 まれに欠落する現象が起こります。 よって、実際の運用環境で監視業務に使うような用途には不向きです。 デバッグのみで利用することをお勧めします。
まとめ
今回は、NLog を使ってログをファイル・コンソール・Log2Console の 3カ所へ同時に出力するC#サンプルを作成しました。 本番環境ではログレベルを制御し、適切なボリュームのログを出力しないと、性能が劣化します。 特に多数のユーザがアクセスするインターネットはレスポンスが悪化します。 以前、そんな経験をして、急いでログレベルを上げた記憶があります。
次回は、今回作った NLogSample を Ubuntu 環境で動作するのかを検証してみます。
最後に参考サイトを掲載しておきます。
では、皆さん、よい旅を。