Author: rgoers
Date: Sat Nov 26 08:32:55 2011
New Revision: 1206410
URL: http://svn.apache.org/viewvc?rev=1206410&view=rev
Log:
More configuration documentation. Check file configuration when filtering
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/FileConfigurationMonitor.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/src/site/site.xml
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/src/site/xdoc/manual/configuration.xml
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/FileConfigurationMonitor.java
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/FileConfigurationMonitor.java?rev=1206410&r1=1206409&r2=1206410&view=diff
==============================================================================
---
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/FileConfigurationMonitor.java
(original)
+++
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/FileConfigurationMonitor.java
Sat Nov 26 08:32:55 2011
@@ -60,8 +60,8 @@ public class FileConfigurationMonitor im
*/
public void checkConfiguration() {
if ((++counter & MASK) == 0) {
- long current = System.currentTimeMillis();
synchronized(this) {
+ long current = System.currentTimeMillis();
if (current >= nextCheck) {
nextCheck = current + interval;
if (lastModified >= file.lastModified()) {
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java?rev=1206410&r1=1206409&r2=1206410&view=diff
==============================================================================
---
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
(original)
+++
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
Sat Nov 26 08:32:55 2011
@@ -89,6 +89,12 @@ public class LoggerConfig extends Filter
this.additive = additive;
}
+ @Override
+ public Filter getFilter() {
+ monitor.checkConfiguration();
+ return super.getFilter();
+ }
+
/**
* Set the ConfigurationMonitor that will detect configuration changes.
* @param monitor The ConfigurationMonitor.
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/src/site/site.xml
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/src/site/site.xml?rev=1206410&r1=1206409&r2=1206410&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/src/site/site.xml
(original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/src/site/site.xml Sat
Nov 26 08:32:55 2011
@@ -43,7 +43,15 @@
<menu name="Manual" inherit="top">
<item name="Introduction" href="/manual/index.html"/>
<item name="Architecture" href="/manual/architecture.html"/>
- <item name="Configuration" href="/manual/configuration.html"/>
+ <item name="Configuration" href="/manual/configuration.html"
collapse="true">
+ <item name="Automatic Configuration"
href="/manual/configuration.html#AutomaticConfiguration"/>
+ <item name="Additivity" href="/manual/configuration.html#Additvity"/>
+ <item name="Automatic Reconfiguration"
href="/manual/configuration.html#AutomaticReconfiguration"/>
+ <item name="Configuration Syntax"
href="/manual/configuration.html#ConfigurationSyntax"/>
+ <item name="Property Substitution"
href="/manual/configuration.html#PropertySubstitution"/>
+ <item name="Status Messages"
href="/manual/configuration.html#StatusMessages"/>
+ <item name="Unit Testing in Maven"
href="/manual/configuration.html#UnitTestingInMaven"/>
+ </item>
<item name="Plugins" href="/manual/plugins.html" collapse="true">
<item name="Core" href="/manual/plugins.html#Core"/>
<item name="Converters" href="/manual/plugins.html#Converters"/>
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/src/site/xdoc/manual/configuration.xml
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/src/site/xdoc/manual/configuration.xml?rev=1206410&r1=1206409&r2=1206410&view=diff
==============================================================================
---
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/src/site/xdoc/manual/configuration.xml
(original)
+++
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/src/site/xdoc/manual/configuration.xml
Sat Nov 26 08:32:55 2011
@@ -47,6 +47,7 @@
Note that unlike Log4j 1.x, the public Log4j 2 API does not expose
methods to add, modify or remove
appenders and filters or manipulate the configuration in any way.
</p>
+ <a name="AutomaticConfiguration"/>
<subsection name="Automatic Configuration">
<p>
Log4j has the ability to automatically configure itself during
initialization.
@@ -90,21 +91,20 @@
logger.trace("Entering application.");
Bar bar = new Bar();
- bar.doIt();
+ if (!bar.doIt() {
+ logger.error("Didn't do it.");
+ }
logger.trace("Exiting application." }
}</source>
</p>
-
<p>
<code>MyApp</code> begins by importing log4j related classes. It
then defines a static logger variable with the name
<code>MyApp</code>
which happens to be the fully qualified name of the class.
</p>
-
<p>
<code>MyApp</code> uses the <code>Bar</code> class defined in the
package<code>com.foo</code>.
</p>
-
<p>
<source> package com.foo;
import org.apache.logging.log4j.Logger;
@@ -112,26 +112,29 @@
public class Bar {
static Logger logger = LogManager.getLogger(Bar.class.getName());
- public void doIt() {
+ public boolean doIt() {
+ logger.entry();
logger.error("Did it again!");
+ logger.exit();
+ return false;
}
}</source>
</p>
-
<p>
If no configuration files are present logback will default to the
DefaultConfiguration which
- will set up a minimal logging environment consisting of a <a
href="">ConsoleAppender</a> attached
- to the root logger. The output will be formatted using a
- <a href="">PatternLayout</a> set to the pattern "%d{HH:mm:ss.SSS}
[%t] %-5level %logger{36} - %msg%n".
+ will set up a minimal logging environment consisting of a
+ <a
href="../log4j2-core/apidocs/org/apache/logging/log4j/core/appender/ConsoleAppender.html">ConsoleAppender</a>
+ attached to the root logger. The output will be formatted using a
+ <a
href="../log4j2-core/apidocs/org/apache/logging/log4j/core/layout/PatternLayout.html">PatternLayout</a>
+ set to the pattern "%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} -
%msg%n".
</p>
-
<p>
Note that by default, the root logger is assigned to
<code>Level.ERROR</code>.
</p>
-
<p>The output of MyApp would be similar to:
<pre>
17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
+ 17:13:01.540 [main] ERROR MyApp - Didn't do it.
</pre>
</p>
<p>
@@ -152,34 +155,232 @@
</configuration>]]></source>
Once the file above is placed into the classpath as log4j.xml you
will get results identical to
those listed above. Changing the root level to trace will result
in results similar to:
- <pre>
+ <source>
17:13:01.540 [main] TRACE MyApp - Entering application.
+ 17:13:01.540 [main] TRACE com.foo.Bar - entry
17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
- 17:13:01.540 [main] TRACE MyApp - Exiting application.</pre>
+ 17:13:01.540 [main] TRACE com.foo.Bar - exit
+ 17:13:01.540 [main] ERROR MyApp - Didn't do it.
+ 17:13:01.540 [main] TRACE MyApp - Exiting application.</source>
+ </p>
+ <p>
+ Note that status logging is disabled when the default
configuration is used.
</p>
<p>
- Note that status logging is disabled using the default
configuration.
+ Perhaps it is desired to eliminate all the TRACE output from
everything except com.foo.BAR. Simply
+ changing the log level would not accomplish the task. Instead, the
solution is to
+ add a new logger definition to the configuration:
+ </p>
+ <source><![CDATA[ <logger name="com.foo.Bar" level="TRACE"/>
+ <root level="ERROR">
+ <appender-ref ref="STDOUT">
+ </root>]]></source>
+ <p>
+ With this configuration all log events from com.foo.Bar will be
recorded while only error events will
+ be recorded from all other components.
</p>
</subsection>
-
+ <a name="Additivity"/>
+ <subsection name="Additivity">
+ <p>
+ In the previous example all the events from com.foo.Bar were still
written to the Console. This is
+ because the logger for com.foo.Bar did not have any appenders
configured while its parent did. In fact,
+ the following configuration
+ </p>
+ <source><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
+<configuration status="OFF">
+ <appenders>
+ <Console name="Console" target="SYSTEM_OUT">
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} -
%msg%n"/>
+ </Console>
+ </appenders>
+ <loggers>
+ <logger name="com.foo.Bar" level="trace">
+ <appender-ref ref="Console"/>
+ </logger>
+ <root level="error">
+ <appender-ref ref="Console"/>
+ </root>
+ </loggers>
+</configuration>]]></source>
+ <p>would result in</p>
+ <source>
+ 17:13:01.540 [main] TRACE com.foo.Bar - entry
+ 17:13:01.540 [main] TRACE com.foo.Bar - entry
+ 17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
+ 17:13:01.540 [main] TRACE com.foo.Bar - exit
+ 17:13:01.540 [main] TRACE com.foo.Bar - exit
+ 17:13:01.540 [main] ERROR MyApp - Didn't do it.</source>
+ <p>Notice that the trace messages from com.foo.Bar appear twice.
This is because the appender associated
+ with logger com.foo.Bar is first used, which writes the first
instance to the Console. Next, the parent
+ of com.foo.Bar, which in this case is the root logger, is
referenced. The event is then passed to its
+ appender, which is also writes to the Console, resulting in the
second instance. This is known as
+ additivity. While additivity can be quite a convenient feature (as
in the first previous example where
+ no appender reference needed to be configured), in many cases this
behavior is considered undesirable
+ and so it is possible to disable it by setting the additivity
attribute on the logger to false:
+ </p>
+ <source><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
+<configuration status="OFF">
+ <appenders>
+ <Console name="Console" target="SYSTEM_OUT">
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} -
%msg%n"/>
+ </Console>
+ </appenders>
+ <loggers>
+ <logger name="com.foo.Bar" level="trace" additivity="false">
+ <appender-ref ref="Console"/>
+ </logger>
+ <root level="error">
+ <appender-ref ref="Console"/>
+ </root>
+ </loggers>
+</configuration>]]></source>
+ <p>
+ Once an event reaches a logger with its additivity set to false
the event will not be passed to
+ any of its parent loggers, regardless of their additivity setting.
+ </p>
+ </subsection>
+ <a name="AutomaticReconfiguration"/>
<subsection name="Automatic Reconfiguration">
-
+ <p>
+ When configured from a File, Log4j has the ability to
automatically detect changes to the configuration
+ file and reconfigure itself. If the monitorInterval attribute is
specified on the configuration element
+ and is set to a non-zero value then the file will be checked the
next time a log event is evaluated
+ and/or logged and the monitorInterval has elapsed since the last
check.
+ </p>
</subsection>
-
+ <a name="ConfigurationSyntax"/>
<subsection name="Configuration Syntax">
</subsection>
-
+ <a name="PropertySubstitution"/>
<subsection name="Property Substitution">
</subsection>
+ <a name="StatusMessages"/>
+ <subsection name="Status Messages">
+ <p>
+ Just as it is desirable to be able to diagnose problems in
applications, it is frequently necessary
+ to be able to diagnose problems in the logging configuration or in
the configured components. Since
+ logging has not been configured, "normal" logging cannot be used
during initialization. In addition,
+ normal logging within appenders could create infinite recursion
which Log4j will detect and cause
+ the recursive events to be ignored. To accomodate this need, the
Log4j 2 API includes a
+ <a
href="../log4j2-api/apidocs/org/apache/logging/log4j/status/StatusLogger.html">StatusLogger</a>.
+ Components declare an instance of the StatusLogger similar to</p>
+<source>
+ protected final static Logger logger = StatusLogger.getLogger();</source>
+ <p>
+ Since StatusLogger implements the Log4j 2 API's Logger interface,
all the normal Logger methods may
+ be used.
+ </p>
+ <p>
+ When configuring Log4j it is sometimes necessary to view the
generated status events. This can be
+ accomplished by adding the status attribute to the configuration
element. The following
+ configuration has the status attribute set to debug.
+
+<source><![CDATA[<?xml version="1.0" encoding="UTF-8"?>;
+<configuration status="debug" name="RoutingTest"
packages="org.apache.logging.log4j.test">
+ <properties>
+ <property
name="filename">target/rolling1/rollingtest-$${sd:type}.log</property>
+ </properties>
+ <ThresholdFilter level="debug"/>
+ <appenders>
+ <Console name="STDOUT">
+ <PatternLayout pattern="%m%n"/>
+ </Console>
+ <List name="List">
+ <ThresholdFilter level="debug"/>
+ </List>
+ <Routing name="Routing">
+ <Routes pattern="$${sd:type}">
+ <Route>
+ <RollingFile name="Rolling-${sd:type}" fileName="${filename}"
+
filePattern="target/rolling1/test1-${sd:type}.%i.log.gz">
+ <PatternLayout>
+ <pattern>%d %p %C{1.} [%t] %m%n</pattern>
+ </PatternLayout>
+ <SizeBasedTriggeringPolicy size="500" />
+ </RollingFile>
+ </Route>
+ <Route appender-ref="STDOUT" key="Audit"/>
+ <Route appender-ref="List" key="Service"/>
+ </Routes>
+ </Routing>
+ </appenders>
- <subsection name="Status Messages">
+ <loggers>
+ <logger name="EventLogger" level="info" additivity="false">
+ <appender-ref ref="Routing"/>
+ </logger>
+
+ <root level="error">
+ <appender-ref ref="STDOUT"/>
+ </root>
+ </loggers>
+</configuration>]]></source>
+ During startup this configuration produces:
+<source>
+ 2011-11-23 17:08:00,769 DEBUG Generated plugins in 0.003374000 seconds
+ 2011-11-23 17:08:00,789 DEBUG Calling createProperty on class
org.apache.logging.log4j.core.config.Property for element property with
params(name="filename", value="target/rolling1/rollingtest-${sd:type}.log")
+ 2011-11-23 17:08:00,792 DEBUG Calling configureSubstitutor on class
org.apache.logging.log4j.core.config.plugins.PropertiesPlugin for element
properties with
params(properties={filename=target/rolling1/rollingtest-${sd:type}.log})
+ 2011-11-23 17:08:00,794 DEBUG Generated plugins in 0.001362000 seconds
+ 2011-11-23 17:08:00,797 DEBUG Calling createFilter on class
org.apache.logging.log4j.core.filter.ThresholdFilter for element
ThresholdFilter with params(level="debug", onMatch="null", onMismatch="null")
+ 2011-11-23 17:08:00,800 DEBUG Calling createLayout on class
org.apache.logging.log4j.core.layout.PatternLayout for element PatternLayout
with params(pattern="%m%n", Configuration(RoutingTest), null, charset="null")
+ 2011-11-23 17:08:00,802 DEBUG Generated plugins in 0.001349000 seconds
+ 2011-11-23 17:08:00,804 DEBUG Calling createAppender on class
org.apache.logging.log4j.core.appender.ConsoleAppender for element Console with
params(PatternLayout(%m%n), null, target="null", name="STDOUT",
suppressExceptions="null")
+ 2011-11-23 17:08:00,804 DEBUG Calling createFilter on class
org.apache.logging.log4j.core.filter.ThresholdFilter for element
ThresholdFilter with params(level="debug", onMatch="null", onMismatch="null")
+ 2011-11-23 17:08:00,806 DEBUG Calling createAppender on class
org.apache.logging.log4j.test.appender.ListAppender for element List with
params(name="List", entryPerNewLine="null", raw="null", null,
ThresholdFilter(DEBUG))
+ 2011-11-23 17:08:00,813 DEBUG Calling createRoute on class
org.apache.logging.log4j.core.appender.routing.Route for element Route with
params(appender-ref="null", key="null", Node=Route)
+ 2011-11-23 17:08:00,823 DEBUG Calling createRoute on class
org.apache.logging.log4j.core.appender.routing.Route for element Route with
params(appender-ref="STDOUT", key="Audit", Node=Route)
+ 2011-11-23 17:08:00,824 DEBUG Calling createRoute on class
org.apache.logging.log4j.core.appender.routing.Route for element Route with
params(appender-ref="List", key="Service", Node=Route)
+ 2011-11-23 17:08:00,825 DEBUG Calling createRoutes on class
org.apache.logging.log4j.core.appender.routing.Routes for element Routes with
params(pattern="${sd:type}", routes={Route(type=dynamic default),
Route(type=static Reference=STDOUT key='Audit'), Route(type=static
Reference=List key='Service')})
+ 2011-11-23 17:08:00,827 DEBUG Calling createAppender on class
org.apache.logging.log4j.core.appender.routing.RoutingAppender for element
Routing with params(name="Routing", suppressExceptions="null",
Routes({Route(type=dynamic default),Route(type=static Reference=STDOUT
key='Audit'),Route(type=static Reference=List key='Service')}),
Configuration(RoutingTest), null, null)
+ 2011-11-23 17:08:00,827 DEBUG Calling createAppenders on class
org.apache.logging.log4j.core.config.plugins.AppendersPlugin for element
appenders with params(appenders={STDOUT, List, Routing})
+ 2011-11-23 17:08:00,828 DEBUG Calling createAppenderRef on class
org.apache.logging.log4j.core.config.plugins.AppenderRefPlugin for element
appender-ref with params(ref="Routing")
+ 2011-11-23 17:08:00,829 DEBUG Calling createLogger on class
org.apache.logging.log4j.core.config.LoggerConfig for element logger with
params(additivity="false", level="info", name="EventLogger",
appender-ref={Routing}, null)
+ 2011-11-23 17:08:00,830 DEBUG Calling createAppenderRef on class
org.apache.logging.log4j.core.config.plugins.AppenderRefPlugin for element
appender-ref with params(ref="STDOUT")
+ 2011-11-23 17:08:00,831 DEBUG Calling createLogger on class
org.apache.logging.log4j.core.config.LoggerConfig$RootLogger for element root
with params(additivity="null", level="error", appender-ref={STDOUT}, null)
+ 2011-11-23 17:08:00,833 DEBUG Calling createLoggers on class
org.apache.logging.log4j.core.config.plugins.LoggersPlugin for element loggers
with params(loggers={EventLogger, root})
+ 2011-11-23 17:08:00,834 DEBUG Reconfiguration completed
+ 2011-11-23 17:08:00,846 DEBUG Calling createLayout on class
org.apache.logging.log4j.core.layout.PatternLayout for element PatternLayout
with params(pattern="%d %p %C{1.} [%t] %m%n", Configuration(RoutingTest), null,
charset="null")
+ 2011-11-23 17:08:00,849 DEBUG Calling createPolicy on class
org.apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy for
element SizeBasedTriggeringPolicy with params(size="500")
+ 2011-11-23 17:08:00,851 DEBUG Calling createAppender on class
org.apache.logging.log4j.core.appender.RollingFileAppender for element
RollingFile with params(fileName="target/rolling1/rollingtest-Unknown.log",
filePattern="target/rolling1/test1-Unknown.%i.log.gz", append="null",
name="Rolling-Unknown", bufferedIO="null", immediateFlush="null",
SizeBasedTriggeringPolicy(SizeBasedTriggeringPolicy(size=500)), null,
PatternLayout(%d %p %C{1.} [%t] %m%n), null, suppressExceptions="null")
+ 2011-11-23 17:08:00,858 DEBUG Generated plugins in 0.002014000 seconds
+ 2011-11-23 17:08:00,889 DEBUG Reconfiguration started for context
sun.misc.Launcher$AppClassLoader@37b90b39
+ 2011-11-23 17:08:00,890 DEBUG Generated plugins in 0.001355000 seconds
+ 2011-11-23 17:08:00,959 DEBUG Generated plugins in 0.001239000 seconds
+ 2011-11-23 17:08:00,961 DEBUG Generated plugins in 0.001197000 seconds
+ 2011-11-23 17:08:00,965 WARN No Loggers were configured, using default
+ 2011-11-23 17:08:00,976 DEBUG Reconfiguration completed</source>
+ </p>
+ <p>
+ If the status attribute is set to error than only error messages
will be written to the console. This
+ makes troubleshooting configuration errors possible. As an
example, if the configuration above is changed
+ to have the status set to error and the logger declaration is:</p>
+<source><![CDATA[ <logger name="EventLogger" level="info" additivity="false">
+ <appender-ref ref="Routng"/>
+ </logger>]]></source>
+ <p>
+ the following error message will be produced.
+<source>
+ 2011-11-24 23:21:25,517 ERROR Unable to locate appender Routng for logger
EventLogger</source>
+ </p>
+ <p>
+ Applications may wish to direct the status output to some other
destination. This can be accomplished
+ by insuring the configured status is set to OFF and then
configuring the application programmatically
+ such as:
+<source>
+ StatusConsoleListener listener = new StatusConsoleListener(Level.ERROR);
+ ((StatusLogger) logger).registerListener(listener);
+</source>
+ </p>
</subsection>
+ <a name="UnitTestingInMaven"/>
<subsection name="Unit Testing in Maven">
+
</subsection>
</section>
</body>