web-dev-qa-db-ja.com

外部ファイルのLog4Net構成が機能しない

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に戻す(上記の最初のコード行を置き換える)と、期待どおりに動作します。外部ファイルで機能しない理由は何ですか?

88
Robert Wagner

AssemblyInfo.csファイルに次の属性がありますか?

[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

ロギング機能を必要とする各クラスの開始時に次のようなコード:

private static readonly ILog log = 
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

これと他の情報を含むブログ投稿があります here

111
Mitch Wheat

この問題には 未解決の欠陥 があります。 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の処理を修正するパッチを提供します。

36
Precipitous

逃したステップは

log4net.Config.XmlConfigurator.Configure(); 

これにより、configSourceが使用されます。 GetLogger()を呼び出す前に、必ず一度呼び出してください。

24
Greg Domjan

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

ビルドアクション:コンテンツ

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

19
Lewis Moten

どちらかを使用して、

<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="log4net.Config" value="Log4Net.config" />
</appSettings>

あるいは単に、

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config"));

どちらの場合でも、Log4Net.configファイルは出力ディレクトリにあるはずです。これを行うには、ソリューションエクスプローラーでLog4Net.configファイルのプロパティを設定します。ビルドアクション-コンテンツおよび出力ディレクトリへのコピー-常にコピー

10
Byju

この問題に注意してください...

私の場合、すべてが正しく構成されました。問題は、Visual Studio 2013内でWeb配置を使用してサイトを WinHost.com にアップロードし、サーバー上の ACLs をリセットしたことです。これにより、フォルダーとファイルに対するすべての権限が取り消されました-log4netはファイルを書き込むことができませんでした。

詳細については、こちらをご覧ください。

Web Deploy/MSBuildがサーバーのアクセス許可を台無しにするのを停止する方法

そこでサポートチームにACLをリセットするように依頼すると、log4netはログを吐き出し始めました。 :)

2

私が持っていることに加えて、私は同じ問題を抱えていました

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

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

[Assembly: log4net.Config.XmlConfigurator]

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

1
TheGuest

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 to output directoryCopy Alwaysに設定するのを忘れていました。

1
waka

Log4net.configという外部構成ファイルがデプロイディレクトリにコピーされていると仮定すると、次のように構成できます。

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());
        }
    }
}
1
JJ_Coder4Hire

私の場合、次のエラーメッセージが表示されました。

log4net: config file [C:\........\bin\Debug\log4net.config] not found.

そしてlog4net.configファイルはVisual Studio 2017プロジェクトにありましたが、bin\Debugフォルダ見つかりませんでした。

元のアセンブリのセットアップは次のとおりでした。

[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

しばらく調査した後、次のように変更すると動作します。

[Assembly: log4net.Config.XmlConfigurator(ConfigFile = @"..\..\log4net.config", Watch = true)]

@Mitch、[Assembly:...]宣言を持つファイルがありますが、ConfigFileプロパティがありませんでした。

追加してLog.configをポイントすると、機能し始めました。他のすべての構成セクション(つまりAppSettings)と同じように機能し、外部構成ファイルを変更せずに受け入れると思います。

グローバル静的ログプロバイダーにラップしているため、2番目のステートメントはありません。

0
Robert Wagner
  1. 以下をAssemblyInfo.csに追加します

[アセンブリ:log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config")]

  1. Log4net.configがプロジェクトに含まれていることを確認してください
  2. Log4net.configのプロパティ

変更出力ディレクトリにコピーから新しい場合はコピー

  1. ログレベルlevel value = "ALL"を再確認してください
0
e03050