9

Asp.Net 2.0 用に log4Net EventLogAppender を構成しました。ただし、何も記録しません。私は Web.Config に以下を持っています。

<log4net>
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
      <param name="LogName" value="Test Log" />
      <param name="ApplicationName" value="Test-Web" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
    <root>
      <priority value="ERROR"/>
      <appender-ref ref="EventLogAppender"/>
    </root>
    <logger name="NHibernate">
      <level value="ERROR" />
      <appender-ref ref="EventLogAppender" />
    </logger>
  </log4net>

Test-Log Event Log は既に作成されており、AspNet ユーザーは Event Log レジストリ エントリに対するアクセス許可を持っています。また、Global.asax Application_Start で log4Net を構成しています。

log4net.Config.XmlConfigurator.Configure();

更新: log4net の内部デバッグを有効にすると、トレースで次のエラーが見つかりました。

log4net:ERROR XmlHierarchyConfigurator: Could not create Appender [EventLogAppender] of type [log4net.Appender.EventLogAppender]. Reported error follows.
System.Security.SecurityException: The source was not found, but some or all event logs could not be searched.  Inaccessible logs: Security.
   at System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly)
   at System.Diagnostics.EventLog.SourceExists(String source, String machineName)
   at System.Diagnostics.EventLog.SourceExists(String source)
   at log4net.Appender.EventLogAppender.ActivateOptions()
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement)

更新 2 : C# でコンソール ベースのアプリケーションを使用してイベント ソース (Test-Web) を作成し、次に Web アプリケーションを使用すると、最終的に機能します。

4

3 に答える 3

11

ASP.NET を使用して Log4Net をイベント ログで動作させるには、非常に簡単な手順がいくつかあります。

オプションは次のとおりです。

アプリ プールを変更する

アプリケーション プールを LocalSystem として実行する

または...アプリケーション名を設定し、レジストリ キーを追加します

最初に構成ファイルを構成して、アプリケーション名が存在するようにします

これは、アクセス許可の問題がある場合に重要です。ソースをピアリングすると、EventLogAppender のデフォルトでアプリケーション名 (イベント ログのソース列) が次のように設定されていることがわかるからです。

System.Threading.Thread.GetDomain().FriendlyName

これには、名前が変更されるたびにアプリケーションでレジストリ キーを作成する必要があり、少し面倒です。したがって、最善の解決策は、アプリケーション名を設定することです。すべてのエラー レベルを送信する EventLogAppender セクションの例を次に示します。ApplicationName 行が重要な部分です。

<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
    <param name="ApplicationName" value="MY-AWESOME-APP" />
    <evaluator type="log4net.Core.LevelEvaluator">
        <threshold value="INFO" />
    </evaluator>
    <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO"/>
        <param name="LevelMax" value="FATAL"/>
    </filter>
    <layout type="log4net.Layout.PatternLayout">
        <!-- The event log already logs the date so just log the message -->
        <conversionPattern value="%message" />
    </layout>
</appender>

この変更を行う前に、次の操作を行います。

レジストリ キーを作成する

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application\MY-AWESOME-APP

この中に文字列値を作成します

名前を付けてEventMessageFile、その値をに設定します

C:\Windows\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dll

そのパスは、64 ビット環境と 32 ビット環境の両方で機能するようです。

この手法を使用すると、レジストリにアクセス許可を設定する必要はありません。上記のキーが作成されると、機能するはずです。

于 2011-01-05T12:07:21.557 に答える
4

何が問題なのか正確にはわかりませんが、ここに行くと、「log4net 内部デバッグを有効にするにはどうすればよいですか?」というメッセージが表示されます。一番下まで。何か問題がある場合、Log4net は例外をスローしないため、log4net から情報を取得するには、内部デバッグを有効にする必要があります。

http://logging.apache.org/log4net/release/faq.html

編集: EventLogAppender を使用した場合のハングアップの可能性について説明している、その直後の質問も参照してください。

于 2010-04-06T19:00:58.757 に答える
2

コード アクセス セキュリティが原因で、イベント ログへのアクセスが妨げられていると思われます。この記事には、トピックに関する情報があります。基本的に、ASP.Net アプリケーションが中程度の信頼で実行されている場合、アプリはイベント ログにアクセスできません。

注: これは log4net 自体に組み込まれた制限ではなく、.Net Framework と ASP.Net の「機能」です。

于 2010-04-07T11:53:52.753 に答える