【问题标题】:How to include log4net for a class library?如何为类库包含 log4net?
【发布时间】:2011-01-06 07:40:02
【问题描述】:

我想在类库中实现日志记录功能,该类库本身在 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 为我的类库工作?

谢谢

【问题讨论】:

  • 代码在您调用 WriteLog 的位置看起来如何?
  • 顺便说一句,您是否尝试将根级别设置为 ALL,并尝试删除 RollingFileAppender 上的所有过滤器。
  • @Pauli:我按照你的建议试过了,还是不行:)
  • 我假设你明白 app.config 在构建时被重命名为程序集名称?
  • 我检查了 bin 文件夹,app.config 有它的名字:)

标签: c# .net log4net log4net-configuration


【解决方案1】:

在运行时,除非明确声明,否则始终从主机应用程序使用配置文件。以防万一,使用的是 web.config 而不是 app.cofig。而是提及一些其他自定义配置文件名,并确保将该文件复制到 Web 服务的虚拟目录中。也正如 chibacity 所说,确保日志文件的权限。最好将其保存在 web 服务主机的 app_data 文件夹中。

【讨论】:

    【解决方案2】:

    您可以使用某种注入,或者构建一个简单的注入,例如:

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

    然后您只需注入与该接口匹配的东西,例如 log4net 的包装器等。

    但是,我认为最正确的做法是不登录类库。为什么我这么认为是因为库本身不是应用程序,您的 Web 服务是您的 Web 服务应该决定记录什么。如果您想记录异常,请不要在类库中捕获它们并让您的 Web 服务处理日志记录。这也将更容易集中记录。

    【讨论】:

    • @Thomas 我同意。使用抽象,但是有很多充分的理由可以说明您可能需要一个库来记录,例如诊断和审计。如果库有问题,可以打开诊断是一件好事。
    • @chibacity:我叫托马斯,不是托马斯;)。除此之外,我在这些方面同意你的看法,但我确实认为它应该保持在最低限度。如果库中有问题,异常应该会告诉,并且可以在堆栈中更高的位置记录。在理想的世界中,图书馆应该是应该“完成”的第三方(但您也可以是第三方)。还是您在谈论其他类型的“错误”?不抛出异常的错误?
    • 抱歉名称拼写错误 :) 我指的是有助于分析可能不会导致异常的问题的信息。即使在存在异常的情况下,拥有周围的诊断信息以查看导致错误的条件通常也很有用。这在软件可能以残酷和不寻常的方式使用的生产中可能特别重要;)
    • @chibaciy:但是我们谈论的是跟踪信息而不是日志记录。我认为这是两件不同的事情,但那只是我。我完全同意您的看法,能够在配置文件中打开此类跟踪非常好。
    【解决方案3】:

    请看我对以下问题的回答:

    Use log4net in SDK

    它有一个日志配置例程,它将构建一个 log4net 配置文件的完整路径。当您在网络服务中时,我不会寻找您期望的“app.config”。

    还要确保您有权从您的网络服务写入“D:\mylogfile.txt”。

    【讨论】:

      猜你喜欢
      • 2016-10-11
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多