11

Web サービスで参照されているクラス ライブラリにログ機能を実装したいと考えています。app.config を追加しようとして、必要なことはすべて実行しましたが、例外がスローされた場合、log4net は単に何もしないようです。

私のapp.config

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="D:\\mylogfile.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <filter type="log4net.Filter.StringMatchFilter">
        <stringToMatch value="test" />
      </filter>
      <filter type="log4net.Filter.StringMatchFilter">
        <stringToMatch value="error" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline%exception" />
      </layout>
    </appender>
    <root>
      <level value="INFO"/>
      <appender-ref ref="RollingFileAppender"/>
      <appender-ref ref="ConsoleAppender" />
    </root>
  </log4net>

AssemblyInfo.cs で:

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

LogManager.cs で:

private static readonly ILog Log = log4net.LogManager.GetLogger
            (MethodBase.GetCurrentMethod().DeclaringType);
public static void WriteLog(Exception ex)
{
    Log.Error(ex);
}

何が問題なのか教えてください。クラス ライブラリで log4net を動作させるにはどうすればよいですか?

ありがとうございました

4

3 に答える 3

7

実行時に、明示的に宣言されていない限り、構成ファイルは常にホスト アプリケーションから使用されます。ここでは、app.cofig ではなく web.config が使用されています。むしろ、他のカスタム構成ファイル名に言及し、ファイルが Web サービスの仮想ディレクトリにコピーされていることを確認してください。また、チバシティが言ったように、ログファイルの許可を確認してください。Web サービス ホストの app_data フォルダーに保存することをお勧めします。

于 2011-01-06T08:06:59.593 に答える
4

次のような単純なものを作成するか、ある種のインジェクションを使用できます。

public interface ILogger
{
    void LogInfo(string message);
       .
       .
       .
}

そして、log4net のラッパーなど、そのインターフェイスに一致するものを挿入するだけです。

でも、一番正しいのはクラスライブラリにログインしないことだと思います。私がそう思う理由は、ライブラリ自体がアプリケーションではなく、Web サービスであるため、何をログに記録するかを Web サービスが決定する必要があるためです。例外をログに記録したい場合は、クラス ライブラリで例外をキャッチせず、Web サービスにログを処理させます。これにより、ログの集中化も容易になります。

于 2011-01-06T08:23:57.380 に答える
1

次の質問に対する私の答えをご覧ください。

SDKでlog4netを使用する

log4net構成ファイルへの完全なパスを構築するログ構成ルーチンがあります。Webサービスを使用しているため、「app.config」に期待する場所を探していません。

また、Webサービスから「D:\mylogfile.txt」に書き込む権限があることを確認してください。

于 2011-01-06T07:57:41.453 に答える