前書き
久しぶりにNLogを使おうとしたらバージョン6になっていて結構変わっているようだったから、メモとして記録。
実装環境
OS: Windows 11(25H2)
Visual Studio: Professional 2022(Version 17.14.33)
C#ターゲットフレームワーク: .NET 9.0
NLog: 6.1.1
実装コード
Program.cs全体
namespace WinFormsApp1
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}
}
これが新規プロジェクトを作成した際に作成されるコードそのままの状態。
それに対していろいろ追加したコードがこちら。
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using NLog.Targets;
namespace WinFormsApp1
{
internal static class Program
{
internal static IHost? MyHost { get; private set; } = null;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
var builder = Host.CreateApplicationBuilder();
builder.Logging.ClearProviders().AddNLog(LogSetting(true));
builder.Services.AddSingleton<Form1>();
MyHost = builder.Build();
Application.Run(MyHost.Services.GetRequiredService<Form1>());
}
/// <summary>
/// NLogの設定
/// </summary>
/// <param name="fileOutput">true: ファイルへも出力する</param>
/// <returns></returns>
private static NLog.Config.LoggingConfiguration LogSetting(bool fileOutput = false)
{
var config = new NLog.Config.LoggingConfiguration();
// Visual Studioのデバッグへの出力
var logDebug = new NLog.Targets.DebuggerTarget("logDebug")
{
Layout = "${longdate} [${uppercase:${level}}] ${message}${exception:format=Message, Type, ToString:separator=\r\n}",
};
#if DEBUG
config.AddRule(NLog.LogLevel.Debug, NLog.LogLevel.Fatal, logDebug);
#else
config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, logDebug);
#endif
if (fileOutput)
{
var logfile = new FileTarget("logfile") // ファイルへの出力
{
FileName = "${basedir}/logs/${shortdate}.log",
Layout = "${longdate} [${uppercase:${level}}] ${message}${exception:format=Message, Type, ToString:separator=\r\n}",
MaxArchiveFiles = 10, // アーカイブ世代数
};
#if DEBUG
config.AddRule(NLog.LogLevel.Debug, NLog.LogLevel.Fatal, logfile);
#else
config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, logfile);
#endif
}
return config;
}
}
}
NuGetで、Microsoft.Extensions.DependencyInjectionやMicrosoft.Extensions.Hostingを追加して、NLog本体とNLog.Extensions.Loggingも追加している。
汎用ホストを利用しないのであればNLog.Extensions.Loggingはいらないはず。
Main内は主に汎用ホストやDIに関する設定で、LogSettingメソッド内にNLogの設定をまとめている。
Form1.cs
Form1のコードはこちら。
using Microsoft.Extensions.Logging;
namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1(ILogger<Form1> logger)
{
InitializeComponent();
_logger = logger;
_logger.LogDebug("Launch Application");
}
private readonly ILogger<Form1> _logger;
}
}
DIを利用して受け取ったILogger経由でNLogを呼び出している。
Windows Formsでの例だけど、WPFならApp.xaml.csから同じようにできるはず。試してないけど。試した。
NLogの設定
アーカイブの設定
古いログファイルを削除する設定。
NLogの説明によると、静的アーカイブロジックと動的アーカイブロジックを混在させないで、とある。
先のコードではFileTargetにFileName = "${basedir}/logs/${shortdate}.log"と指定しているため、日単位でファイルが作成される。
例)2026-06-01.log
これは動的アーカイブロジックに該当する。
一方、FileName = "${basedir}/logs/App.log"のようにファイル名が固定になる設定をした状態でFileTargetに
archiveEvery = FileArchivePeriod.Day,
archiveFileName = "...",
というように設定した場合が静的アーカイブロジックに該当するらしい。