砂漠の旅人(たびと)

UNIX / MS-DOS 時代から電脳砂漠を旅しています

【Windows版】C#でNLogを使ってログを出力する

こんにちは、たびとです。

来月は、.NET 6 と Visual Studio 2022 がリリースされるようで、 どのような変化を遂げたのかが気になるところです。

前回ログビューワである Log2Console を取り上げました。 そこで、今回は、Visual Studio 2019 を使って、 NLogを使ったログを出力するプログラムを実際に作ります。

この記事の対象者

  • NLog (ロギングユーティリティ)に興味のある方、使ってみたい方
  • Visual Studio によるアプリ開発をやっている方、またはこれからやりたい方
  • log4net の開発休止宣言騒ぎで、将来的に別の手段を考えている方

プロジェクトを作成する

Visual Studio 2019 を用いて、.NET Core のコンソールアプリケーションを作成します。

Visual Studio 2019 を起動し、「新しいプロジェクトの作成(N)」をクリックします。

Visual Studio 2019 を起動し、新しいプロジェクトを作成する画面
Visual Studio 2019 を起動し、新しいプロジェクトを作成する

コンソールアプリケーション(.NET Core)を選択し、「次へ(N)」ボタンをクリックします。

コンソールアプリケーションを選択し、次へボタンをクリックする画面
コンソールアプリケーションを選択し、次へボタンをクリックする

新しいプロジェクトのプロジェクト名に「NLogSample」と入力し、「次へ(N)」ボタンをクリックします。

プロジェクト名を入力する画面
プロジェクト名を入力する

ターゲット フレームワーク .NET 5.0(現在)を選択し、「作成(C)」ボタンをクリックします。 サンプルプロジェクト「NLogSample」ができあがります。

NLog をインストールする

Visual Studio 2019 のメニューから「ツール(T) - NuGet パッケージマネージャ(N) - ソリューションの NuGet パッケージの管理(N)...」 を選択します。

NuGet パッケージの管理を選択する画面
NuGet パッケージの管理を選択する

パッケージの参照画面から NLog を検索し、プロジェクトにインストールします。

NLog をインストールする画面
NLog をインストールする

インストールの確認画面が出力されたら、OKボタンをクリックします。

NLog のインストールを確認する画面
NLog のインストールを確認する

これでプロジェクトに 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 ファイルを作成する画面
NLog.config ファイルを作成する

ソリューション エクスプローラー画面で、NLog.config を選択し、右クリックメニューのプロパティ(R)を選択します。 プロパティのビルドアクションを「 コンテンツ 」、出力ディレクトリにコピーを「 新しい場合はコピーする 」に変更します。 これで、ビルド時に実行ファイルと同じ場所に NLog.config が出力されるようになります。

NLog.config のプロパティを変更する画面
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です。

NLogSample を実行する画面
NLogSample を実行する

コンソールを確認する

コンソールの実行結果です。NLogの内容がコンソールにも正しく表示されていることが確認できます。

コンソールで実行結果を確認する画面
コンソールで実行結果を確認する

ログファイルを確認する

次に、定義したログファイル(プロセス名.log)を確認するため、以下の配下にある「NLogSample.log」ファイルを確認します。 ここにも正しく表示されていることが確認できます。 ちなみに、Visual Studio Code で見るとカラー表示されるので見やすいです。

場所:C:\Users\ユーザ名\source\repos\NLogSample\NLogSample\bin\Debug\net5.0\logs

ログファイを確認する画面
ログファイを確認する

Log2Console を確認する

最後に、Log2Console への出力結果を確認します。ここにも正常に出力されることが確認できます。 ただし、Log2Console は事前に起動しておく必要があります。

Log2Console へのログ出力を確認する画面
Log2Console へのログ出力を確認する

Log2Console をご存じない方、詳細メッセージの日本語が文字化けして使えないと思っている方は、 前回の記事を参考にしてください。

sabakunotabito.hatenablog.com

Log2Console は、大量のログを一気に出力すると、 まれに欠落する現象が起こります。 よって、実際の運用環境で監視業務に使うような用途には不向きです。 デバッグのみで利用することをお勧めします。

まとめ

今回は、NLog を使ってログをファイル・コンソール・Log2Console の 3カ所へ同時に出力するC#サンプルを作成しました。 本番環境ではログレベルを制御し、適切なボリュームのログを出力しないと、性能が劣化します。 特に多数のユーザがアクセスするインターネットはレスポンスが悪化します。 以前、そんな経験をして、急いでログレベルを上げた記憶があります。

次回は、今回作った NLogSample を Ubuntu 環境で動作するのかを検証してみます。

sabakunotabito.hatenablog.com

最後に参考サイトを掲載しておきます。

では、皆さん、よい旅を。

参考サイト