问题 如何为类库包含log4net?


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

谢谢


1130
2018-01-06 07:40


起源

代码如何调用WriteLog? - Pauli Østerø
顺便说一句,您是否尝试过将root级别设置为ALL,并尝试删除RollingFileAppender上的所有过滤器。 - Pauli Østerø
@Pauli:我按照你的建议尝试过,它仍然没有用:) - Vimvq1987
我假设您了解app.config在构建时被重命名为程序集名称? - kenny
我检查了bin文件夹,app.config保存了它的名字:) - Vimvq1987


答案:


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


6
2018-01-06 08:06





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

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

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

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


4
2018-01-06 08:23



@Thomas我同意了。使用抽象,但有很多很好的理由可以让你想要一个库来记录,例如诊断和审计。如果库有问题,可以打开诊断功能是件好事。 - Tim Lloyd
@chibacity:我的名字是Tomas而不是托马斯;)。除此之外,我在这方面同意你的观点,但我确实认为它应该保持在最低限度。如果库中存在错误,则异常应该告诉您,并且可以在堆栈中更高的位置记录。在理想的世界中,图书馆应该是第三方(但你也可以是第三方)应该“完成”。或者你在谈论其他一些“错误”?不抛出异常的错误? - Tomas Jansson
抱歉,拼写名称:)我指的是有助于分析可能导致异常的问题的信息。即使在存在例外的情况下,通常也可以使用周围的诊断信息来查看导致错误的条件。这在软件可能以残忍和不寻常的方式使用的生产中尤其重要;) - Tim Lloyd
@chibaciy:但接下来我们讨论的是跟踪信息而不是记录。我认为那些是两个不同的东西,但那只是我。我完全同意你能够在配置文件中打开这样的跟踪。 - Tomas Jansson


请参阅我对以下问题的回答:

在SDK中使用log4net

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

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


1
2018-01-06 07:57



虽然此链接可能会回答这个问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面发生更改,则仅链接答案可能会变为无效。 - 来自评论 - Brandon Minnick