log4net层次结构和日志级别

146
这个网站说:
日志记录器可以被分配级别。级别是log4net.Core.Level类的实例。以下级别按照优先级递增的顺序定义:
- ALL - DEBUG - INFO - WARN - ERROR - FATAL - OFF
DEBUG似乎具有最低的优先级,而ERROR则更高。
问题:
如果我设置最小和最大值为DEBUG和ERROR,它会打印所有DEBUG、INFO、WARN和ERROR信息。如果我指定ERROR(日志级别=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 中是否可能实现这一点?

基于评论发布 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吗? - default
5
_DEBUG 似乎具有最低的优先级,而错误则具有最高的优先级。这不是一个 优先级,而是一个 阈值,即在此之上或以上的消息将被记录。 - R. Schreurs
1
你尝试过只使用 levelMax 吗?如果你没有指定 levelMin,我认为它应该包括它下面的所有内容。 - A N
9个回答

130

这可能有助于理解记录了什么级别的内容。 记录器可以被分配级别。级别是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,为什么不是呢? - Mel Pama
2
你可以查看本网站的这一部分来获得正确的答案格式。 - Jarod Moser

38

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

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


请检查我的更新问题,我的问题涉及级别和日志记录。 - Siva
<level value="ALL" /> 改为 <level value="WARN" />,这样你就只会得到警告和错误信息。 - Ilya Kogan
2
不,它没有帮助。我尝试进行更改。我没有看到以下优先级的日志被包含在内。 - Siva
12
当然你看不到优先级低于该最小优先级的日志记录。那是你设置的最低优先级。 - Ilya Kogan

19

DEBUG会显示所有消息,INFO则会显示除DEBUG消息以外的所有消息,等等。
通常情况下,人们使用INFO或WARN。这取决于公司政策。


请检查我的更新问题,我的问题涉及级别和日志记录。 - Siva
请发布您的整个log4Net配置,您可能有两个相互干扰的记录器。 - weismat
我个人目前只使用了级别设置。我认为应尽可能避免使用最小/最大设置。 - weismat
我已经发布了整个log4net配置,请检查。我正在尝试学习和实现。 - Siva

19

以下是一些代码,告诉您所有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>

要排除特定的日志级别,可以在筛选器中添加“deny”节点。

您可以叠加多个过滤器来指定多个级别。例如,如果您只想要WARN和FATAL级别。如果您想要的级别是连续的,则LevelRangeFilter更合适。

参考文档:log4net.Filter.LevelMatchFilter

如果其他答案没有为您提供足够的信息,希望这将帮助您从log4net中获取所需的内容。


啊,拒绝是我个人一直在寻找的。希望有信息和错误消息,但不需要调试。感谢您提供这个。 - Sarfaraaz
通过向过滤器添加一个“deny”节点来实现,具体如何操作? - mrhotroad
@mrhotroad 我不确定当前的log4net版本与2014年的版本有多大的差异,但是这里是关于LevelMatchFilter.AcceptOnMatch的文档。http://logging.apache.org/log4net/release/sdk/html/P_log4net_Filter_LevelMatchFilter_AcceptOnMatch.htm 所以你可以这样做:<levelToMatch value="WARN" AcceptOnMatch="false"/> - ulty4life

8

官方文档 (Apache log4net™ Manual - Introduction) 指出了以下日志级别:

  • ALL(全部)
  • DEBUG(调试)
  • INFO(信息)
  • WARN(警告)
  • ERROR(错误)
  • FATAL(严重错误)
  • OFF(关闭)

但是,奇怪的是,在查看程序集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
就此而言,它们都列在以下链接中,但似乎他们已经有一段时间没有更新他们的手册了。 http://logging.apache.org/log4net/release/sdk/html/T_log4net_Core_Level.htm - Dinerdo
2
级别良好;级别更好;级别最佳。从现在开始,我只会使用这三个级别。 - maembe

0

你可以将此用于特定的日志警告:(添加到appender)

<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>

0

<root>中设置日志级别,日志将包括该级别及其以下所有级别:

<root>
  <level value="DEBUG" />
  <appender-ref ref="TraceAppender" />
  <appender-ref ref="ConsoleAppender" />
  <appender-ref ref="RollingFileAppender" />
</root>

-5

试试这样做,对我有用

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

这个记录了三种类型的错误 - 错误,信息和警告


8
根据log4net文档,对于根日志记录器:“level”:可选元素,仅允许一个。 定义此记录器的日志级别。 此记录器仅接受具有该级别或更高级别的事件。 - gonadarian
为什么这个答案被踩了?它对我也有效。因此我要点赞。 - amilamad
2
因为<level value="WARN" />已经足够了。 - rlesias

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