Hi, I'm not sure how to do implement it the "right" way. What I did in my project was more like a hack (imho). I wanted quick results that are not so dirty that I should feel bad. Therefore I reused KeyValuePair and just allowed them to appear in an AppendersType and then put the name of a KeyValuePair along with its value (or body) to the attributes of the parent node. KeyValuePair is used as a parameter for some Plugins like MapRewritePolicy, DynamicThresholdFilter and others. I'm currently striving towards another solution that would feel more right: I'd like to create a new XML complexType that just has a name and value - probably not even a value but a body/extending xs:string (just like PropertyType) and call it AttributeType (Attribute) *edit* better call it ParameterType (Parameter) because in the documentation they're referred as Parameters and that's what they are. We could then configure an Appender like this:
<Appender type="Console" name="EXCEPTION"> <Parameter name="target">SYSTEM_ERR</Parameter> <Layout Type="PatternLayout"> <Pattern> %date{dd.MM.yyyy HH:mm:ss,SSS} %C{1}.%M %logger in thread %thread %m %xEx%n</Pattern> </Layout> <Filters> <Filter type="MarkerFilter" marker="FLOW" onMatch="NEUTRAL" onMismatch="NEUTRAL" /> <Filter type="MarkerFilter" marker="EXCEPTION" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> </Appender> This will work as long as nobody implements a @Plugin with name "Parameter". I'm eager to read your thoughts on this proposal. *edit2* My patch proposal: (I also edited the current Log4j2-config.xsd to reflect the current implementation on the ConfigurationType element - and since there are so many attributes I sorted them - and I also fixed some minOccurs and maxOccurs attributes.) It's really only a small change if I don't have to hack around but alter the sources directly :) I implemented it in getType (which was saved as a name... - final String name = getType(child);) Index: src/main/java/org/apache/logging/log4j/core/config/XMLConfiguration.java =================================================================== --- src/main/java/org/apache/logging/log4j/core/config/XMLConfiguration.java (revision 1533024) +++ src/main/java/org/apache/logging/log4j/core/config/XMLConfiguration.java (working copy) @@ -329,6 +329,12 @@ private String getType(final Element element) { if (strict) { + if( "parameter".equalsIgnoreCase(element.getTagName()) ) { + final String nameValue = element.getAttribute("name"); + if( nameValue != null ) { + return nameValue; + } + } final NamedNodeMap attrs = element.getAttributes(); for (int i = 0; i < attrs.getLength(); ++i) { final org.w3c.dom.Node w3cNode = attrs.item(i); Index: src/main/resources/Log4j-config.xsd =================================================================== --- src/main/resources/Log4j-config.xsd (revision 1533024) +++ src/main/resources/Log4j-config.xsd (working copy) @@ -20,28 +20,34 @@ <xs:element name="Configuration" type="ConfigurationType"/> <xs:complexType name="ConfigurationType"> <xs:sequence> - <xs:element name="Properties" type="PropertiesType"/> + <xs:element name="Properties" type="PropertiesType" minOccurs="0"/> <xs:choice minOccurs="0" maxOccurs="1"> <xs:element name="Filters" type="FiltersType"/> <xs:element name="Filter" type="FilterType"/> </xs:choice> - <xs:element name="ThresholdFilter" type="ThresholdFilterType"/> + <xs:element name="ThresholdFilter" type="ThresholdFilterType" minOccurs="0"/> <xs:element name="Appenders" type="AppendersType"/> <xs:element name="Loggers" type="LoggersType"/> </xs:sequence> + <xs:attribute name="advertiser" type="xs:string"/> + <xs:attribute name="dest" type="xs:string"/> + <xs:attribute name="monitorInterval" type="xs:int"/> + <xs:attribute name="name" type="xs:string"/> <xs:attribute name="packages" type="xs:string"/> + <xs:attribute name="schema" type="xs:string"/> + <xs:attribute name="shutdownHook" type="xs:boolean"/> <xs:attribute name="status" type="xs:string"/> <xs:attribute name="strict" type="xs:string"/> - <xs:attribute name="name" type="xs:string"/> - <xs:attribute name="advertiser" type="xs:string"/> + <xs:attribute name="verbose" type="xs:boolean"/> </xs:complexType> <xs:complexType name="PropertiesType"> <xs:sequence> - <xs:element name="Property" type="PropertyType"/> + <xs:element name="Property" type="PropertyType" minOccurs="1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="AppenderType"> <xs:sequence> + <xs:element name="Parameter" type="ParameterType" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Layout" type="LayoutType" minOccurs="0"/> <xs:choice minOccurs="0" maxOccurs="1"> <xs:element name="Filters" type="FiltersType"/> @@ -65,6 +71,13 @@ </xs:extension> </xs:simpleContent> </xs:complexType> + <xs:complexType name="ParameterType"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="name" type="xs:string"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> <xs:complexType name="KeyValuePairType"> <xs:simpleContent> <xs:extension base="xs:string"> The config can then be strict, the general structure of the document validated but one is still able to use custom Plugins. Not the ideal world scenario Gary wanted (which I'd appreciate) but still an improvement imho. Best Regards, Alex -----Ursprüngliche Nachricht----- Von: Rathai, Alexander Gesendet: Donnerstag, 17. Oktober 2013 09:15 An: log4j-user@logging.apache.org Betreff: AW: Log4j2 Appender attributes with strict xml config Hi, will do as soon as I got some spare time. I already checked out the trunk. I have to admit that my solution is a bit dirty (imho) and there's a warning when validating a config that uses KeyValuePairs on Appenders. When I make a diff I'll patch the original classes and thus make sure that everything is set up nicely. Best Regards, Alex -----Ursprüngliche Nachricht----- Von: Remko Popma [mailto:remko.po...@gmail.com] Gesendet: Mittwoch, 16. Oktober 2013 16:40 An: Log4J Users List Betreff: Re: Log4j2 Appender attributes with strict xml config On Wednesday, October 16, 2013, Gary Gregory wrote: > On Wed, Oct 16, 2013 at 8:48 AM, Remko Popma > <remko.po...@gmail.com<javascript:;>> > wrote: > > > Perfection may be hard to achieve, but if Alexander's suggestions > > are an improvement over the current schema, should we add them to > > the current > code > > base? > > > > Probably but where are they? It looks like some text was lost in a > reply to this thread. > > Gary Hm, it's a bit hard to do this via mail (but perhaps that's just me...) Alexander, would you mind raising a JIRA ticket and appending your modifications to it? A diff patch file would be ideal. Best regards, Remko *snip old conversation* --------------------------------------------------------------------- To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org For additional commands, e-mail: log4j-user-h...@logging.apache.org