The branch, master has been updated
via d6158815139bdc475619c07ce2a1e21185942343 (commit)
from 40c50961a8e1685a2d7dc1bad65eea2361b5c740 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=d6158815139bdc475619c07ce2a1e21185942343
http://github.com/ceki/logback/commit/d6158815139bdc475619c07ce2a1e21185942343
commit d6158815139bdc475619c07ce2a1e21185942343
Author: Ceki Gulcu <[email protected]>
Date: Tue Nov 10 17:07:36 2009 +0100
- ongoing editing of filters.html
- fixed http://jira.qos.ch/browse/LBCLASSIC-155
diff --git
a/logback-classic/src/main/java/ch/qos/logback/classic/boolex/JaninoEventEvaluator.java
b/logback-classic/src/main/java/ch/qos/logback/classic/boolex/JaninoEventEvaluator.java
index 093cc8e..232c689 100644
---
a/logback-classic/src/main/java/ch/qos/logback/classic/boolex/JaninoEventEvaluator.java
+++
b/logback-classic/src/main/java/ch/qos/logback/classic/boolex/JaninoEventEvaluator.java
@@ -23,6 +23,7 @@ import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.LoggerContextVO;
+import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.boolex.JaninoEventEvaluatorBase;
import ch.qos.logback.core.boolex.Matcher;
@@ -45,12 +46,15 @@ public class JaninoEventEvaluator extends
JaninoEventEvaluatorBase<ILoggingEvent
DEFAULT_PARAM_NAME_LIST.add("event");
DEFAULT_PARAM_NAME_LIST.add("message");
+
+ DEFAULT_PARAM_NAME_LIST.add("formattedMessage");
DEFAULT_PARAM_NAME_LIST.add("logger");
DEFAULT_PARAM_NAME_LIST.add("loggerContext");
DEFAULT_PARAM_NAME_LIST.add("level");
DEFAULT_PARAM_NAME_LIST.add("timeStamp");
DEFAULT_PARAM_NAME_LIST.add("marker");
DEFAULT_PARAM_NAME_LIST.add("mdc");
+ DEFAULT_PARAM_NAME_LIST.add("throwableProxy");
DEFAULT_PARAM_NAME_LIST.add("throwable");
DEFAULT_PARAM_TYPE_LIST.add(int.class);
@@ -61,12 +65,14 @@ public class JaninoEventEvaluator extends
JaninoEventEvaluatorBase<ILoggingEvent
DEFAULT_PARAM_TYPE_LIST.add(ILoggingEvent.class);
DEFAULT_PARAM_TYPE_LIST.add(String.class);
DEFAULT_PARAM_TYPE_LIST.add(String.class);
+ DEFAULT_PARAM_TYPE_LIST.add(String.class);
DEFAULT_PARAM_TYPE_LIST.add(LoggerContextVO.class);
DEFAULT_PARAM_TYPE_LIST.add(int.class);
DEFAULT_PARAM_TYPE_LIST.add(long.class);
DEFAULT_PARAM_TYPE_LIST.add(Marker.class);
DEFAULT_PARAM_TYPE_LIST.add(Map.class);
DEFAULT_PARAM_TYPE_LIST.add(IThrowableProxy.class);
+ DEFAULT_PARAM_TYPE_LIST.add(Throwable.class);
}
@@ -111,18 +117,29 @@ public class JaninoEventEvaluator extends
JaninoEventEvaluatorBase<ILoggingEvent
values[i++] = loggingEvent;
values[i++] = loggingEvent.getMessage();
+ values[i++] = loggingEvent.getFormattedMessage();
values[i++] = loggingEvent.getLoggerName();
values[i++] = loggingEvent.getLoggerContextVO();
values[i++] = loggingEvent.getLevel().toInteger();
values[i++] = new Long(loggingEvent.getTimeStamp());
values[i++] = loggingEvent.getMarker();
values[i++] = loggingEvent.getMDCPropertyMap();
- if (loggingEvent.getThrowableProxy() != null) {
- values[i++] = loggingEvent.getThrowableProxy();
+
+ IThrowableProxy iThrowableProxy = loggingEvent.getThrowableProxy();
+
+ if (iThrowableProxy != null) {
+ values[i++] = iThrowableProxy;
+ if(iThrowableProxy instanceof ThrowableProxy) {
+ values[i++] = ((ThrowableProxy) iThrowableProxy).getThrowable();
+ } else {
+ values[i++] = null;
+ }
} else {
values[i++] = null;
+ values[i++] = null;
}
+
for(int j = 0; j < matcherListSize; j++) {
values[i++] = (Matcher) matcherList.get(j);
}
diff --git
a/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/EvaluatorAction.java
b/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/EvaluatorAction.java
index 3d2c890..3880d08 100644
---
a/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/EvaluatorAction.java
+++
b/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/EvaluatorAction.java
@@ -16,11 +16,8 @@ package ch.qos.logback.classic.joran.action;
import ch.qos.logback.classic.boolex.JaninoEventEvaluator;
import ch.qos.logback.core.joran.action.AbstractEventEvaluatorAction;
-
public class EvaluatorAction extends AbstractEventEvaluatorAction {
-
- protected String defaultClassName() {
+ protected String defaultClassName() {
return JaninoEventEvaluator.class.getName();
}
-
}
diff --git
a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextVO.java
b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextVO.java
index b7768d8..e6cbe18 100644
---
a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextVO.java
+++
b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextVO.java
@@ -20,13 +20,14 @@ import ch.qos.logback.classic.LoggerContext;
/**
* LoggerContextVO offers a restricted view of LoggerContext intended to be
- * exposed by LoggingEvent to remote system. This restricted view is optimized
+ * exposed by LoggingEvent to remote systems. This restricted view is optimized
* for serialization.
*
- * Some of the LoggerContext or Logger attributes should not survive
+ * <p>
+ * Some of the LoggerContext or Logger attributes MUST not survive
* serialization, e.g appenders, level values etc, as these attributes may have
- * other values on the remote platform. LoggerContextVO class exposes
- * the minimal (relevant) attributes to remote host, instead of having to deal
+ * other values on the remote platform. LoggerContextVO class exposes the
+ * minimal and relevant attributes to the remote host, instead of having to
deal
* with an incomplete LoggerContext with many null references.
*
* @author Ceki Gülcü
diff --git
a/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java
b/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java
index 13e8ecf..8be5a62 100644
---
a/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java
+++
b/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java
@@ -17,6 +17,8 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import java.io.IOException;
+
import org.junit.Test;
import org.slf4j.MarkerFactory;
@@ -249,4 +251,27 @@ public class JaninoEventEvaluatorTest {
loop(jee, "x.matches(message): ");
}
+ @Test
+ public void throwable_LBCLASSIC_155_I() throws EvaluationException {
+ JaninoEventEvaluator jee = new JaninoEventEvaluator();
+ jee.setExpression("throwable instanceof java.io.IOException");
+ jee.setContext(loggerContext);
+ jee.start();
+
+ LoggingEvent event = makeLoggingEvent(new IOException(""));
+ assertTrue(jee.evaluate(event));
+ }
+
+
+ @Test
+ public void throwable_LBCLASSIC_155_II() throws EvaluationException {
+ JaninoEventEvaluator jee = new JaninoEventEvaluator();
+ jee.setExpression("throwableProxy.getClassName().contains(\"IO\")");
+ jee.setContext(loggerContext);
+ jee.start();
+
+ LoggingEvent event = makeLoggingEvent(new IOException(""));
+ assertTrue(jee.evaluate(event));
+ }
+
}
diff --git
a/logback-core/src/main/java/ch/qos/logback/core/boolex/EventEvaluatorBase.java
b/logback-core/src/main/java/ch/qos/logback/core/boolex/EventEvaluatorBase.java
index 69c60a5..6b758cc 100644
---
a/logback-core/src/main/java/ch/qos/logback/core/boolex/EventEvaluatorBase.java
+++
b/logback-core/src/main/java/ch/qos/logback/core/boolex/EventEvaluatorBase.java
@@ -39,7 +39,6 @@ abstract public class EventEvaluatorBase<E> extends
ContextAwareBase implements
public void start() {
started = true;
-
}
public void stop() {
diff --git a/logback-examples/src/main/java/chapter6/basicEventEvaluator.xml
b/logback-examples/src/main/java/chapter6/basicEventEvaluator.xml
index 16ceb8a..f6a1e3e 100644
--- a/logback-examples/src/main/java/chapter6/basicEventEvaluator.xml
+++ b/logback-examples/src/main/java/chapter6/basicEventEvaluator.xml
@@ -2,7 +2,7 @@
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
- <evaluator name="myEval">
+ <evaluator>
<expression>message.contains("billing")</expression>
</evaluator>
<OnMismatch>NEUTRAL</OnMismatch>
diff --git a/logback-examples/src/main/java/chapter6/basicEventEvaluator.xml
b/logback-examples/src/main/java/chapter6/evaluatorWithMatcher.xml
similarity index 62%
copy from logback-examples/src/main/java/chapter6/basicEventEvaluator.xml
copy to logback-examples/src/main/java/chapter6/evaluatorWithMatcher.xml
index 16ceb8a..64d0efb 100644
--- a/logback-examples/src/main/java/chapter6/basicEventEvaluator.xml
+++ b/logback-examples/src/main/java/chapter6/evaluatorWithMatcher.xml
@@ -2,8 +2,14 @@
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
- <evaluator name="myEval">
- <expression>message.contains("billing")</expression>
+ <evaluator>
+
+ <matcher>
+ <Name>odd</Name>
+ <regex>statement [13579]</regex>
+ </matcher>
+
+ <expression>message.contains("billing") ||
odd.matches(formattedMessage)</expression>
</evaluator>
<OnMismatch>NEUTRAL</OnMismatch>
<OnMatch>DENY</OnMatch>
diff --git a/logback-site/src/site/pages/manual/filters.html
b/logback-site/src/site/pages/manual/filters.html
index 871ef11..7ab56f7 100644
--- a/logback-site/src/site/pages/manual/filters.html
+++ b/logback-site/src/site/pages/manual/filters.html
@@ -105,7 +105,7 @@
events, the value NEUTRAL is returned.
</p>
-<em>Example 6.1: Basic custom filter (<a
href="../xref/chapter6/SampleFilter.html">logback-examples/src/main/java/chapter6/SampleFilter.java</a>)</em>
+<em>Example 6.<span class="autoEx"/>: Basic custom filter (<a
href="../xref/chapter6/SampleFilter.html">logback-examples/src/main/java/chapter6/SampleFilter.java</a>)</em>
<pre class="prettyprint source">package chapter6;
import ch.qos.logback.classic.spi.ILoggingEvent;
@@ -128,7 +128,7 @@ public class SampleFilter extends Filter>ILoggingEvent> {
<code>SampleFilter</code> to a <code>ConsoleAppener</code>.
</p>
-<em>Example 6.2: SampleFilter configuration
(logback-examples/src/main/java/chapter6/SampleFilterConfig.xml)</em>
+<em>Example 6.<span class="autoEx"/>: SampleFilter configuration
(logback-examples/src/main/java/chapter6/SampleFilterConfig.xml)</em>
<pre class="prettyprint source"><configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
@@ -183,7 +183,7 @@ public class SampleFilter extends Filter>ILoggingEvent> {
configuration file.
</p>
-<em>Example 6.3: Sample LevelFilter configuration
(logback-examples/src/main/java/chapter6/levelFilterConfig.xml)</em>
+<em>Example 6.<span class="autoEx"/>: Sample LevelFilter configuration
(logback-examples/src/main/java/chapter6/levelFilterConfig.xml)</em>
<pre class="prettyprint source"><configuration>
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
@@ -215,7 +215,7 @@ public class SampleFilter extends Filter>ILoggingEvent> {
configuration file.
</p>
-<em>Example 6.4: Sample ThresholdFilter configuration
(logback-examples/src/main/java/chapter6/thresholdFilterConfig.xml)</em>
+<em>Example 6.<span class="autoEx"/>: Sample ThresholdFilter configuration
(logback-examples/src/main/java/chapter6/thresholdFilterConfig.xml)</em>
<pre class="prettyprint source"><configuration>
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
@@ -249,28 +249,29 @@ public class SampleFilter extends
Filter>ILoggingEvent> {
class="option">OnMismatch</span> properties.
</p>
- <p>The <code>EventEvaluator</code> class is abstract and you can
- implement your own even evaluation logic. Logback-classic ships
+ <p>The <code>EventEvaluator</code> is an abstract class and you
+ can implement your own event evaluation logic by sub-classing
+ <code>EventEvaluator</code>. However, logback-classic also ships
with a concrete evaluator implementation called <a
href="../xref/ch/qos/logback/classic/boolex/JaninoEventEvaluator.html">JaninoEventEvaluator</a>
- which takes artibtrary boolean expressions (in the Java language)
- as the evaluation criispteria. We refer to such artbitrary boolean
- expressions in the Java language as "<em>evaulation
- expressions</em>". Evaluation expressions enable hereto
- unprecedented flexibility in event filtering.
+ which takes artibtrary java language boolean expressions as the
+ evaluation criteria. We refer to such java language boolean
+ expressions as "<em>evaulation expressions</em>". Evaluation
+ expressions enable hereto unprecedented flexibility in event
+ filtering.
</p>
<p>Evaluation expressions are compiled on-the-fly during the
interpretation of the configuration file. As a user, you do not
need to worry about the actual plumbing. However, it is your
- reponsibility to ensure that the expression is boolean, that it
- evaluates to true or false. </p>
+ reponsibility to ensure that the java-language expression is
+ boolean, that it evaluates to true or false. </p>
<p>Given that an evaluation expression acts on the current logging
- event, logback implicitly exposes various fields of the logging
+ event, logback automatically exports various fields of the logging
event as variables accessible from the evaluation expression. The
- list of these implicit variables is given below.
+ case-sensitive names these variables is listed below.
</p>
<table class="bodyTable">
@@ -294,19 +295,37 @@ public class SampleFilter extends
Filter>ILoggingEvent> {
<tr class="alt">
<td>message</td>
<td><code>String</code></td>
- <td>The message of the logging request.</td>
+ <td>The raw message of the logging request. For some logger
+ <em>l</em>, when you write l.info("Hello {}", name); where
+ name is assigned the value "Alice", then "Hello {}" is the
+ message.</td> </tr>
+
+ <tr>
+ <td>formatedMessage</td>
+ <td><code>String</code></td>
+ <td>The formatted message in the logging request. For some
+ logger <em>l</em>, when you write l.info("Hello {}", name);
+ where name is assigned the value "Alice", then "Hello Alice"
+ is the formatted message.</td>
</tr>
- <tr>
+
+ <tr class="alt">
<td>logger</td>
- <td><code>LoggerRemoteView</code></td>
- <td>This object is a proxy for the logger
object where the
- logging request was issued. It can be viewed as
a regular
- logger object. However, it has some nice
performance
- properties, especially with respect to
serialization.
+ <td><code>String</code></td>
+ <td>The name of the logger.
+ </td>
+ </tr>
+
+ <tr>
+ <td>loggerContext</td>
+ <td><a
+
href="../xref/ch/qos/logback/classic/spi/LoggerContextVO.html"><code>LoggerContextVO</code></a></td>
+ <td>A restricted (value object) view of the
logger context to which the logging event belongs to.
</td>
</tr>
- <tr class="alt">
+
+ <tr class="alt">
<td>level</td>
<td><code>int</code></td>
<td>The int value corresponding to the level.
To help create
@@ -316,6 +335,7 @@ public class SampleFilter extends Filter>ILoggingEvent> {
INFO</em> is a correct expression.
</td>
</tr>
+
<tr>
<td>timeStamp
</td>
@@ -324,7 +344,7 @@ public class SampleFilter extends Filter>ILoggingEvent> {
creation.
</td>
</tr>
- <tr class="alt">
+ <tr class="alt">
<td>marker</td>
<td><code>Marker</code></td>
<td>The <code>Marker</code> object associated with the logging
@@ -332,39 +352,53 @@ public class SampleFilter extends
Filter>ILoggingEvent> {
</td>
</tr>
<tr>
- <td>mdc
- </td>
+ <td>mdc</td>
<td><code>Map</code></td>
<td>A map containing all the MDC values at the
time of the
creation of the logging event. A value can be
accessed by
using the following expression:
<em>mdc.get("myKey")</em>.
</td>
</tr>
- <tr class="alt">
+
+ <tr class="alt">
<td>throwable</td>
- <td><code>Throwable</code></td>
- <td>The exception associated with the logging
event
+ <td>java.lang.Throwable</td>
+ <td>If no exception is associated with the
event, then the
+ value of the "throwable" variable will be null.
Unfortunately,
+ "throwable" does not survive serialization.
Thus, on remote
+ systems, its value will always be null. For
location
+ independent expresisons, use the
<code>throwableProxy</code>
+ variable described next.
+ </td>
+ </tr>
+
+ <tr>
+ <td>throwableProxy</td>
+ <td><a
+
href="../xref/ch/qos/logback/classic/spi/IThrowableProxy.html"><code>IThrowableProxy</code></a></td>
+ <td>A proxy for the exception associated with
the logging
+ event. If no exception is associated with the
event, then the
+ value of the "throwableProxy" variable will be
null. In
+ contrast to "throwable", when an exception is
associated with
+ an event, the value of "throwableProxy" will be
non-null even
+ on remote systems, that is even after
serialization.
</td>
</tr>
- </table>
-
- <p>The behaviour of the <code>EvaluatorFilter</code> is also
- affected by its <span class="option">OnMatch</span> and <span
- class="option">OnMismatch</span> options taking values of type
- <code>FilterReply</code>, i.e. DENY, ACCEPT, NEUTRAL.
- </p>
+
+ </table>
+
<p>Here is a concrete example.</p>
-<em>Example 6.5: Basic event evaluator usage
(logback-examples/src/main/java/chapter6/basicEventEvaluator.xml)</em>
+<em>Example 6.<span class="autoEx"/>: Basic event evaluator usage
(logback-examples/src/main/java/chapter6/basicEventEvaluator.xml)</em>
-<pre class="prettyprint source"><configuration>
+<pre class="prettyprint source longline"><configuration>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
- <b><filter class="ch.qos.logback.core.filter.EvaluatorFilter">
- <evaluator name="myEval">
+ <b><filter class="ch.qos.logback.core.filter.EvaluatorFilter">
+ <evaluator> <!-- defaults to type
ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
<expression><span
class="green">message.contains("billing")</span></expression>
</evaluator>
<OnMismatch>NEUTRAL</OnMismatch>
@@ -382,18 +416,29 @@ public class SampleFilter extends
Filter>ILoggingEvent> {
</root>
</configuration></pre>
- <p>The bold part in the previous configuration adds an
+ <p>The bold part in the above configuration file adds an
<code>EvaluatorFilter</code> to a <code>ConsoleAppender</code>.
An
- <code>EventEvaluator</code> is then injected into the
- <code>EvaluatorFilter</code>. The <em>expression</em> element
- corresponds to the evaluation expression described previously.
The
- expression <code>message.contains("billing")</code> returns a
- boolean value. Notice that the <em>message</em> variable is
- defined implicitly.
+ evaluator of type <code>JaninoEventEvaluator</code> is then
+ injected into the <code>EvaluatorFilter</code>. In the absence
of
+ <span class="attr">class</span> attribute in the
+ <code><evaluator></code> element specified by the user, joran
+ will infer a default type, i.e.
<code>JaninoEventEvaluator</code>,
+ for the evaluator. This is one of the <a
+ href="onJoran.html#defaultClassMapping">few occurrences</a>
where
+ Joran implicitly infers the type of a component.
+ </p>
+
+ <p>The <em>expression</em> element corresponds to the evaluation
+ expression just discussed. The expression
+ <code>message.contains("billing")</code> returns a boolean
+ value. Notice that the <em>message</em> variable is exported
+ automatically by <code>JaninoEventEvaluator</code>.
</p>
- <p>This evalutor filter will drop all logging events whose
message
- contains the string "billing".
+ <p>Given that the <span class="option">OnMatch</span> property
is
+ set to NEUTRAL and the <span class="option">OnMismatch</span>
+ property set to DENY, this evalutor filter will drop all logging
+ events whose message contains the string "billing".
</p>
<p>The <a
@@ -421,11 +466,12 @@ java chapter6.FilterEvents
src/main/java/chapter6/basicConfiguration.xml
- <p>Suppose that we want to get rid of the billing information.
- The <em>basicEventEvaluator.xml</em> configuration file just
- described, does exactly what we want.</p>
+ <p>Suppose that we want to get rid of the "billing statement".
+ The <em>basicEventEvaluator.xml</em> configuration file listed
+ above filters messages containing the string "billing" which is
+ precisely the desired outcome.</p>
- <p>Running with filters:</p>
+ <p>Running with <em>basicEventEvaluator.xml</em>:</p>
<p class="source">java chapter6.FilterEvents
src/main/java/chapter6/basicEventEvaluator.xml</p>
<p>we obtain:
</p>
@@ -440,7 +486,59 @@ java chapter6.FilterEvents
src/main/java/chapter6/basicConfiguration.xml
0 [main] INFO chapter6.FilterEvents - logging statement 8
0 [main] INFO chapter6.FilterEvents - logging statement 9</p>
+ <h2><a name="matcher" href="#matcher">Matchers</a></h2>
+
+ <p>While it is possible to do pattern matching operations by
+ invoking the <a
+
href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#matches%28java.lang.String%29">matches()</a>
+ method in the <code>String</code> class, this incurs the cost of
+ the creation by compilation of a new Pattern object each time the
+ filter is invoked. To eliminate this overhead, you can predefine
+ one or more <a
+ href="../xref/ch/qos/logback/core/boolex/Matcher.html">Matcher</a>
+ objects. Once a matcher is defined, it can be repeatedly referenced
+ by name in the evaluator expression.</p>
+
+ <p>An example should clarify the point:</p>
+
+<em>Example 6.<span class="autoEx"/>: Defining matchers in an event evaluator
(logback-examples/src/main/java/chapter6/evaluatorWithMatcher.xml)</em>
+
+ <pre class="prettyprint source longline"><configuration debug="true">
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
+ <evaluator>
+ <b><matcher>
+ <Name>odd</Name>
+ <!-- filter out odd numbered statements -->
+ <regex>statement [13579]</regex>
+ </matcher>
+
+ <expression>message.contains("billing") ||
odd.matches(formattedMessage)</expression></b>
+ </evaluator>
+ <OnMismatch>NEUTRAL</OnMismatch>
+ <OnMatch>DENY</OnMatch>
+ </filter>
+ <layout>
+ <pattern>%-4relative [%thread] %-5level %logger - %msg%n</pattern>
+ </layout>
+ </appender>
+
+ <root level="DEBUG">
+ <appender-ref ref="STDOUT" />
+ </root>
+</configuration></pre>
+
+ <p>Running with <em>evaluatorWithMatcher.xml</em>:</p>
+ <p class="source">java chapter6.FilterEvents
src/main/java/chapter6/evaluatorWithMatcher.xml</p>
+ <p>we obtain:
+ </p>
+ <p class="source">220 [main] INFO chapter6.FilterEvents - logging
statement 0
+223 [main] INFO chapter6.FilterEvents - logging statement 2
+223 [main] INFO chapter6.FilterEvents - logging statement 4
+225 [main] INFO chapter6.FilterEvents - logging statement 8</p>
+
<h2><a name="TurboFilter" href="#TurboFilter">TurboFilters</a></h2>
<p><code>TurboFilter</code> objects all extend the
@@ -480,7 +578,7 @@ java chapter6.FilterEvents
src/main/java/chapter6/basicConfiguration.xml
slightly more complex filter:
</p>
-<em>Example 6.6: Basic custom <code>TurboFilter</code> (<a
href="../xref/chapter6/SampleTurboFilter.html">logback-examples/src/main/java/chapter6/SampleTurboFilter.java</a>)</em>
+<em>Example 6.<span class="autoEx"/>: Basic custom <code>TurboFilter</code>
(<a
href="../xref/chapter6/SampleTurboFilter.html">logback-examples/src/main/java/chapter6/SampleTurboFilter.java</a>)</em>
<pre class="prettyprint source">package chapter6;
import org.slf4j.Marker;
@@ -545,7 +643,7 @@ public class SampleTurboFilter extends TurboFilter {
created <code>TurboFilter</code>.
</p>
-<em>Example 6.7: Basic custom <code>TurboFilter</code> configuration
(logback-examples/src/main/java/chapter6/sampleTurboFilterConfig.xml)</em>
+<em>Example 6.<span class="autoEx"/>: Basic custom <code>TurboFilter</code>
configuration
(logback-examples/src/main/java/chapter6/sampleTurboFilterConfig.xml)</em>
<pre class="prettyprint source"><configuration>
<b><turboFilter class="chapter6.SampleTurboFilter">
<Marker>sample</Marker>
@@ -581,7 +679,7 @@ public class SampleTurboFilter extends TurboFilter {
<code>MDCFilter</code> and <code>MarkerFilter</code>.
</p>
-<em>Example 6.8: <code>MDCFilter</code> and <code>MarkerFilter</code>
+<em>Example 6.<span class="autoEx"/>: <code>MDCFilter</code> and
<code>MarkerFilter</code>
configuration (logback-examples/src/main/java/chapter6/turboFilters.xml)</em>
<pre class="prettyprint source"><configuration>
@@ -708,7 +806,7 @@ logger.debug("Hello {}.", name1);</pre>
</p>
-<em>Example: <code>DuplicateMessageFilter</code>
+<em>Example 6.<span class="autoEx"/>: <code>DuplicateMessageFilter</code>
configuration
(logback-examples/src/main/java/chapter6/duplicateMessage.xml)</em>
<pre class="prettyprint source"><configuration>
@@ -783,7 +881,7 @@ configuration
(logback-examples/src/main/java/chapter6/duplicateMessage.xml)</em
error will be logged:
</p>
-<em>Example 6.9: Access Evaluator
(logback-examples/src/main/java/chapter6/accessEventEvaluator.xml)</em>
+<em>Example 6.<span class="autoEx"/>: Access Evaluator
(logback-examples/src/main/java/chapter6/accessEventEvaluator.xml)</em>
<pre class="prettyprint source"><configuration>
<appender name="STDOUT"
diff --git a/logback-site/src/site/pages/manual/onJoran.html
b/logback-site/src/site/pages/manual/onJoran.html
index edabe34..ba08ea4 100644
--- a/logback-site/src/site/pages/manual/onJoran.html
+++ b/logback-site/src/site/pages/manual/onJoran.html
@@ -613,9 +613,12 @@ Element [abc] asked to be printed.
</li>
</ol>
- <p>In logback-classic, there are just two rules mapping (parent
- class/property name) couples to a default class. These are listed in
- the table below.</p>
+ <h4><a name="defaultClassMapping"
+ href="#defaultClassMapping">Default class mapping</a></h4>
+
+ <p>In logback-classic, there are a handful of inernal rules mapping
+ parent class/property name couples to a default class. These are
+ listed in the table below.</p>
<table class="bodyTable">
<tr>
@@ -623,12 +626,20 @@ Element [abc] asked to be printed.
<th>property name </th>
<th>default nested class</th>
</tr>
+
<tr >
<td>ch.qos.logback.core.AppenderBase</td>
<td>layout</td>
<td>ch.qos.logback.classic.PatternLayout</td>
</tr>
+
<tr class="alt">
+ <td>ch.qos.logback.core.UnsynchronizedAppenderBase</td>
+ <td>layout</td>
+ <td>ch.qos.logback.classic.PatternLayout</td>
+ </tr>
+
+ <tr>
<td>ch.qos.logback.core.filter.EvaluatorFilter</td>
<td>evaluator</td>
<td>ch.qos.logback.classic.boolex.JaninoEventEvaluator</td>
diff --git a/logback-site/src/site/pages/news.html
b/logback-site/src/site/pages/news.html
index 2efe00d..5792c7e 100644
--- a/logback-site/src/site/pages/news.html
+++ b/logback-site/src/site/pages/news.html
@@ -36,6 +36,14 @@
by applying the relavant patch supplied by Hugues Malphettes.
</p>
+ <p>JaninoEventEvaluator now passes the throwable associated with
+ an event as a <code>java.lang.Throwable</code> instead of an
+ <code>IThrowableProxy</code>. This fixes <a
+ href="http://jira.qos.ch/browse/LBCLASSIC-155">LBCLASSIC-155</a>
+ as reported by Hontvári József. See <a
+ href="manual/filters.html#evalutatorFilter">EvaluatorFilter
+ documentation</a> for more details.</p>
+
<hr width="80%" align="center" />
<h3>9th of August 2009 - Release of version 0.9.17</h3>
-----------------------------------------------------------------------
Summary of changes:
.../classic/boolex/JaninoEventEvaluator.java | 21 ++-
.../classic/joran/action/EvaluatorAction.java | 5 +-
.../qos/logback/classic/spi/LoggerContextVO.java | 9 +-
.../classic/boolex/JaninoEventEvaluatorTest.java | 25 +++
.../logback/core/boolex/EventEvaluatorBase.java | 1 -
.../src/main/java/chapter6/basicEventEvaluator.xml | 2 +-
...EventEvaluator.xml => evaluatorWithMatcher.xml} | 10 +-
logback-site/src/site/pages/manual/filters.html | 214 ++++++++++++++------
logback-site/src/site/pages/manual/onJoran.html | 17 ++-
logback-site/src/site/pages/news.html | 8 +
10 files changed, 237 insertions(+), 75 deletions(-)
copy logback-examples/src/main/java/chapter6/{basicEventEvaluator.xml =>
evaluatorWithMatcher.xml} (62%)
hooks/post-receive
--
Logback: the generic, reliable, fast and flexible logging framework.
_______________________________________________
logback-dev mailing list
[email protected]
http://qos.ch/mailman/listinfo/logback-dev