====== ログ出力 ======
===== 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サービスで処理しています。