今日はNLogを設定ファイルなしで使用する方法を紹介します。
NLogは、Log4netと双璧をなす.Net系のログ出力ライブラリです。
どちらも簡単にログ出力を行えます。
双方に共通することですが、
基本的にライブラリ(dll)と、設定ファイル(config)で構成されいて、
dllが内部的にconfigの値をロードして動作します。
しかしconfigがない方が都合が良いケースもあります。
※1のケースでは、configを使用しないだけでなく、ILMergeを使用して、dllをexeに埋め込む必要があります。
【.net】dllをexeに埋め込む方法
当記事では、NLogを設定ファイルなしで利用する方法にフォーカスします。
NuGet パッケージマネージャーから下記の項目をインストールします。
エントリポイントとなる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を作成後に、下記の設定を行ってください。
プロジェクトの設定 ⇒ アプリケーション
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, "起動時エラー");
}
}
}
}
ご静聴ありがとうございました。