在log4net中启用日志级别

11

我正在编写一个简单的测试项目,用于尝试log4net,并且一开始就遇到了难题。无论我在配置文件中做什么,我的记录器都会以所有“IsXXXXEnabled”标志设置为false来初始化。这是我的非常简单的app.config:

  <log4netgroup>
    <log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
        <param name="LogName" value="Application" />
        <param name="ApplicationName" value="HelloProgram" />
        <threshold value="DEBUG"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger - %newline%message" />
        </layout>
      </appender>

      <root>
        <level value="DEBUG" />
        <appender-ref ref="EventLogAppender" />
      </root>
      <logger name="HelloLogger">
        <level value="DEBUG" />
        <appender-ref ref="EventLogAppender" />
      </logger>
    </log4net>
  </log4netgroup>

以下是 Main 中的简单测试:

    ILog Log = LogManager.GetLogger("HelloLogger");

    if(Log.IsErrorEnabled)
        Console.WriteLine("The logger is working!");
    else
        Console.WriteLine("Nope");
输出结果为 "Nope"。我尝试将阈值和级别的值切换为 "ALL",但是没有任何变化。这似乎很简单,我错过了什么使一切都能启用吗? 谢谢

为什么你有这些命名空间? - Mauricio Scheffer
1
如果您正在引用log4net.xsd,则是log4net模式。该引用将其添加到智能感知中,我强烈推荐使用。可在csharptest.net上找到。 - BradV
4个回答

16

我解决了!我不知道为什么这个调用在log4net手册中没有提到,或者为什么我需要它,但将此程序集添加到我的项目中启用了所有日志级别:

[assembly:XmlConfigurator(Watch = true)]

这里可以找到答案: 如何配置log4net使log.IsDebugEnabled为true?


手册涵盖了这个主题:http://logging.apache.org/log4net/release/manual/configuration.html - Stefan Egli
3
@Stefan,谢谢提供链接。我想当我说“log4net手册中没有提到这点”时,实际上是想说“我很不擅长阅读手册”。 - BradV

5

您需要配置根日志记录器

<root>
    <level value="DEBUG" />
    <appender-ref ref="EventLogAppender" />
</root>

任何非根记录器(使用<logger name="...">创建的记录器)仅适用于其命名空间限定名称具有记录器名称作为前缀的类。因此,您创建的记录器仅适用于位于命名空间之外且名称为HelloLogger的类,或者位于名为HelloLogger的命名空间中(可能在其中嵌套了命名空间的类)。 (当我说记录器“适用于”类X时,我的意思是当您调用LogManager.GetLogger(typeof(X))时,那就是您将获得的记录器。)
编辑:您还需要调用log4net.Config.XmlConfigurator.Configure();以使log4net读取App.config。另外,删除最外层的<log4netgroup>元素并重命名配置部分名称:<section name="log4net" .../>

我已添加了根定义,但级别日志选项仍然被禁用。我刚刚更新了 OP。 - BradV

0
如果您正在为log4net使用单独的配置文件,请执行以下操作:在遵循所有其他设置说明之后,确保在Visual Studio解决方案资源管理器中右键单击该文件,选择属性,展开“高级”选项组,将“复制到输出目录”值设置为“始终复制”。这样就可以完成了... :) 干杯!

0

配置根记录器并不是必须的,但Aasmund的观点确实很有道理。我认为问题在于您尝试使用EventLogAppender。对于简单的测试,您应该使用ConsoleAppender,因为这可能是您可以在控制台应用程序中使之工作的最简单的appender。

EventLogAppender需要一些额外的设置步骤:您需要创建一个事件源,这需要管理员权限。Appender会尝试即时完成此操作,但如果UAC已打开,则通常会悄无声息地失败。要查看是否存在此问题,您可以尝试打开内部调试

通常,您将使用安装程序创建事件源。


虽然我很感激你的评论,因为这些问题在不久的将来可能会困扰我,但我的当前瓶颈出现在任何这些问题之前。我在原始帖子中发布了一个简单的测试程序来证明这一点。 - BradV
很高兴现在它能够正常工作。我倾向于忘记这个问题,因为我的包装器会负责配置log4net,如果我没有明确地做的话... - Stefan Egli

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