log4j2 xsd_Log4j 2.x XSD的描述不完整

log4j2 xsd

在博客文章JAXB和Log4j XML配置文件中 ,我讨论了“与使用JAXB通过Java类处理[Log4j 1.x和Log4j 2.x] XML配置文件相关的细微差别。” 在本文中,我将探讨与通过Log4j 2.x XML Schema文件Log4j-config.xsd生成的JAXB对象生成Log4j 2.x配置XML相关的另一挑战:它没有完全指定Log4j 2.x组件的配置特点。

使用Log4j 2.x XML配置时 ,首先要做出的重要区别之一是要使用XML的“ 风味 ”(“简洁”或“严格”)。 简洁的格式可能更容易,因为XML元素的名称对应于它们表示的Log4j 2组件,但XSD仅支持严格格式。 这意味着从Log4j 2.x XSD生成的JAXB对象编组的任何XML都必须具有“严格”格式,而不是“简洁”格式。

不幸的是,当前与Log4j 2.x发行版一起提供的XSD( Log4j-config.xsd )不足以生成Log4j 2支持的完整“严格” XML配置。我在这里通过讨论XSD定义的复杂类型来演示这一点。 “ AppenderType ”,因为它是受支持元素在XSD中缺少其潜在属性规范的最极端情况之一。 从Log4j 2.6.2开始,下面的代码清单显示了Log4j-config.xsdAppenderType的定义。

在Log4j 2.6.2的Log4j-config.xsd定义的AppenderType

<xs:complexType name="AppenderType"><xs:sequence><xs:element name="Layout" type="LayoutType" minOccurs="0"/><xs:choice minOccurs="0" maxOccurs="1"><xs:element name="Filters" type="FiltersType"/><xs:element name="Filter" type="FilterType"/></xs:choice></xs:sequence><xs:attribute name="type" type="xs:string" use="required"/><xs:attribute name="name" type="xs:string" use="required"/><xs:attribute name="fileName" type="xs:string" use="optional"/>
</xs:complexType>

刚刚显示的XSD的摘录告诉我们,以XSD兼容的XML描述的追加器将只能具有三个属性( typenamefileName )中的一个或多个。 “ type ”属性用于标识其附加器的类型(例如“ File ”,“ RollingFile ”,“ Console ”,“ Socket ”和“ Syslog ”)。 问题在于,每个“附加”类型都具有不同的属性和特性,理想情况下,可以通过此AppenderType上的属性来描述它们。

Appenders上的Log4j 2.x文档列出了不同类型的附加程序的特征。 例如,此页面指示ConsoleAppender具有七个参数: filterlayoutfollowdirectnameignoreExceptionstarget 。 该name是由一般所支持的属性之一AppenderType复杂类型和filterlayout通过在嵌套的元件支撑AppenderType 。 但是,可用于ConsoleAppender的其他四个参数在XSD中没有规定定义它们的机制。

甚至不考虑自定义Log4j 2.x追加器 , 内置的Log4j 2.x追加器不会共享相同的属性和特征,并且它们中大多数具有比AppenderType指定的三个属性和两个嵌套元素更多的特征。 我讨论的七个参数的控制台追加程序以前和其他例子包括RollingFileAppender进行其12个参数( appendbufferedIObufferSizefilterfileNamefilePatternimmediateFlushlayoutnamepolicystrategyignoreExceptions )的JDBCAppender与七个参数( nameignoreExceptionsfilterbufferSizeconnectionSourcetableNamecolumnConfigs )和JMSAppender及其十三个参数( factoryBindingNamefactoryNamefilterlayoutnamepasswordproviderURLdestinationBindingNamesecurityPrincipalNamesecurityCredentialsignoreExceptionsurlPkgPrefixesuserName )。

为了描述XSD中给定的附加器类型可用的每个参数,将需要XML Schema具备以下能力:特定的一组可用属性取决于AppenderTypetype属性的设置。 不幸的是,XML Schema不容易支持这种条件规范,在该条件规范中,给定复杂类型的可用属性基于复杂类型的其他属性之一而不同。

由于模式语言的局限性,想要使用JAXB生成对所有提供的附加程序均具有完全支持的对象的人将需要更改XSD。 一种方法是更改​​XSD,以使AppenderType具有任何内置附加程序的所有可能属性,这些附加属性可用作元素的可选属性。 最明显的缺点是,即使该属性不适用于特定的附加程序类型,XSD也会允许任何附加程序类型具有任何属性。 但是,这种方法将允许JAXB生成的对象针对给定的附加程序类型配置所有XML属性。 下一个代码段说明了如何开始。 此处指定了一些不同的追加器所需的其他属性,但是即使更长的列表也不包含支持所有可能的内置追加器类型的属性所需的所有可能的追加器属性。

一些添加到AppenderType Appender属性

<xs:complexType name="AppenderType"><xs:sequence><xs:element name="Layout" type="LayoutType" minOccurs="0"/><xs:choice minOccurs="0" maxOccurs="1"><xs:element name="Filters" type="FiltersType"/><xs:element name="Filter" type="FilterType"/></xs:choice></xs:sequence><xs:attribute name="type" type="xs:string" use="required"/><xs:attribute name="name" type="xs:string" use="required"/><xs:attribute name="fileName" type="xs:string" use="optional"/><!-- Attributes specified below here are not in Log4j 2.x Log4j-config.xsd --><xs:attribute name="target" type="xs:string" use="optional"/><xs:attribute name="follow" type="xs:string" use="optional"/><xs:attribute name="append" type="xs:string" use="optional"/><xs:attribute name="filePattern" type="xs:string" use="optional"/><xs:attribute name="host" type="xs:string" use="optional"/><xs:attribute name="port" type="xs:string" use="optional"/><xs:attribute name="protocol" type="xs:string" use="optional"/><xs:attribute name="connectTimeoutMillis" type="xs:integer" use="optional"/><xs:attribute name="reconnectionDelayMillis" type="xs:string" use="optional"/><xs:attribute name="facility" type="xs:string" use="optional"/><xs:attribute name="id" type="xs:string" use="optional"/><xs:attribute name="enterpriseNumber" type="xs:integer" use="optional"/><xs:attribute name="useMdc" type="xs:boolean" use="optional"/><xs:attribute name="mdcId" type="xs:string" use="optional"/><xs:attribute name="mdcPrefix" type="xs:string" use="optional"/><xs:attribute name="eventPrefix" type="xs:string" use="optional"/><xs:attribute name="newLine" type="xs:boolean" use="optional"/><xs:attribute name="newLineEscape" type="xs:string" use="optional"/>
</xs:complexType>

更改Log4j 2.x XSD以完全支持所有内置附加程序的第二种方法是将XSD设计从具有一个由type属性指定的特定类型的单个AppenderType更改为具有许多不同的复杂类型,每个复杂类型分别表示不同的XSD设计。内置的附加器类型。 使用这种方法,XSD可以强制执行任何给定附加程序的所有属性,并且仅与该给定附加程序相关联的属性。 每个追加程序都具有元素类型的这种方法类似于“简洁” XML格式的工作方式,但是当前没有XSD支持。

请注意,我在这里有意专注于内置的附加器类型,因为可以期望静态XSD能够合理,充分且完全地支持它。 另外:可以通过为属性指定任意的名称/值对来支持此操作,就像对过滤器或使用参数进行的操作一样 ,但是这还导致能够指定多余的甚至是无用的属性,而架构没有任何能力来捕获这些属性。 支持自定义类型的第三种方法是不使用静态XSD描述语法,而是使用生成的XSD。 可以根据文档中Log4j 2.x组件的描述来手写这样的XSD,但是更好的方法可能是利用Log4j 2.x中使用的@PluginFactory , @PluginElement和@PluginAttribute注释。源代码。 以下两个代码清单来自Apache Log4j 2.6.2代码库,并演示了这些注释如何描述给定类型的元素和属性。

ConsoleAppender.createAppender()签名

@PluginFactory
public static ConsoleAppender createAppender(@PluginElement("Layout") Layout layout,@PluginElement("Filter") final Filter filter,@PluginAttribute(value = "target", defaultString = "SYSTEM_OUT") final String targetStr,@PluginAttribute("name") final String name,@PluginAttribute(value = "follow", defaultBoolean = false) final String follow,@PluginAttribute(value = "ignoreExceptions", defaultBoolean = true) final String ignore)

SysLogAppender.createAppender()签名

@PluginFactory
public static SyslogAppender createAppender(// @formatter:off@PluginAttribute("host") final String host,@PluginAttribute(value = "port", defaultInt = 0) final int port,@PluginAttribute("protocol") final String protocolStr,@PluginElement("SSL") final SslConfiguration sslConfig,@PluginAttribute(value = "connectTimeoutMillis", defaultInt = 0) final int connectTimeoutMillis,@PluginAliases("reconnectionDelay") // deprecated@PluginAttribute(value = "reconnectionDelayMillis", defaultInt = 0) final int reconnectionDelayMillis,@PluginAttribute(value = "immediateFail", defaultBoolean = true) final boolean immediateFail,@PluginAttribute("name") final String name,@PluginAttribute(value = "immediateFlush", defaultBoolean = true) final boolean immediateFlush,@PluginAttribute(value = "ignoreExceptions", defaultBoolean = true) final boolean ignoreExceptions,@PluginAttribute(value = "facility", defaultString = "LOCAL0") final Facility facility,@PluginAttribute("id") final String id,@PluginAttribute(value = "enterpriseNumber", defaultInt = Rfc5424Layout.DEFAULT_ENTERPRISE_NUMBER) final int enterpriseNumber,@PluginAttribute(value = "includeMdc", defaultBoolean = true) final boolean includeMdc,@PluginAttribute("mdcId") final String mdcId,@PluginAttribute("mdcPrefix") final String mdcPrefix,@PluginAttribute("eventPrefix") final String eventPrefix,@PluginAttribute(value = "newLine", defaultBoolean = false) final boolean newLine,@PluginAttribute("newLineEscape") final String escapeNL,@PluginAttribute("appName") final String appName,@PluginAttribute("messageId") final String msgId,@PluginAttribute("mdcExcludes") final String excludes,@PluginAttribute("mdcIncludes") final String includes,@PluginAttribute("mdcRequired") final String required,@PluginAttribute("format") final String format,@PluginElement("Filter") final Filter filter,@PluginConfiguration final Configuration config,@PluginAttribute(value = "charset", defaultString = "UTF-8") final Charset charsetName,@PluginAttribute("exceptionPattern") final String exceptionPattern,@PluginElement("LoggerFields") final LoggerFields[] loggerFields, @PluginAttribute(value = "advertise", defaultBoolean = false) final boolean advertise)

这种方法需要几个步骤,因为一个人需要使用Log4j 2.x体系结构的主要组成部分的知识以及注释处理来动态生成XSD,然后使用JAXB生成能够封送综合Log4j 2.x的Java类。 XML。

要考虑的另一种选择是使用“简洁的” XML或另一种形式的Log4j 2.x配置 (例如JSON或属性文件 ),而不使用XSD生成用于编组Log4j 2.x配置的JAXB对象。 值得注意的是,用于Log4j 2.x且具有“ strict”格式的XML配置文件显然不需要针对Log4j-config.xsd进行验证,否则XML的“ strict”形式将无法完全指定Log4j2组态。 这意味着即使拥有XSD,剩下的价值是供我们自己的工具或脚本使用,以便在与Log4j 2.x结合使用之前先使用它来验证我们的XML配置,或者用于编组/解编Log4j2.x。带有JAXB的XML。

结论

Log4j2发行版随附的Log4j-config.xsd不足以验证“严格” XML配置中的所有Log4j 2.x构造,同样不足以生成用于封送Log4j2严格XML的JAXB对象。 希望使用XSD进行验证或JAXB类生成的开发人员将需要手动更改XSD或从Log4j2源代码生成XSD。

这些参考文献在上面的文章中链接到内联,但此处出于强调目的而列出。

  • 在Log4j2中,如何将XML模式与log4j2.xml关联?
  • [LOG4J2-170]发生架构验证Log4J-V2.0.xsd失败
  • [LOG4J2-411] 支持XSD / DTD链接到配置文件
  • logging-log4j-user邮件列表 :“ Log4j2 Appender属性具有严格的xml配置 ”
    • 从注释生成XSD?

翻译自: https://www.javacodegeeks.com/2016/08/log4j-2-x-xsd-not-fully-descriptive.html

log4j2 xsd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tampermonkey怎么不能用了_普洱茶发霉了怎么办?能不能用太阳晒

大家都知道普洱茶要储藏在通风干燥的地方&#xff0c;如果储存不恰当就可能变质发霉。而且普洱茶很容易吸味&#xff0c;需要存放到干净的环境并避免日晒。当发现茶叶发霉的现象比较严重时&#xff0c;需要直接扔掉。如果不严重&#xff0c;可以采用以下方法&#xff1a;千万不…

java开发常见异常_最常见的Java异常及其对Java开发人员的评价

java开发常见异常我知道我说过在完成视频之前我不会发帖&#xff0c;但这一直困扰着我。 至于视频的更新&#xff0c;我有些懒散&#xff0c;有些忙碌&#xff0c;但是我已经准备好记录第一集&#xff0c;这是我第一次有机会&#xff0c;而且我不需要太多的编辑。 无论如何&…

vue 动态变量名_【告别复制粘贴】动态模板生成小技巧

? 这是第 75篇不掺水的原创&#xff0c;想要了解更多&#xff0c;请戳上方蓝色字体&#xff1a;政采云前端团队关注我们吧&#xff5e;本文首发于政采云前端团队博客&#xff1a;告别复制粘贴&#xff1a;动态模板生成小技巧https://www.zoo.team/article/dynamic-template-ge…

【安卓开发 】Android初级开发(六)Activity生命周期

Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d("Activity生命周期","onCreate创建页面");}Overrideprotected void onStart() {super.onStart();Log.d(…

jboss项目导入idea_如何导入任何JBoss BRMS示例项目

jboss项目导入idea在过去几周内&#xff0c;JBoss BRMS演示的用户反复询问我以下内容时&#xff0c;会给您这些提示和技巧&#xff1a; “如何将与各种JBoss BRMS演示项目相关的项目导入到我自己的现有安装中&#xff1f;” 这意味着用户希望在个人安装产品时有一个示例项目&…

amos看拟合度在哪里看_哪里可以看亲爱的热爱的电视剧全集

由杨紫、李现、胡一天、张格出演的暖心甜宠剧《亲爱的&#xff0c;热爱的》正在热播中。该剧根据墨宝非宝小说《蜜汁炖鱿鱼》改编&#xff0c;讲述了一场高智商与高情商的甜萌梦幻爱情故事。剧中李现饰演的高冷G神和杨紫饰演的萌妹学霸&#xff0c;从开头的一见钟情到后面的相处…

【开源项目】Android下自定义HASH【支持一个key对应多个value--根据key排序】

package com.peace.love.carpo_test.tool;import java.util.List; import java.util.Map; import java.util.Set;/*** <p>Can save multiple the value of the map.</p>* Created in 2021/2/20.** author 一笑奈何;*/ public interface HongDou_MultiValueMap<K…

jaxb xml配置_JAXB和Log4j XML配置文件

jaxb xml配置Log4j 1.x和Log4j 2.x均支持使用XML文件来指定日志记录配置 。 这篇文章探讨了与使用JAXB通过Java类处理这些XML配置文件相关的一些细微差别。 本文中的示例基于Apache Log4j 1.2.17 &#xff0c; Apache Log4j 2.6.2和Java 1.8.0_73&#xff08;带有JAXB xjc 2.2.…

multiprocessing.queue取数据要加锁么_干货 | 小程序多页面接口数据缓存

小程序里面多个页面&#xff0c;有时候会需要用到同一个接口的数据。而这些数据全局来说只需要拉取一遍&#xff0c;如果要存到缓存&#xff0c;要怎么保证其他页面取缓存的时候&#xff0c;数据已经拉取回来了呢&#xff1f;答案是多页面接口数据缓存实现。思路设计其实这种场…

【安卓开发 】Android初级开发(七)MD5加密

//MD5加密public String encrypt(String raw){String md5Str raw;try {MessageDigest md MessageDigest.getInstance("MD5");md.update(raw.getBytes());byte[]encryContext md.digest();int i ;StringBuffer buf new StringBuffer("");for (int offse…

apache.camel_Apache Camel 2.18 –即将推出的功能的亮点

apache.camel骆驼骑士正在忙于即将发布的Apache Camel 2.18版本。 当我们动态更新发行说明时 &#xff0c;这是一种快速查看即将发生的情况的方法。 我只是想在夏天在这里进行快速更新&#xff0c;到目前为止&#xff0c;我们已经完成了简短的重点介绍。 随着发行版的临近和文档…

【安卓开发 】Android初级开发(八)WebView网页

1.网页的基本组成 2.WebView的常用方法 WebView webView findViewById(R.id.webvv);//加载线上网页webView.loadUrl("https://www.baidu.com");//加载SD卡上的html文件,Environment.getDownloadCacheDirectory().getPath()为获取SD卡根目录路径webView.loadUrl(&quo…

python整数加法计算器_Python应用实例赏析2.1简单计算

在日常应用中&#xff0c;我们会经常使用计算器进行计算&#xff0c;有些时候普通计算器的功能不能满足需要&#xff0c;例如使用计算机系统自带的计算器&#xff0c;计算不能超过32位数&#xff0c;手机自带计算器不能超过15位等(我的电脑和手机)&#xff0c;也可能计算需要的…

functor_纯Java中的Functor和Monad示例

functor本文最初是我们使用RxJava进行React式编程的附录。 但是&#xff0c;尽管与React式编程非常相关&#xff0c;但对monad的介绍却不太适合。 因此&#xff0c;我决定将其取出并作为博客文章单独发布。 我知道&#xff0c;“ 我对单子的自己的&#xff0c;一半正确和一半的…

【开源项目】Android开发内置App自动升级

1.准备工作&#xff0c;首先需要在AndroidManifest.xml中的application中加入以下内容 <providerandroid:name"android.support.v4.content.FileProvider"android:authorities"需要更新app的包名.fileprovider"android:grantUriPermissions"true&q…

智能雷达物位计说明书_?浅谈人工检尺法和雷达液位计在油罐液位测量中的应用...

近年来&#xff0c;油罐液位的测量工作已成为工业测量中十分重要的部分。过去&#xff0c;在油罐测量方面&#xff0c;人工检尺法是进行液位测量的主要方法之一&#xff0c;但随着科技的发展和进步&#xff0c;雷达液位计等智能化液位测量设备使油罐的监控和测量方式趋向于多元…

【安卓开发 】Android初级开发(九)Android中封装View提供接口供点击事件回调的方法及使用

自古一楼先上图 package com.example.mydialog;import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.Window; i…

spring 自定义日志_Spring和Hibernate的自定义审核日志

spring 自定义日志如果您需要对所有数据库操作进行自动审核 &#xff0c;并且正在使用Hibernate…&#xff0c;则应使用Envers或spring data jpa auditing 。 但是&#xff0c;如果由于某些原因您不能使用Envers&#xff0c;则可以使用Hibernate事件侦听器和spring事务同步来实…

打印pdf就一页_Excel表格打印技巧汇总,看完才发现,你连基础打印技巧都不知道...

前天被老板削了一顿&#xff0c;说我打印的表格连标题行都没有&#xff01;昨天被老板削了两顿&#xff0c;说我打印的表格太浪费纸&#xff01;今天被老板削了五顿&#xff0c;说我表格打印出来的数据居然是错误&#xff01;……在挨削了很多次之后&#xff0c;学会了一些技巧…

机器学习java_如何开始使用Java机器学习

机器学习java什么是开始使用Java机器学习的最佳工具&#xff1f; 他们已经存在了一段时间&#xff0c;但如今看来&#xff0c;每个人都在谈论人工智能和机器学习。 对于科学家和研究人员而言&#xff0c;它已经不再是秘密&#xff0c;几乎可以在任何新兴技术中实现。 在下面的…