ユーザ用ツール

サイト用ツール


it技術:dotnet:ログ出力

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
it技術:ログ出力 [2017/04/02 00:56] yajuadminit技術:dotnet:ログ出力 [2023/01/24 09:46] (現在) – [ログローテーション連番] yajuadmin
行 3: 行 3:
 ===== log4net ===== ===== log4net =====
 オープンソースのロギング・サービス「log4net」\\ オープンソースのロギング・サービス「log4net」\\
-[[http://www.atmarkit.co.jp/ait/articles/0712/25/news121.html|オープンソースのロギング・サービス「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は開発休止になったのか?]]
  
-Assembly.vbに下記の設定をしないと、ログが出力されてこない。 +==== 導入 ==== 
-<code vbnet Assembly.vb>+メニューのツール > Nugetパッケージ マネージャー > ソリューションのNugetパッケージ管理から、オンラインで「log4net」を検索して、該当プロジェクトへインストールする。 
 + 
 +==== Winフォームでの設定 ==== 
 +=== AssemblyInfo === 
 +AssemblyInfo.vbに下記の設定をしないと、ログが出力されてこない。 
 +<code vbnet AssemblyInfo.vb>
 'App.configに設定した場合 'App.configに設定した場合
 <Assembly: log4net.Config.XmlConfigurator(Watch:=True)> <Assembly: log4net.Config.XmlConfigurator(Watch:=True)>
 +
 '外部ファイルにして使用する場合 '外部ファイルにして使用する場合
-'<Assembly: log4net.Config.XmlConfigurator(ConfigFile:="Log4net.xml", Watch:=True)>  +<Assembly: log4net.Config.XmlConfigurator(ConfigFile:="Log4net.xml", Watch:=True)>  
 </code> </code>
  
-App.configのconfigSectionsタグ内に下記の定義を行う。+C#の場合\\ 
 +<code csharp AssemblyInfo.cs> 
 +//App.configに設定した場合 
 +[assembly: log4net.Config.XmlConfigurator(Watch = true)] 
 + 
 +//外部ファイルにして使用する場合 
 +[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.xml", Watch = true)] 
 +</code> 
 + 
 +[[https://kazenetu.exblog.jp/19164776/|log4netで例外エラーが発生する場合に確認するポイント]]\\ 
 +log4net.dllを参照後、App.configにlog4netの設定を記述してデバッグログ出力しようとしたら「構成システムを初期化できませんでした。」と例外エラーが発生しました。 
 + 
 +=== App.config === 
 +App.configのconfigSectionsタグ内に下記の定義を行う。\\ 
 +※AssemblyInfoとセットなので、これをしないと「構成システムを初期化できませんでした。」の例外エラーとなる。 
 <code xml App.config> <code xml App.config>
 <configSections> <configSections>
行 21: 行 46:
  
 App.configのlog4netの定義を行う。\\ App.configのlog4netの定義を行う。\\
 +「Test」というアプリケーション名にした場合\\
 下記の設定内容では、Test.exe直下にlogフォルダが作成され、Test_yyyyMMdd.logのファイルが出力される。\\ 下記の設定内容では、Test.exe直下にlogフォルダが作成され、Test_yyyyMMdd.logのファイルが出力される。\\
 +
 +アプリケーション名が不要の場合、下記の設定で実行ファイルのフォルダ直下に自動でlogフォルダに、yyyyMMdd.logのファイルが出力される。
 +<code xml>
 +<!-- 作成するログファイル -->
 +<param name="File" value="log\" />
 +<datePattern value='yyyyMMdd".log"' />
 +</code>
 +
 【ログの中身】\\ 【ログの中身】\\
 2016/09/23 17:25:50 [INFO ] テスト 2016/09/23 17:25:50 [INFO ] テスト
行 36: 行 70:
  
       <!-- 作成するログファイル -->       <!-- 作成するログファイル -->
-      <param name="File" value=".\log\CrimpHelper" />+      <param name="File" value=".\log\Test" />
  
       <!-- 追記する場合true/上書きする場合false -->       <!-- 追記する場合true/上書きする場合false -->
行 74: 行 108:
 </code> </code>
  
 +==== 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 ===
 +<code csharp Global.aspx.cs>
 +protected void Application_Start()
 +{
 +    log4net.Config.XmlConfigurator.Configure();
 +    AreaRegistration.RegisterAllAreas();
 +    RouteConfig.RegisterRoutes(RouteTable.Routes);
 +}
 +</code>
 +
 +=== Web.Config ===
 +<code xml 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>
 +</code>
 +
 +==== プログラムに組み込む ====
 プログラムでログ出力する場合 プログラムでログ出力する場合
-<code vbnet> +<code vbnet frmMain.vb> 
-    'loggerを生成する(以下の記述は、ほとんどのコードで利用できる)+    Imports log4net 
 +    ' loggerを生成する(以下の記述は、ほとんどのコードで利用できる)
     Private _logger As ILog = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)     Private _logger As ILog = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
  
行 85: 行 180:
     _logger.Fatal("システムが停止する致命的な障害が発生")     _logger.Fatal("システムが停止する致命的な障害が発生")
 </code> </code>
 +
 +C#の場合\\
 +<code csharp 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("システムが停止する致命的な障害が発生");
 +</code>
 +
 +[[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]]
 +
 +<code xml>
 +<?xml version="1.0" encoding="utf-8" ?>
 +<configuration>
 +  <appSettings>
 +    <add key="log4net.Internal.Debug" value="true"/>
 +  </appSettings>
 +</configuration>
 +</code>
 +これにより送信される内部ログがオンになる。System.Diagnostics.Traceため、以下を追加できます。
 +
 +<code xml>
 +<configuration>
 +  ...
 +  <system.diagnostics>
 +    <trace autoflush="true">
 +      <listeners>
 +        <add name="textWriterTraceListener" 
 +             type="System.Diagnostics.TextWriterTraceListener" 
 +             initializeData="C:\temp\log4net.txt" />
 +      </listeners>
 +    </trace>
 +  </system.diagnostics>
 +  ...
 +</configuration>
 +</code>
 +
 +出力されたログにはタイムスタンプが付いていない。[[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サービスで処理しています。
it技術/dotnet/ログ出力.1491062188.txt.gz · 最終更新: 2017/04/02 00:56 by yajuadmin