NLogを使った基本的なロギングの方法

NLogは、C#アプリケーションにおける強力で柔軟なロギングライブラリです。シンプルな設定で多様な出力先(ファイル、データベース、コンソールなど)にログを記録できるため、開発者にとって非常に便利です。本記事では、C#でのNLogの基本的な導入方法と初期設定、ログ出力の実装手順を解説します。

パッケージのインストール

.NET CLIインストール済みの環境で、次のコマンドを実行します。Visual Studioからは開発者用 PowerShellから入力できます。

dotnet add package NLog
dotnet add package NLog.Config
dotnet add package NLog.Extensions.Logging

設定ファイルの作成

次に設定ファイル(NLog.config)を作成します。インストール時にプロジェクトのトップディレクトリにユーザディレクトリにある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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">

  <!-- optional, add some variables
  https://github.com/nlog/NLog/wiki/Configuration-file#variables
  -->
  <variable name="logDirectory" value="C:\logs\${shortdate}"/>

  <!--
  See https://github.com/nlog/nlog/wiki/Configuration-file
  for information on customizing logging rules and outputs.
   -->
  <!-- ログの出力先(ターゲット)の定義 -->
  <targets>

    <!--
    add your targets here
    See https://github.com/nlog/NLog/wiki/Targets for possible targets.
    See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
    -->

    <!--
    Write events to a file with the date in the filename.
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    -->
    <target name="file" xsi:type="file" encoding="UTF-8"
            fileName="${logDirectory}/log.log"
            layout="${longdate},${level},${logger},${message}"
            archiveEvery="None"
            archiveFileName="${logDirectory}/logs-${shortdate}-{#}.log"
            archiveNumbering="Sequence"
            maxArchiveFiles="10"
            archiveAboveSize="10485760" />
    <target name="console" xsi:type="console" layout="${longdate}, ${level}, ${logger}, ${message}" />
  </targets>

  <!-- ログのルール(どのログレベルをどこに出力するか) -->
  <rules>
    <!-- add your logging rules here -->

    <!--
    Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f"
    <logger name="*" minlevel="Debug" writeTo="f" />
    -->
    <logger name="*" minlevel="Info" writeTo="file,console" />
  </rules>
</nlog>

targetの属性

上記でtargetに指定した属性の一部について、以下に説明します。これらの指定を行うことでログのローテーションが可能となります。

属性 内容
archiveEvery ログファイルを一定の時間間隔でアーカイブする条件を設定する
archiveFileName アーカイブされたログファイルの名前のフォーマットを定義する
archiveNumbering アーカイブファイルの番号付けの方式を指定し、連番や日付などを指定する
maxArchiveFiles 保存する最大アーカイブファイル数を設定し、古いファイルは自動的に削除される
archiveAboveSize 指定したサイズを超えた場合にログファイルをアーカイブする条件を設定する

ビルド後イベントに以下を追加します。

xcopy "$(ProjectDir)NLog.config" "$(TargetDir)" /Y

または、NLog.configのプロパティで、出力ディレクトリにコピーを常にコピーするに設定します。

NLogを使ったロギングの方法

各プログラムごとにLogManager.GetCurrentClassLogger() を使うと、NLogの設定(NLog.configによる設定)がアプリ全体で共通の出力先を使用するように動作します。つまり、アプリのすべてのクラスで GetCurrentClassLogger() を呼び出しても、共通のログ設定に従って出力されます

using NLog;

class Program {
    private static readonly Logger logger = LogManager.GetCurrentClassLogger();

    static void Main() {
        logger.Info("アプリケーションが起動しました");
        logger.Warn("これは警告メッセージです");
        logger.Error("エラーメッセージです");

        // アプリ終了時にNLogをシャットダウン
        LogManager.Shutdown();
    }
}

パラメータ指定の記述。

logger.Info("{0} {1} ", arg1, arg2);

動作の仕組み

LogManager.GetCurrentClassLogger() は、クラスごとに異なるロガー(Logger インスタンス)を取得するメソッドです。しかし、ログの出力先(targets)やルール(rules)はNLog.configファイルに従うため、すべてのファイルで共通のログ出力が可能になります。この仕組みにより、各クラスで個別のロギングを行いつつも、設定ファイルを通じて一元管理されたログ出力を実現できます。これにより、アプリケーション全体のロギング戦略を統一し、メンテナンスやトラブルシューティングを効率化することが可能です。

また、layout${logger}を利用することで、クラス名がログに出力されるため、ログの出所を明確に把握できるようになります。例えば、次のログ出力では MyApp.ProgramMyApp.MainForm というクラス名が記録されているため、どのクラスの処理で発生したログなのかが一目でわかります

2025-03-24 12:00:00|INFO|MyApp.Program|Mainメソッド開始
2025-03-24 12:00:01|INFO|MyApp.MainForm|コンストラクタ

この情報は、デバッグやトラブルシューティングの際に特に有用であり、問題の特定を迅速に行う助けとなります。適切なログ出力を行うことで、アプリケーションの可視性を向上させ、保守性を高めることができます。

このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です