プログラムの実行状態をログで記録したいという場合には、ログの数が少ないうちは StreamWriter を使って自作してもそれほど手間はかからないのですが、Web サイトでアクセス数が多くなってくると、少なくとも次の2点を考慮する必要がでてきます。
- ファイルが大きくなり過ぎないように、ログファイルのローテートをする。
- 同時アクセスがあった場合の対応が必要である。
それではということで、ロギングライブラリーを探してみたら、C#用には、NLog と Log4Net というライブラリーがありました。比較すると NLog の方が活動が活発で使い方も簡単そうだったので、NLog を使うことにしました。
ソースコードとマニュアルは、GitHub にホストされています。マニュアルによると、ログの出力先にはファイルだけでなく、データベースやメールやWebサービスが選択できます。重大な障害が発生したときには、メールで通知できるのは便利ですね。
Visual Studio へのインストールには NuGet が利用できます。NuGet パッケージの管理で NLog で検索すると以下のようなパッケージが表示されます。NLog には多くの拡張パッケージがあって多くのところで利用されているのがわかります。NuGet では NLog だけでなく、NLog Configuration もインストールします。
インストールが完了すると、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を使うことで簡単にログを出力できるようになるので、現状のログに不満がある人は試してみてください。