ロギングのライブラリ、log4net を使う理由
ログのライブラリを使う理由は、次の2つです。
- ファイルのロック、排他制御をしてくれる
- 自動的にローテーションをしてくれる
log4net と NLog の2種類がメジャーなようです。
- log4net の方が歴史が長く、インターネット上の知見が多い。
- log4net の方が「枯れた技術」となっていそう。
- NLog の方が更新されている。
- NLog の方がパフォーマンスが優れている、というページがある。
今回は、歴史とノウハウが大きいという理由で log4net を採用いたしました。
では早速導入手順を残してまいります。2種類のやり方を解説いたします。
どちらもASP.NET MVC5 プロジェクトを作成し、アクティブになっている状態からスタートです♪
【log4net を ASP.NET MVC5 プロジェクトに導入する方法1】Web.config にログ設定を書くやり方
プロジェクト直下に作成される Web.config ファイルにログ設定を書く方法となります。Views\Web.config ではありませんので、注意です♪
1-1. log4net インストール
パッケージマネージャーコンソールから操作します。
Install-Package log4net
1-2. 設定の読み込み設定
Application_Start 関数の冒頭に追加いたしました。最初に追加いたしましたけれども、関数内であればどこでも問題ないと思います。
Global.asax.cs
protected void Application_Start() { log4net.Config.XmlConfigurator.Configure(); AreaRegistration.RegisterAllAreas(); ... 略 ... }
1-3. 設定ファイルを編集して設定を追加
Web.config に追記して log4net を設定していきます。
設定項目の詳細については、次のページが参考になりました♪
- Apache log4net – Apache log4net: Config Examples の RollingFileAppender 部分
<configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="App_Data/log4net/access.log" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="LogFileAppender" /> </root> </log4net> ... 略 ... </configuration >
【log4net を ASP.NET MVC5 プロジェクトに導入する方法2】ログ設定を別ファイルに書くやり方
プロジェクト直下に、log4net.config というログ設定ファイルを作成しこれを読み込むやり方となります。
2-1. log4net インストール
これは同じです。パッケージマネージャーコンソールから操作します。
Install-Package log4net
2-2. 設定の読み込み設定
ファイルが異なり、AssemblyInfo.cs となります。最後に次のコードを追記いたします。
ここでログの設定ファイルを指定することとなります。
Properties\AssemblyInfo.cs
[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = true)]
2-3. 設定ファイルを作成して設定を追加
プロジェクト直下に、log4net.config というログ設定ファイルを作成して次の設定を書きました。
設定項目の詳細については、先程と同様に本家ページを参照くださいませ。
- Apache log4net – Apache log4net: Config Examples の RollingFileAppender 部分
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="App_Data/log4net/access.log" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="LogFileAppender" /> </root> </log4net> </configuration >
log4net の 2 種類の導入方法は以上です。次はいよいよログが記録できるかどうか確かめていきます!
動作確認
手っ取り早く確認しようと思いますので、適当なコントローラークラスの Index アクションに書いてみました。
- クラスのプロパティとしてロガーを宣言。、
log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
と書く。 - クラス内で
logger.Debug("ログメッセージ");
などとと書いて使用する。
Controllers\HomeController.cs
... 略 ... public class HomeController : Controller { log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public ActionResult Index() { logger.Debug("Debug: 開発用のデバッグメッセージ"); logger.Info("Info: 操作ログなどの情報"); logger.Warn("Warn: 障害ではない注意警告"); logger.Error("Error: システム停止はしないが、問題となる障害"); logger.Fatal("Fatal: システム停止するような致命的な障害"); return View(); } ... 略 ... }
ログファイルを見てみますと、次のように記録されておりました♪
2015-10-17 14:06:04,124 [53] DEBUG Sample1.Controllers.HomeController [(null)] – Debug: 開発用のデバッグメッセージ
2015-10-17 14:06:04,136 [53] INFO Sample1.Controllers.HomeController [(null)] – Info: 操作ログなどの情報
2015-10-17 14:06:04,136 [53] WARN Sample1.Controllers.HomeController [(null)] – Warn: 障害ではない注意警告
2015-10-17 14:06:04,136 [53] ERROR Sample1.Controllers.HomeController [(null)] – Error: システム停止はしないが、問題となる障害
2015-10-17 14:06:04,137 [53] FATAL Sample1.Controllers.HomeController [(null)] – Fatal: システム停止するような致命的な障害
おわりに
ログが出るようになったのはよいのですけれども、このログファイル書き込みをリアルタイムで監視する方法はないのかしら?実行前にログを閉じて、実行して、ログファイルを開いて、、、と確認するのは面倒ですの!
それはともかく、今回の導入にあたって「log4net blog」「aspx log4net」などで検索して調べました。
次のページが参考になりました。ありがとう存じます!
- Apache log4net – Apache log4net: Home
- NuGet Gallery | log4net [1.2.13] 2.0.3
- ASP.NET MVC loggingは、NLogがベスト
- aspxページ内(ASP.NET)でログ出力を行う方法(log4net編) | Pa-kun plus idea
また、以下は ASP.NET ではなく .NET 用のようで、参考にはなりましたけれども導入のためにそのままは使えませんでした。しばらく違いに気が付かず、時間を使ってしまいました><。
- いまさら聞けない「log4net」の使い方 – C# Windowsプログラマだけど・・・
- C#でログを残したい時の方法「log4netを使ってみる」 – Kamuycikap – SentenceDataBase
以上です。