[File] 外部ファイルのLog4Net設定が機能しない



Answers

この問題には未解決の欠陥があります。 Log4Netは構成要素のconfigSource属性をサポートしていません。 純粋な設定ファイルソリューションを使用するには、appSettingsのlog4net.Configキーを使用します。

ステップ1:通常の構成セクションの定義を含めます。

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>

ステップ2:appSettingsのmagic log4net.Configキーを使用します。

<appSettings>
      <add key="log4net.Config" value="log4net.simple.config" />
</appSettings>

ステップ3:configSourceの処理を修正するパッチを提供する。

Question

私たちはlog4netを使用しており、他のセクションと同様に、外部の設定ファイルにその設定を指定したいと考えています。 これを行うために、App.configのlog4netセクションを次のように変更しました:

...
<section name="log4net" 
     type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...

また、Log.Configファイル(App.configと同じディレクトリ)には次のものがあります。

<log4net>
  <appender name="General" type="log4net.Appender.FileAppender">
    <file value="myapp.log" />
    <layout type="log4net.Layout.SimpleLayout" />
  </appender>
  <root>
    <appender-ref ref="General" />
  </root>
</log4net>

ただし、アプリケーションを実行すると、ログファイルは作成されず、ログは作成されません。 コンソールに出力されるエラーメッセージはありません。

Log.configファイルの内容をApp.config(上記の最初のコード行を置き換える)に戻すと、期待通りに機能します。 なぜそれが外部ファイルで動作していないのか?




log4net.configファイルに次のプロパティが設定されていることを確認します。

ビルドアクション:内容

出力ディレクトリにコピー:常にコピー




log4netデバッグモードを有効にすることもできます。 これをApp.configファイルに挿入します。

 <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
 </appSettings>
 <system.diagnostics>
      <trace autoflush="true">
      <listeners>
           <add
             name="textWriterTraceListener"
             type="System.Diagnostics.TextWriterTraceListener"
             initializeData="link\to\your\file.log" />
      </listeners>
      </trace>
 </system.diagnostics>

エラーメッセージが表示されます。このエラーメッセージから、正確に何が間違っていたかがわかります。 私の場合は、 Copy Always Copy to output directoryCopy Always Copy to output directoryに設定するのを忘れてCopy Always




私は同じ問題を抱えていた

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]

実行中のプロジェクトでは、参照プロジェクトに次の行もありました。

[assembly: log4net.Config.XmlConfigurator]

参照プロジェクトでこの行を削除すると、ログが表示され始めます。




log4net.configという外部設定ファイルがdeployディレクトリにコピーされていると仮定して、次のように設定することができます:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Reflection;

using log4net;

namespace MyAppNamespace {
    static class Program {
        //declare it as static and public so all classes in the project can access it
        //like so: Program.log.Error("got an error");
        public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() {
             //configure it to use external file
            log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config"));
            //use it
            log.Debug("#############   STARING APPLICATION    #################");


            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormMain());
        }
    }
}





Links