[ 
https://issues.apache.org/jira/browse/LOG4J2-166?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Ralph Goers resolved LOG4J2-166.
--------------------------------

       Resolution: Fixed
    Fix Version/s: 2.0-beta9

The problem was that when the default route was selected it was not returning 
the AppenderControl.  This has been resolved in revision 1505102. Please verify 
and close.
                
> Routing Appender default Route broken for references
> ----------------------------------------------------
>
>                 Key: LOG4J2-166
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-166
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.0-beta4, 2.0-beta5, 2.0-beta6
>            Reporter: David Johle
>              Labels: appender, config, configuration, route, routing
>             Fix For: 2.0-beta9
>
>
> I recently updated to using beta4 and ran into a problem upon startup where I 
> received numerous errors such as this:
> 2013-02-14 12:27:40,139 ERROR No Appender was configured for route null
> Everything was working great up though beta3.  After tracing it back, I think 
> I found that it relates to the change Ralph alluded to in LOG4J2-129...
> "The problem was that the code was treating the Appender being created under 
> the default Route as the default. That is incorrect. The code has been 
> modified to just keep track of the default route."
> I think my setup was relying on that incorrect behavior, and that it's 
> somewhat similar to what William is trying to accomplish.
> (His comment: 
> https://issues.apache.org/jira/browse/LOG4J2-129?focusedCommentId=13553008&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13553008
>  )
> I have several appenders created, and a routing appender to map events to 
> them using static definitions.  I also have a catch-all appender where I want 
> all non-matched events to be sent.  The [abbreviated] configuration is like 
> this:
> {code}
>   <appenders>
>     <RollingFile name="apples" fileName="logs/apples" 
> filePattern="logs/apples.%d{yyyy-MM-dd}">
>       <PatternLayout pattern="${commonLayout}"/>
>       <Policies>
>         <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
>       </Policies>
>     </RollingFile>
>     <RollingFile name="oranges" fileName="logs/oranges" 
> filePattern="logs/oranges.%d{yyyy-MM-dd}">
>       <PatternLayout pattern="${commonLayout}"/>
>       <Policies>
>         <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
>       </Policies>
>     </RollingFile>
>     <RollingFile name="other" fileName="logs/other" 
> filePattern="logs/other.%d{yyyy-MM-dd}">
>       <PatternLayout pattern="${commonLayout}"/>
>       <Policies>
>         <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
>       </Policies>
>     </RollingFile>
>     <Routing name="Routing">
>       <Routes pattern="$${ctx:fruit}">
>         <Route key="apples" ref="apples"/>
>         <Route key="oranges" ref="oranges"/>
>         <Route ref="other"/>
>       </Routes>
>     </Routing>
>   </appenders>
> {code}
> So the idea is that anything which has a ctx:fruit value of apples/oranges 
> goes into the specific files, any everything else (regardless of ctx:fruit 
> being defined or not) going into the "other" file.
> At startup time, most (if not all) events fall into the case of not having 
> ctx:fruit defined at all.  And during my debugging, I saw that "...the 
> replacement won't occur if the context value isn't present.." as William 
> mentioned.
> In RoutingAppender.java on line 107 there is:
>    final String key = config.getSubst().replace(event, routes.getPattern());
> The value that ends up being assigned is the literal string "$\{ctx:fruit\}" 
> instead of null.  As a result, it chooses the default Route entry of "other" 
> which hasn't been created yet, so it proceeds to create that appender.  So 
> far so good, until...
> In RoutingAppender.java on lines 142-144 there is:
> {code}
>         final Node routeNode = route.getNode();
>         for (final Node node : routeNode.getChildren()) {
>             if (node.getType().getElementName().equals("appender")) {
> {code}
> I traced the execution and routeNode.getChildren() returns an empty list.  I 
> believe this is due to the <Route/> entries in the config...they don't have 
> any child nodes because they are just referencing some existing appenders.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to