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


92

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


私は同じ問題に遭遇しました-私たちはおそらく同じ(誤ったガイド)ガイドに従いました!
ザックバーリンゲーム、

14
これは私がlog4netについて好きではないことです。ロギングフレームワークは、私の意見ではアプリの最も堅実な部分の1つである必要があります-しかし、log4netはしばしば少し不安定に思えます。
UpTheCreek

回答:


112

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

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

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

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

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


17
これは機能します。log4net.configファイルを作成して、[常にコピー]の[出力ディレクトリにコピー]プロパティを設定することを確認してください。
E.ファンデルスポール2015

@mitchwheat絶対に神のような、私はこれが一日中正確に何をするかを行うためにninjectベースのソリューションと戦ってきました...
戦争

39

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


5
log4net.Config.XmlConfigurator.Configure();の呼び出し この問題を回避するには、configSourceを読み取らない
Greg Domjan

これで何も変わりませんでした。私はまだ問題を理解していませんが、フォローアップを試みます。
Don Rolling、

5
log4net設定ファイルを「新しい場合はコピー」としてマークすることが重要です。設定ファイルがbinフォルダーにコピーされていない場合、機能しません。
Francisco

これは私にはそのまま機能しましたが、一部のライブラリはログが別のlog4net.configで構成されているWebアプリで使用され、ログが存在するスタンドアロンアプリで使用される場合があるため、私はそれを受け入れられたソリューションよりも好んで使用していますapp.exe.configで構成されます。このように、すべてがアセンブリ情報ではなく構成に含まれます-log4net.configに「ハードコード」したくありません
Danny

27

逃したステップは

log4net.Config.XmlConfigurator.Configure(); 

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


Mitch Wheatのソリューションを使用する場合、これを行う必要はありません。
Robert Wagner、

4
@ロバート:確かに、ミッチウィートのソリューションではapp.configの外で構成ファイルをハードコーディングする必要があります-私は元の質問を読んだのですが、なぜconfigSourceが機能しないのですか?この追加の手順に従っても機能します。
グレッグDomjan

特に内部でlog4net(後で置き換えることができる)を使用するラッパーログハンドラーを作成しているため、このアプローチの方が好きです。このラッパーログハンドラーでは、常にlog4net.Config.XmlConfigurator.Configure()を呼び出します。このようにして、独自のapp.configを持つすべてのプロジェクトは、assembler.csを変更する必要なく、このラッパーログハンドラーを使用できます
zheng yu

19

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

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

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


10

どちらを使うか

<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ファイルのプロパティを設定します。ビルドアクション-コンテンツと出力ディレクトリへのコピー-常にコピー


最初のケースでは<configSections>タグは必要ありません
disklosr 2017年

2

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

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

あなたはここでそれについてもっと読むことができます:

Web配置/ MSBuildがサーバーの権限を台無しにしないようにする方法

そこでACLをリセットするようにサポートチームに依頼したところ、log4netがログの出力を開始しました。:)


1

デプロイディレクトリにコピーされた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

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

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

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

[assembly: log4net.Config.XmlConfigurator]

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


1

のデバッグモードをオンにすることもできます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 directoryするのを忘れていましたCopy Always


0

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

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

グローバルスタティックログプロバイダーでラップするため、2番目のステートメントはありません。


0

私の場合、私はこのエラーメッセージを受け取りました:

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)]

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

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

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

新しい場合は、出力ディレクトリコピーをコピーに変更します

  1. ログレベルlevel value = "ALL"を再確認します

0

Webアプリでは、binフォルダーではなくルートディレクトリにあることを指摘することも重要です。そのため、構成ファイルを配置する場所を確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.