日志根名称相似的log4net记录器层次结构

| 我在这里找到错误了吗,或者我在此配置上做错了什么?
<appender name=\"ConsoleAppender\" type=\"log4net.Appender.ConsoleAppender\">
  <layout type=\"log4net.Layout.PatternLayout\">
    <conversionPattern value=\"%message%newline\" />
  </layout>
</appender>
<logger name=\"MyApp.Common\">
  <level value=\"WARN\" />
  <appender-ref ref=\"ConsoleAppender\" />
</logger>
<logger name=\"MyApp.Common.Namespace.SomeGenericClass`1\">
  <level value=\"INFO\" />
  <appender-ref ref=\"ConsoleAppender\" />
</logger>
假设我已经按照标准的“ ... DeclaringType \”命名方案命名了记录器,那么我的期望是,只要是WARN,MyApp.Common命名空间下的所有内容都会记录到控制台中或更高。如果它的INFO或更高版本,SomeGenericClass`1中的所有内容都将被记录(如果由于WARN记录器而达到WARN或更高,则两次记录)。 发生的情况是,登录到INFO中的SomeGenericClass`1中的所有内容都将通过管道传输到控制台两次,而不是预期的一次。如果删除更特定的记录器,则不会记录任何内容;如果删除较不特定的记录器,则仅记录一次,两者均符合预期。另外,在配置文件中反转记录器的顺序没有任何作用(正如我所期望的那样,因为我认为顺序无关紧要)。 我在这里找到错误了吗,还是在层次结构的工作方式中缺少重要的东西?     
已邀请:
我使用多个记录器节点的实验经验是,log4net将使用您在任何特定记录器中设置的最低级别。因此,即使您在MyApp.Common中指定了WARN,在MyApp.Common.SomeGenericClass中使用INFO也会导致global(?)级别设置降至WARN。因此,您从MyApp.Common以及MyApp.Common.SomeGenericClass获得了一个条目,因为追加程序ConsoleAppender被触发了两次。 我所要做的是获取日志的子集以转到单独的文件。与您在问题中所说的不完全相同,但它确实包含您想做的事情。我确实想在某个地方记录我的解决方案,以便我自己可以再次找到它;-)。 我创建了两个与上面类似的记录器,尽管其中一个是root,但它的工作原理相同。然后,我创建了两个不同的附加程序,每个附加程序都会过滤不同的错误级别,并在两个记录器中分别引用它们。我得到的是一个文件中OtherNamespace的日志,另一个文件中的其他日志。下面的代码。
<log4net>
<logger name=\"OtherNamespace\">
  <appender-ref ref=\"OtherNamespaceAppender\"/>
</logger>
<root>
  <level value=\"WARN\"/>
  <appender-ref ref=\"MyRollingFileAppender\"/>
</root>
<appender name=\"MyRollingFileAppender\" type=\"log4net.Appender.RollingFileAppender\">
  <file type=\"log4net.Util.PatternString\" value=\"C:\\Comanche\\mylogfileFor_%property{User}.log\" />
  <appendToFile value=\"true\" />
  <rollingStyle value=\"Size\" />
  <threshold value=\"ERROR\" />
  <countDirection value=\"3\" />
  <maxSizeRollBackups value=\"2\" />
  <maximumFileSize value=\"200KB\" />
  <staticLogFileName value=\"true\" />
  <layout type=\"log4net.Layout.PatternLayout\">
    <param name=\"ConversionPattern\" value=\"%-6level%utcdate{ABSOLUTE} – %location :: %message%newline\" />
  </layout>
</appender>
<appender name=\"OtherNamespaceAppender\" type=\"log4net.Appender.RollingFileAppender\">
  <file value=\"C:\\Comanche\\OtherNamespace.log\" />
  <appendToFile value=\"true\" />
  <rollingStyle value=\"Size\" />
  <threshold value=\"WARN\" />
  <countDirection value=\"3\" />
  <maxSizeRollBackups value=\"2\" />
  <maximumFileSize value=\"200KB\" />
  <staticLogFileName value=\"true\" />
  <filter type=\"log4net.Filter.LoggerMatchFilter\">
    <acceptOnMatch value=\"true\" />
    <LoggerToMatch value=\"OtherNamespace\" />
    <!-- set your class name here -->
  </filter>

  <filter type=\"log4net.Filter.DenyAllFilter\" />

  <layout type=\"log4net.Layout.PatternLayout\">
    <param name=\"ConversionPattern\" value=\"%-6level%utcdate{ABSOLUTE} :: %message%newline\" />
  </layout>
</appender>
请注意,“其他所有内容”都在另一个命名空间中,因此它不会被转移到OtherNamespace记录器中,如果存在某种名称匹配的话,它可能会存在。还要注意,由于一切都是从root继承的,所以如果我将root引用的附加程序的日志记录级别更改为WARN,那么我也将获得OtherNamespace日志。我要做的就是让更详细的日志记录转至其他文件。     
我认为这应该做您想要的(没有测试):
<logger name=\"MyApp.Common\">
     <level value=\"WARN\" />
     <appender-ref ref=\"ConsoleAppender\" />
</logger>
<logger name=\"MyApp.Common.Namespace.SomeGenericClass`1\">
     <level value=\"INFO\" />  
</logger>
无需再次引用该追加程序,除非您将加性设置为false,否则它将自动继承。     

要回复问题请先登录注册