【问题标题】:In Log4j2, how do I associate an XML Schema with log4j2.xml?在 Log4j2 中,如何将 XML Schema 与 log4j2.xml 关联?
【发布时间】:2012-12-03 23:27:41
【问题描述】:

我一直在尝试新的 Log4j2。从documentation on migration 看来,XML Schema/DTD 规范已被取消。

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

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

【问题讨论】:

标签: java log4j log4j2


【解决方案1】:

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

或反对标记版本:

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

【讨论】:

【解决方案2】:

请重新阅读关于 XML configuration 的 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 格式

【讨论】:

  • 架构在哪里?
  • @BrunoJCM log4j-core-2.6.2.jar/Log4j-config.xsd,但我这样使用它:&lt;Configuration strict="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://git-wip-us.apache.org/repos/asf?p=logging-log4j2.git;a=blob_plain;f=log4j-core/src/main/resources/Log4j-config.xsd"&gt;
  • 谢谢,但在意识到严格模式不允许 Logger 上的可选附加程序后,我放弃了..
  • 顺便说一句,提供的位置似乎已过时...新位置似乎像https://raw.githubusercontent.com/apache/logging-log4j2/master/log4j-core/src/main/resources/Log4j-config.xsd
【解决方案3】:

我似乎在 Log4J2 网站上找不到对 XSD 的引用,但如果您下载 for 2.0 beta 5,您会发现它在路径中包含 Log4J 2 架构 (Log4J-V2.0.xsd)核心/src/main/resources。

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

我说“主要是”是因为我发现一个问题是 XSD 中甚至缺少一些记录在案的有效属性(例如 monitorInterval)。

希望未来的版本能够提供严格格式的准确 XSD。

希望对你有所帮助。

-史蒂夫

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

【讨论】:

  • 3.5 年后,这个问题仍未解决。这就是为什么您不根据文档选择库的原因。
  • @Dave 该问题已过时,是的,但 99% 已正确验证,并且您还可以获得内容支持。 XSD 在log4j-core-2.6.2.jar/Log4j-config.xsd 中始终可用,您可以随时将其复制出来并添加该属性。
  • 这也可能有帮助:marxsoftware.blogspot.com/2016/08/…
【解决方案4】:

我认为不可能有一个带有 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 中,我有:&lt;configuration status="ERROR"。当它存在时,log4j2 将在运行时输出与错误配置相关的任何错误。虽然不如 XML 验证方便,但也非常有用!

希望对你有所帮助, 穆尔。

【讨论】:

  • 我明白了。我无法批评 Log4j2 的设计,但我认为 XML 的全部意义在于它很容易验证……但无论如何,谢谢!
  • 有可能,&lt;Appender type="CyclicBuffer"&gt; 的非动态格式也可以:logging.apache.org/log4j/2.x/manual/…; glory1 3 年前详细阐述过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2015-07-11
相关资源
最近更新 更多