4

セットアップの一部として呼び出すアプリケーション (ASP.Net WebAPI を自己ホストするコンソール アプリケーション) がXmlConfigurator.Configure()あります。

アプリケーションのapp.configファイルが次のようになっている場合、問題なく動作します。

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

    <log4net>
    </log4net>
</configuration>

<log4net>空の要素を取り出すとハングします:

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

過去に log4net を使用したときに、この動作は他の場所では見たことがありません (通常は、「log4net:エラー XmlConfigurator: アプリケーションの .config ファイルで構成セクション 'log4net' が見つかりませんでした。」というメッセージがコンソールに出力されます)。

何か間違ったことをしているのですか、それとも log4net のバグに出くわしたのでしょうか?


私はこれを広範囲にデバッグしました。次の 2 つの動作があります。

  1. 私がそれをまたぐと、への呼び出しXmlConfigurator.Configure()が無期限にハングします
  2. への呼び出しはXmlConfigurator.Configure()ステップ オーバーできますが、アプリケーションがハングしたように見えます。実行を一時停止してアクティブなスレッドを見ると、log4net メソッド (のようなものConfigureFromFile) でスタックしているスレッドがあります。

いずれにせよ、アプリケーション全体がハングします。

ハングしたスレッドからのスタック トレースを次に示します (上記の 2 番目のケース)。

スタックトレース

4

3 に答える 3

4

このブログ投稿のおかげで、最終的にこれの底にたどり着きました。

基本的に、マシンに.Net 4.5がインストールされているという事実に要約されます。私は .Net 4.0 をターゲットにしていますが、.Net 4.5 のドロップイン置換の性質により、動作は異なります。

構成ファイルに空<log4net>の要素がないと、log4net は要素が空であることを通知するために標準エラーに書き込みます。この要素がないと、ログは記録されません。ロギングが発生すると (アプリケーション内の他のコンソールの使用とは別のスレッドで発生します)、.Net 4.5 でのコンソールの初期化方法の変更が原因でデッドロックが発生します (リンクされたブログ投稿で詳しく説明されています)。

于 2013-02-06T23:37:48.753 に答える
0

このようなものを試してみてください、私は設定後に.configファイルにあります

あなたのページでこのようなことを宣言してください

private static log4Net.ILog _logger = log4net.LogManager.GetLoggger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);


  <log4net>
    <root>
      <level value="ALL"/>
      <appender-ref ref="LogFileAppender"/>
    </root>
    <appender name="LogFileAppender"  type="log4net.Appender.RollingFileAppender,log4net">
    <param name="File value="c:\Logs\SampleLog.txt"/>
    <param name="AppendToFile value="true"/>
    <rollingStyle value="Size"/>
    <maximumFileSize value="2MB"/>
    <staticLogFileName value="false"/>
    <datePattern value="yyyyMMdd"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger -%message%newline"/>
      </layout>
    </appender>
  </log4net>
于 2012-09-28T13:18:49.123 に答える
0

あなたの構成は XmlConfigurator マネージャーに Log4Net というセクションがあることを伝えます。したがって、XmlConfigurator はそのセクションを読み込もうとし、不平を言います。
これは当然のことだと断言します。
configSections で宣言された ANY セクションを削除すると、派生した構成クラスで同じ動作が得られます。

于 2012-09-28T13:08:03.503 に答える