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

Reply via email to