文書の過去の版を表示しています。
ログ出力
log4net
オープンソースのロギング・サービス「log4net」
導入
メニューのツール > Nugetパッケージ マネージャー > ソリューションのNugetパッケージ管理から、オンラインで「log4net」を検索して、該当プロジェクトへインストールする。
Winフォームでの設定
AssemblyInfo
AssemblyInfo.vbに下記の設定をしないと、ログが出力されてこない。
- AssemblyInfo.vb
'App.configに設定した場合 <Assembly: log4net.Config.XmlConfigurator(Watch:=True)> '外部ファイルにして使用する場合 <Assembly: log4net.Config.XmlConfigurator(ConfigFile:="Log4net.xml", Watch:=True)>
C#の場合
- AssemblyInfo.cs
//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
App.configのconfigSectionsタグ内に下記の定義を行う。
※AssemblyInfoとセットなので、これをしないと「構成システムを初期化できませんでした。」の例外エラーとなる。
- App.config
<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 ] テスト
- App.config
<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>
ASP.NETでの設定
AssemblyInfoの代わりに、Global.aspx に定義を行う。 ※但し、ログ設定を別ファイルにする場合は、AssemblyInfo に記述する。 App.configの代わりにWeb.Configに設定を追加する。
Global.aspx
- Global.aspx.cs
protected void Application_Start() { log4net.Config.XmlConfigurator.Configure(); AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); }
Web.Config
- Web.Confog
<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>
プログラムに組み込む
プログラムでログ出力する場合
- frmMain.vb
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#の場合
- frmMain.cs
// loggerを生成する(以下の記述は、ほとんどのコードで利用できる) using log4net; private ILog _logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); _logger.Debug("開発中のデバッグ/トレースに使用する"); _logger.Info("情報(操作履歴等)"); _logger.Warn("注意/警告(障害の一歩手前)"); _logger.Error("システムが停止するまではいかない障害が発生"); _logger.Fatal("システムが停止する致命的な障害が発生");
NLog
.NET 向けのオープンソースのログツールである。
その他
C#における構造化ログの手法、そしてデータ可視化のためのDomoの薦め
ログの扱いといったところで、「ロガーをlog4netにするかNLogにするか」というレベルにとどまっているのではないでしょうか?
ログはテキストでは取り扱わず.NET 4.5から追加されたEventSourceクラスを用い、ETW(Event Tracing for Windows) を経由して、Semantic Logging Application Block(SLAB)のOut-of-Processサービスで処理しています。