0

しばらくの間、複数のアプリケーションで Log4Net を使用してきました。正常に動作していましたが、最近、アプリケーションが突然ログに記録されなくなったことに気付きました。この問題はすべてのアプリケーションで同じであることが判明し、数か月前にすべてのアプリケーションが突然ログを記録しなくなりました。奇妙なことに、サーバー (http://localhost/myApp) で直接アプリケーションにアクセスするとログが記録されますが、別の PC からアプリケーションにアクセスすると何も記録されません。私が最初に考えたのは、ファイル/フォルダーのアクセス許可に関連しているに違いないということでしたが、"Everyone" (Windows ユーザー グループ) にログ フォルダーへのフル アクセスを許可しても役に立ちませんでした。

これらはすべて IIS7 (Windows 2008 R2 Enterprise OS) で実行されている ASP.Net MVC 4 アプリケーションであり、アプリケーション プールは "ApplicationPoolIdentity" を使用しています。Log4Net のバージョンは 1.2.10.0 で、カスタムの CompositeRollingFileAppender を使用しています。カスタムアペンダーの不具合かと思っていたのですが、標準のRollingFileAppenderに切り替えてみても同じでした。複数のサーバーでこの問題を確認しました。

誰か似たようなものを見たことがありますか?アプリケーションへのローカル アクセスとリモート アクセスに違いがあるべき理由がわからないので、ご意見をお聞かせください。

これは、私のアプリケーションの web.config の 1 つの log4net セクションです。

<log4net>
    <appender name="RollingFileAppender" type="[mynamespace].CompositeRollingFileAppender">
      <file value="Logs/ApplicationLog.log" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <maxSizeRollBackups value="20" />
      <maximumFileSize value="10MB" />
      <datePattern value="_yyyy-MM-dd" />
      <staticLogFileName value="true" />
      <preserveLogFileNameExtension value="true" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%utcdate;%property{ErrorCode};%property{Severity};%property{ErrorName};%property{Module};%m%n" />
      </layout>
    </appender>
    <root>
      <priority value="ALL" />
      <appender-ref ref="RollingFileAppender" />
      <level value="Warn" />
    </root>
    <logger name="NHibernate">
      <level value="OFF" />
    </logger>
    <logger name="NHibernate.SQL">
      <level value="OFF" />
    </logger>
  </log4net>
4

1 に答える 1

2

この問題は log4net に直接関係していたのではなく、ASP.Net MVC3 以降がデフォルトで例外を処理する方法に関係していたことが判明しました。数か月前に、アプリケーションを MVC2 から MVC4 に更新しました。このコードはデフォルトで global.asax.cs.Application_Start() から実行されるため、CustomErrors が RemoteOnly または On に設定されている場合、例外処理モジュールを「バイパス」しました。

public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    }

このスレッドは私を正しい軌道に乗せました。最終的にfilters.Add(..)行を削除しましたが、今では正常に機能しているようです!

于 2012-11-20T09:23:05.127 に答える