ということをやりました。しかしあれですわ…こういう系は相変わらず公式のドキュメント以外の情報がほとんどない…

log4netとどっちを使うかで少し迷ったのですが下記の理由でNLogを使うことにしました。
なお、たいしてまともに比較していないので以下はあくまで全部個人的な主観です。

  • 開発が活発そう & オープン
  • サポートしてるプラットフォームが多い
  • ドキュメントが見やすい

環境


お約束の環境。今回は以下でやってます。

  • .NET Framework 4.6
  • NLog 4.4.2

インストール


お約束通り、Nugetでインストールします。

設定


この辺を見ながら設定します。どこに書けば良いかというと、アプリケーション構成ファイルです。いわゆるApp.configです。ASP.NETの場合はたぶんweb.configです。ASP.NETやったことないですが。

で、ここの<configurations>という要素の中に、下記を記述します。これを書かないとTypeInitializationExceptionが出ます。

1
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>

次に<configuration>要素内に細かい出力設定を記述していきます。今回は下記のように出力するように設定してみました。

  • エラーとそれ以外のログを別ファイルにする
  • UTF-8
  • 改行はLF(個人的にCRLFが嫌い)
  • 長い日付形式で出す
  • 実行されたクラス・メソッドを出力する
  • 1日ごとに別のファイルに出力する
  • 7日間でローテーションする

実際にこれらの設定を書いたApp.configは下記のようなになります。この辺の出力設定はこのドキュメントを参考にしました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="event"
xsi:type="File"
encoding="UTF-8"
lineEnding="LF"
layout="[${longdate}] [${uppercase:${level:padding=5}}] ${message} - ${callsite}() ${exception:format=tostring}"
fileName="${basedir}/logs/event.log"
archiveNumbering="Date"
archiveFileName="${basedir}/logs/archive/{#}-event.log"
archiveEvery="Day" archiveDateFormat="yyyyMMdd"
maxArchiveFiles="7"/>
<target name="error"
xsi:type="File"
encoding="UTF-8"
lineEnding="LF"
layout="[${longdate}] [${uppercase:${level:padding=5}}] ${message} - ${callsite}() ${exception:format=tostring}"
fileName="${basedir}/logs/error.log"
archiveNumbering="Date"
archiveFileName="${basedir}/logs/archive/{#}-error.log"
archiveEvery="Day" archiveDateFormat="yyyyMMdd"
maxArchiveFiles="7"/>
</targets>
<rules>
<logger name="*" levels="Info,Warn" writeTo="event"/>
<logger name="*" levels="Error,Fatal" writeTo="error"/>
</rules>
</nlog>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/>
</startup>
</configuration>

特別説明することはないのですが<rules>要素でどのログレベルでどのファイルに出力するか記述しています。
うん…これ以上書くことないな…xmlに全部書いてあるし…

コードを書く


出力できるかどうか確認するためにコードを書いていきます。下記のようなクラスを作ります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using NLog;

public class LogTest
{
private Logger _logger = LogManager.GetCurrentClassLogger();

public void Logging()
{
try
{
_logger.Info("情報ログ");
_logger.Warn("警告ログ");
_logger.Error("エラーログ");
throw new Exception("例外");
}
catch (Exception ex)
{
_logger.Log(LogLevel.Fatal, ex, "例外発生!!");
}
}
}

次にエントリーポイント内で前述のクラスのメソッドを呼び出すように記述します。

1
2
3
4
5
6
7
8
public class Program
{
public static void Main(string[] args)
{
LogTest logtest = new LogTest();
logtest.Logging();
}
}

実行してみる


今回はログレベルに応じてファイルを分けているので、実行すると2つのログファイルにそれぞれ下記のように出力されます。

1
2
3
//以下は/logs/event.logに記述される
[2017-02-09 17:51:08.2323] [ INFO] 情報ログ - LogTest.Logging()
[2017-02-09 17:51:08.2674] [ WARN] 警告ログ - LogTest.Logging()
1
2
3
4
//以下は/logs/error.logに記述される
[2017-02-09 17:52:14.9115] [ERROR] エラーログ - LogTest.Logging()
[2017-02-09 17:52:14.9446] [FATAL] 例外発生!! - LogTest.Logging() System.Exception: 例外
場所 LogTest.Logging() 場所 D:\develop\NLogSample\NLogSample\LogTest.cs:行 15

その他


実は日付を変えたら異なる日付でアーカイブができるところまでは確認しましたが、ローテーションできるかどうかまでは確認してないのです。たぶんできるんだとおもいます。