42

我一直在尝试新的 Log4j2。从关于 migration的文档看来,XML Schema/DTD 规范已经被取消了。

这似乎是倒退了一步。当然,应该可以将 XML Schema 或 DTD 与 my 关联log4j2.xml以帮助编写它并进行验证。我无法在文档中找到任何有用的东西,也没有找到 XML Schema 或 DTD 本身。

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

4

4 回答 4

25

日食对我有用:

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

或反对标记版本:

<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">
于 2017-06-21T10:24:00.143 回答
20

请重新阅读有关XML 配置的 Log4J2 文档,您会发现这两个地方:

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

再进一步:

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

因此,如果您想对 Log4j2 使用 XML 模式验证,则仅使用 Strict XML 格式

于 2013-10-16T15:41:56.457 回答
12

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

正如 Muel 所说,很可能有自定义的附加程序。因此,我相信只有在主配置节点中使用 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">

我说“主要是”是因为我发现一个问题是,即使是一些记录在案的有效属性(例如 monitorInterval)也从 XSD 中丢失。

希望在未来的版本中可以使用严格格式的准确 XSD。

希望这个对你有帮助。

-史蒂夫

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

于 2013-04-29T03:32:57.733 回答
8

我认为不可能有一个带有 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>

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

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

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

希望这对您有所帮助,穆尔。

于 2013-02-25T00:53:13.690 回答