====== ログ出力 ====== ===== log4net ===== オープンソースのロギング・サービス「log4net」\\ * [[http://www.atmarkit.co.jp/ait/articles/0712/25/news121.html|オープンソースのロギング・サービス「log4net」を使う ]] * [[http://sumurai993.hatenablog.com/entry/2015/07/23/072345|いまさら聞けない「log4net」の使い方]] * [[https://ameblo.jp/yukkov/entry-10473035979.html|log4net.dll 設定ファイル]] * [[http://kitunechan.hatenablog.jp/entry/2016/05/13/111711|コードだけでlog4netを使う]] * [[https://qiita.com/n-shima/items/31a98d182f0519249fd0|Log4Netは開発休止になったのか?]] ==== 導入 ==== メニューのツール > Nugetパッケージ マネージャー > ソリューションのNugetパッケージ管理から、オンラインで「log4net」を検索して、該当プロジェクトへインストールする。 ==== Winフォームでの設定 ==== === AssemblyInfo === AssemblyInfo.vbに下記の設定をしないと、ログが出力されてこない。 'App.configに設定した場合 '外部ファイルにして使用する場合 C#の場合\\ //App.configに設定した場合 [assembly: log4net.Config.XmlConfigurator(Watch = true)] //外部ファイルにして使用する場合 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.xml", Watch = true)] [[https://kazenetu.exblog.jp/19164776/|log4netで例外エラーが発生する場合に確認するポイント]]\\ log4net.dllを参照後、App.configにlog4netの設定を記述してデバッグログ出力しようとしたら「構成システムを初期化できませんでした。」と例外エラーが発生しました。 === App.config === App.configのconfigSectionsタグ内に下記の定義を行う。\\ ※AssemblyInfoとセットなので、これをしないと「構成システムを初期化できませんでした。」の例外エラーとなる。
App.configのlog4netの定義を行う。\\ 「Test」というアプリケーション名にした場合\\ 下記の設定内容では、Test.exe直下にlogフォルダが作成され、Test_yyyyMMdd.logのファイルが出力される。\\ アプリケーション名が不要の場合、下記の設定で実行ファイルのフォルダ直下に自動でlogフォルダに、yyyyMMdd.logのファイルが出力される。 【ログの中身】\\ 2016/09/23 17:25:50 [INFO ] テスト ==== ASP.NETでの設定 ==== AssemblyInfoの代わりに、Global.aspx に定義を行う。\\ ※但し、ログ設定を別ファイルにする場合は、AssemblyInfo に記述する。\\ App.configの代わりにWeb.Configに設定を追加する。 [[https://oki2a24.com/2015/10/18/use-log4net-in-asp-net-mvc5/|【ASP.NET MVC5】log4net の導入手順メモ♪]] 指定したlogsフォルダはWeb.configと同じ階層に作成される。 === Global.aspx === protected void Application_Start() { log4net.Config.XmlConfigurator.Configure(); AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); } === Web.Config ===
==== プログラムに組み込む ==== プログラムでログ出力する場合 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("システムが停止する致命的な障害が発生"); [[https://garafu.blogspot.com/2014/05/log4net_26.html|log4net で 出力先 ファイル名 を 動的に 取得、設定 する 方法]] ==== ログが途中で止まる現象 ==== とあるシステムで発生している。最後まで出力されたり途中で止まっていて不安定。 >Log4Net は、何か問題が発生してアペンダーに書き込めない場合、黙って失敗します。 >これは実際には良いことです。ロギングに少し失敗しても、正常なシステムがダウンすることはないからです。 >最善の策は、log4net の内部ログを有効にして診断を行い、(できれば) 失敗の原因を突き止めることです。 * https://stackoverflow.com/questions/2263301/log4net-randomly-stops-logging * https://stackoverflow.com/questions/40077917/log4net-internal-debug-timestamp * [[https://pgroene.wordpress.com/2017/07/03/log4net-troubleshooting/|Log4Net troubleshooting, debug your configuration]] これにより送信される内部ログがオンになる。System.Diagnostics.Traceため、以下を追加できます。 ... ... 出力されたログにはタイムスタンプが付いていない。[[https://github.com/apache/logging-log4net/pull/49|プルリクエスト]]があったが、放棄されたようだ。 ==== ログローテーション連番 ==== CountDirection:ローテの連番をどの様に振るか。 * 0未満 : 常に同じ連番が使われる。デフォルト値(-1)。 * 0以上 : 新たな連番が使われる。 xxxx.log.1 というように拡張子の後ろに連番が付く。ファイル名を日パターンにしても同様。 [[https://shima111.hatenadiary.org/entry/20060627/p1|Log4net(6) RollingFileAppender 意味不明パラメータ:CountDirection]] ==== 参照 ==== * [[https://devlights.hatenablog.com/entry/20110216/p2|Log4Netで複数プロセスから同じログファイルに書き込み (log4net.config, lockingModel, FileAppender+MinimalLock, Appender)]] * [[https://www.kinakomotitti.net/entry/2017/10/31/231607|log4net × Lock Model × Mutex]] * [[http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28121&forum=7|log4net 使用時にログファイルがロックされ読み込みできない]] * [[http://www.atmarkit.co.jp/ait/articles/0802/14/news138.html|オープン中のファイルにアクセスするには?[C#、VB]]] ===== NLog ===== .NET 向けのオープンソースのログツールである。 * [[https://yoshinorin.net/2017/02/13/csharp-logging-using-by-nlog/|C#でNLogを使ってログ出力する]] * [[http://ohke.hateblo.jp/entry/2017/02/24/221702|NET Coreアプリケーションでログ出力にはNLogが良いみたいですね]] * [[https://www.infoq.com/jp/news/2015/07/nlog4|最新版の NLog は例外ログを改善し、JSON/Zip をサポートした]] * [[https://techinfoofmicrosofttech.osscons.jp/index.php?NLog#d47c5b58|Apache log4netとの違い]] ===== その他 ===== [[http://www.buildinsider.net/column/kawai-yoshifumi/003|C#における構造化ログの手法、そしてデータ可視化のためのDomoの薦め]]\\ >ログの扱いといったところで、「ロガーをlog4netにするかNLogにするか」というレベルにとどまっているのではないでしょうか? >ログはテキストでは取り扱わず.NET 4.5から追加されたEventSourceクラスを用い、ETW(Event Tracing for Windows) を経由して、Semantic Logging Application Block(SLAB)のOut-of-Processサービスで処理しています。