在Log4j2中,如何将XML Schema与log4j2.xml相关联?

glt*_*lts 33 java log4j log4j2

我一直在给新的Log4j2.从迁移文档中可以看出,XML Schema/DTD规范已被废除.

这似乎是倒退一步.当然应该可以将XML Schema或DTD与我联系起来,log4j2.xml以协助编写和验证.我无法在文档中找到任何有用的东西,也没有找到XML Schema或DTD本身.

那么:在Log4j2中,我应该如何将XML Schema与log4j2.xml

小智 17

请重新阅读有关XML配置的Log4J2文档,您将找到以下两个位置:

可以使用两种XML风格配置Log4j; 简洁严格.简洁的格式使配置变得非常简单,因为元素名称与它们所代表的组件相匹配,但是无法使用XML模式进行验证.例如,通过在其父appenders元素下声明名为Console的XML元素来配置ConsoleAppender.但是,元素和属性名称不区分大小写.此外,可以将属性指定为XML属性,也可以指定为没有属性且具有文本值的XML元素.

再进一步:

严格的XML.除了上面简洁的XML格式之外,Log4j还允许以更"正常"的XML方式指定配置,可以使用XML Schema进行验证.这是通过将上面的友好元素名称替换为其对象类型来实现的,如下所示.例如,不是使用名为Console的元素配置ConsoleAppender,而是将其配置为具有包含"Console"的type属性的appender元素.

因此,如果要对Log4j2使用XML模式验证,则只使用Strict XML格式.

  • 架构在哪里? (8认同)
  • 谢谢,但是在意识到严格模式不允许在 Logger 上使用可选的 appender 之后,我放弃了它.. (2认同)

sfo*_*dal 11

我似乎无法在Log4J2网站上找到对XSD的引用,但是如果你下载for for beta beta 5,你会发现它在路径core/src中包含一个Log4J 2架构(Log4J-V2.0.xsd) /主/资源.

正如Muel所说,很有可能拥有自定义appender.因此,我相信只有在主配置节点中使用strict ="true"才能使用它.

请参阅:http://logging.apache.org/log4j/2.x/manual/configuration.html#ConfigurationSyntax

我已经使用schema属性将其添加到配置中,它似乎主要起作用.

这是一个例子:

<configuration name="testConfiguration"
    status="debug"
    strict="true"
    monitorInterval="30"
    schema="Log4J-V2.0.xsd">
Run Code Online (Sandbox Code Playgroud)

我说"大多数"是因为我发现有一个问题,即使XSD中缺少一些记录有效的属性(例如monitorInterval).

希望在将来的版本中,可以获得严格格式的准确XSD.

希望这个对你有帮助.

史蒂夫

更新: 有关XSD验证的问题,请参阅LOG4J2-170


x54*_*545 10

适用于eclipse:

<Configuration strict="true"
           xmlns="http://logging.apache.org/log4j/2.0/config"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://logging.apache.org/log4j/2.0/config 
           https://raw.githubusercontent.com/apache/logging-log4j2/master/log4j-core/src/main/resources/Log4j-config.xsd">
Run Code Online (Sandbox Code Playgroud)

或者针对标记版本:

<Configuration strict="true"
           xmlns="http://logging.apache.org/log4j/2.0/config"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://logging.apache.org/log4j/2.0/config 
           https://raw.githubusercontent.com/apache/logging-log4j2/log4j-2.8.2/log4j-core/src/main/resources/Log4j-config.xsd">
Run Code Online (Sandbox Code Playgroud)

  • 不错:-)小建议:使用Log4j 2版本的标签,例如log4j-2.9-rc1,而不是主分支.如果XSD发生变化:https://raw.githubusercontent.com/apache/logging-log4j2/log4j-2.9-rc1/log4j-core/src/main/resources/Log4j-config.xsd (2认同)

Mue*_*uel 7

我认为使用log4j2可能没有架构/ DTD.最近我写了一个自定义appender,并支持appender我的log4j2.xml样子如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="ERROR" packages="package.same.as.custom.appender">
  <appenders>
    <CyclicBuffer name="CyclicBuffer" bufferSize="200">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %c{1.} - %msg%n"/>
    </CyclicBuffer>
  </appenders>
  <loggers>
    <root level="info">
      <appender-ref ref="CyclicBuffer"/>
    </root>
  </loggers>
</configuration>
Run Code Online (Sandbox Code Playgroud)

需要注意的重要事项是,我有一个完全自定义的CyclicBuffer元素,并且它具有完全自定义的bufferSize属性.查看周围的文档@PluginFactory以及@Plugin更多详细信息.

由于这种定制,我不认为XML可以通过标准的通用XSD/DTD进行验证.相反,如果您希望验证XML,我认为您需要创建自己的XSD.

需要注意的一件重要事情是,在我的XML中,我得到了:<configuration status="ERROR".如果存在,log4j2将在运行时输出与错误配置相关的任何错误.虽然不如XML验证方便,但它也非常有用!

Muel,希望这有一些帮助.

  • 我懂了。我不能批评Log4j2的设计,但是我认为XML的全部重点是易于验证……但是无论如何,谢谢! (2认同)