0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C#からNLogを利用する方法についてのメモ

0
Last updated at Posted at 2026-06-24

前書き

久しぶりにNLogを使おうとしたらバージョン6になっていて結構変わっているようだったから、メモとして記録。

実装環境

OS: Windows 11(25H2)
Visual Studio: Professional 2022(Version 17.14.33)
C#ターゲットフレームワーク: .NET 9.0
NLog: 6.1.1

実装コード

Program.cs全体

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());
        }
    }
}

これが新規プロジェクトを作成した際に作成されるコードそのままの状態。
それに対していろいろ追加したコードがこちら。

Program.cs
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.DependencyInjectionMicrosoft.Extensions.Hostingを追加して、NLog本体NLog.Extensions.Loggingも追加している。
汎用ホストを利用しないのであればNLog.Extensions.Loggingはいらないはず。

Main内は主に汎用ホストやDIに関する設定で、LogSettingメソッド内にNLogの設定をまとめている。

Form1.cs

Form1のコードはこちら。

Form1.cs
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 = "...",

というように設定した場合が静的アーカイブロジックに該当するらしい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?