.net

【.net】設定ファイルなしでNLogを使用する

今日はNLogを設定ファイルなしで使用する方法を紹介します。

NLogは、Log4netと双璧をなす.Net系のログ出力ライブラリです。
どちらも簡単にログ出力を行えます。

双方に共通することですが、
基本的にライブラリ(dll)と、設定ファイル(config)で構成されいて、
dllが内部的にconfigの値をロードして動作します。

しかしconfigがない方が都合が良いケースもあります。

  1. exe単体で実行したい場合
  2. 設定値を基本的に変更しない場合

※1のケースでは、configを使用しないだけでなく、ILMergeを使用して、dllをexeに埋め込む必要があります。
【.net】dllをexeに埋め込む方法

当記事では、NLogを設定ファイルなしで利用する方法にフォーカスします。


Visual StudioでNLogを使うには

NuGet パッケージマネージャーから下記の項目をインストールします。

  • NLog


サンプルソース

エントリポイントとなるMain()でLoggerの初期化を行っています。

c#版


using System;
using System.Windows.Forms;
using NLog;
using NLog.Config;
using NLog.Targets;

namespace NLogNoConfigSample
{
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            InitializeLogger();

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        /// <summary>
        /// Logger初期化
        /// </summary>
        private static void InitializeLogger()
        {
            var conf = new LoggingConfiguration();
            // ファイル出力定義
            var file = new FileTarget("file");
            file.Encoding = System.Text.Encoding.GetEncoding("shift-jis");
            file.Layout = "${longdate} [${threadid:padding=2}] [${uppercase:${level:padding=-5}}] ${callsite}() - ${message}${exception:format=ToString}";
            file.FileName = "${basedir}/logs/sample_${date:format=yyyyMMdd}.log";
            file.ArchiveNumbering = ArchiveNumberingMode.Date;
            file.ArchiveFileName = "${basedir}/logs/sample.log.{#}";
            file.ArchiveEvery = FileArchivePeriod.None;
            file.MaxArchiveFiles = 10;
            conf.AddTarget(file);
            conf.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, file));

            // イベントログ出力定義 ※ただし初回は管理者として実行しないとSourceの登録ができない
            var eventlog = new EventLogTarget("eventlog");
            eventlog.Layout = "${message}${newline}${exception:format=ToString}";
            eventlog.Source = "NLogNoConfigSample";
            eventlog.Log = "Application";
            eventlog.EventId = "1001";
            conf.AddTarget(eventlog);
            conf.LoggingRules.Add(new LoggingRule("*", LogLevel.Error, eventlog));

            // 設定を反映する
            LogManager.Configuration = conf;
        }
    }
}


続いてvb版
※vbの場合は、エントリポイントの変更が必要になるため、
Program.vbを作成後に、下記の設定を行ってください。

プロジェクトの設定 ⇒ アプリケーション

  • [アプリケーション フレームワークを有効にする]をOFF
  • [スタートアップ オブジェクト]を「Program」に変更

Imports NLog
Imports NLog.Config
Imports NLog.Targets

Public Class Program

    ''' <summary>
    ''' アプリケーションのメイン エントリ ポイントです。
    ''' </summary>
    <STAThread()>
    Shared Sub Main()
        InitializeLogger()

        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)
        Application.Run(New Form1())
    End Sub

    ''' <summary>
    ''' Logger初期化
    ''' </summary>
    Private Shared Sub InitializeLogger()
        Dim conf = New LoggingConfiguration()
        ' ファイル出力定義
        Dim file = New FileTarget("file")
        file.Encoding = System.Text.Encoding.GetEncoding("shift-jis")
        file.Layout = "${longdate} [${threadid:padding=2}] [${uppercase:${level:padding=-5}}] ${callsite}() - ${message} ${exception:format=ToString}"
        file.FileName = "${basedir}/logs/sample_${date:format=yyyyMMdd}.log"
        file.ArchiveNumbering = ArchiveNumberingMode.[Date]
        file.ArchiveFileName = "${basedir}/logs/sample.log.{#}"
        file.ArchiveEvery = FileArchivePeriod.None
        file.MaxArchiveFiles = 10
        conf.AddTarget(file)
        conf.LoggingRules.Add(New LoggingRule("*", LogLevel.Debug, file))

        ' イベントログ出力定義 ※ただし初回は管理者として実行しないとSourceが登録できない
        var eventlog = new EventLogTarget("eventlog");
        eventlog.Layout = "${message}${newline}${exception:format=ToString}";
        eventlog.Source = "NLogNoConfigSample";
        eventlog.Log = "Application";
        eventlog.EventId = "1001";
        conf.AddTarget(eventlog);
        conf.LoggingRules.Add(new LoggingRule("*", LogLevel.Error, eventlog));

        ' 設定を反映する
        LogManager.Configuration = conf
    End Sub

End Class

後は使用したいクラスで下記のように定義し、好きなように使用できます。


using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using NLog;

namespace NLogNoConfigSample
{
    public partial class Form1 : Form
    {
        /// <summary>Logger取得</summary>
        private Logger _logger = LogManager.GetCurrentClassLogger();
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            _logger.Info("起動");

            try
            {
                int zero = 0;
                int a = 2 / zero;
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "起動時エラー");
            }
        }
    }
}

ご静聴ありがとうございました。

コメントを残す

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