【问题标题】:log4net hierarchy and logging levelslog4net 层次结构和日志记录级别
【发布时间】:2022-03-13 15:22:59
【问题描述】:

This site

记录器可能被分配级别。级别是 log4net.Core.Level 类的实例。以下级别按优先级递增的顺序定义:

  • 全部
  • 调试
  • 信息
  • 警告
  • 错误
  • 致命
  • 关闭

DEBUG 的优先级似乎最低,而 ERROR 的优先级更高。

问题

  • 如果我设置 Min 和 Max 示例 DEBUG 和 ERROR,它会打印所有内容 DEBUG、INFO、WARN 和 ERROR。不使用最小和最大过滤器。如果我指定 ERROR (Logging level = ERROR) 是否会包含 DEBUG、INFO 和 WARN
 <filter type="log4net.Filter.LevelRangeFilter">
     <param name="LevelMin" value="ERROR"/>
     <param name="LevelMax" value="ERROR"/>
 </filter>

而不是最小和最大过滤器。是否可以配置一个级别并包括其下的所有其他级别以进行日志记录。

示例 - 将级别设置为错误,它将包括 DEBUG、INFO、WARN 和 ERROR。 log4net 可以做到这一点吗?

发布基于 cmets 之一的 log4net 配置:

     <?xml version="1.0" encoding="utf-8" ?>
     <configuration>
        <configSections>
            <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
        </configSections >
        <log4net debug="true">
  <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <layout type="log4net.Layout.XMLLayout" /> -->
        <param name="File" value="TestLog.log" />
        <param name="AppendToFile" value="false" />
        <layout type="log4net.Layout.PatternLayout">
            <header type="log4net.Util.PatternString" value="[START LOG] %newline" />
            <footer type="log4net.Util.PatternString" value="[END LOG] %newline" />
            <conversionPattern value="%d [%t] %-5p - %m%n" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="DEBUG"/>
            <param name="LevelMax" value="ERROR"/>
        </filter>
    </appender>
<root>
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
    </root>
    <logger name="log4NetExample">
        <!-- <appender-ref ref="B" /> -->
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
    </logger>
</log4net>

【问题讨论】:

  • 您是否尝试将日志记录级别设置为 INFO 并检查它是否包含 INFO 和 DEBUG?
  • DEBUG 的优先级似乎最低,Error 最高。 这不是 priority,而是 threshold 或上面会记录一条消息。
  • 你试过只使用levelMax吗?如果您不指定levelMin,我认为这应该包括它下面的所有内容

标签: c# log4net log4net-configuration


【解决方案1】:

这可能有助于了解在什么级别记录的内容 记录器可能被分配级别。级别是 log4net.Core.Level 类的实例。以下级别按严重性递增的顺序定义 - 日志级别。

每个设置级别记录的级别数:

 ALL    DEBUG   INFO    WARN    ERROR   FATAL   OFF
•All                        
•DEBUG  •DEBUG                  
•INFO   •INFO   •INFO               
•WARN   •WARN   •WARN   •WARN           
•ERROR  •ERROR  •ERROR  •ERROR  •ERROR      
•FATAL  •FATAL  •FATAL  •FATAL  •FATAL  •FATAL  
•OFF    •OFF    •OFF    •OFF    •OFF    •OFF    •OFF

【讨论】:

  • 对不起,我以为这是 wswg,为什么不是??
  • 您可以查看this portion of the site 以了解正确的答案格式
【解决方案2】:

对于大多数应用程序,您希望设置最低级别而不是最高级别。

例如,在调试代码时将最低级别设置为 DEBUG,而在生产环境中将其设置为 WARN。

【讨论】:

  • 请检查我更新的问题,我的问题是关于级别和日志语句
  • &lt;level value="ALL" /&gt; 更改为&lt;level value="WARN" /&gt;,您只会收到警告和错误。
  • 不,它没有帮助。我试图改变。我没有看到包含低于优先级的日志
  • 当然你不会看到低于优先级的日志。这是您设置的最低优先级。
【解决方案3】:

DEBUG 将显示所有消息,INFO 将显示除 DEBUG 消息之外的所有消息,等等。
通常使用 INFO 或 WARN。这取决于公司政策。

【讨论】:

  • 请检查我更新的问题,我的问题是关于级别和日志语句
  • 请发布您的整个 log4Net 配置,您可能有两个记录器正在干扰。
  • 而且我个人目前只使用过关卡设置。我认为应该尽可能避免使用 Min/Max 设置。
  • 我已经发布了整个 log4net 配置。请检查。我正在努力学习和实施。
【解决方案4】:

这里是一些关于所有 log4net 级别的优先级的代码:

TraceLevel(Level.All); //-2147483648

TraceLevel(Level.Verbose);   //  10 000
TraceLevel(Level.Finest);    //  10 000
    
TraceLevel(Level.Trace);     //  20 000
TraceLevel(Level.Finer);     //  20 000
    
TraceLevel(Level.Debug);     //  30 000
TraceLevel(Level.Fine);      //  30 000
    
TraceLevel(Level.Info);      //  40 000
TraceLevel(Level.Notice);    //  50 000
    
TraceLevel(Level.Warn);      //  60 000
TraceLevel(Level.Error);     //  70 000
TraceLevel(Level.Severe);    //  80 000
TraceLevel(Level.Critical);  //  90 000
TraceLevel(Level.Alert);     // 100 000
TraceLevel(Level.Fatal);     // 110 000
TraceLevel(Level.Emergency); // 120 000
    
TraceLevel(Level.Off); //2147483647


private static void TraceLevel(log4net.Core.Level level)
{
   Debug.WriteLine("{0} = {1}", level, level.Value);
}

【讨论】:

    【解决方案5】:

    正如其他人所指出的,通常最好指定一个最低日志级别来记录该级别以及比它更严重的任何其他级别。似乎您只是在向后考虑日志记录级别。

    但是,如果您想对记录各个级别进行更细粒度的控制,您可以使用以下语法告诉 log4net 仅记录一个或多个特定级别:

    <filter type="log4net.Filter.LevelMatchFilter">
      <levelToMatch value="WARN"/>
    </filter>
    

    或者通过向过滤器添加“拒绝”节点来排除特定的日志记录级别。

    您可以将多个过滤器堆叠在一起以指定多个级别。例如,如果您只想要 WARN 和 FATAL 级别。如果你想要的关卡是连续的,那么 LevelRangeFilter 更合适。

    参考文档:log4net.Filter.LevelMatchFilter

    如果其他答案没有给你足够的信息,希望这能帮助你从 log4net 中得到你想要的。

    【讨论】:

    • 啊,否认是我个人一直在寻找的。想要信息+错误消息,但不想要调试。谢谢你。
    • by adding a "deny" node to the filter 怎么样?
    • @mrhotroad 我不确定 log4net 的当前版本与 2014 年的版本有何不同,但这是关于 LevelMatchFilter.AcceptOnMatch 的文档。 logging.apache.org/log4net/release/sdk/html/… 所以你可以这样做
    【解决方案6】:

    官方文档 (Apache log4net™ Manual - Introduction) 确实指出有以下级别...

    • 全部
    • 调试
    • 信息
    • 警告
    • 错误
    • 致命
    • 关闭

    ...但奇怪的是,当我查看程序集 log4net.dll,v1.2.15.0 密封类 log4net.Core.Level 时,我看到定义了以下级别...

    public static readonly Level Alert;
    public static readonly Level All;
    public static readonly Level Critical;
    public static readonly Level Debug;
    public static readonly Level Emergency;
    public static readonly Level Error;
    public static readonly Level Fatal;
    public static readonly Level Fine;
    public static readonly Level Finer;
    public static readonly Level Finest;
    public static readonly Level Info;
    public static readonly Level Log4Net_Debug;
    public static readonly Level Notice;
    public static readonly Level Off;
    public static readonly Level Severe;
    public static readonly Level Trace;
    public static readonly Level Verbose;
    public static readonly Level Warn;
    

    长期以来,我一直将 TRACE 与 PostSharp OnBoundaryEntry 和 OnBoundaryExit 结合使用。我想知道为什么这些其他级别不在文档中。此外,所有这些级别的真正优先级是什么?

    【讨论】:

    • 对于它的价值,它们都列在以下链接中,但他们似乎有一段时间没有更新他们的手册了。 logging.apache.org/log4net/release/sdk/html/…
    • 精细级别;水平更细;最好的水平;从现在开始,我只使用这三个。
    【解决方案7】:

    您可以将其用于某些日志警告:(添加到附加程序)

    <filter type="log4net.Filter.LevelMatchFilter">
        <acceptOnMatch value="true" />
        <levelToMatch value="WARN" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    

    如果您希望将错误记录到警报范围:

    <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="ERROR" />
        <levelMax value="ALERT" />
    </filter>
    

    【讨论】:

      【解决方案8】:

      试试这个,对我有用

      <root>
        <!--<level value="ALL" />-->
        <level value="ERROR" />
        <level value="INFO" />
        <level value="WARN" />     
      </root>
      

      这会记录 3 种类型的错误 - 错误、信息和警告

      【讨论】:

      • 根据log4net docs for Root Logger:“级别:可选元素,允许的最大值。定义此记录器的日志记录级别。此记录器将仅接受符合以下条件的事件在此级别或以上。"
      • 为什么这个答案投了反对票?它也为我工作。因此投票。
      • 因为 就足够了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2014-12-27
      相关资源
      最近更新 更多