【Visual Studio C# デバッグ入門 】NLogの使用方法を徹底解説

本ブログでは初学者向けに、NLogの使用方法を紹介します。

NLog は柔軟で高機能な .NET 用のログライブラリです。ログレベル(Info, Debug, Error など)の切り分け、ログファイルの出力先や形式のカスタマイズなどが簡単に設定できる便利なツールです。

  • 使用環境
    • Windows 10 Pro 2009 ビルド19045.5854
    • Visual Studio 2020 Version 17.14.2
    • NLog 5.5

Visual Studio C# NLogを使用した本格的なログ管理

  • NLogの主な用途
    • デバッグ:開発時の挙動を把握し、エラーを素早く特定
    • エラートラッキング:アプリの異常動作を記録し、問題分析に役立つ
    • パフォーマンス監視:処理時間の記録やシステム負荷の検出
    • 運用ログ管理:ファイル、データベース、クラウドなど様々な場所へログ保存
  • ログ出力形式
出力先ファイル形式特 徴
1ファイル.txt, .log, .csv一般的なテキストログで解析し易い
2JSON.Json構造化データのログ。外部ツールとの連携向き
3XML.xml可読性とデータ整合性のバランスが良い
4イベントログWindowsのイベントビューアにログ記録
データベースSQL Server, MySQL など集中的にログ管理したい場合に便利
6クラウドAzureやAWS などクラウド上でリアルタイム監視

NLogの使用方法

NuGet パッケージからインストール

  • ソリューションエクスプローラー画面の「プロジェクト」を右クリック→「NuGetパッケージの管理」画面から下記のパッケージをインストールする。
    • NLog 5.5.0
    • NLog.Schema 5.5.0
  • NLog.Schema
    • XML スキーマを提供し、設定ミスを防ぐ
    • 設定ファイルの構造をチェックし、誤ったタグや属性の使用を防止

■パッケージのインストール結果

NLog.config ファイルの作成

  • NLog.configファイル とは
    • ログの出力方法(出力先・レベル・書式など)を XML 形式で定義し、アプリケーションのログ動作の制御を記述する
  • 「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">

<!-- 変数の設定 -->
  <variable name="logdir" value="c:\temp\nlog"/>

<!-- ターゲットの設定 -->
  <targets>
   <target xsi:type="File" name="filelog" fileName="${logdir}/logs/${shortdate}.log"
        layout="${longdate} ${uppercase:${level}} ${message}" />
   <target xsi:type="Console" name="consolelog"
	layout="${longdate} ${uppercase:${level}} ${message}" />
  </targets>

<!-- ルールの設定 -->
  <rules>
    <logger name="*" minlevel="Info" writeTo="filelog,consolelog" />
  </rules>
</nlog>
  • NLog.configファイルを「右クリック」→「プロパティ」でプロパティ画面を表示し、下記項目を設定
    • ビルドアクション:コンテンツ
    • 出力ディレクトリコピー:新しい場合はコピーする
  • プロパティの設定の意味
    • ビルド時に設定ファイルを bin フォルダへコピー
    • 実行時に NLog.config を参照できる(アプリが正しくログ出力できる)
    • ファイルが変更された場合のみコピーされるため、不要な更新を防ぐ

NLog.config ファイルの構成

「NLog.config」ファイルは、以下の3つの主要なセクションから構成されています。

  • 変数 <variable>
  • ターゲット <targets> → ログの出力先
  • ルール <rules> → どのログレベルをどこに記録するか

変数 <variable>の設定方法

設定ファイル(NLog.config)内でよく使う値を変数として定義し、再使用するための機能。
ログの出力先フォルダ名やファイル名などを変数化することで、メンテナンス性・可読性が向上する。

■基本構文

<variable name="変数名" value="値"/>

■具体例

  • 下記の様に定義した変数は、NLog.configファイル内で ${logDir} のように参照できます。
<variable name="logDir" value="logs" />

■よく使用する変数パターン

変数名用 途 例
logDirログの出力先ディレクトリ
appNameアプリケーション名(ファイル名に使用)
logLevel出力ログのレベルに応じたファイル名などに応用可

ターゲット <targets>の設定方法

ターゲットは、「ログの出力先(どこにログを書き出すか)」を定義するセクションです。

ログの出力先はファイル、コンソール、データベース、メール、デバッグウィンドウなど多岐にわたり、それらを「ターゲット」と呼びます。

■基本構文

下記は、「xsi:type=”File”」で出力先をファイルとし、「fileTarget」という識別名で、log.txt ファイルに ログを出力するターゲットを定義しています。

  • type:出力先
  • name:定義した本<targets>の識別名
  • fileName:出力先が、”File” の場合のログファイル名称
  <targets>
    <target xsi:type="File" name="fileTarget" fileName="log.txt" />
  </targets>

■よく使われるターゲット(出力先)の種類

種別(xsi:type)説 明
Fileログをファイルに書き出す
Consoleコンソールにログを出力(.NET コンソールアプリ向け)
DebugVisual Studio の「出力ウィンドウ」にログを出力
TraceSystem.Diagnostics.Trace.WriteLine に出力
EventLogWindows のイベントログに出力
Mailメールでログを送信(SMTP設定必要)
Null出力を捨てる(開発時のテスト用)

■具体例(File)

  • 変数<variable>との関係も併せて説明
<variable name="logDir" value="logs" />
<targets>
  <target xsi:type="File"
          name="fileTarget"
          fileName="${logDir}/app.log"
          layout="${longdate}|${level}|${logger}|${message}" />
</targets>
  • fileName:出力ファイル名(変数値を使用したので出力先は、”logs/app.log” となる)
    ${logDir}を使用する事で、ログの出力先を一括で変更できる。
  • layout: ログの出力フォーマット(テンプレート文字列)
  • Fileの出力例
2025-06-05 20:00:00.0000|INFO|MyApp.Main|アプリ起動

■具体例(Debug)

Visual Studio の「出力ウィンドウ」にログが表示されるので、開発中の動作確認に便利です。

<targets>
  <target xsi:type="Debug"
          name="debugTarget"
          layout="${longdate}|${message}" />
</targets>

■layout のカスタマイズ

layout 属性では、以下のような変数を使ってログ出力内容を柔軟に構成できます。

変数内 容
${longdate}日時(yyyy-MM-dd HH:mm:ss.ffff)
${level}ログレベル(INFO, DEBUG など)
${logger}ロガー名(通常はクラス名)
${message}実際のログメッセージ
${exception}例外内容(あれば)

ルール<rules>の設定方法

<rules>はどのログレベルをどこに記録するか を定義します。

■基本構文

下記のサンプルは、後で「writeTo」を説明する為に<targets>も含めています。

<targets>
    <target xsi:type="File" name="filelog" fileName="${logdir}/logs/${shortdate}.log"
        layout="${longdate} ${uppercase:${level}} ${message}" />
	
	<target xsi:type="Console" name="consolelog"
		layout="${longdate} ${uppercase:${level}} ${message}" />      
</targets>

<rules>
    <logger name="*" minlevel="Info" writeTo="filelog,consolelog" />
</rules>
  • name
    • <targets>で指定するnameの名称を指定する。name=”*” は、全ての<targets>に適用
  • minlevel
    • どのレベル以上のログを記録するかを指定
      • minlevel=”Info”は、”Info”,”Warn”,”Error”,”Fatal”レベルを出力する。
順位レベル機 能
1Traceさらに詳細な内部ログ(通常は不要)
2Debug開発・トラブルシュート用。ほぼすべての情報を出力。
3Info通常の動作情報
4Warn警告(問題の可能性あり)
5Errorエラー(処理に問題あり)
6Fatal致命的なエラー(即時対応が必要)
  • writeTo
    • ログの出力先を指定 する為、<target>で定義されている name の名称を指定します。サンプルでは、”filelog,consolelog” と指定している為、ログファイルとコンソールの両方に出力します。

Visual Studio C# NLog 動作確認

本ブログで使用した「NLog.config」を使用して、実際に以下の簡単なコンソールアプリをReleaseモードで動かしてみました。

// See https://aka.ms/new-console-template for more information

using NLog;

namespace Console_Test
{
    class Program
    {
        // ロガーを定義(クラススコープで静的に)
        private static readonly Logger logger = LogManager.GetCurrentClassLogger();

        static void Main(string[] args)
        {
            try
            {
                logger.Trace("Trace:トレースログ ログに表示されない。");
                logger.Debug("Debug:デバッグログ ログに表示されない。");
                logger.Info("Info:テストプログラムが開始しました。");
                logger.Warn("Warn:警告エラーメッセージ");

                for (int i = 0; i < 10; i++)
                {
                    int doubled = i * 2;
                    logger.Info($"NLog ループ {i}:2 倍の値 = {doubled}");
                }

                // 故意に例外を発生させるためのコード
                int val_1 = 10;
                int val_2 = 0;
                int result = val_1 / val_2; 
            }
            catch (Exception ex)
            {
                // 例外が発生した場合はエラーログを記録
                logger.Error(ex, "Error:アプリケーションでエラーが発生しました");
                logger.Fatal(ex, "Fatal:アプリケーションで致命的なエラーが発生しました");
            }
            finally
            {
                // アプリケーション終了時のログ
                logger.Info("アプリケーション終了が終了しました");
            }  
        }
    }
}

下記の出力結果を見ると、想定通りに動作した事が確認できました。

  • TraceとDebugレベルのメッセージは表示されない
  • コンソールとログファイルの両方に出力された

■コンソール画面への出力結果

■ログファイルへの出力結果

「Visual Studio C#」 NLog まとめ

NLogはXML設定ファイルを使った構成が得意でリリース後にログ設定を変更し易い為、長期運用されるシステムでの使用が今後も続くでしょう。

NLogと同様にC#のログ記録ライブラリとして広く使われているライブラリに、Serilogがあります。こちらはSerilogはクラウド環境や構造化ログを活用するプロジェクトで人気があります。

最近では、Serilogの採用が増えている傾向があるようですが、用途によって適したライブラリを選択する事が重要です。

Serilogについては「Serilogの使用方法を徹底解説」を御覧ください。

タイトルとURLをコピーしました