log4net层次结构和日志记录级别


127

这个网站

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

  • 所有
  • 调试
  • 信息
  • 警告
  • 错误
  • 致命

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

  • 如果我设置了最小和最大示例DEBUG和ERROR,它将打印所有DEBUG,INFO,WARN和ERROR。不使用最小和最大过滤器。如果我指定错误(日志记录级别=错误),它将包括DEBUG,INFO和WARN
 <filter type="log4net.Filter.LevelRangeFilter">
     <param name="LevelMin" value="ERROR"/>
     <param name="LevelMax" value="ERROR"/>
 </filter>

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

示例-将级别设置为错误,它将包括调试,信息,警告和错误。log4net是否可能?

根据评论之一发布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?
默认值

5
调试似乎优先级最低,而错误最高。这不是优先级,而是将记录一条高于或高于消息的阈值
R. Schreurs

您是否尝试过仅使用levelMax?我认为,如果您未指定levelMin
AN

Answers:


90

这可能有助于了解什么级别记录了记录器,可以为记录器分配级别。级别是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

2
抱歉,我认为这是wswg,为什么不呢?
梅尔·帕玛

1
您可以查看网站的这一部分,以正确设置答案的格式
Jarod Moser

36

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

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


请检查我更新的问题,我的问题是关于级别和日志语句
Siva 2012年

更改<level value="ALL" /><level value="WARN" />,您将仅收到警告和错误。
伊利亚·科根

2
不,这没有帮助。我试图改变。我没有看到低于优先级的日志
Siva 2012年

12
当然,您不会在优先级下方看到日志。这是您设置的最低优先级。
Ilya Kogan 2012年

19

DEBUG将显示所有消息,除DEBUG消息外还将显示所有INFO,依此类推。
通常一个使用INFO或WARN。这取决于公司政策。


请检查我更新的问题,我的问题是关于级别和日志语句
Siva 2012年

请发布整个log4Net配置,您可能有两个干扰的记录器。
weismat 2012年

到目前为止,我个人仅使用了级别设置。我认为,如果可能,应避免使用最小/最大设置。
weismat 2012年

我已经发布了整个log4net配置。请检查。我正在尝试学习和实施。
西瓦(Siva)2012年

16

以下代码说明了所有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);
}


10

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

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

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

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

您可以将多个过滤器堆叠在一起以指定多个级别。例如,如果您只需要警告和致命等级。如果您想要的级别是连续的,则LevelRangeFilter更合适。

参考文档:log4net.Filter.LevelMatchFilter

如果其他答案没有给您足够的信息,则希望这可以帮助您从log4net中获得所需的信息。


啊,否认是我个人一直在寻找的东西。想要信息+错误消息,但不调试。谢谢你
Sarfaraaz

by adding a "deny" node to the filter怎么样?
mrhotroad

@mrhotroad我不确定log4net的当前版本与2014年的版本有何不同,但这是LevelMatchFilter.AcceptOnMatch上的文档。logging.apache.org/log4net/release/sdk/html/…因此,您可以执行<levelToMatch value =“ WARN” AcceptOnMatch =“ false” />
ulty4life

8

确实,官方文档(Apache log4net™手册-简介)指出以下级别...

  • 所有
  • 调试
  • 信息
  • 警告
  • 错误
  • 致命

...但是奇怪的是,当我查看程序集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结合使用。我想知道为什么这些其他级别不在文档中。此外,所有这些级别的真正优先级是什么?


2
值得一提的是,所有这些都在下面的链接中列出,但他们似乎已有一段时间没有更新其手册了。logging.apache.org/log4net/release/sdk/html/…–
Dinerdo

2
罚款等级;级别更细;最高级 从现在开始,我将只使用这三个。
maembe

-3

这样尝试,对我有用

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

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


7
根据Root Logger的log4net文档:“级别:可选元素,最多允许一个。定义此记录器的记录级别。此记录器将仅接受此级别或更高级别的事件
gonadarian

为什么这个答案会被否决?它也为我工作。因此,进行了投票。
amilamad19年

1
因为<level value =“ WARN” />就足够了。
rlesias
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.