我一直在尝试新的 Log4j2。从关于 migration的文档看来,XML Schema/DTD 规范已经被取消了。
这似乎是倒退了一步。当然,应该可以将 XML Schema 或 DTD 与 my 关联log4j2.xml
以帮助编写它并进行验证。我无法在文档中找到任何有用的东西,也没有找到 XML Schema 或 DTD 本身。
所以:在 Log4j2 中,我应该如何将 XML Schema 与log4j2.xml
?
我一直在尝试新的 Log4j2。从关于 migration的文档看来,XML Schema/DTD 规范已经被取消了。
这似乎是倒退了一步。当然,应该可以将 XML Schema 或 DTD 与 my 关联log4j2.xml
以帮助编写它并进行验证。我无法在文档中找到任何有用的东西,也没有找到 XML Schema 或 DTD 本身。
所以:在 Log4j2 中,我应该如何将 XML Schema 与log4j2.xml
?
日食对我有用:
<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">
请重新阅读有关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 格式。
我似乎在 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
我认为不可能有一个带有 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 验证方便,但它也非常有用!
希望这对您有所帮助,穆尔。