Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Log4Net XML配置中,优先级与级别是否相同?_Xml_Logging_Log4net_Log4net Configuration - Fatal编程技术网

在Log4Net XML配置中,优先级与级别是否相同?

在Log4Net XML配置中,优先级与级别是否相同?,xml,logging,log4net,log4net-configuration,Xml,Logging,Log4net,Log4net Configuration,我继承了一些在xml配置中使用根目录下的priority元素的代码。这就像示例中显示的: <root> <priority value="ALL" /> <appender-ref ref="LogFileAppender" /> <appender-ref ref="ConsoleAppender"/> </root> 始终使用级别元素显示它: <root> <level value="DEBUG" /&

我继承了一些在xml配置中使用根目录下的priority元素的代码。这就像示例中显示的:

<root>
 <priority value="ALL" />
 <appender-ref ref="LogFileAppender" />
 <appender-ref ref="ConsoleAppender"/>
</root>

始终使用级别元素显示它:

<root>
 <level value="DEBUG" />
 <appender-ref ref="A1" />
</root>

在这种类型的配置中

<priority>

<level>

?


有人能告诉我文档中解释这一点的地方吗?

log4net中的
Logger
类上没有
Priority
属性。我能找到的
Priority
的唯一实例是
SmtpAppender
。所以我进入了代码

XmlHierarchyConfigurator
ParseChildrenOfLoggerElement
方法中,您将找到以下代码:

if (xmlElement.LocalName == "level" || xmlElement.LocalName == "priority")
{
    this.ParseLevel(xmlElement, log, isRoot);
}
// ...
XmlElement xmlElement = (XmlElement)xmlNode;
if (xmlElement.LocalName == "logger")
{
    this.ParseLogger(xmlElement);
}
else
{
    if (xmlElement.LocalName == "category")
    {
        this.ParseLogger(xmlElement);
    }
    else
    {
        if (xmlElement.LocalName == "root")
        {
            this.ParseRoot(xmlElement);
        }
    // ...
啊!!这两个值被解析为同一个属性(除了分配、记录和管理“继承的”值(这是一个可能的级别)之外,
ParseLevel
方法实际上没有什么作用,所以您就有了它“级别”和“优先级”对配置的影响完全相同。我想这样做是为了保持与该库以前版本的某种向后兼容性,事实上,它得到了以下方面的支持:

在log4j的早期版本中,这些被称为类别和优先级, 但现在它们分别被称为logger和level

实际上,如果我们搜索“category”,则
XmlHierarchyConfigurator
中有一个
Configure
方法,其中包含以下代码:

if (xmlElement.LocalName == "level" || xmlElement.LocalName == "priority")
{
    this.ParseLevel(xmlElement, log, isRoot);
}
// ...
XmlElement xmlElement = (XmlElement)xmlNode;
if (xmlElement.LocalName == "logger")
{
    this.ParseLogger(xmlElement);
}
else
{
    if (xmlElement.LocalName == "category")
    {
        this.ParseLogger(xmlElement);
    }
    else
    {
        if (xmlElement.LocalName == "root")
        {
            this.ParseRoot(xmlElement);
        }
    // ...
就是这样:级别和优先级是可互换的,记录器和类别也是可互换的

有趣的花絮:最后一个属性获胜,并且您可以在记录器上拥有的属性数量没有限制,因此这是有效的,并将设置调试级别

<root>
 <priority value="ALL" />
 <priority value="ERROR" />
 <level value="DEBUG" />
</root>

Wow。谢谢还有,你的“有趣的花絮”解释了我的下一个谜团。我继承的一个配置文件在根目录下有两个优先级元素。我假设“last property wins”和测试验证了这一点,但感谢您的洞察力。不客气,这是一个有趣的分析,我已经从这个答案中得到了一些关于配置解析的建议: