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.Program
や MyApp.MainForm
というクラス名が記録されているため、どのクラスの処理で発生したログなのかが一目でわかります。
2025-03-24 12:00:00|INFO|MyApp.Program|Mainメソッド開始
2025-03-24 12:00:01|INFO|MyApp.MainForm|コンストラクタ
この情報は、デバッグやトラブルシューティングの際に特に有用であり、問題の特定を迅速に行う助けとなります。適切なログ出力を行うことで、アプリケーションの可視性を向上させ、保守性を高めることができます。