log4net层次结构和日志级别

这个网站说

logging仪可能被分配级别。 级别是log4net.Core.Level类的实例。 以下级别按优先顺序排列

  • 所有
  • DEBUG
  • 信息
  • 警告
  • 错误
  • 致命
  • closures

DEBUG似乎具有最低的优先级,ERROR较高。

  • 如果我设置最小和最大的例子DEBUG和错误,它打印everthing DEBUG,信息,警告和错误。 不使用最小和最大的filter。 如果我指定错误(logging级别=错误)它将包括debugging,信息和警告
<filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ERROR"/> <param name="LevelMax" value="ERROR"/> </filter> 

而不是最小和最大的filter。 是否可以configuration一个级别,并包括其下的所有其他级别的日志logging。

示例 – 将级别设置为错误,它将包括DEBUG,INFO,WARN和ERROR。 这可能与log4net?

根据以下其中一条注释发布log4netconfiguration:

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

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

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

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

这可能有助于了解什么级别logging器可能被分配级别logging什么。 级别是log4net.Core.Level类的实例。 以下级别按照日益严重的顺序定义 – 日志级别。

为每个设置级别logging的级别数量:

  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 

正如其他人所指出的那样,通常最好指定一个最低日志logging级别来logging该级别,而其他任何级别都比这更严格。 看来你只是在考虑日志级别的倒退。

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

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

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

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

参考文档: log4net.Filter.LevelMatchFilter

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

其真正的官方文档( Apache log4net™手册 – 介绍 )指出有以下几个级别…

  • 所有
  • DEBUG
  • 信息
  • 警告
  • 错误
  • 致命
  • closures

…但奇怪的是,当我查看程序集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很长一段时间。 我想知道为什么这些其他级别不在文档中。 而且,所有这些层次的真正优先级是什么?

以下是一些关于所有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.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); } 

在这里input图像说明