【问题标题】:Enabling log levels in log4net在 log4net 中启用日志级别
【发布时间】:2012-12-03 00:13:16
【问题描述】:

我正在编写一个简单的测试项目来试验 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");

输出是“不”。我尝试将阈值和电平值切换为“ALL”,但没有任何改变。这看起来很简单,我缺少什么来启用一切? 谢谢

【问题讨论】:

  • 为什么会有这些命名空间?
  • 如果您指的是 log4net.xsd,它是 log4net 架构。该参考将其添加到智能感知中,我强烈推荐它。发现于csharptest.net

标签: log4net app-config


【解决方案1】:

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

[assembly:XmlConfigurator(Watch = true)]

在这里找到: How do I configure log4net so that log.IsDebugEnabled is true?

【讨论】:

【解决方案2】:

你应该配置根记录器

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

任何非根记录器(您使用&lt;logger name="..."&gt; 创建的记录器)仅适用于其命名空间限定名称以记录器名称作为前缀的类。因此,您创建的记录器将仅适用于位于名称空间之外且名称为 HelloLogger 的类,或者适用于位于名为 HelloLogger 的名称空间中的任何类(并且可能位于嵌套在该名称空间内的名称空间内)。 (当我说一个记录器“适用于”一个类 X 时,我的意思是当你调用 LogManager.GetLogger(typeof(X)) 时你会得到这个记录器。)

编辑:您还需要调用log4net.Config.XmlConfigurator.Configure(); 以使log4net 读取App.config。另外,删除最外层的&lt;log4netgroup&gt; 元素并重命名配置部分名称:&lt;section name="log4net" .../&gt;

【讨论】:

  • 我添加了根定义,但级别日志记录选项仍然被禁用。我刚刚更新了 OP。
【解决方案3】:

配置根记录器并不是绝对必要的,但 Aasmund 的论点肯定是有效的。我认为问题在于您尝试使用 EventLogAppender。对于简单的测试,您应该使用 ConsoleAppender,因为这可能是您可以在控制台应用程序中使用的最简单的附加程序。

EventLogAppender 需要一些额外的设置步骤:您需要创建一个事件源,这需要管理权限。 Appender 尝试即时执行此操作,但如果打开 UAC,它通常会静默失败。要查看这是否是问题,您可以尝试打开internal debugging

通常您会create 带有安装程序的事件源。

【讨论】:

  • 虽然我很感谢你们的 cmets,因为这些问题在不久的将来就会出现在我身上,但我目前的瓶颈出现在这些问题之前。我发布了一个简单的测试器来在 OP 中演示这一点。
  • 很高兴它现在可以工作。我倾向于忘记这个问题,因为如果我没有明确地配置 log4net,我的包装器会负责...
【解决方案4】:

如果您为 log4net 使用单独的配置文件,请执行以下操作:按照所有其他设置说明进行操作后,确保您在 Visual Studio 解决方案资源管理器中右键单击该文件,选择属性,展开“高级”选项组,将“复制到输出目录”值设置为“始终复制”。那会变魔术... :) 干杯!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多