如何在类库中集成log4net?

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在我的类库中工作?

谢谢


你调用WriteLog的代码是什么样子的? - Pauli Østerø
顺便问一下,你尝试将根级别设置为ALL,并尝试删除RollingFileAppender上的所有过滤器了吗? - Pauli Østerø
@Pauli:我按照你建议的尝试了,仍然不起作用 :) - Quan Mai
我假设你明白在构建时app.config会被重命名为程序集名称? - kenny
我检查了bin文件夹,app.config保存了它的名称 :) - Quan Mai
当您移除过滤器时会发生什么?如果您看到日志消息,将DenyAll放在字符串匹配过滤器之前会发生什么?为什么不使用日志级别过滤器呢? - Berin Loritsch
3个回答

7

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


5

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

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

然后,你只需要注入与该接口匹配的内容,例如log4net的包装器等。但是,我认为最正确的做法是不要在类库中记录日志。我这样认为的原因是因为类库本身不是应用程序,你的web服务才是应用程序,所以应该由你的web服务决定要记录什么。如果你想记录异常,只需不在类库中捕获它们,让你的web服务处理日志记录。这也会使日志记录更容易集中管理。


@Thomas 我同意使用抽象层,但你可能有很多充分的理由需要一个记录诊断和审计信息的库。如果库出了问题,有可开启的诊断信息是一件好事情。 - Tim Lloyd
@chibacity: 我的名字是Tomas不是Thomas ;). 除此之外,我同意你提到的那些方面,但我认为应该将其保持在最低限度。如果库中出现错误,异常应该告诉我们,并且可以在堆栈的更高层记录下来。在理想的情况下,库应该是第三方(但您也可以是第三方)应该“完成”。或者你正在谈论其他类型的“错误”吗?会导致不抛出异常的错误? - Tomas Jansson
抱歉名字拼错了 :) 我指的是可以帮助分析可能不会导致异常的问题的信息。即使在有异常的情况下,拥有周围的诊断信息也常常很有用,以便查看导致错误的条件。这在生产环境中尤其重要,因为软件可能被用于残酷和不寻常的方式 ;) - Tim Lloyd
@chibaciy: 但是那时我们在谈论跟踪信息而不是日志记录。我认为这些是两个不同的东西,但这只是我的观点。我完全同意您可以在配置文件中打开此类跟踪功能。 - Tomas Jansson

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

在SDK中使用log4net

它有一个日志配置例程,将构造完整路径到log4net配置文件。由于您在Web服务中,它可能不会在您期望的位置查找“app.config”。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接