プログラムの実行状態をログで記録したいという場合には、ログの数が少ないうちは StreamWriter を使って自作してもそれほど手間はかからないのですが、Web サイトでアクセス数が多くなってくると、少なくとも次の2点を考慮する必要がでてきます。

  • ファイルが大きくなり過ぎないように、ログファイルのローテートをする。
  • 同時アクセスがあった場合の対応が必要である。

それではということで、ロギングライブラリーを探してみたら、C#用には、NLogLog4Net というライブラリーがありました。比較すると NLog の方が活動が活発で使い方も簡単そうだったので、NLog を使うことにしました。

ソースコードとマニュアルは、GitHub にホストされています。マニュアルによると、ログの出力先にはファイルだけでなく、データベースやメールやWebサービスが選択できます。重大な障害が発生したときには、メールで通知できるのは便利ですね。

Visual Studio へのインストールには NuGet が利用できます。NuGet パッケージの管理で NLog で検索すると以下のようなパッケージが表示されます。NLog には多くの拡張パッケージがあって多くのところで利用されているのがわかります。NuGet では NLog だけでなく、NLog Configuration もインストールします。

image

インストールが完了すると、NLog.config という設定ファイルのひな形が以下のように作成されています。ひな形をみれば、NLog.config では、ターゲット(targets)とルール(rules)を設定をしたらいいということのようです。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <!–
  See http://nlog-project.org/wiki/Configuration_file
  for information on customizing logging rules and outputs.
   –>
  <targets>
    <!– add your targets here –>
   
    <!–
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    –>
  </targets>

  <rules>
    <!– add your logging rules here –>
   
    <!–
    <logger name="*" minlevel="Trace" writeTo="f" />
    –>
  </rules>
</nlog>

通常のログファイルだったらひな形がそのまま使えます。ターゲットが複数利用できるので、メール用のターゲットとルールを以下のように追加すると致命的エラーの時にメールを送るようにすることができます。

ターゲットの追加

<target xsi:type="Mail" name="m"
    subject="エラーの発生"
    from=admin@example.com
    to="niji@yniji.net"
    header="エラーが発生しました。${newline}"
    body="${message}"
    smtpServer="mail.example.com"
    smtpPort="587"
    smtpUserName=admin@example.com 
    enableSsl=”False” 
    smtpPassword="password"
    smtpAuthentication=”Basic” />

ルールの追加

<logger name="*" minlevel="Fatal" writeTo="m" />

ログを出力するコードを書くのは比較的簡単で、ASP.NET MVC の場合であれば、モデルに次のようなルーチンを作っておけば、他のモデルやコントローラーから呼び出して使えます。

using NLog;

public class LoggerClass
{
    private static Logger Logger = LogManager.GetCurrentClassLogger();

    public static void NLogInfo(string message)
    {
        Logger.Info(message);
    }

    public static void NLogFatal(string message)
    {
        Logger.Fatal(message);
    }
}

NLogを使うことで簡単にログを出力できるようになるので、現状のログに不満がある人は試してみてください。