ユーザ用ツール

サイト用ツール


it技術:dotnet:ログ出力

ログ出力

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に設定を追加する。

【ASP.NET MVC5】log4net の導入手順メモ♪

指定したlogsフォルダは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("システムが停止する致命的な障害が発生");

log4net で 出力先 ファイル名 を 動的に 取得、設定 する 方法

ログが途中で止まる現象

とあるシステムで発生している。最後まで出力されたり途中で止まっていて不安定。

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:ローテの連番をどの様に振るか。

  • 0未満 : 常に同じ連番が使われる。デフォルト値(-1)。
  • 0以上 : 新たな連番が使われる。

xxxx.log.1 というように拡張子の後ろに連番が付く。ファイル名を日パターンにしても同様。

Log4net(6) RollingFileAppender 意味不明パラメータ:CountDirection

参照

NLog

その他

C#における構造化ログの手法、そしてデータ可視化のためのDomoの薦め

ログの扱いといったところで、「ロガーをlog4netにするかNLogにするか」というレベルにとどまっているのではないでしょうか?
ログはテキストでは取り扱わず.NET 4.5から追加されたEventSourceクラスを用い、ETW(Event Tracing for Windows) を経由して、Semantic Logging Application Block(SLAB)のOut-of-Processサービスで処理しています。
it技術/dotnet/ログ出力.txt · 最終更新: 2023/01/24 09:46 by yajuadmin