オープンソースのロギング・サービス「log4net」
メニューのツール > Nugetパッケージ マネージャー > ソリューションのNugetパッケージ管理から、オンラインで「log4net」を検索して、該当プロジェクトへインストールする。
AssemblyInfo.vbに下記の設定をしないと、ログが出力されてこない。
'App.configに設定した場合 <Assembly: log4net.Config.XmlConfigurator(Watch:=True)> '外部ファイルにして使用する場合 <Assembly: log4net.Config.XmlConfigurator(ConfigFile:="Log4net.xml", Watch:=True)>
C#の場合
//App.configに設定した場合 [assembly: log4net.Config.XmlConfigurator(Watch = true)] //外部ファイルにして使用する場合 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.xml", Watch = true)]
log4netで例外エラーが発生する場合に確認するポイント
log4net.dllを参照後、App.configにlog4netの設定を記述してデバッグログ出力しようとしたら「構成システムを初期化できませんでした。」と例外エラーが発生しました。
App.configのconfigSectionsタグ内に下記の定義を行う。
※AssemblyInfoとセットなので、これをしないと「構成システムを初期化できませんでした。」の例外エラーとなる。
<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections>
App.configのlog4netの定義を行う。
「Test」というアプリケーション名にした場合
下記の設定内容では、Test.exe直下にlogフォルダが作成され、Test_yyyyMMdd.logのファイルが出力される。
アプリケーション名が不要の場合、下記の設定で実行ファイルのフォルダ直下に自動でlogフォルダに、yyyyMMdd.logのファイルが出力される。
<!-- 作成するログファイル --> <param name="File" value="log\" /> <datePattern value='yyyyMMdd".log"' />
【ログの中身】
2016/09/23 17:25:50 [INFO ] テスト
<log4net> <!-- ===================================================================== --> <!-- ログ出力先の設定(アペンダーの設定) --> <!-- ===================================================================== --> <!-- ▼ファイル出力用[RollingFileAppender](日付や時刻の制約に基づいたログファイルの生成) --> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="Encoding" value="utf-8" /> <!-- 作成するログファイル --> <param name="File" value=".\log\Test" /> <!-- 追記する場合true/上書きする場合false --> <param name="AppendToFile" value="true" /> <!-- ログを新規ファイルに切替える条件 --> <rollingStyle value="Date" /> <!-- ログファイル名を固定にするか --> <staticLogFileName value="false" /> <!-- rollingStyleがdateまたはCompositeの際にファイル名に付与される文字列 --> <datePattern value='"_"yyyyMMdd".log"' /> <!-- ローテして残しておくログファイル数 --> <MaxSizeRollBackups value="-1" /> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!-- ログの書式 --> <layout type="log4net.Layout.PatternLayout"> <ConversionPattern value="%date{yyyy/MM/dd HH:mm:ss} [%-5p] %m%n" /> </layout> </appender> <!-- ===================================================================== --> <!-- ログ出力の対象レベルと出力先の設定 --> <!-- ===================================================================== --> <root> <!-- 警告以上のログを出力したい場合 --> <!-- ALL > DEBUG > INFO > WARN > ERROR > FATAL --> <level value="INFO" /> <!-- 出力タイプの指定(ファイルへ出力) --> <appender-ref ref="RollingFileAppender" /> </root> </log4net>
AssemblyInfoの代わりに、Global.aspx に定義を行う。
※但し、ログ設定を別ファイルにする場合は、AssemblyInfo に記述する。
App.configの代わりにWeb.Configに設定を追加する。
【ASP.NET MVC5】log4net の導入手順メモ♪
指定したlogsフォルダはWeb.configと同じ階層に作成される。
protected void Application_Start() { log4net.Config.XmlConfigurator.Configure(); AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); }
<configSections> <!-- log4netセクションのハンドラ設定 --> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections> <log4net> <!-- ===================================================================== --> <!-- ログ出力の対象レベルと出力先の設定 --> <!-- ===================================================================== --> <root> <!-- ログのレベルを指定 --> <!-- ALL > DEBUG > INFO > WARN > ERROR > FATAL --> <level value="ALL"/> <!-- どのログ出力先を使用するか --> <appender-ref ref="RollingFileAppender"/> </root> <!-- ===================================================================== --> <!-- ログ出力先の設定(アペンダーの設定) --> <!-- ===================================================================== --> <!-- ▼ファイル出力用[RollingFileAppender](日付や時刻の制約に基づいたログファイルの生成) --> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="Encoding" value="utf-8"/> <!-- ファイル名 --> <param name="File" value="logs\"/> <!-- 追記する場合true/上書きする場合false --> <param name="AppendToFile" value="true"/> <!-- 日付や時刻の制約によるログファイルの切替 --> <param name="RollingStyle" value="Date"/> <!-- 上から「毎月、毎週、毎日、半日、毎時、毎分」の設定(デフォルトは毎時) --> <param name="DatePattern" value='""yyyyMMdd".log"'/> <param name="StaticLogFileName" value="false"/> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/> </layout> </appender> </log4net>
プログラムでログ出力する場合
Imports log4net ' loggerを生成する(以下の記述は、ほとんどのコードで利用できる) Private _logger As ILog = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType) _logger.Debug("開発中のデバッグ/トレースに使用する") _logger.Info("情報(操作履歴等)") _logger.Warn("注意/警告(障害の一歩手前)") _logger.Error("システムが停止するまではいかない障害が発生") _logger.Fatal("システムが停止する致命的な障害が発生")
C#の場合
// loggerを生成する(以下の記述は、ほとんどのコードで利用できる) using log4net; private ILog _logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); _logger.Debug("開発中のデバッグ/トレースに使用する"); _logger.Info("情報(操作履歴等)"); _logger.Warn("注意/警告(障害の一歩手前)"); _logger.Error("システムが停止するまではいかない障害が発生"); _logger.Fatal("システムが停止する致命的な障害が発生");
とあるシステムで発生している。最後まで出力されたり途中で止まっていて不安定。
Log4Net は、何か問題が発生してアペンダーに書き込めない場合、黙って失敗します。
これは実際には良いことです。ロギングに少し失敗しても、正常なシステムがダウンすることはないからです。
最善の策は、log4net の内部ログを有効にして診断を行い、(できれば) 失敗の原因を突き止めることです。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="log4net.Internal.Debug" value="true"/> </appSettings> </configuration>
これにより送信される内部ログがオンになる。System.Diagnostics.Traceため、以下を追加できます。
<configuration> ... <system.diagnostics> <trace autoflush="true"> <listeners> <add name="textWriterTraceListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\temp\log4net.txt" /> </listeners> </trace> </system.diagnostics> ... </configuration>
出力されたログにはタイムスタンプが付いていない。プルリクエストがあったが、放棄されたようだ。
CountDirection:ローテの連番をどの様に振るか。
xxxx.log.1 というように拡張子の後ろに連番が付く。ファイル名を日パターンにしても同様。
.NET 向けのオープンソースのログツールである。
C#における構造化ログの手法、そしてデータ可視化のためのDomoの薦め
ログの扱いといったところで、「ロガーをlog4netにするかNLogにするか」というレベルにとどまっているのではないでしょうか?
ログはテキストでは取り扱わず.NET 4.5から追加されたEventSourceクラスを用い、ETW(Event Tracing for Windows) を経由して、Semantic Logging Application Block(SLAB)のOut-of-Processサービスで処理しています。