From 4639e1b0672b358057ab74172100ed0c3efdb8fc Mon Sep 17 00:00:00 2001 From: No Author Date: Mon, 13 May 2002 06:27:31 +0000 Subject: [PATCH 001/342] This commit was manufactured by cvs2svn to create branch 'v1_2-branch'. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309525 13f79535-47bb-0310-9956-ffa450edef68 From 9a7e0b6c129b4cf2a281ea2dd17fcc0e0bd4e10f Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Mon, 13 May 2002 06:27:31 +0000 Subject: [PATCH 002/342] A very cosmetic change on the 1.2 branch. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309526 13f79535-47bb-0310-9956-ffa450edef68 --- INSTALL | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/INSTALL b/INSTALL index 75fd6db6a9..d3db76bdb0 100644 --- a/INSTALL +++ b/INSTALL @@ -82,7 +82,8 @@ Log4j is based on JDK 1.1 with the following additional requirements: The SMTPAppender relies on the JavaMail API. It has been tested with JavaMail API version 1.2. The JavaMail API requires the - JavaBeans Activation Framework package. You can download the JavaMail API at: + JavaBeans Activation Framework package. You can download the + JavaMail API at: http://java.sun.com/products/javamail/ From 46e9a311a69a1886ba529c3d14b1b7f3147981c6 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 15 May 2002 16:08:29 +0000 Subject: [PATCH 003/342] - Integrated Mathias' changes in manual.html to the 1.2 branch. - Added missing build.properties.sample in the dist target. - Added a BRANCHES file which outlines a procedure for working with the 1.2 branch. Notice that this commit is on the 1.2 branch, not the trunk!!!! PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309528 13f79535-47bb-0310-9956-ffa450edef68 --- BRANCHES | 61 ++++++++++++++++++ build.xml | 3 +- docs/manual.html | 161 ++++++++++++++++++++++++----------------------- 3 files changed, 144 insertions(+), 81 deletions(-) create mode 100644 BRANCHES diff --git a/BRANCHES b/BRANCHES new file mode 100644 index 0000000000..da0e39d1ab --- /dev/null +++ b/BRANCHES @@ -0,0 +1,61 @@ + +Given that log4j 1.3 is not likely to be released before a few months, +I have created a branch called v1_2-branch in our CVS repository. The +branch was created by issuing the following command: + +cvs -d :ext:ceki@cvs.apache.org:/home/cvs rtag -b -r v1_2final v1_2-branch jakarta-log4j + +Using the 1.2 branch, we can incorporate patches to log4j version 1.2 +while version 1.3 continues to be developed on the main trunk. For +example, we can officially release LogFactor5 (including +documentation) already in log4j 1.2.1. + +The command to access the v1_2-branch is: + +cvs -d XYZ checkout -r v1_2-branch jakarta-log4j + +where XYZ is the remote repository name, that is +":ext:ceki@cvs.apache.org:/home/cvs" for me. + +Alternatively, you can issue following update command from within any +existing work copy. + + cvs update -r v1_2-branch + +Working with branches is not completely trivial and requires a little +coordination between committers, in particular in relation with branch +merge operations. In order to avoid multiple merge conflicts, each +time we merge from the 1.2 branch to the main trunk, we should tag the +merged version on the 1.2 branch. Subsequent merges should use the tag +referring to the latest merged version of the branch. Also do not +forget to publicly announce a merge operation. + +I am suggesting that (1.2 -> trunk) merge operations be done in a +concerted manner. Before doing a merge you tell everyone that you are +going to do a merge, you execute the merge operation, and then tag the +merged version on the 1.2 branch, for example v_1_2_-merged-bug666 + +The *next* merge operation would be performed as + + cvs update -j v_1_2_-merged-bug666 -j v1_2-branch + +from within a working copy of the *trunk*. This merge operation would +obviously also need to be tagged. According to the CVS manual, this +procedure eliminates the side effects of merging already merged +changes. + +Bug fixes should and documentation improvements, should be made to the +1.2 branch, not the trunk. I'll take care of merging the changes to +the main trunk. + +If this sounds like mambo jumbo, I urge you to consult the CVS +documentation and experiment with branches before hitting the log4j +repository. Branches are not that complicated really although they +require slightly more discipline on the part of committers. Do not +hesitate to shout if you need help. + +If you have a better alternative for working with branches please let +us know. + +-- +Ceki \ No newline at end of file diff --git a/build.xml b/build.xml index c730e8a744..4f2baaf1cd 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + @@ -413,6 +413,7 @@ examples/**, build/*, build.xml, + build.properties.sample, manifest.mf, INSTALL, LICENSE.txt, diff --git a/docs/manual.html b/docs/manual.html index 50c5331a1d..2c24f45fea 100644 --- a/docs/manual.html +++ b/docs/manual.html @@ -90,7 +90,7 @@

Introduction

application. If too verbose, it can cause scrolling blindness. To alleviate these concerns, log4j is designed to be reliable, fast and extensible. Since logging is rarely the main focus of an application, -log4j API strives to be simple to understand and to use. +the log4j API strives to be simple to understand and to use.

Loggers, Appenders and Layouts

@@ -114,13 +114,13 @@

Logger hierarchy

earlier versions of log4j, the Logger class can be considered as a mere alias to the Category class. -

Loggers are named entities. Logger names are case-sensitive and +

Loggers are named entities. Logger names are case-sensitive and they follow the hierarchical naming rule:

-
+
Named Hierarchy @@ -142,11 +142,11 @@

Logger hierarchy

should be familiar to most developers.

The root logger resides at the top of the logger hierarchy. It -is exceptional in two ways: +is exceptional in two ways:

  1. it always exists, -
  2. it cannot be retrieved by name. +
  3. it cannot be retrieved by name.

Invoking the class static Logger.getRootLogger @@ -162,18 +162,19 @@

Logger hierarchy

   package org.apache.log4j;
-  
+
   public class Logger {
-  
+
     // Creation & retrieval methods:
     public static Logger getRootLogger();
     public static Logger getLogger(String name);
-    
+
     // printing methods:
     public void debug(Object message);
     public void info(Object message);
     public void warn(Object message);
     public void error(Object message);
+    public void fatal(Object message);
 
     // generic printing method:
     public void log(Level l, Object message);
@@ -183,19 +184,19 @@ 

Logger hierarchy

Loggers may be assigned levels. The set of possible -levels, that is +levels, that is -DEBUG, -INFO, -WARN, -ERROR and -FATAL +DEBUG, +INFO, +WARN, +ERROR and +FATAL are defined in the org.apache.log4j.Level -class. Although we do not encourage you from doing so, you may define +class. Although we do not encourage you to do so, you may define your own levels by sub-classing the Level class. A -perhaps better approach is will be explained later on. +perhaps better approach will be explained later on.

If a given logger is not assigned a level, then it inherits one from its closest ancestor with an assigned level. More @@ -205,7 +206,7 @@

Logger hierarchy

- - +
+
Level Inheritance @@ -231,10 +232,10 @@

Logger hierarchy

X none Proot
X.Y none Proot
X.Y.Z none Proot
Example 1Example 1
-

In example 1 above, only the root logger is assinged a +

In example 1 above, only the root logger is assigned a level. This level value, Proot, is inherited by the other loggers X, X.Y and X.Y.Z. @@ -288,17 +289,17 @@

Logger hierarchy

Logging requests are made by invoking one of the printing methods -of a logger instance. These printing methods are +of a logger instance. These printing methods are debug, -info, +info, -warn, +warn, error, fatal - and log. + and log.

By definition, the printing method determines the level of a @@ -321,8 +322,8 @@

Logger hierarchy

Basic Selection Rule

A log request of level p in a logger with - inherited level q, is enabled if p >= - q. + (either assigned or inherited, whichever is appropriate) level q, is enabled if p >= + q. @@ -330,7 +331,7 @@

Logger hierarchy

ordered. For the standard levels, we have DEBUG < INFO < WARN < ERROR < FATAL. -

Here is an example of this rule. +

Here is an example of this rule.

@@ -339,35 +340,35 @@

Logger hierarchy

// get a logger instance named "com.foo" Logger logger = Logger.getLogger("com.foo"); - // Now set its level. Normally you do not need to set the - // level of a logger progamitcally. This is usually done + // Now set its level. Normally you do not need to set the + // level of a logger programmatically. This is usually done // in configuration files. logger.setLevel(Level.INFO); Logger barlogger = Logger.getLogger("com.foo.Bar"); - + // This request is enabled, because WARN >= INFO. logger.warn("Low fuel level."); - + // This request is disabled, because DEBUG < INFO. - logger.debug("Starting search for nearest gas station."); - + logger.debug("Starting search for nearest gas station."); + // The logger instance barlogger, named "com.foo.Bar", - // will inherit its level from the logger named - // "com.foo" Thus, the following request is enabled - // because INFO >= INFO. - barlogger.info("Located nearest gas station."); + // will inherit its level from the logger named + // "com.foo" Thus, the following request is enabled + // because INFO >= INFO. + barlogger.info("Located nearest gas station."); // This request is disabled, because DEBUG < INFO. - barlogger.debug("Exiting gas station search"); + barlogger.debug("Exiting gas station search"); -
+

Calling the getLogger method with the same name will -always return a reference to the exact same logger object. +always return a reference to the exact same logger object. -

For example, in +

For example, in
@@ -422,7 +423,7 @@

Appenders and Layouts

Event Loggers, and remote UNIX Syslog daemons. It is also possible to log asynchronously. - +

More than one appender can be attached to a logger.

The Appenders and Layouts

x.y none true A1, A-x1, A-x2 Appenders of "x" and root. -
x.y.z A-xyz1 true A1, A-x1, A-x2, A-xyz1 +
x.y.z A-xyz1 true A1, A-x1, A-x2, A-xyz1 Appenders in "x.y.z", "x" and root. -
security A-sec false +
security A-sec false A-sec No appender accumulation since the additivity flag is set to - false. + false.
security.access none true A-sec Only appenders of "security" because the additivity flag in "security" is @@ -507,7 +508,7 @@

Appenders and Layouts

associating a layout with an appender. The layout is responsible for formatting the logging request according to the user's wishes, whereas an appender takes care of sending the formatted output -to its destination. +to its destination. The PatternLayout, part @@ -533,7 +534,7 @@

Appenders and Layouts

frequently need to log Oranges, an object type used in your current project, then you can register an OrangeRenderer that will be invoked whenever an orange -needs to be logged. +needs to be logged.

Object rendering follows the class hierarchy. For example, assuming oranges are fruits, if you register an FruitRenderer, all @@ -570,7 +571,7 @@

Configuration

// Import log4j classes. import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; - + public class MyApp { // Define a static logger variable so that it references the @@ -585,7 +586,7 @@

Configuration

logger.info("Entering application."); Bar bar = new Bar(); bar.doIt(); - logger.info("Exiting application."); + logger.info("Exiting application."); } } @@ -603,12 +604,12 @@

Configuration

  package com.foo;
  import org.apache.log4j.Logger;
- 
+
  public class Bar {
    static Logger logger = Logger.getLogger(Bar.class);
-  
+
    public void doIt() {
-     logger.debug("Did it again!");    
+     logger.debug("Did it again!");
    }
  }
 
@@ -624,7 +625,7 @@

Configuration

to the pattern "%-4r [%t] %-5p %c %x - %m%n".

Note that by default, the root logger is assigned to -Level.DEBUG. +Level.DEBUG.

The output of MyApp is:

@@ -635,7 +636,7 @@ 

Configuration

The figure below depicts the object diagram of MyApp after just having called the BasicConfigurator.configure -method. +method.

@@ -658,7 +659,7 @@

Configuration

The previous example always outputs the same log information. Fortunately, it is easy to modify MyApp so that the log output can be controlled at run-time. Here is a slightly modified -version. +version.

- +
@@ -666,21 +667,21 @@ 

Configuration

import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; - + public class MyApp { static Logger logger = Logger.getLogger(MyApp.class.getName()); public static void main(String[] args) { - + // BasicConfigurator replaced with PropertyConfigurator. PropertyConfigurator.configure(args[0]); logger.info("Entering application."); Bar bar = new Bar(); bar.doIt(); - logger.info("Exiting application."); + logger.info("Exiting application."); } }
@@ -697,10 +698,10 @@

Configuration

 # Set root logger level to DEBUG and its only appender to A1.
 log4j.rootLogger=DEBUG, A1
-  
-# A1 is set to be a ConsoleAppender. 
+
+# A1 is set to be a ConsoleAppender.
 log4j.appender.A1=org.apache.log4j.ConsoleAppender
-  
+
 # A1 uses PatternLayout.
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
@@ -721,10 +722,10 @@ 

Configuration

log4j.rootLogger=DEBUG, A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout - + # Print the date in ISO 8601 format log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n - + # Print only messages of level WARN or above in the package com.foo. log4j.logger.com.foo=WARN
@@ -932,7 +933,7 @@

Default Initialization under Tomcat

tells log4j to use the file c:\foobar.lcf as the default configuration file. The configuration file is fully specified by the URL file:/c:/foobar.lcf. Thus, the same configuration -file will be used for all web-applications. +file will be used for all web-applications.

Different web-applications will load the log4j classes through @@ -963,9 +964,9 @@

Default Initialization under Tomcat

import java.io.IOException; public class Log4jInit extends HttpServlet { - + public - void init() { + void init() { String prefix = getServletContext().getRealPath("/"); String file = getInitParameter("log4j-init-file"); // if the log4j-init-file is not set, then no point in trying @@ -1029,19 +1030,19 @@

Nested Diagnostic Contexts

Nested Diagnostic Context. The NDC class is shown below.
-  public class NDC { 
-    // Used when printing the diagnostic 
-    public static String get(); 
- 
+  public class NDC {
+    // Used when printing the diagnostic
+    public static String get();
+
     // Remove the top of the context from the NDC.
-    public static String pop(); 
- 
+    public static String pop();
+
     // Add diagnostic context for the current thread.
-    public static void push(String message); 
- 
-    // Remove the diagnostic context for this thread.                      
-    public static void remove(); 
-  }                  
+    public static void push(String message);
+
+    // Remove the diagnostic context for this thread.
+    public static void remove();
+  }
 

The NDC is managed per thread as a stack of contextual @@ -1096,7 +1097,7 @@

Nested Diagnostic Contexts

machine this cost is typically in the 5 to 50 nanosecond range.

However, The method invocation involves the "hidden" cost of - parameter construction. + parameter construction.

For example, for some logger cat, writing,

@@ -1113,12 +1114,12 @@ 

Nested Diagnostic Contexts

To avoid the parameter construction cost write: -

   
+    
       if(logger.isDebugEnabled() {
         logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
       }
    
- +

This will not incur the cost of parameter construction if debugging is disabled. On the other hand, if the logger is debug-enabled, it will incur twice the cost of @@ -1127,7 +1128,7 @@

Nested Diagnostic Contexts

debug. This is an insignificant overhead because evaluating a logger takes about 1% of the time it takes to actually log. - +

In log4j, logging requests are made to instances of the Logger class. Logger is a class and not an interface. This measurably reduces the cost of method invocation at the cost of some From bbbb844fbd28c449988d0fac9dbfebc2fb740b71 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 17 May 2002 11:54:06 +0000 Subject: [PATCH 004/342] Fixed bug #9155 reported by Nicko Cadell. Added test5 to SocketServerTestCase in order to detect such bugs earlier in the release process. Also improved the documentation of LoggingEvent, NDC, ShortSocketServer and SocketServerTestCase. +----------------------------------------------------+ |Note: These changes are committed on the v1_2-branch| +----------------------------------------------------+ Relase of log4j 1.2.1 will follow shortly. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309529 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY | 8 ++ src/java/org/apache/log4j/NDC.java | 3 +- .../org/apache/log4j/spi/LoggingEvent.java | 36 +++++---- tests/build.xml | 2 +- tests/input/socketServer5.properties | 8 ++ .../apache/log4j/net/ShortSocketServer.java | 15 ++-- .../log4j/net/SocketServerTestCase.java | 75 ++++++++++++++++++- tests/witness/socketServer.5 | 35 +++++++++ 8 files changed, 157 insertions(+), 25 deletions(-) create mode 100644 tests/input/socketServer5.properties create mode 100644 tests/witness/socketServer.5 diff --git a/docs/HISTORY b/docs/HISTORY index 6f2a35a5eb..a4dd4ce86b 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -5,6 +5,14 @@ client code. [***] Changes requiring important modifications to existing client code. + May 17th, 2002 + + - Relase of version 1.2.1 + + - This minor release fixes bug #9155 reported by Nicko Cadell. + LoggingEvent.getMDCCopy() method now sets mdcCopyLookupRequired + instead of ndcLookupRequired. [*] + May, 2002 - Release of version 1.2 diff --git a/src/java/org/apache/log4j/NDC.java b/src/java/org/apache/log4j/NDC.java index aa4461518b..b0327446bb 100644 --- a/src/java/org/apache/log4j/NDC.java +++ b/src/java/org/apache/log4j/NDC.java @@ -192,7 +192,8 @@ void inherit(Stack stack) { /** - Used when printing the diagnostic context. + Never use this method directly, use the {@link + org.apache.log4j.spi.LoggingEvent#getNDC} method instead. */ static public diff --git a/src/java/org/apache/log4j/spi/LoggingEvent.java b/src/java/org/apache/log4j/spi/LoggingEvent.java index 5cd6e42dc7..b35332c47a 100644 --- a/src/java/org/apache/log4j/spi/LoggingEvent.java +++ b/src/java/org/apache/log4j/spi/LoggingEvent.java @@ -62,18 +62,16 @@ public class LoggingEvent implements java.io.Serializable { /** Have we tried to do an NDC lookup? If we did, there is no need - to do it again. Note that its value is always false when - serialized. Thus, a receiving SocketNode will never use it's own - (incorrect) NDC. See also writeObject method. */ + * to do it again. Note that its value is always false when + * serialized. Thus, a receiving SocketNode will never use it's own + * (incorrect) NDC. See also writeObject method. */ private boolean ndcLookupRequired = true; - /** Have we tried to do an MDC lookup? If we did, there is no need to - do it again. Note that its value is always false when - serialized. Thus, a receiving SocketNode will never use it's own - (incorrect) MDC. See also writeObject method. */ - private boolean mdcLookupRequired = true; - + /** Have we tried to do an MDC lookup? If we did, there is no need + * to do it again. Note that its value is always false when + * serialized. See also the getMDC and getMDCCopy methods. */ + private boolean mdcCopyLookupRequired = true; /** The application supplied message of logging event. */ transient private Object message; @@ -187,6 +185,11 @@ Object getMessage() { } } + /** + * This method returns the NDC for this event. It will return the + * correct content even if the event was generated in a different + * thread or even on a different machine. The {@link NDC#get} method + * should never be called directly. */ public String getNDC() { if(ndcLookupRequired) { @@ -199,9 +202,11 @@ String getNDC() { /** Returns the the context corresponding to the key - parameter. If there is a local MDC copy (probably from a remote - machine, the we use it, if that fails then the current thread's - MDC is used. + parameter. If there is a local MDC copy, possibly because we are + in a logging server or running inside AsyncAppender, then we + search for the key in MDC copy, if a value is found it is + returned. Otherwise, if the search in MDC copy returns a null + result, then the current thread's MDC is used.

Note that both the local MDC copy and the current thread's MDC are searched. @@ -223,11 +228,12 @@ Object getMDC(String key) { /** Obtain a copy of this thread's MDC prior to serialization or - asynchronous logging. */ + asynchronous logging. + */ public void getMDCCopy() { - if(mdcLookupRequired) { - ndcLookupRequired = false; + if(mdcCopyLookupRequired) { + mdcCopyLookupRequired = false; // the clone call is required for asynchronous logging. // See also bug #5932. Hashtable t = (Hashtable) MDC.getContext(); diff --git a/tests/build.xml b/tests/build.xml index a249bdd70c..809c3019a4 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -172,7 +172,7 @@ - + diff --git a/tests/input/socketServer5.properties b/tests/input/socketServer5.properties new file mode 100644 index 0000000000..9772442e8d --- /dev/null +++ b/tests/input/socketServer5.properties @@ -0,0 +1,8 @@ +log4j.rootLogger=DEBUG, A +log4j.Logger.org.apache.log4j.test.ShortSocketServer=WARN +log4j.Logger.org.apache.log4j.net.SocketNode=WARN +log4j.appender.A=org.apache.log4j.FileAppender +log4j.appender.A.file=output/temp +log4j.appender.A.Append=false +log4j.appender.A.layout=org.apache.log4j.PatternLayout +log4j.appender.A.layout.ConversionPattern=%5p %x %X{key1}%X{key5} [%t] %c{1} - %m%n diff --git a/tests/src/java/org/apache/log4j/net/ShortSocketServer.java b/tests/src/java/org/apache/log4j/net/ShortSocketServer.java index 99b8d5c520..4da0259ed9 100644 --- a/tests/src/java/org/apache/log4j/net/ShortSocketServer.java +++ b/tests/src/java/org/apache/log4j/net/ShortSocketServer.java @@ -20,10 +20,15 @@ import org.apache.log4j.net.SocketServer; /** - This SocketServer exits after just one connection from a client. - - @author Ceki Gulcu -*/ + * This SocketServer exits after certain number of connections from a + * client. This number is determined the totalsTest parameter, that is + * the first argument on the commmand line. The second argument, + * prefix, determines the prefix of the configuration file to + * use. Each run of the server will use a different properties + * file. For the i-th run, the path to the file is + * (prefix+i+".properties"). + * + * @author Ceki Gulcu */ public class ShortSocketServer { @@ -61,7 +66,7 @@ void main(String args[]) throws Exception { static - void usage(String msg) { + void usage(String msg) { System.err.println(msg); System.err.println( "Usage: java " +ShortSocketServer.class.getName() + " totalTests configFilePrefix"); diff --git a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java index 3810ac2bff..defbbd4973 100644 --- a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java +++ b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java @@ -55,6 +55,9 @@ public class SocketServerTestCase extends TestCase { static String PAT4 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some T4 MDC-TEST4 \\[main]\\" + " (root|SocketServerTestCase) - Message \\d{1,2}"; + static String PAT5 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some5 T5 MDC-TEST5 \\[main]\\" + + " (root|SocketServerTestCase) - Message \\d{1,2}"; + static String EXCEPTION1 = "java.lang.Exception: Just testing"; static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; @@ -72,8 +75,6 @@ public SocketServerTestCase(String name) { public void setUp() { System.out.println("Setting up test case."); - socketAppender = new SocketAppender("localhost", PORT); - rootLogger.addAppender(socketAppender); } public void tearDown() { @@ -81,8 +82,15 @@ public void tearDown() { socketAppender = null; rootLogger.removeAllAppenders(); } - + + /** + * The pattern on the server side: %5p %x [%t] %c %m%n + * + * We are testing NDC functionality across the wire. + */ public void test1() throws Exception { + socketAppender = new SocketAppender("localhost", PORT); + rootLogger.addAppender(socketAppender); common("T1", "key1", "MDC-TEST1"); delay(1); ControlFilter cf = new ControlFilter(new String[]{PAT1, EXCEPTION1, @@ -93,7 +101,16 @@ public void test1() throws Exception { assertTrue(Compare.compare(FILTERED, "witness/socketServer.1")); } + /** + * The pattern on the server side: %5p %x [%t] %C (%F:%L) %m%n + * + * We are testing NDC across the wire. Localization is turned off by + * default so it is not tested here even if the conversion pattern + * uses localization. */ public void test2() throws Exception { + socketAppender = new SocketAppender("localhost", PORT); + rootLogger.addAppender(socketAppender); + common("T2", "key2", "MDC-TEST2"); delay(1); ControlFilter cf = new ControlFilter(new String[]{PAT2, EXCEPTION1, @@ -104,8 +121,15 @@ public void test2() throws Exception { assertTrue(Compare.compare(FILTERED, "witness/socketServer.2")); } + /** + * The pattern on the server side: %5p %x [%t] %C (%F:%L) %m%n + * meaning that we are testing NDC and locatization functionality + * across the wire. */ public void test3() throws Exception { + socketAppender = new SocketAppender("localhost", PORT); socketAppender.setLocationInfo(true); + rootLogger.addAppender(socketAppender); + common("T3", "key3", "MDC-TEST3"); delay(1); ControlFilter cf = new ControlFilter(new String[]{PAT3, EXCEPTION1, @@ -116,10 +140,19 @@ public void test3() throws Exception { assertTrue(Compare.compare(FILTERED, "witness/socketServer.3")); } + /** + * The pattern on the server side: %5p %x %X{key1}%X{key4} [%t] %c{1} - %m%n + * meaning that we are testing NDC, MDC and localization functionality across + * the wire. + */ public void test4() throws Exception { + socketAppender = new SocketAppender("localhost", PORT); socketAppender.setLocationInfo(true); + rootLogger.addAppender(socketAppender); + NDC.push("some"); common("T4", "key4", "MDC-TEST4"); + NDC.pop(); delay(1); ControlFilter cf = new ControlFilter(new String[]{PAT4, EXCEPTION1, EXCEPTION2, EXCEPTION3}); @@ -129,6 +162,41 @@ public void test4() throws Exception { assertTrue(Compare.compare(FILTERED, "witness/socketServer.4")); } + /** + * The pattern on the server side: %5p %x %X{key1}%X{key5} [%t] %c{1} - %m%n + * + * The test case uses wraps an AsyncAppender around the + * SocketAppender. This tests was written specifically for bug + * report #9155. + + * Prior to the bug fix the output on the server did not contain the + * MDC-TEST5 string because the MDC clone operation (in getMDCCopy + * method) operation is performed twice, once from the main thread + * which is correct, and a second time from the AsyncAppender's + * dispatch thread which is incrorrect. + + */ + public void test5() throws Exception { + socketAppender = new SocketAppender("localhost", PORT); + socketAppender.setLocationInfo(true); + AsyncAppender asyncAppender = new AsyncAppender(); + asyncAppender.setLocationInfo(true); + asyncAppender.addAppender(socketAppender); + rootLogger.addAppender(asyncAppender); + + NDC.push("some5"); + common("T5", "key5", "MDC-TEST5"); + NDC.pop(); + delay(2); + ControlFilter cf = new ControlFilter(new String[]{PAT5, EXCEPTION1, + EXCEPTION2, EXCEPTION3}); + + Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); + + assertTrue(Compare.compare(FILTERED, "witness/socketServer.5")); + } + + static void common(String dc, String key, Object o) { int i = -1; @@ -161,6 +229,7 @@ public static Test suite() { suite.addTest(new SocketServerTestCase("test2")); suite.addTest(new SocketServerTestCase("test3")); suite.addTest(new SocketServerTestCase("test4")); + suite.addTest(new SocketServerTestCase("test5")); return suite; } } diff --git a/tests/witness/socketServer.5 b/tests/witness/socketServer.5 new file mode 100644 index 0000000000..dec6b0eb08 --- /dev/null +++ b/tests/witness/socketServer.5 @@ -0,0 +1,35 @@ +DEBUG some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 1 +DEBUG some5 T5 MDC-TEST5 [main] root - Message 2 + INFO some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 3 + WARN some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 4 +LETHAL some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 5 +DEBUG some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 6 +java.lang.Exception: Just testing + at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) + at org.apache.log4j.net.SocketServerTestCase.test5(SocketServerTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) +ERROR some5 T5 MDC-TEST5 [main] root - Message 7 +java.lang.Exception: Just testing + at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) + at org.apache.log4j.net.SocketServerTestCase.test5(SocketServerTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) From 91325748e337a9c918d861108ba7197044883f63 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 17 May 2002 12:48:49 +0000 Subject: [PATCH 005/342] Minor documentation changes. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309530 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY | 5 ++++- src/xdocs/documentation.xml | 4 ---- src/xdocs/download.xml | 22 ++++++++++++++-------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/docs/HISTORY b/docs/HISTORY index a4dd4ce86b..f8974e3ca2 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -11,7 +11,10 @@ - This minor release fixes bug #9155 reported by Nicko Cadell. LoggingEvent.getMDCCopy() method now sets mdcCopyLookupRequired - instead of ndcLookupRequired. [*] + instead of ndcLookupRequired. This bug would cause the wrong MDC + information to appear on a log server. It could only occur if the + client wrapped an AsyncAppender around a SocketAppender or if the + server used an AsyncAppender for its logging. [*] May, 2002 diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index 0f2690ab40..ec3ea813dd 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -58,10 +58,6 @@ Add logging to your Java Applications by Kevin Brown -

  • - Computer: captains, new entry... DasJakarta Logging-System log4j by Thomas Poschmann -
  • -
  • OpenSymphony Logging Primer
  • diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 6f40fb1b58..4e8db25a82 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -9,13 +9,19 @@ -
    -

    log4j 1.2 is now available in TAR.GZ format or - in ZIP format. +

    +

    log4j 1.2.1 is now available in TAR.GZ format + or in ZIP + format.

    - +

    This minor release fixes bug #9155 reported by Nicko + Cadell. With the exception of this bug fix and some + documentation improvements, it is identical to log4j 1.2 + final. +

    +

    In addition to many performance improvements, bug fixes, and other small enhancements, log4j 1.2 adds JMX support, Mapped Diagnostic Contexts, JDBC logging, graphical log viewer @@ -57,9 +63,9 @@

    Chainsaw
    -
    Chainsaw is now integrated with log4j and ships with the - official distribution. Chainsaw is a graphical log viewer and - filter for the log4j package. It listens for Chainsaw is now integrated with log4j and ships with + the official distribution. Chainsaw is a graphical log + viewer and filter for the log4j package. It listens for LoggingEvent objects sent using the SocketAppender From 6bcaf3152fad7efc3e32130255b433845113c8ee Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 22 May 2002 17:15:21 +0000 Subject: [PATCH 006/342] - Log4j now configurators admit NULL as a valid level value. NULL has the same meaning as the previously available INHERITED value. Both values are case insensitive. [*] - When loading component classes, log4j will now first attempt to use the Thread Context Loader and if that fails, it will use Class.forName. In log4j 1.2 and 1.2.1, only Class.forName was used and the TCL was ignored. This change is a response to bug #9305 opened by Scott M. Stark. [*] Release of log4j 1.2.2 is pending. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309541 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/HISTORY | 14 ++++ .../apache/log4j/PropertyConfigurator.java | 10 ++- src/java/org/apache/log4j/helpers/Loader.java | 71 +++++++++++++------ .../apache/log4j/helpers/OptionConverter.java | 4 +- src/java/org/apache/log4j/or/RendererMap.java | 3 +- .../org/apache/log4j/spi/Configurator.java | 22 +++--- .../org/apache/log4j/spi/LoggingEvent.java | 4 +- .../org/apache/log4j/xml/DOMConfigurator.java | 10 +-- src/xdocs/download.xml | 8 +-- 10 files changed, 94 insertions(+), 54 deletions(-) diff --git a/build.xml b/build.xml index 4f2baaf1cd..e326574dfa 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY b/docs/HISTORY index f8974e3ca2..6ee2970ed3 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -5,6 +5,20 @@ client code. [***] Changes requiring important modifications to existing client code. + May 22nd, 2002 + + - Relase of version 1.2.2 + + - Log4j now configurators admit NULL as a valid level value. NULL has + the same meaning as the previously available INHERITED value. Both + values are case insensitive. [*] + + - When loading component classes, log4j will now first attempt to use + the Thread Context Loader and if that fails, it will use + Class.forName. In log4j 1.2 and 1.2.1, only Class.forName was used + and the TCL was ignored. This change is a response to bug #9305 + opened by Scott M. Stark. [*] + May 17th, 2002 - Relase of version 1.2.1 diff --git a/src/java/org/apache/log4j/PropertyConfigurator.java b/src/java/org/apache/log4j/PropertyConfigurator.java index c15d438f26..27234f179c 100644 --- a/src/java/org/apache/log4j/PropertyConfigurator.java +++ b/src/java/org/apache/log4j/PropertyConfigurator.java @@ -576,9 +576,13 @@ void parseCategory(Properties props, Logger logger, String optionKey, // If the level value is inherited, set category level value to // null. We also check that the user has not specified inherited for the // root category. - if(levelStr.equalsIgnoreCase(INHERITED) && - !loggerName.equals(INTERNAL_ROOT_NAME)) { - logger.setLevel(null); + if(INHERITED.equalsIgnoreCase(levelStr) || + NULL.equalsIgnoreCase(levelStr)) { + if(loggerName.equals(INTERNAL_ROOT_NAME)) { + LogLog.warn("The root logger cannot be set to null."); + } else { + logger.setLevel(null); + } } else { logger.setLevel(OptionConverter.toLevel(levelStr, (Level) Level.DEBUG)); } diff --git a/src/java/org/apache/log4j/helpers/Loader.java b/src/java/org/apache/log4j/helpers/Loader.java index 222c2ccffe..a8949d4e9a 100644 --- a/src/java/org/apache/log4j/helpers/Loader.java +++ b/src/java/org/apache/log4j/helpers/Loader.java @@ -8,6 +8,10 @@ package org.apache.log4j.helpers; import java.net.URL; +import java.lang.IllegalAccessException; +import java.lang.reflect.Method; +import java.lang.reflect.InvocationTargetException; + //import java.awt.Image; //import java.awt.Toolkit; @@ -36,6 +40,9 @@ public class Loader { } } + /* A cache for + private static Method GET_TCL_METHOD; + /** This method will search for resource in different places. The rearch order is as follows: @@ -64,7 +71,7 @@ URL getResource(String resource) { try { if(!java1) { - classLoader = Thread.currentThread().getContextClassLoader(); + classLoader = getTCL(); if(classLoader != null) { LogLog.debug("Trying to find ["+resource+"] using context classloader " +classLoader+"."); @@ -111,28 +118,48 @@ boolean isJava1() { return java1; } + /** + * Get the Thread Context Loader which is a JDK 1.2 feature. If we + * are running under JDK 1.1 or anything else goes wrong the method + * returns null. + * + * */ + private static ClassLoader getTCL() throws IllegalAccessException, + InvocationTargetException { + + // Are we running on a JDK 1.2 or later system? + Method method = null; + try { + method = Thread.class.getMethod("getContextClassLoader", null); + } catch (NoSuchMethodException e) { + // We are running on JDK 1.1 + return null; + } + + return (ClassLoader) method.invoke(Thread.currentThread(), null); + } + + /** - Load the specified class using the Thread - contextClassLoader if running under Java2 or current - class loader if running under JDK 1.1. - */ - static - public - Class loadClass (Double clazz) throws ClassNotFoundException { - return null; - // if(java1) { - // return Class.forName(clazz); - // } else { - // try { - // return Thread.currentThread().getContextClassLoader().loadClass(clazz); - // } catch(Exception e) { - // // we reached here because - // // currentThread().getContextClassLoader() is null or because - // // of a security exceptio, or because clazz could not be - // // loaded, in any case we now try one more time - // return Class.forName(clazz); - // } - // } + * If running under JDK 1.2 load the specified class using the + * Thread contextClassLoader if that + * fails try Class.forname. Under JDK 1.1 only Class.forName is + * used. + * + */ + static public Class loadClass (String clazz) throws ClassNotFoundException { + if(java1) { + return Class.forName(clazz); + } else { + try { + return getTCL().loadClass(clazz); + } catch(Throwable e) { + // we reached here because tcl was null or because of a + // security exception, or because clazz could not be loaded... + // In any case we now try one more time + return Class.forName(clazz); + } + } } } diff --git a/src/java/org/apache/log4j/helpers/OptionConverter.java b/src/java/org/apache/log4j/helpers/OptionConverter.java index 2131b48d71..a96b537f84 100644 --- a/src/java/org/apache/log4j/helpers/OptionConverter.java +++ b/src/java/org/apache/log4j/helpers/OptionConverter.java @@ -199,7 +199,7 @@ Level toLevel(String value, Level defaultValue) { + ":pri=[" + levelName + "]"); try { - Class customLevel = Class.forName(clazz); + Class customLevel = Loader.loadClass(clazz); // get a ref to the specified class' static method // toLevel(String, org.apache.log4j.Level) @@ -306,7 +306,7 @@ Object instantiateByClassName(String className, Class superClass, Object defaultValue) { if(className != null) { try { - Class classObj = Class.forName(className); + Class classObj = Loader.loadClass(className); if(!superClass.isAssignableFrom(classObj)) { LogLog.error("A \""+className+"\" object is not assignable to a \""+ superClass.getName() + "\" variable."); diff --git a/src/java/org/apache/log4j/or/RendererMap.java b/src/java/org/apache/log4j/or/RendererMap.java index 79094786a4..620c10c3ae 100644 --- a/src/java/org/apache/log4j/or/RendererMap.java +++ b/src/java/org/apache/log4j/or/RendererMap.java @@ -9,6 +9,7 @@ import org.apache.log4j.spi.RendererSupport; import org.apache.log4j.helpers.LogLog; +import org.apache.log4j.helpers.Loader; import org.apache.log4j.helpers.OptionConverter; import java.util.Hashtable; @@ -46,7 +47,7 @@ void addRenderer(RendererSupport repository, String renderedClassName, return; } else { try { - Class renderedClass = Class.forName(renderedClassName); + Class renderedClass = Loader.loadClass(renderedClassName); repository.setRenderer(renderedClass, renderer); } catch(ClassNotFoundException e) { LogLog.error("Could not find class ["+renderedClassName+"].", e); diff --git a/src/java/org/apache/log4j/spi/Configurator.java b/src/java/org/apache/log4j/spi/Configurator.java index 7b7c7abcc8..28de2964c5 100644 --- a/src/java/org/apache/log4j/spi/Configurator.java +++ b/src/java/org/apache/log4j/spi/Configurator.java @@ -19,22 +19,16 @@ public interface Configurator { /** -

    ENABLE_KEY is the name of the constant - holding the string value log4j.enable. - -

    Setting the system property log4j.disable to DEBUG, - INFO, WARN, ERROR or FATAL is equivalent to calling the {@link - Hierarchy#disable} method with the corresponding level. - - @since 1.2 */ - // public static final String ENABLE_KEY = "log4j.enable"; - + Special level value signifying inherited behaviour. The current + value of this string constant is inherited. {@link #NULL} + is a synonym. */ + public static final String INHERITED = "inherited"; /** - Special level value signifying inherited behaviour. The - current value of this string constant is inherited. - */ - public static final String INHERITED = "inherited"; + Special level signifying inherited behaviour, same as {@link + #INHERITED}. The current value of this string constant is + null. */ + public static final String NULL = "null"; diff --git a/src/java/org/apache/log4j/spi/LoggingEvent.java b/src/java/org/apache/log4j/spi/LoggingEvent.java index b35332c47a..110c25eb7f 100644 --- a/src/java/org/apache/log4j/spi/LoggingEvent.java +++ b/src/java/org/apache/log4j/spi/LoggingEvent.java @@ -10,7 +10,7 @@ import org.apache.log4j.*; import org.apache.log4j.helpers.LogLog; - +import org.apache.log4j.helpers.Loader; import java.lang.reflect.Method; import java.io.ObjectOutputStream; import java.io.ObjectInputStream; @@ -316,7 +316,7 @@ void readLevel(ObjectInputStream ois) } else { Method m = (Method) methodCache.get(className); if(m == null) { - Class clazz = Class.forName(className); + Class clazz = Loader.loadClass(className); // Note that we use Class.getDeclaredMethod instead of // Class.getMethod. This assumes that the Level subclass // implements the toLevel(int) method which is a diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index 8060989d80..a61259eae6 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -161,7 +161,7 @@ Appender parseAppender (Element appenderElement) { String className = subst(appenderElement.getAttribute(CLASS_ATTR)); LogLog.debug("Class name: [" + className+']'); try { - Object instance = Class.forName(className).newInstance(); + Object instance = Loader.loadClass(className).newInstance(); Appender appender = (Appender)instance; PropertySetter propSetter = new PropertySetter(appender); @@ -311,7 +311,7 @@ void parseCategory (Element loggerElement) { else { LogLog.debug("Desired logger sub-class: ["+className+']'); try { - Class clazz = Class.forName(className); + Class clazz = Loader.loadClass(className); Method getInstanceMethod = clazz.getMethod("getLogger", ONE_STRING_PARAM); cat = (Logger) getInstanceMethod.invoke(null, new Object[] {catName}); @@ -442,7 +442,7 @@ Layout parseLayout (Element layout_element) { String className = subst(layout_element.getAttribute(CLASS_ATTR)); LogLog.debug("Parsing layout of class: \""+className+"\""); try { - Object instance = Class.forName(className).newInstance(); + Object instance = Loader.loadClass(className).newInstance(); Layout layout = (Layout)instance; PropertySetter propSetter = new PropertySetter(layout); @@ -493,7 +493,7 @@ void parseLevel(Element element, Logger logger, boolean isRoot) { String priStr = subst(element.getAttribute(VALUE_ATTR)); LogLog.debug("Level value for "+catName+" is ["+priStr+"]."); - if(INHERITED.equals(priStr)) { + if(INHERITED.equalsIgnoreCase(priStr) || NULL.equalsIgnoreCase(priStr)) { if(isRoot) { LogLog.error("Root level cannot be inherited. Ignoring directive."); } else { @@ -506,7 +506,7 @@ void parseLevel(Element element, Logger logger, boolean isRoot) { } else { LogLog.debug("Desired Level sub-class: ["+className+']'); try { - Class clazz = Class.forName(className); + Class clazz = Loader.loadClass(className); Method toLevelMethod = clazz.getMethod("toLevel", ONE_STRING_PARAM); Level pri = (Level) toLevelMethod.invoke(null, diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 4e8db25a82..3dd68600cb 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -9,10 +9,10 @@ -

    -

    log4j 1.2.1 is now available in TAR.GZ format - or in ZIP +

    +

    log4j 1.2.2 is now available in TAR.GZ format + or in ZIP format.

    From 182b40acfb2fdf7aa043456cac596bf6e68a8ae8 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 22 May 2002 17:23:36 +0000 Subject: [PATCH 007/342] minor doc changes PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309542 13f79535-47bb-0310-9956-ffa450edef68 --- docs/FAQ.html | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/docs/FAQ.html b/docs/FAQ.html index 3b0b0dbd44..8adfa3e38b 100644 --- a/docs/FAQ.html +++ b/docs/FAQ.html @@ -60,8 +60,8 @@

    May 2002

    (possibly across multiple timezones) logging to the same file using the method above, what happens to timestamps?

    -
  • Why can't Log4J find my properties file in a J2EE or WAR application?

    -
  • Is there a way to get Log4J to automatically reload a configuration file if it changes?

    +
  • Why can't log4j find my properties file in a J2EE or WAR application?

    +
  • Is there a way to get log4j to automatically reload a configuration file if it changes?

  • What does the Windows NT Event Viewer complain about missing descriptions for my event messages when I use the NTEventLogAppender?

  • Why can't I map my logger names to the loggers that appear in the @@ -436,9 +436,8 @@

    May 2002

    This policy usually best encapsulates what the user actually wants to do, as opposed to her mind-projected solution. -

    See sort4.lcf -for an example threshold configuration. +

    See examples/sort4.lcf for an example threshold +configuration.

    If you must filter events by exact level match, then you can attach a May 2002 seen in the log file would all appear in order, generated at the time they arrived at the log server host according to its local clock. -

    Why can't Log4J find my properties file in a J2EE +

    Why can't log4j find my properties file in a J2EE or WAR application?

    -The short answer: the Log4J classes and the properties file are not +The short answer: the log4j classes and the properties file are not within the scope of the same classloader.

    The long answer (and what to do about it): J2EE or Servlet containers @@ -490,14 +489,14 @@

    May 2002

    classloader needs to find a class or a resource, it first delegates the request to the parent. -

    Log4J only uses the default Class.forName() mechanism +

    Log4j only uses the default Class.forName() mechanism for loading classes. Resources are handled similarly. See the documentation for java.lang.ClassLoader for more details.

    So, if you're having problems, try loading the class or resource -yourself. If you can't find it, neither will Log4J. ;) +yourself. If you can't find it, neither will log4j. ;) -

    Is there a way to get Log4J to +

    Is there a way to get log4j to automatically reload a configuration file if it changes?

    Yes. Both the DOMConfigurator and the PropertyConfigurator support @@ -593,8 +592,8 @@

    May 2002

  • Take responsibility for your code. -

    Authoring software is like parenting. It takes many - years to raise a child. +

    Authoring software is very much like running a marathon. It + takes time and endurance.

  • Did I mention sticking with the indentation style? From 4147df387f90d735d44403707d0979719570b2ac Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 22 May 2002 22:33:45 +0000 Subject: [PATCH 008/342] A NullAppender merely exists, it never outputs a message to any device. On rare occasions NullAppenders come in handy. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309544 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/varia/NullAppender.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/java/org/apache/log4j/varia/NullAppender.java diff --git a/src/java/org/apache/log4j/varia/NullAppender.java b/src/java/org/apache/log4j/varia/NullAppender.java new file mode 100644 index 0000000000..133efaafd1 --- /dev/null +++ b/src/java/org/apache/log4j/varia/NullAppender.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ + +package org.apache.log4j.performance; + +import org.apache.log4j.spi.LoggingEvent; +import org.apache.log4j.AppenderSkeleton; + +/** + * A NullAppender merely exists, it never outputs a message to any + * device. + * @author Ceki Gülc¨ + */ +public class NullAppender implements OptionHandler { + + private static NullAppender instance = new NullAppender(); + + public NullAppender() { + } + + public NullAppender getInstance() { + return instance; + } + + public void close() { + } + + public void doAppend(LoggingEvent event) { + } + + /** + * NullAppenders do not need a layout. + * + */ + public boolean requiresLayout() { + return false; + } +} From 045c3cee6ce6dfe5b027436c4ec0f240f1b8ae50 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 23 May 2002 08:05:39 +0000 Subject: [PATCH 009/342] A version of NullAppender that actually conpiles. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309545 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/varia/NullAppender.java | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/log4j/varia/NullAppender.java b/src/java/org/apache/log4j/varia/NullAppender.java index 133efaafd1..d892ded3ff 100644 --- a/src/java/org/apache/log4j/varia/NullAppender.java +++ b/src/java/org/apache/log4j/varia/NullAppender.java @@ -5,9 +5,14 @@ * License version 1.1, a copy of which has been included with this * distribution in the LICENSE.txt file. */ -package org.apache.log4j.performance; +package org.apache.log4j.varia; +import org.apache.log4j.Appender; +import org.apache.log4j.Layout; +import org.apache.log4j.spi.OptionHandler; import org.apache.log4j.spi.LoggingEvent; +import org.apache.log4j.spi.ErrorHandler; +import org.apache.log4j.spi.Filter; import org.apache.log4j.AppenderSkeleton; /** @@ -15,13 +20,23 @@ * device. * @author Ceki Gülc¨ */ -public class NullAppender implements OptionHandler { +public class NullAppender extends AppenderSkeleton { private static NullAppender instance = new NullAppender(); public NullAppender() { } + /** + * There are no options to acticate. + * */ + public void activateOptions() { + } + + /** + * Whenever you can, use this method to retreive an instance instead + * of instantiating a new one with new. + * */ public NullAppender getInstance() { return instance; } @@ -29,13 +44,21 @@ public NullAppender getInstance() { public void close() { } + /** + * Does not do anything. + * */ public void doAppend(LoggingEvent event) { } + /** + * Does not do anything. + * */ + protected void append(LoggingEvent event) { + } + /** * NullAppenders do not need a layout. - * - */ + * */ public boolean requiresLayout() { return false; } From 93c9d2844f7b1ce16d95b6e284552357d11aa934 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 24 May 2002 12:58:44 +0000 Subject: [PATCH 010/342] Minor documentation chages, one in particular to satisfy bug report #9291. Fixed bug #9285 where the SyslogAppender would incorrectly compute the length of the datagram to send to the remote syslogd host. Reported by Mamoru Kadota. Fixed bug #8505 where the stack trace of exception would not be properly printed on the Compaq tru64 Unix platform. [*]. Initially Reported by Fabrice Claes and later Espen H. Kolstad who also provided the fix. Release of version 1.2.3 is pending. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309546 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY | 18 +++- docs/manual.html | 6 +- .../apache/log4j/PropertyConfigurator.java | 9 +- .../apache/log4j/helpers/NullEnumeration.java | 4 +- .../apache/log4j/helpers/SyslogWriter.java | 4 +- .../log4j/spi/ThrowableInformation.java | 82 ++++++++++++------- src/xdocs/download.xml | 18 ++-- 7 files changed, 91 insertions(+), 50 deletions(-) diff --git a/docs/HISTORY b/docs/HISTORY index 6ee2970ed3..afb85af82c 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -5,9 +5,23 @@ client code. [***] Changes requiring important modifications to existing client code. + + May ??, 2002, + + - Release of version 1.2.3 + + - Fixed bug #9285 where the SyslogAppender would incorrectly compute + the length of the datagram to send to the remote syslogd host. + Reported by Mamoru Kadota. [*] + + - Fixed bug #8505 where the stack trace of exception would not be + properly printed on the Compaq tru64 Unix platform. [*]. Initially + Reported by Fabrice Claes and later Espen H. Kolstad who also + provided the fix. [*] + May 22nd, 2002 - - Relase of version 1.2.2 + - Release of version 1.2.2 - Log4j now configurators admit NULL as a valid level value. NULL has the same meaning as the previously available INHERITED value. Both @@ -21,7 +35,7 @@ May 17th, 2002 - - Relase of version 1.2.1 + - Release of version 1.2.1 - This minor release fixes bug #9155 reported by Nicko Cadell. LoggingEvent.getMDCCopy() method now sets mdcCopyLookupRequired diff --git a/docs/manual.html b/docs/manual.html index 2c24f45fea..69e8eedce7 100644 --- a/docs/manual.html +++ b/docs/manual.html @@ -814,9 +814,9 @@

    Configuration

      -
    1. Skip default initialization if the system property - log4j.defaultInitOverride is set to any value other than - "false". +
    2. Setting the log4j.defaultInitOverride system property to + any other value then "false" will cause log4j to skip the default + initialization procedure (this procedure).

    3. Set the resource string variable to the value of the log4j.configuration system property. The preferred diff --git a/src/java/org/apache/log4j/PropertyConfigurator.java b/src/java/org/apache/log4j/PropertyConfigurator.java index 27234f179c..077a469d18 100644 --- a/src/java/org/apache/log4j/PropertyConfigurator.java +++ b/src/java/org/apache/log4j/PropertyConfigurator.java @@ -175,7 +175,7 @@ public class PropertyConfigurator implements Configurator {

      For non-root categories the syntax is almost the same:

      -    log4j.logger.logger_name=[level|INHERITED], appenderName, appenderName, ...
      +    log4j.logger.logger_name=[level|INHERITED|NULL], appenderName, appenderName, ...
           

      The meaning of the optional level value is discussed above @@ -187,9 +187,10 @@ public class PropertyConfigurator implements Configurator { named logger remains untouched.

      By default categories inherit their level from the - hierarchy. However, if you set the level of a logger and - later decide that that logger should inherit its level, then - you should specify INHERITED as the value for the level value. + hierarchy. However, if you set the level of a logger and later + decide that that logger should inherit its level, then you should + specify INHERITED as the value for the level value. NULL is a + synonym for INHERITED.

      Similar to the root logger syntax, each appenderName (separated by commas) will be attached to the named logger. diff --git a/src/java/org/apache/log4j/helpers/NullEnumeration.java b/src/java/org/apache/log4j/helpers/NullEnumeration.java index e7dd29e2ee..b1e831909d 100644 --- a/src/java/org/apache/log4j/helpers/NullEnumeration.java +++ b/src/java/org/apache/log4j/helpers/NullEnumeration.java @@ -25,9 +25,7 @@ public class NullEnumeration implements Enumeration { NullEnumeration() { } - public - static - NullEnumeration getInstance() { + public static NullEnumeration getInstance() { return instance; } diff --git a/src/java/org/apache/log4j/helpers/SyslogWriter.java b/src/java/org/apache/log4j/helpers/SyslogWriter.java index 81a05f152a..50f52fe4d9 100644 --- a/src/java/org/apache/log4j/helpers/SyslogWriter.java +++ b/src/java/org/apache/log4j/helpers/SyslogWriter.java @@ -61,8 +61,8 @@ void write(char[] buf, int off, int len) throws IOException { public void write(String string) throws IOException { - DatagramPacket packet = new DatagramPacket(string.getBytes(), - string.length(), + byte[] bytes = string.getBytes(); + DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, SYSLOG_PORT); if(this.ds != null) diff --git a/src/java/org/apache/log4j/spi/ThrowableInformation.java b/src/java/org/apache/log4j/spi/ThrowableInformation.java index 06d13c18e6..c71457e106 100644 --- a/src/java/org/apache/log4j/spi/ThrowableInformation.java +++ b/src/java/org/apache/log4j/spi/ThrowableInformation.java @@ -12,10 +12,18 @@ import java.util.Vector; /** - - - - */ + * ThrowableInformation is log4j's internal representation of + * throwables. It essentially consists of a string array, called + * 'rep', where the first element, that is rep[0], represents the + * string representation of the throwable (i.e. the value you get + * when you do throwable.toString()) and subsequent elements + * correspond the stack trace with the top most entry of the stack + * corresponding to the second entry of the 'rep' array that is + * rep[1]. + * + * @author Ceki Gülcü + * + * */ public class ThrowableInformation implements java.io.Serializable { static final long serialVersionUID = -4748765566864322735L; @@ -41,12 +49,20 @@ String[] getThrowableStrRep() { VectorWriter vw = new VectorWriter(); throwable.printStackTrace(vw); rep = vw.toStringArray(); - vw.clear(); return rep; } } } +/** + * VectorWriter is a seemingly trivial implemtantion of PrintWriter. + * The throwable instance that we are trying to represnt is asked to + * print itself to a VectorWriter. + * + * By our design choice, r string representation of the throwable + * does not contain any line separators. It follows that println() + * methods of VectorWriter ignore the 'ln' part. + * */ class VectorWriter extends PrintWriter { private Vector v; @@ -56,34 +72,27 @@ class VectorWriter extends PrintWriter { v = new Vector(); } - // Support for Orion - public - void print(Object o) { + public void print(Object o) { v.addElement(o.toString()); } - // Support for Orion - public - void print(char[] s) { - v.addElement(new String(s)); + public void print(char[] chars) { + v.addElement(new String(chars)); } - // Support for Orion - public - void print(String s) { + public void print(String s) { v.addElement(s); } - public - void println(Object o) { + public void println(Object o) { v.addElement(o.toString()); } // JDK 1.1.x apprenly uses this form of println while in // printStackTrace() public - void println(char[] s) { - v.addElement(new String(s)); + void println(char[] chars) { + v.addElement(new String(chars)); } public @@ -91,8 +100,23 @@ void println(String s) { v.addElement(s); } - public - String[] toStringArray() { + public void write(char[] chars) { + v.addElement(new String(chars)); + } + + public void write(char[] chars, int off, int len) { + v.addElement(new String(chars, off, len)); + } + + public void write(String s, int off, int len) { + v.addElement(s.substring(off, off+len)); + } + + public void write(String s) { + v.addElement(s); + } + + public String[] toStringArray() { int len = v.size(); String[] sa = new String[len]; for(int i = 0; i < len; i++) { @@ -101,24 +125,20 @@ String[] toStringArray() { return sa; } - public - void clear() { - v.setSize(0); - } } class NullWriter extends Writer { - public - void close() { + public void close() { + // blank } - public - void flush() { + public void flush() { + // blank } - public - void write(char[] cbuf, int off, int len) { + public void write(char[] cbuf, int off, int len) { + // blank } } diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 3dd68600cb..bc6d2c3c02 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -9,14 +9,22 @@ -

      -

      log4j 1.2.2 is now available in TAR.GZ format - or in ZIP +

      +

      log4j 1.2.3 is available in TAR.GZ format + or in ZIP format.

      -

      This minor release fixes bug #9155 reported by Nicko +

      Minor release 1.2.2 responds to bug #9305. When loading + component classes, log4j will now first attempt to use the + Thread Context Loader and if that fails, it will use + Class.forName. In log4j 1.2 and 1.2.1, only Class.forName was + used and the TCL was ignored. +

      + + +

      The 1.2.1 (minor release) fixed bug #9155 reported by Nicko Cadell. With the exception of this bug fix and some documentation improvements, it is identical to log4j 1.2 final. From 7722a630956263e9b271dd9a2659c021252ff07c Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 28 May 2002 14:25:00 +0000 Subject: [PATCH 011/342] In reaction to bug report 9435, changed the log4j.dtd so that log4j:event is now made of logger and level attributes instead of category and priority. Changed XMLLayout to conform to the DTD. Log4j 1.2.4 will be released when chainsaw code follows suit. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309554 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/HISTORY | 12 ++++---- src/java/org/apache/log4j/Category.java | 7 +++-- src/java/org/apache/log4j/xml/XMLLayout.java | 2 +- src/java/org/apache/log4j/xml/log4j.dtd | 4 +-- src/xdocs/download.xml | 16 ++--------- tests/witness/xmlLayout.1 | 30 ++++++++++---------- tests/witness/xmlLayout.2 | 30 ++++++++++---------- 8 files changed, 47 insertions(+), 56 deletions(-) diff --git a/build.xml b/build.xml index e326574dfa..ce5898bb3a 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY b/docs/HISTORY index afb85af82c..461b081af7 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -6,7 +6,7 @@ [***] Changes requiring important modifications to existing client code. - May ??, 2002, + May 24th, 2002, - Release of version 1.2.3 @@ -15,17 +15,17 @@ Reported by Mamoru Kadota. [*] - Fixed bug #8505 where the stack trace of exception would not be - properly printed on the Compaq tru64 Unix platform. [*]. Initially - Reported by Fabrice Claes and later Espen H. Kolstad who also + properly printed on the Compaq tru64 Unix platform. Initially + reported by Fabrice Claes and later by Espen H. Kolstad who also provided the fix. [*] May 22nd, 2002 - Release of version 1.2.2 - - Log4j now configurators admit NULL as a valid level value. NULL has - the same meaning as the previously available INHERITED value. Both - values are case insensitive. [*] + - Log4j configurators take the "NULL" string value as a synonym for + "INHERITED". Both of these two strings are legal level values for + setting the level of a logger. Both values are case insensitive. [*] - When loading component classes, log4j will now first attempt to use the Thread Context Loader and if that fails, it will use diff --git a/src/java/org/apache/log4j/Category.java b/src/java/org/apache/log4j/Category.java index 110b86dd67..3ac81c3375 100644 --- a/src/java/org/apache/log4j/Category.java +++ b/src/java/org/apache/log4j/Category.java @@ -431,9 +431,10 @@ Level getEffectiveLevel() { } /** - - @deprecated Has been replaced by the {@link #getEffectiveLevel} - method. */ + * + * @deprecated Please use the the {@link #getEffectiveLevel} method + * instead. + * */ public Priority getChainedPriority() { for(Category c = this; c != null; c=c.parent) { diff --git a/src/java/org/apache/log4j/xml/XMLLayout.java b/src/java/org/apache/log4j/xml/XMLLayout.java index abc2fa284a..79308bb6af 100644 --- a/src/java/org/apache/log4j/xml/XMLLayout.java +++ b/src/java/org/apache/log4j/xml/XMLLayout.java @@ -101,7 +101,7 @@ String format(LoggingEvent event) { // We yield to the \r\n heresy. - buf.append(" diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index bc6d2c3c02..1e0c0d7fe7 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -16,20 +16,10 @@ format.

      -

      Minor release 1.2.2 responds to bug #9305. When loading - component classes, log4j will now first attempt to use the - Thread Context Loader and if that fails, it will use - Class.forName. In log4j 1.2 and 1.2.1, only Class.forName was - used and the TCL was ignored. +

      Release 1.2.3 fixes several relatively minor bugs. See the + HISTORY file for the exact details.

      - - -

      The 1.2.1 (minor release) fixed bug #9155 reported by Nicko - Cadell. With the exception of this bug fix and some - documentation improvements, it is identical to log4j 1.2 - final. -

      - +

      In addition to many performance improvements, bug fixes, and other small enhancements, log4j 1.2 adds JMX support, Mapped Diagnostic Contexts, JDBC logging, graphical log viewer diff --git a/tests/witness/xmlLayout.1 b/tests/witness/xmlLayout.1 index dd160c2063..4c36198923 100644 --- a/tests/witness/xmlLayout.1 +++ b/tests/witness/xmlLayout.1 @@ -1,48 +1,48 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + Date: Tue, 28 May 2002 17:29:57 +0000 Subject: [PATCH 012/342] This commit was manufactured by cvs2svn to create branch 'v1_2-branch'. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309555 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/log4j/varia/LevelRangeFilter.java | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 src/java/org/apache/log4j/varia/LevelRangeFilter.java diff --git a/src/java/org/apache/log4j/varia/LevelRangeFilter.java b/src/java/org/apache/log4j/varia/LevelRangeFilter.java new file mode 100644 index 0000000000..a207b758c3 --- /dev/null +++ b/src/java/org/apache/log4j/varia/LevelRangeFilter.java @@ -0,0 +1,175 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ + +package org.apache.log4j.varia; + +import org.apache.log4j.Level; +import org.apache.log4j.spi.Filter; +import org.apache.log4j.spi.LoggingEvent; +import org.apache.log4j.helpers.LogLog; +import org.apache.log4j.helpers.OptionConverter; + +/** + This is a very simple filter based on level matching, which can be + used to reject messages with priorities outside a certain range. + +

      The filter admits three options LevelMin, LevelMax + and AcceptOnMatch. + +

      If the level of the {@link LoggingEvent} is not between Min and Max + (inclusive), then {@link Filter#DENY} is returned. + +

      If the Logging event level is within the specified range, then if + AcceptOnMatch is true, {@link Filter#ACCEPT} is returned, and if + AcceptOnMatch is false, {@link Filter#NEUTRAL} is returned. + +

      If LevelMinw is not defined, then there is no + minimum acceptable level (ie a level is never rejected for + being too "low"/unimportant). If LevelMax is not + defined, then there is no maximum acceptable level (ie a + level is never rejected for beeing too "high"/important). + +

      Refer to the {@link + org.apache.log4j.AppenderSkeleton#setThreshold setThreshold} method + available to all appenders extending {@link + org.apache.log4j.AppenderSkeleton} for a more convenient way to + filter out events by level. + + @author Simon Kitching + @author based on code by Ceki Gülcü +*/ +public class LevelRangeFilter extends Filter { + + /** + Do we return ACCEPT when a match occurs. Default is + false, so that later filters get run by default */ + boolean acceptOnMatch = false; + + Level levelMin; + Level levelMax; + + + /** + Return the decision of this filter. + */ + public + int decide(LoggingEvent event) { + if(this.levelMin != null) { + if (event.level.isGreaterOrEqual(levelMin) == false) { + // level of event is less than minimum + return Filter.DENY; + } + } + + if(this.levelMax != null) { + if (event.level.toInt() > levelMax.toInt()) { + // level of event is greater than maximum + // Alas, there is no Level.isGreater method. and using + // a combo of isGreaterOrEqual && !Equal seems worse than + // checking the int values of the level objects.. + return Filter.DENY; + } + } + + if (acceptOnMatch) { + // this filter set up to bypass later filters and always return + // accept if level in range + return Filter.ACCEPT; + } + else { + // event is ok for this filter; allow later filters to have a look.. + return Filter.NEUTRAL; + } + } + + /** + Get the value of the LevelMax option. */ + public + Level getLevelMax() { + return levelMax; + } + + + /** + Get the value of the LevelMin option. */ + public + Level getLevelMin() { + return levelMin; + } + + /** + Get the value of the AcceptOnMatch option. + */ + public + boolean getAcceptOnMatch() { + return acceptOnMatch; + } + + /** + Set the LevelMax option. + */ + public + void setLevelMax(Level levelMax) { + this.levelMax = levelMax; + } + + /** + Set the LevelMin option. + */ + public + void setLevelMin(Level levelMin) { + this.levelMin = levelMin; + } + + /** + Set the AcceptOnMatch option. + */ + public + void setAcceptOnMatch(boolean acceptOnMatch) { + this.acceptOnMatch = acceptOnMatch; + } + + + /** + @deprecated We now use JavaBeans introspection to configure + components. + */ + public + String[] getOptionStrings() { + return new String[] { + LEVEL_MIN_OPTION, + LEVEL_MAX_OPTION, + ACCEPT_ON_MATCH_OPTION}; + } + + /** + @deprecated We now use JavaBeans introspection to configure + components. + */ + public + void setOption(String key, String value) { + if(key.equalsIgnoreCase(LEVEL_MIN_OPTION)) { + levelMin = OptionConverter.toLevel(value, null); + } + else if (key.equalsIgnoreCase(LEVEL_MAX_OPTION)) { + levelMax = OptionConverter.toLevel(value, null); + } + else if (key.equalsIgnoreCase(ACCEPT_ON_MATCH_OPTION)) { + acceptOnMatch = OptionConverter.toBoolean(value, acceptOnMatch); + } + } + + /** See class comments */ + public static final String LEVEL_MIN_OPTION = "LevelMin"; + + /** See class comments */ + public static final String LEVEL_MAX_OPTION = "LevelMax"; + + /** See class comments */ + public static final String ACCEPT_ON_MATCH_OPTION = "AcceptOnMatch"; +} + From 9cb4cccf273bcb4f825e62c89c7466bbde8f1c39 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 28 May 2002 17:29:57 +0000 Subject: [PATCH 013/342] Added missing LevelRangeFilter.java file to the v1_2-branch This is in response to bug #9459. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309556 13f79535-47bb-0310-9956-ffa450edef68 From c2a04207bd5750284df18410cf6d87bb35a8f443 Mon Sep 17 00:00:00 2001 From: oburn Date: Wed, 29 May 2002 11:50:17 +0000 Subject: [PATCH 014/342] Changes to support running Checkstyle. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309557 13f79535-47bb-0310-9956-ffa450edef68 --- build.properties.sample | 3 ++- build.xml | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/build.properties.sample b/build.properties.sample index 300f021c75..fdd5e3d905 100644 --- a/build.properties.sample +++ b/build.properties.sample @@ -18,5 +18,6 @@ jms.jar=/java/JMQ1.1/lib/jms.jar jmx.jar=/java/jmx/lib/jmxri.jar jmx-extra.jar=/java/jmx/lib/jmxtools.jar - +# Required to run Checkstyle. Available from http://checkstyle.sf.net +checkstyle.jar=/java/checkstyle-2.2/checkstyle-all-2.2.jar diff --git a/build.xml b/build.xml index ce5898bb3a..86bf9c1e1d 100644 --- a/build.xml +++ b/build.xml @@ -251,7 +251,7 @@ + classpath="${checkstyle.jar}"/> + classpath="${javac.dest};${ant.home}/lib/crimson.jar"> From 6f96fd3be87f95249c30c461e3f96500cfd6f48a Mon Sep 17 00:00:00 2001 From: oburn Date: Wed, 29 May 2002 11:51:20 +0000 Subject: [PATCH 015/342] Change made on the mainline that should be on the branch as well. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309558 13f79535-47bb-0310-9956-ffa450edef68 --- .../log4j/chainsaw/LoggingReceiver.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java b/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java index c69b3de1d5..3cd3455335 100644 --- a/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java +++ b/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java @@ -23,7 +23,7 @@ */ class LoggingReceiver extends Thread { /** used to log messages **/ - private static final Logger logger = Logger.getLogger(LoggingReceiver.class); + private static final Logger LOG = Logger.getLogger(LoggingReceiver.class); /** * Helper that actually processes a client connection. It receives events @@ -46,7 +46,7 @@ private class Slurper implements Runnable { /** loops getting the events **/ public void run() { - logger.debug("Starting to get data"); + LOG.debug("Starting to get data"); try { final ObjectInputStream ois = new ObjectInputStream(mClient.getInputStream()); @@ -55,19 +55,19 @@ public void run() { mModel.addEvent(new EventDetails(event)); } } catch (EOFException e) { - logger.info("Reached EOF, closing connection"); + LOG.info("Reached EOF, closing connection"); } catch (SocketException e) { - logger.info("Caught SocketException, closing connection"); + LOG.info("Caught SocketException, closing connection"); } catch (IOException e) { - logger.warn("Got IOException, closing connection", e); + LOG.warn("Got IOException, closing connection", e); } catch (ClassNotFoundException e) { - logger.warn("Got ClassNotFoundException, closing connection", e); + LOG.warn("Got ClassNotFoundException, closing connection", e); } try { mClient.close(); } catch (IOException e) { - logger.warn("Error closing connection", e); + LOG.warn("Error closing connection", e); } } } @@ -93,19 +93,19 @@ public void run() { /** Listens for client connections **/ public void run() { - logger.info("Thread started"); + LOG.info("Thread started"); try { while (true) { - logger.debug("Waiting for a connection"); + LOG.debug("Waiting for a connection"); final Socket client = mSvrSock.accept(); - logger.debug("Got a connection from " + + LOG.debug("Got a connection from " + client.getInetAddress().getHostName()); final Thread t = new Thread(new Slurper(client)); t.setDaemon(true); t.start(); } } catch (IOException e) { - logger.error("Error in accepting connections, stopping.", e); + LOG.error("Error in accepting connections, stopping.", e); } } } From cfb6b405823a5c437d5666a524baf85435fcb9b5 Mon Sep 17 00:00:00 2001 From: oburn Date: Wed, 29 May 2002 11:54:24 +0000 Subject: [PATCH 016/342] PR: 9435 Brought down changes made on the mainline to support Xerces and Crimson. Now support the updated version of the log4j.dtd as requested by Ceki. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309559 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/log4j/chainsaw/XMLFileHandler.java | 49 ++++++++----------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java b/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java index 5ce82d0744..a5e7d4f3b7 100644 --- a/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java +++ b/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java @@ -37,12 +37,10 @@ class XMLFileHandler private final MyTableModel mModel; /** the number of events in the document **/ private int mNumEvents; - /** the current element being parsed **/ - private String mCurrentElement; /** the time of the event **/ private long mTimeStamp; - /** the priority of the event **/ + /** the priority (level) of the event **/ private Priority mPriority; /** the category of the event **/ private String mCategoryName; @@ -56,7 +54,8 @@ class XMLFileHandler private String[] mThrowableStrRep; /** the location details for the event **/ private String mLocationDetails; - + /** buffer for collecting text **/ + private final StringBuffer mBuf = new StringBuffer(); /** * Creates a new XMLFileHandler instance. @@ -76,21 +75,7 @@ public void startDocument() /** @see DefaultHandler **/ public void characters(char[] aChars, int aStart, int aLength) { - if (mCurrentElement == TAG_NDC) { - mNDC = new String(aChars, aStart, aLength); - } else if (mCurrentElement == TAG_MESSAGE) { - mMessage = new String(aChars, aStart, aLength); - } else if (mCurrentElement == TAG_THROWABLE) { - final StringTokenizer st = - new StringTokenizer(new String(aChars, aStart, aLength), "\t"); - mThrowableStrRep = new String[st.countTokens()]; - if (mThrowableStrRep.length > 0) { - mThrowableStrRep[0] = st.nextToken(); - for (int i = 1; i < mThrowableStrRep.length; i++) { - mThrowableStrRep[i] = "\t" + st.nextToken(); - } - } - } + mBuf.append(String.valueOf(aChars, aStart, aLength)); } /** @see DefaultHandler **/ @@ -101,8 +86,20 @@ public void endElement(String aNamespaceURI, if (TAG_EVENT.equals(aQName)) { addEvent(); resetData(); - } else if (mCurrentElement != TAG_EVENT) { - mCurrentElement = TAG_EVENT; // hack - but only thing I care about + } else if (TAG_NDC.equals(aQName)) { + mNDC = mBuf.toString(); + } else if (TAG_MESSAGE.equals(aQName)) { + mMessage = mBuf.toString(); + } else if (TAG_THROWABLE.equals(aQName)) { + final StringTokenizer st = + new StringTokenizer(mBuf.toString(), "\n\t"); + mThrowableStrRep = new String[st.countTokens()]; + if (mThrowableStrRep.length > 0) { + mThrowableStrRep[0] = st.nextToken(); + for (int i = 1; i < mThrowableStrRep.length; i++) { + mThrowableStrRep[i] = "\t" + st.nextToken(); + } + } } } @@ -112,22 +109,18 @@ public void startElement(String aNamespaceURI, String aQName, Attributes aAtts) { + mBuf.setLength(0); + if (TAG_EVENT.equals(aQName)) { mThreadName = aAtts.getValue("thread"); mTimeStamp = Long.parseLong(aAtts.getValue("timestamp")); - mCategoryName = aAtts.getValue("category"); + mCategoryName = aAtts.getValue("logger"); mPriority = Priority.toPriority(aAtts.getValue("level")); } else if (TAG_LOCATION_INFO.equals(aQName)) { mLocationDetails = aAtts.getValue("class") + "." + aAtts.getValue("method") + "(" + aAtts.getValue("file") + ":" + aAtts.getValue("line") + ")"; - } else if (TAG_NDC.equals(aQName)) { - mCurrentElement = TAG_NDC; - } else if (TAG_MESSAGE.equals(aQName)) { - mCurrentElement = TAG_MESSAGE; - } else if (TAG_THROWABLE.equals(aQName)) { - mCurrentElement = TAG_THROWABLE; } } From a6162478f0b8f210c93031d76975ca1e27c83456 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 30 May 2002 22:41:39 +0000 Subject: [PATCH 017/342] Small improvements to FallbackErrorHandler.java PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309561 13f79535-47bb-0310-9956-ffa450edef68 --- .../log4j/varia/FallbackErrorHandler.java | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/java/org/apache/log4j/varia/FallbackErrorHandler.java b/src/java/org/apache/log4j/varia/FallbackErrorHandler.java index a7ebb9f00a..18ccb3d311 100644 --- a/src/java/org/apache/log4j/varia/FallbackErrorHandler.java +++ b/src/java/org/apache/log4j/varia/FallbackErrorHandler.java @@ -16,16 +16,17 @@ import java.util.Vector; /** - - The FallbackErrorHandler implements the ErrorHandler - interface such that a secondary appender may be specified. This - secondary appender takes over if the primary appender fails for - whatever reason. - -

      The error message is printed on System.err, and - logged in the new secondary appender. - -*/ + * + * The FallbackErrorHandler implements the ErrorHandler + * interface such that a secondary appender may be specified. This + * secondary appender takes over if the primary appender fails for + * whatever reason. + * + *

      The error message is printed on System.err, and + * logged in the new secondary appender. + * + * @author Ceki Gücü + * */ public class FallbackErrorHandler implements ErrorHandler { @@ -73,13 +74,15 @@ void error(String message, Exception e, int errorCode) { */ public void error(String message, Exception e, int errorCode, LoggingEvent event) { + LogLog.debug("FB: The following error reported: " + message, e); + LogLog.debug("FB: INITIATING FALLBACK PROCEDURE."); for(int i = 0; i < loggers.size(); i++) { Logger l = (Logger) loggers.elementAt(i); - LogLog.debug("FB: Searching for ["+primary.getName()+"] in logger" - +l.getName()); + LogLog.debug("FB: Searching for ["+primary.getName()+"] in logger [" + +l.getName() + "]."); //if(l.isAttached(primary)) { LogLog.debug("FB: Replacing ["+primary.getName()+"] by [" - + backup.getName() + " in logger"+ l); + + backup.getName() + "] in logger ["+ l.getName() +"]."); l.removeAppender(primary); LogLog.debug("FB: Adding appender ["+backup.getName()+"] to logger " + l.getName()); From b0ab84eef804a18eb76072358d0996df862abf03 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 30 May 2002 22:43:57 +0000 Subject: [PATCH 018/342] Added new test case for testing the FallbackErrorHandler. The test case is not yet complete. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309562 13f79535-47bb-0310-9956-ffa450edef68 --- tests/input/xml/fallback1.xml | 35 ++++++ .../log4j/varia/ErrorHandlerTestCase.java | 109 ++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 tests/input/xml/fallback1.xml create mode 100644 tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java diff --git a/tests/input/xml/fallback1.xml b/tests/input/xml/fallback1.xml new file mode 100644 index 0000000000..e11e95baf8 --- /dev/null +++ b/tests/input/xml/fallback1.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java b/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java new file mode 100644 index 0000000000..826602cf83 --- /dev/null +++ b/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java @@ -0,0 +1,109 @@ + +package org.apache.log4j.varia; + +import junit.framework.TestCase; +import junit.framework.TestSuite; +import junit.framework.Test; + +import org.apache.log4j.Logger; +import org.apache.log4j.Level; +import org.apache.log4j.xml.DOMConfigurator; +import org.apache.log4j.util.Filter; +import org.apache.log4j.util.LineNumberFilter; +import org.apache.log4j.util.ControlFilter; +import org.apache.log4j.util.ISO8601Filter; +import org.apache.log4j.util.Transformer; +import org.apache.log4j.util.Compare; + +public class ErrorHandlerTestCase extends TestCase { + + static String TEMP_A1 = "output/temp.A1"; + static String TEMP_A2 = "output/temp.A2"; + static String FILTERED_A1 = "output/filtered.A1"; + static String FILTERED_A2 = "output/filtered.A2"; + + + static String EXCEPTION1 = "java.lang.Exception: Just testing"; + static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; + static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; + + static String TEST1_1A_PAT = + "(DEBUG|INFO |WARN |ERROR|FATAL) \\w*\\.\\w* - Message \\d"; + + static String TEST1_1B_PAT = "(DEBUG|INFO |WARN |ERROR|FATAL) root - Message \\d"; + + static String TEST1_2_PAT = "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3} "+ + "\\[main]\\ (DEBUG|INFO|WARN|ERROR|FATAL) .* - Message \\d"; + + + + Logger root; + Logger logger; + + public ErrorHandlerTestCase(String name) { + super(name); + } + + public void setUp() { + root = Logger.getRootLogger(); + logger = Logger.getLogger("test"); + } + + public void tearDown() { + root.getLoggerRepository().resetConfiguration(); + } + + public void test1() throws Exception { + DOMConfigurator.configure("input/xml/fallback1.xml"); + common(); + + ControlFilter cf1 = new ControlFilter(new String[]{TEST1_1A_PAT, TEST1_1B_PAT, + EXCEPTION1, EXCEPTION2, EXCEPTION3}); + + ControlFilter cf2 = new ControlFilter(new String[]{TEST1_2_PAT, + EXCEPTION1, EXCEPTION2, EXCEPTION3}); + + Transformer.transform(TEMP_A1, FILTERED_A1, new Filter[] {cf1, + new LineNumberFilter()}); + + Transformer.transform(TEMP_A2, FILTERED_A2, new Filter[] {cf2, + new LineNumberFilter(), new ISO8601Filter()}); + + assertTrue(Compare.compare(FILTERED_A1, "witness/dom.A1.1")); + assertTrue(Compare.compare(FILTERED_A2, "witness/dom.A2.1")); + } + + void common() { + int i = -1; + + logger.debug("Message " + ++i); + root.debug("Message " + i); + + logger.info ("Message " + ++i); + root.info("Message " + i); + + logger.warn ("Message " + ++i); + root.warn("Message " + i); + + logger.error("Message " + ++i); + root.error("Message " + i); + + logger.log(Level.FATAL, "Message " + ++i); + root.log(Level.FATAL, "Message " + i); + + Exception e = new Exception("Just testing"); + logger.debug("Message " + ++i, e); + root.debug("Message " + i, e); + + logger.error("Message " + ++i, e); + root.error("Message " + i, e); + + } + + public static Test suite() { + TestSuite suite = new TestSuite(); + suite.addTest(new ErrorHandlerTestCase("test1")); + return suite; + } + +} From 17e9bc69657646eac781a58dfa263799b40f2594 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 4 Jun 2002 22:00:51 +0000 Subject: [PATCH 019/342] Added more performance tests to measure BufferedIO performance of FileAppender. These test are numbered 220-227. The formatting of tests 200 to 207 was also changed. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309563 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/performance/logging | 50 +++++++++++++++++++ .../log4j/performance/xml/logging201.xml | 36 ++++++------- .../log4j/performance/xml/logging202.xml | 36 ++++++------- .../log4j/performance/xml/logging203.xml | 36 ++++++------- .../log4j/performance/xml/logging204.xml | 38 +++++++------- .../log4j/performance/xml/logging205.xml | 38 +++++++------- .../log4j/performance/xml/logging206.xml | 38 +++++++------- .../log4j/performance/xml/logging207.xml | 34 ++++++------- .../log4j/performance/xml/logging220.xml | 23 +++++++++ .../log4j/performance/xml/logging221.xml | 25 ++++++++++ .../log4j/performance/xml/logging222.xml | 24 +++++++++ .../log4j/performance/xml/logging223.xml | 25 ++++++++++ .../log4j/performance/xml/logging224.xml | 25 ++++++++++ .../log4j/performance/xml/logging225.xml | 25 ++++++++++ .../log4j/performance/xml/logging226.xml | 25 ++++++++++ .../log4j/performance/xml/logging227.xml | 25 ++++++++++ 16 files changed, 375 insertions(+), 128 deletions(-) create mode 100644 src/java/org/apache/log4j/performance/xml/logging220.xml create mode 100644 src/java/org/apache/log4j/performance/xml/logging221.xml create mode 100644 src/java/org/apache/log4j/performance/xml/logging222.xml create mode 100644 src/java/org/apache/log4j/performance/xml/logging223.xml create mode 100644 src/java/org/apache/log4j/performance/xml/logging224.xml create mode 100644 src/java/org/apache/log4j/performance/xml/logging225.xml create mode 100644 src/java/org/apache/log4j/performance/xml/logging226.xml create mode 100644 src/java/org/apache/log4j/performance/xml/logging227.xml diff --git a/src/java/org/apache/log4j/performance/logging b/src/java/org/apache/log4j/performance/logging index 20da7cb040..adec4f415a 100644 --- a/src/java/org/apache/log4j/performance/logging +++ b/src/java/org/apache/log4j/performance/logging @@ -251,6 +251,56 @@ if [ $TEST -ge $start ]; then multiRun xml/logging$TEST.xml 8 "PatternLayout \"$format\"" $SHORTRUN fi +echo ------------------------------------- +echo "FileAppender: BufferedIO=true" +echo ------------------------------------- + +TEST=220 +if [ $TEST -ge $start ]; then + multiRun xml/logging$TEST.xml 8 "SimpleLayout" $LONGRUN +fi + +TEST=221 +if [ $TEST -ge $start ]; then + format="%p - %m%n" + multiRun xml/logging$TEST.xml 8 "PatternLayout \"$format\"" $LONGRUN +fi + +TEST=222 +if [ $TEST -ge $start ]; then + multiRun xml/logging$TEST.xml 8 "TTCC/RELATIVE" $LONGRUN +fi + +TEST=223 +if [ $TEST -ge $start ]; then + format="%r [%t] %-5p %c - %m%n" + multiRun xml/logging$TEST.xml 8 "PatternLayout \"$format\"" $LONGRUN +fi + +TEST=224 +if [ $TEST -ge $start ]; then + multiRun xml/logging$TEST.xml 8 "TTCCLayout/ISO8601" $LONGRUN +fi + +TEST=225 +if [ $TEST -ge $start ]; then + format="%d{ISO8601} [%t] %-5p %c %x - %m%n" + multiRun xml/logging$TEST.xml 8 "PatternLayout \"$format\"" $LONGRUN +fi + +TEST=226 +if [ $TEST -ge $start ]; then + format="%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n" + multiRun xml/logging$TEST.xml 8 "PatternLayout \"$format\"" $LONGRUN +fi + +TEST=227 +if [ $TEST -ge $start ]; then + format="%l - %m%n" + multiRun xml/logging$TEST.xml 8 "PatternLayout \"$format\"" $SHORTRUN +fi + + echo ================================== echo Async appender echo ================================== diff --git a/src/java/org/apache/log4j/performance/xml/logging201.xml b/src/java/org/apache/log4j/performance/xml/logging201.xml index d1c21e2d06..5b8fcb2dd0 100644 --- a/src/java/org/apache/log4j/performance/xml/logging201.xml +++ b/src/java/org/apache/log4j/performance/xml/logging201.xml @@ -2,23 +2,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging202.xml b/src/java/org/apache/log4j/performance/xml/logging202.xml index 5850075db9..ff93a004da 100644 --- a/src/java/org/apache/log4j/performance/xml/logging202.xml +++ b/src/java/org/apache/log4j/performance/xml/logging202.xml @@ -2,22 +2,22 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging203.xml b/src/java/org/apache/log4j/performance/xml/logging203.xml index 7d2d70464f..741c49e46d 100644 --- a/src/java/org/apache/log4j/performance/xml/logging203.xml +++ b/src/java/org/apache/log4j/performance/xml/logging203.xml @@ -2,23 +2,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging204.xml b/src/java/org/apache/log4j/performance/xml/logging204.xml index 05210f3d5f..ceaa45c5e2 100644 --- a/src/java/org/apache/log4j/performance/xml/logging204.xml +++ b/src/java/org/apache/log4j/performance/xml/logging204.xml @@ -2,23 +2,23 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging205.xml b/src/java/org/apache/log4j/performance/xml/logging205.xml index f9d0ad34f7..63093dd779 100644 --- a/src/java/org/apache/log4j/performance/xml/logging205.xml +++ b/src/java/org/apache/log4j/performance/xml/logging205.xml @@ -2,23 +2,23 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging206.xml b/src/java/org/apache/log4j/performance/xml/logging206.xml index a695214b54..cb80b32b6b 100644 --- a/src/java/org/apache/log4j/performance/xml/logging206.xml +++ b/src/java/org/apache/log4j/performance/xml/logging206.xml @@ -2,23 +2,23 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging207.xml b/src/java/org/apache/log4j/performance/xml/logging207.xml index a4098a9390..22fce853cd 100644 --- a/src/java/org/apache/log4j/performance/xml/logging207.xml +++ b/src/java/org/apache/log4j/performance/xml/logging207.xml @@ -2,23 +2,23 @@ - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging220.xml b/src/java/org/apache/log4j/performance/xml/logging220.xml new file mode 100644 index 0000000000..12faaabf6e --- /dev/null +++ b/src/java/org/apache/log4j/performance/xml/logging220.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging221.xml b/src/java/org/apache/log4j/performance/xml/logging221.xml new file mode 100644 index 0000000000..0833be0419 --- /dev/null +++ b/src/java/org/apache/log4j/performance/xml/logging221.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging222.xml b/src/java/org/apache/log4j/performance/xml/logging222.xml new file mode 100644 index 0000000000..57ee68a3c6 --- /dev/null +++ b/src/java/org/apache/log4j/performance/xml/logging222.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging223.xml b/src/java/org/apache/log4j/performance/xml/logging223.xml new file mode 100644 index 0000000000..ca7dc8e82e --- /dev/null +++ b/src/java/org/apache/log4j/performance/xml/logging223.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging224.xml b/src/java/org/apache/log4j/performance/xml/logging224.xml new file mode 100644 index 0000000000..a79ff1c0b9 --- /dev/null +++ b/src/java/org/apache/log4j/performance/xml/logging224.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging225.xml b/src/java/org/apache/log4j/performance/xml/logging225.xml new file mode 100644 index 0000000000..94c45a699b --- /dev/null +++ b/src/java/org/apache/log4j/performance/xml/logging225.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging226.xml b/src/java/org/apache/log4j/performance/xml/logging226.xml new file mode 100644 index 0000000000..13117e4f0b --- /dev/null +++ b/src/java/org/apache/log4j/performance/xml/logging226.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/log4j/performance/xml/logging227.xml b/src/java/org/apache/log4j/performance/xml/logging227.xml new file mode 100644 index 0000000000..c3a61e2c7b --- /dev/null +++ b/src/java/org/apache/log4j/performance/xml/logging227.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + From fe4b30de5f80fb858792b088e72d28abf28c160e Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 4 Jun 2002 22:42:29 +0000 Subject: [PATCH 020/342] Removed a warning statement which gets systematically called under JDK 1.1. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309564 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/helpers/Loader.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/java/org/apache/log4j/helpers/Loader.java b/src/java/org/apache/log4j/helpers/Loader.java index a8949d4e9a..7d30c6749d 100644 --- a/src/java/org/apache/log4j/helpers/Loader.java +++ b/src/java/org/apache/log4j/helpers/Loader.java @@ -85,10 +85,7 @@ URL getResource(String resource) { // We could not find resource. Ler us now try with the // classloader that loaded this class. classLoader = Loader.class.getClassLoader(); - if(classLoader == null) { - LogLog.warn("Loader.class.getClassLoader returned null!"); - } else { - + if(classLoader != null) { LogLog.debug("Trying to find ["+resource+"] using "+classLoader +" class loader."); url = classLoader.getResource(resource); From f520ad3efbc4ff2049013f56a32e7109a12f06d5 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Mon, 10 Jun 2002 16:46:53 +0000 Subject: [PATCH 021/342] Corrected incorrect package name references. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309565 13f79535-47bb-0310-9956-ffa450edef68 --- examples/mycat.bad | 14 ++++++++------ examples/mycat.good | 16 ++++++++-------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/examples/mycat.bad b/examples/mycat.bad index 86ef942ff8..fcfdc6164a 100644 --- a/examples/mycat.bad +++ b/examples/mycat.bad @@ -1,16 +1,18 @@ # The usual stuff. Note that A1 is configured in root not in "some.cat" -log4j.rootCategory=DEBUG, A1 +log4j.rootLogger=DEBUG, A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%5p [%t] %c - %m%n # Set the priority of "some.cat" to TRACE (defined in -# org.apache.log4j.xml.examples.XPriority). This will actually have -# the side effect of instanciating a category object having the name -# "some.cat" this will cause a ClassCastException if the category -# object is cast as a MyCategory object. +# examples.customLevel.XLevel). This will actually have the side +# effect of instanciating a logger object having the name "some.cat" +# this will cause a ClassCastException if the logger object is cast +# as a MyLogger object. + +log4j.logger.some.cat=TRACE#examples.customLevel.XLevel + -log4j.category.some.cat=TRACE#org.apache.log4j.xml.examples.XPriority diff --git a/examples/mycat.good b/examples/mycat.good index 6d0813667e..c2e02ee7ca 100644 --- a/examples/mycat.good +++ b/examples/mycat.good @@ -1,13 +1,13 @@ -# Setting the category factory to MyCategoryFactory solves the +# Setting the logger factory to MyLoggerFactory solves the # ClassCastException problem encountered with the "mycat.bad" # configuration file. -log4j.categoryFactory=org.apache.log4j.examples.MyCategoryFactory +log4j.loggerFactory=examples.subclass.MyLoggerFactory # The usual stuff. Note that A1 is configured in root not in "some.cat" -log4j.rootCategory=DEBUG, A1 +log4j.rootLogger=DEBUG, A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout @@ -15,10 +15,10 @@ log4j.appender.A1.layout.ConversionPattern=%5p [%t] %c - %m%n # Set the priority of "some.cat" to TRACE (defined in -# org.apache.log4j.xml.examples.XPriority). Since we specified -# MyCategoryFactory as the category factory, the following line willl -# also have the side effect of instanciating a MyCategory object -# having the name "some.cat". +# examples.customLevel.XLevel). Since we specified MyLoggerFactory as +# the logger factory, the following line willl also have the side +# effect of instanciating a MyLogger object having the name +# "some.cat". -log4j.category.some.cat=TRACE#org.apache.log4j.xml.examples.XPriority +log4j.logger.some.cat=TRACE#examples.customLevel.XLevel From ddb6842d3282bb9cebb8b7bceb58644a914b3b55 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 11 Jun 2002 13:05:23 +0000 Subject: [PATCH 022/342] The dispatcher thread associated with AsyncAppender is now marked as a deamon thread. This resolves bug #9750. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309568 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/AsyncAppender.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/log4j/AsyncAppender.java b/src/java/org/apache/log4j/AsyncAppender.java index e9fb7d615c..f99bd862dc 100644 --- a/src/java/org/apache/log4j/AsyncAppender.java +++ b/src/java/org/apache/log4j/AsyncAppender.java @@ -37,8 +37,6 @@ files sample4.xml and sample5.xml. - - @author Ceki Gülcü @since 0.9.1 */ public class AsyncAppender extends AppenderSkeleton @@ -256,10 +254,14 @@ class Dispatcher extends Thread { Dispatcher(BoundedFIFO bf, AsyncAppender container) { this.bf = bf; this.container = container; - this.aai = container.aai; + this.aai = container.aai; + // It is the user's responsibility to close appenders before + // exiting. + this.setDaemon(true); // set the dispatcher priority to lowest possible value this.setPriority(Thread.MIN_PRIORITY); this.setName("Dispatcher-"+getName()); + // set the dispatcher priority to MIN_PRIORITY plus or minus 2 // depending on the direction of MIN to MAX_PRIORITY. //+ (Thread.MAX_PRIORITY > Thread.MIN_PRIORITY ? 1 : -1)*2); From d489e89e0b1e3223897c76f0653a72ffbc53841f Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 11 Jun 2002 13:06:11 +0000 Subject: [PATCH 023/342] Slightly more accurate error reporting. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309569 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/ConsoleAppender.java | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/java/org/apache/log4j/ConsoleAppender.java b/src/java/org/apache/log4j/ConsoleAppender.java index fc1447461f..bd43ede034 100644 --- a/src/java/org/apache/log4j/ConsoleAppender.java +++ b/src/java/org/apache/log4j/ConsoleAppender.java @@ -11,12 +11,12 @@ import org.apache.log4j.helpers.LogLog; /** - ConsoleAppender appends log events to System.out or - System.err using a layout specified by the - user. The default target is System.out. - - @author Ceki Gülcü - @since 1.1 */ + * ConsoleAppender appends log events to System.out or + * System.err using a layout specified by the user. The + * default target is System.out. + * + * @author Ceki Gülcü + * @since 1.1 */ public class ConsoleAppender extends WriterAppender { public static final String SYSTEM_OUT = "System.out"; @@ -47,9 +47,10 @@ public ConsoleAppender(Layout layout, String target) { } /** - Sets the value of the Target option. Recognized values are - "System.out" and "System.err". Any other value will be ignored. - */ + * Sets the value of the Target option. Recognized values + * are "System.out" and "System.err". Any other value will be + * ignored. + * */ public void setTarget(String value) { String v = value.trim(); @@ -64,12 +65,11 @@ void setTarget(String value) { } /** - Returns the current value of the Target property. The default - value of the option is "System.out". - - See also {@link #setTarget}. - - */ + * Returns the current value of the Target property. The + * default value of the option is "System.out". + * + * See also {@link #setTarget}. + * */ public String getTarget() { return target; @@ -77,7 +77,7 @@ String getTarget() { void targetWarn(String val) { LogLog.warn("["+val+"] should be System.out or System.err."); - LogLog.warn("Using System.out (default)."); + LogLog.warn("Using previously set target, System.out by default."); } public @@ -90,8 +90,10 @@ void activateOptions() { } /** - Override the parent method to do nothing. - */ + * This method overrides the parent {@link + * WriterAppender#closeWriter} implementation to do nothing because + * the console stream is not ours to close. + * */ protected final void closeWriter() { From e6d7b3792f271f34f7be45272840dad4a03e7fff Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 11 Jun 2002 13:08:20 +0000 Subject: [PATCH 024/342] More useful error message in PropertySetter PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309570 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/config/PropertySetter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/config/PropertySetter.java b/src/java/org/apache/log4j/config/PropertySetter.java index c1b2ec1ad9..7feff64adc 100644 --- a/src/java/org/apache/log4j/config/PropertySetter.java +++ b/src/java/org/apache/log4j/config/PropertySetter.java @@ -156,7 +156,7 @@ void setProperty(String name, String value) { setProperty(prop, name, value); } catch (PropertySetterException ex) { LogLog.warn("Failed to set property [" + name + - "] to value \"" + value + "\". " + ex.getMessage()); + "] to value \"" + value + "\". ", ex.rootCause); } } } From bbcfd5659ee89014ba829c65e0799441e36f914a Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 11 Jun 2002 13:09:06 +0000 Subject: [PATCH 025/342] Corrected the value returned by the requiresLayout() method. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309571 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/jdbc/JDBCAppender.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/log4j/jdbc/JDBCAppender.java b/src/java/org/apache/log4j/jdbc/JDBCAppender.java index 31bf000291..aa8b0885c3 100644 --- a/src/java/org/apache/log4j/jdbc/JDBCAppender.java +++ b/src/java/org/apache/log4j/jdbc/JDBCAppender.java @@ -15,7 +15,11 @@ /** The JDBCAppender provides for sending log events to a database. - + +

      WARNING This version of JDBCAppender does not log + exceptions. +

      +

      Each append call adds to an ArrayList buffer. When the buffer is filled each log event is placed in a sql statement (configurable) and executed. @@ -247,10 +251,10 @@ public void finalize() { /** - * JDBCAppender builds a layout internally if one is not provided. - */ + * JDBCAppender requires a layout. + * */ public boolean requiresLayout() { - return false; + return true; } From a53139308bda40c0dc570ebe39992659c744fff4 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 11 Jun 2002 13:17:38 +0000 Subject: [PATCH 026/342] Cosmetic changes, documentation improvements, typo corrections, indentation changes... PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309572 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/AppenderSkeleton.java | 29 +++++++------- src/java/org/apache/log4j/FileAppender.java | 16 ++++---- src/java/org/apache/log4j/WriterAppender.java | 27 ++++++------- .../org/apache/log4j/spi/LoggingEvent.java | 12 +++--- .../apache/log4j/varia/LevelMatchFilter.java | 2 +- .../apache/log4j/varia/LevelRangeFilter.java | 39 ------------------- 6 files changed, 41 insertions(+), 84 deletions(-) diff --git a/src/java/org/apache/log4j/AppenderSkeleton.java b/src/java/org/apache/log4j/AppenderSkeleton.java index caf95ba1b6..0309b050d8 100644 --- a/src/java/org/apache/log4j/AppenderSkeleton.java +++ b/src/java/org/apache/log4j/AppenderSkeleton.java @@ -17,13 +17,14 @@ /** - Abstract superclass of the other appenders in the package. - - This class provides the code for common functionality, such as - support for threshold filtering and support for general filters. - - @since 0.8.1 - @author Ceki Gülcü */ + * Abstract superclass of the other appenders in the package. + * + * This class provides the code for common functionality, such as + * support for threshold filtering and support for general filters. + * + * @since 0.8.1 + * @author Ceki Gülcü + * */ public abstract class AppenderSkeleton implements Appender, OptionHandler { /** The layout variable does not need to be set if the appender @@ -99,11 +100,10 @@ void clearFilters() { } /** - Finalize this appender by calling the imlenentation's + Finalize this appender by calling the derived class' close method. - @since 0.8.4 - */ + @since 0.8.4 */ public void finalize() { // An appender might be closed then garbage collected. There is no @@ -191,11 +191,10 @@ boolean isAsSevereAsThreshold(Priority priority) { /** - This method performs threshold checks and invokes filters before - delegating actual logging to the subclasses specific {@link - AppenderSkeleton#append} method. - - */ + * This method performs threshold checks and invokes filters before + * delegating actual logging to the subclasses specific {@link + * AppenderSkeleton#append} method. + * */ public synchronized void doAppend(LoggingEvent event) { diff --git a/src/java/org/apache/log4j/FileAppender.java b/src/java/org/apache/log4j/FileAppender.java index e3b212ec5f..49715775da 100644 --- a/src/java/org/apache/log4j/FileAppender.java +++ b/src/java/org/apache/log4j/FileAppender.java @@ -20,14 +20,14 @@ // Ben Sandee /** - FileAppender appends log events to a file. - -

      Support for java.io.Writer and console appending - has been deprecated and then removed. See the replacement - solutions: {@link WriterAppender} and {@link ConsoleAppender}. - - - @author Ceki Gülcü */ + * FileAppender appends log events to a file. + * + *

      Support for java.io.Writer and console appending + * has been deprecated and then removed. See the replacement + * solutions: {@link WriterAppender} and {@link ConsoleAppender}. + * + * @author Ceki Gülcü + * */ public class FileAppender extends WriterAppender { /** Append to or truncate the file? The default value for this diff --git a/src/java/org/apache/log4j/WriterAppender.java b/src/java/org/apache/log4j/WriterAppender.java index 50b33f4a02..456d35bd0d 100644 --- a/src/java/org/apache/log4j/WriterAppender.java +++ b/src/java/org/apache/log4j/WriterAppender.java @@ -194,17 +194,18 @@ void close() { writeFooter(); reset(); } + /** - Close the underlying {@link java.io.Writer}. - */ - protected - void closeWriter() { + * Close the underlying {@link java.io.Writer}. + * */ + protected void closeWriter() { if(qw != null) { try { qw.close(); } catch(IOException e) { - LogLog.error("Could not close " + qw, e); // do need to invoke an error handler - // at this late stage + // There is do need to invoke an error handler at this late + // stage. + LogLog.error("Could not close " + qw, e); } } } @@ -234,13 +235,11 @@ OutputStreamWriter createWriter(OutputStream os) { return retval; } - public - String getEncoding() { + public String getEncoding() { return encoding; } - public - void setEncoding(String value) { + public void setEncoding(String value) { encoding = value; } @@ -250,9 +249,7 @@ void setEncoding(String value) { /** Set the {@link ErrorHandler} for this WriterAppender and also the underlying {@link QuietWriter} if any. */ - public - synchronized - void setErrorHandler(ErrorHandler eh) { + public synchronized void setErrorHandler(ErrorHandler eh) { if(eh == null) { LogLog.warn("You have tried to set a null error-handler."); } else { @@ -275,9 +272,7 @@ void setErrorHandler(ErrorHandler eh) {

      WARNING: Logging to an unopened Writer will fail.

      @param writer An already opened Writer. */ - public - synchronized - void setWriter(Writer writer) { + public synchronized void setWriter(Writer writer) { reset(); this.qw = new QuietWriter(writer, errorHandler); //this.tp = new TracerPrintWriter(qw); diff --git a/src/java/org/apache/log4j/spi/LoggingEvent.java b/src/java/org/apache/log4j/spi/LoggingEvent.java index 110c25eb7f..e20db2dc4f 100644 --- a/src/java/org/apache/log4j/spi/LoggingEvent.java +++ b/src/java/org/apache/log4j/spi/LoggingEvent.java @@ -39,11 +39,13 @@ public class LoggingEvent implements java.io.Serializable { /** Fully qualified name of the calling category class. */ transient public final String fqnOfCategoryClass; - /** The category of the logging event. The category field is not - serialized for performance reasons. - -

      It is set by the LoggingEvent constructor or set by a remote - entity after deserialization. */ + /** + * The category of the logging event. This field is not serialized + * for performance reasons. + * + *

      It is set by the LoggingEvent constructor or set by a remote + * entity after deserialization. + * */ transient public Category logger; /** The category (logger) name. */ diff --git a/src/java/org/apache/log4j/varia/LevelMatchFilter.java b/src/java/org/apache/log4j/varia/LevelMatchFilter.java index b028c83674..483aee8ae0 100644 --- a/src/java/org/apache/log4j/varia/LevelMatchFilter.java +++ b/src/java/org/apache/log4j/varia/LevelMatchFilter.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.APL file. + * the LICENSE.txt file. */ package org.apache.log4j.varia; diff --git a/src/java/org/apache/log4j/varia/LevelRangeFilter.java b/src/java/org/apache/log4j/varia/LevelRangeFilter.java index a207b758c3..9e3d1e187c 100644 --- a/src/java/org/apache/log4j/varia/LevelRangeFilter.java +++ b/src/java/org/apache/log4j/varia/LevelRangeFilter.java @@ -132,44 +132,5 @@ void setLevelMin(Level levelMin) { void setAcceptOnMatch(boolean acceptOnMatch) { this.acceptOnMatch = acceptOnMatch; } - - - /** - @deprecated We now use JavaBeans introspection to configure - components. - */ - public - String[] getOptionStrings() { - return new String[] { - LEVEL_MIN_OPTION, - LEVEL_MAX_OPTION, - ACCEPT_ON_MATCH_OPTION}; - } - - /** - @deprecated We now use JavaBeans introspection to configure - components. - */ - public - void setOption(String key, String value) { - if(key.equalsIgnoreCase(LEVEL_MIN_OPTION)) { - levelMin = OptionConverter.toLevel(value, null); - } - else if (key.equalsIgnoreCase(LEVEL_MAX_OPTION)) { - levelMax = OptionConverter.toLevel(value, null); - } - else if (key.equalsIgnoreCase(ACCEPT_ON_MATCH_OPTION)) { - acceptOnMatch = OptionConverter.toBoolean(value, acceptOnMatch); - } - } - - /** See class comments */ - public static final String LEVEL_MIN_OPTION = "LevelMin"; - - /** See class comments */ - public static final String LEVEL_MAX_OPTION = "LevelMax"; - - /** See class comments */ - public static final String ACCEPT_ON_MATCH_OPTION = "AcceptOnMatch"; } From 7534730bad8ea73926c8c4ad29e9985933222e69 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 11 Jun 2002 13:20:05 +0000 Subject: [PATCH 027/342] XMLLayout can now output messages which contain embedded CDATA sections. This resolves bug #9750. Many thanks Michael A. McAngus for supplying the relevant patch. Added a new test in XMLLayoutTestCase.java PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309573 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/helpers/Transform.java | 55 +++++- src/java/org/apache/log4j/xml/XMLLayout.java | 174 +++++++++--------- .../apache/log4j/xml/XMLLayoutTestCase.java | 15 +- 3 files changed, 147 insertions(+), 97 deletions(-) diff --git a/src/java/org/apache/log4j/helpers/Transform.java b/src/java/org/apache/log4j/helpers/Transform.java index 66e6c8041b..fe2ef9d54f 100644 --- a/src/java/org/apache/log4j/helpers/Transform.java +++ b/src/java/org/apache/log4j/helpers/Transform.java @@ -12,21 +12,28 @@ /** Utility class for transforming strings. + + @author Ceki Gülcü + @author Michael A. McAngus */ public class Transform { + private static final String CDATA_START = ""; + private static final String CDATA_PSEUDO_END = "]]>"; + private static final String CDATA_EMBEDED_END = CDATA_END + CDATA_PSEUDO_END + CDATA_START; + private static final int CDATA_END_LEN = CDATA_END.length(); + /** - * This method takes a string which may contain HTML tags (ie, , , - * etc) and converts the '<' and '>' characters to their HTML escape - * sequences. + * This method takes a string which may contain HTML tags (ie, + * <b>, <table>, etc) and replaces any '<' and '>' + * characters with respective predefined entity references. * * @param input The text to be converted. * @return The input string with the characters '<' and '>' replaced with - * < and > respectively. - */ - static - public - String escapeTags(String input) { + * &lt; and &gt; respectively. + * */ + static public String escapeTags(String input) { //Check if the string is null or zero length -- if so, return //what was sent in. @@ -53,4 +60,36 @@ String escapeTags(String input) { } return buf.toString(); } + + /** + * Ensures that embeded CDEnd strings (]]>) are handled properly + * within message, NDC and throwable tag text. + * + * @param buf StringBuffer holding the XML data to this point. The + * initial CDStart () of the CDATA + * section are the responsibility of the calling method. + * @param str The String that is inserted into an existing CDATA Section within buf. + * */ + static public void appendEscapingCDATA(StringBuffer buf, String str) { + int end = str.indexOf(CDATA_END); + + if (end < 0) { + buf.append(str); + return; + } + + int start = 0; + while (end > -1) { + buf.append(str.substring(start,end)); + buf.append(CDATA_EMBEDED_END); + start = end + CDATA_END_LEN; + if (start < str.length()) { + end = str.indexOf(CDATA_END, start); + } else { + return; + } + } + + buf.append(str.substring(start)); + } } diff --git a/src/java/org/apache/log4j/xml/XMLLayout.java b/src/java/org/apache/log4j/xml/XMLLayout.java index 79308bb6af..ac68ec2b39 100644 --- a/src/java/org/apache/log4j/xml/XMLLayout.java +++ b/src/java/org/apache/log4j/xml/XMLLayout.java @@ -17,37 +17,38 @@ import org.apache.log4j.helpers.Transform; /** - The output of the XMLLayout consists of a series of log4j:event - elements as defined in the log4j.dtd. It does not output a - complete well-formed XML file. The output is designed to be - included as an external entity in a separate file to form - a correct XML file. - -

      For example, if abc is the name of the file where - the XMLLayout ouput goes, then a well-formed XML file would be: - -

      + * The output of the XMLLayout consists of a series of log4j:event
      + * elements as defined in the log4j.dtd. It does not output a
      + * complete well-formed XML file. The output is designed to be
      + * included as an external entity in a separate file to form
      + * a correct XML file.
      + *
      + * 

      For example, if abc is the name of the file where + * the XMLLayout ouput goes, then a well-formed XML file would be: + * +

          <?xml version="1.0" ?>
      -
      -   <!DOCTYPE log4j:eventSet SYSTEM "log4j.dtd" [<!ENTITY data SYSTEM "abc">]>
      -
      -   <log4j:eventSet version="1.2" xmlns:log4j="http://jakarta.apache.org/log4j/">
      -         &data;
      -   </log4j:eventSet>
      -   
      - -

      This approach enforces the independence of the XMLLayout and the - appender where it is embedded. - -

      The version attribute helps components to correctly - intrepret output generated by XMLLayout. The value of this - attribute should be "1.1" for output generated by log4j versions - prior to log4j 1.2 (final release) and "1.2" for relase 1.2 and - later. - - @author Ceki Gülcü - @since 0.9.0 */ + + <!DOCTYPE log4j:eventSet SYSTEM "log4j.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4j:eventSet version="1.2" xmlns:log4j="http://jakarta.apache.org/log4j/"> +   &data; + </log4j:eventSet> +

      + + *

      This approach enforces the independence of the XMLLayout and the + * appender where it is embedded. + * + *

      The version attribute helps components to correctly + * intrepret output generated by XMLLayout. The value of this + * attribute should be "1.1" for output generated by log4j versions + * prior to log4j 1.2 (final release) and "1.2" for relase 1.2 and + * later. + * + * @author Ceki Gülcü + * @since 0.9.0 + * */ public class XMLLayout extends Layout { private final int DEFAULT_SIZE = 256; @@ -55,41 +56,38 @@ public class XMLLayout extends Layout { private StringBuffer buf = new StringBuffer(DEFAULT_SIZE); private boolean locationInfo = false; - /** - The LocationInfo option takes a boolean value. By - default, it is set to false which means there will be no location - information output by this layout. If the the option is set to - true, then the file name and line number of the statement - at the origin of the log statement will be output. - -

      If you are embedding this layout within an {@link - org.apache.log4j.net.SMTPAppender} then make sure to set the - LocationInfo option of that appender as well. - */ - public - void setLocationInfo(boolean flag) { + * The LocationInfo option takes a boolean value. By default, + * it is set to false which means there will be no location + * information output by this layout. If the the option is set to + * true, then the file name and line number of the statement at the + * origin of the log statement will be output. + * + *

      If you are embedding this layout within an {@link + * org.apache.log4j.net.SMTPAppender} then make sure to set the + * LocationInfo option of that appender as well. + * */ + public void setLocationInfo(boolean flag) { locationInfo = flag; } /** Returns the current value of the LocationInfo option. */ - public - boolean getLocationInfo() { + public boolean getLocationInfo() { return locationInfo; } - public - void activateOptions() { + /** No options to activate. */ + public void activateOptions() { } /** - Formats a {@link LoggingEvent} in conformance with the log4j.dtd. */ - public - String format(LoggingEvent event) { + * Formats a {@link LoggingEvent} in conformance with the log4j.dtd. + * */ + public String format(LoggingEvent event) { // Reset working buffer. If the buffer is too large, then we need a new // one in order to avoid the penalty of creating a large array. @@ -111,43 +109,44 @@ String format(LoggingEvent event) { buf.append(event.getThreadName()); buf.append("\">\r\n"); - - buf.append("\r\n"); - - String ndc = event.getNDC(); - if(ndc != null) { - buf.append("\r\n"); - } - - String[] s = event.getThrowableStrRep(); - if(s != null) { - buf.append("\r\n"); - } - - if(locationInfo) { - LocationInfo locationInfo = event.getLocationInformation(); - buf.append("\r\n"); - } - + buf.append("\r\n"); + + String ndc = event.getNDC(); + if(ndc != null) { + buf.append("\r\n"); + } + + String[] s = event.getThrowableStrRep(); + if(s != null) { + buf.append("\r\n"); + } + + if(locationInfo) { + LocationInfo locationInfo = event.getLocationInformation(); + buf.append("\r\n"); + } + buf.append("\r\n\r\n"); - + return buf.toString(); } @@ -155,8 +154,7 @@ String format(LoggingEvent event) { The XMLLayout prints and does not ignore exceptions. Hence the return value false. */ - public - boolean ignoresThrowable() { + public boolean ignoresThrowable() { return false; } } diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java index 49c214d8a3..5941c66cc4 100644 --- a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java @@ -58,6 +58,19 @@ public void locationInfo() throws Exception { assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.2")); } + public void testCDATA() throws Exception { + XMLLayout xmlLayout = new XMLLayout(); + xmlLayout.setLocationInfo(true); + root.addAppender(new FileAppender(xmlLayout, TEMP, false)); + + logger.debug("Message with embedded hi]]>."); + + Transformer.transform(TEMP, FILTERED, new Filter[] {new LineNumberFilter(), + new XMLTimestampFilter(), + new XMLLineAttributeFilter()}); + assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.3")); + } + void common() { int i = -1; @@ -84,13 +97,13 @@ void common() { logger.error("Message " + ++i, e); root.error("Message " + i, e); - } public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(new XMLLayoutTestCase("basic")); suite.addTest(new XMLLayoutTestCase("locationInfo")); + suite.addTest(new XMLLayoutTestCase("testCDATA")); return suite; } From 419b0333558231f5435860918078f84feb54990b Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 11 Jun 2002 13:21:59 +0000 Subject: [PATCH 028/342] Small javadoc corrections. Preparing release 1.2.4. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309574 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY | 18 ++++++++++++++++++ .../org/apache/log4j/PropertyConfigurator.java | 2 +- src/xdocs/download.xml | 10 +++++----- tests/build.xml | 11 ++++++++--- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/docs/HISTORY b/docs/HISTORY index 461b081af7..3183155360 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -6,6 +6,24 @@ [***] Changes requiring important modifications to existing client code. + - Release of version 1.2.4 + + - XMLLayout can now output messages which contain embedded CDATA + sections. This resolves bug #9750. Many thanks Michael + A. McAngus for supplying the relevant patch. [*] + + - The dispatcher thread associated with AsyncAppender is now marked + as a deamon thread. This resolves bug #9750. [*] + + - Added missing NTEventLogAppender.dll as reported in bug #9606. [*] + + - In response to bug report 9435, the log4j.dtd was changed so that + is now made of logger and level attributes instead of + category and priority. Changed XMLLayout to conform to the + DTD. Chainsaw was changed to adapt to the XMLLayout. [*] + + - Added missing LevelRangeFilter file. [*] + May 24th, 2002, - Release of version 1.2.3 diff --git a/src/java/org/apache/log4j/PropertyConfigurator.java b/src/java/org/apache/log4j/PropertyConfigurator.java index 077a469d18..27f84468f6 100644 --- a/src/java/org/apache/log4j/PropertyConfigurator.java +++ b/src/java/org/apache/log4j/PropertyConfigurator.java @@ -118,7 +118,7 @@ public class PropertyConfigurator implements Configurator {

      The level value can consist of the string values OFF, FATAL, - ERROR, WARN, INFO, DEBUG, ALL or a custom level value. A + ERROR, WARN, INFO, DEBUG, ALL or a custom level value. A custom level value can be specified in the form level#classname. By default the repository-wide threshold is set to the lowest possible value, namely the level ALL. diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 1e0c0d7fe7..9f5b052c36 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -9,14 +9,14 @@ -

      -

      log4j 1.2.3 is available in TAR.GZ format - or in ZIP +

      +

      log4j 1.2.4 is available in TAR.GZ format + or in ZIP format.

      -

      Release 1.2.3 fixes several relatively minor bugs. See the +

      Release 1.2.4 fixes several relatively minor bugs. See the HISTORY file for the exact details.

      diff --git a/tests/build.xml b/tests/build.xml index 809c3019a4..0e0b0754cb 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -51,9 +51,7 @@ build - compile all project files, if a certain library is missing, then the compilation of its dependents are skipped. - regression - Run regression ests which check large parts of log4j. - unit - Run unit tests which check one component at a time. - longUnit - Run long unit tests which check one component at a time. + regression - Run regression tests which check large parts of log4j. runAll - run all available tests @@ -212,6 +210,13 @@ + + + + + + + From 369284819b89e455126c064a209efbc700feafff Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 11 Jun 2002 21:17:21 +0000 Subject: [PATCH 029/342] LF5 gif files. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309575 13f79535-47bb-0310-9956-ffa450edef68 --- docs/lf5/images/blue_on_white.gif | Bin 0 -> 908 bytes docs/lf5/images/console_window.gif | Bin 0 -> 56097 bytes docs/lf5/images/lf5.gif | Bin 0 -> 35277 bytes docs/lf5/images/lf5_about.gif | Bin 0 -> 9451 bytes docs/lf5/images/lf5_category_explorer.gif | Bin 0 -> 62477 bytes docs/lf5/images/lf5_collapseall.gif | Bin 0 -> 62701 bytes docs/lf5/images/lf5_colorchooser.gif | Bin 0 -> 62676 bytes docs/lf5/images/lf5_compactview.gif | Bin 0 -> 53415 bytes docs/lf5/images/lf5_configure.gif | Bin 0 -> 62471 bytes docs/lf5/images/lf5_deselectall.gif | Bin 0 -> 65637 bytes docs/lf5/images/lf5_detailedview.gif | Bin 0 -> 57900 bytes docs/lf5/images/lf5_expandall.gif | Bin 0 -> 64917 bytes docs/lf5/images/lf5_loglevels.gif | Bin 0 -> 62411 bytes docs/lf5/images/lf5_logo.gif | Bin 0 -> 2398 bytes docs/lf5/images/lf5_logo_small.gif | Bin 0 -> 970 bytes docs/lf5/images/lf5_logtable.gif | Bin 0 -> 61525 bytes docs/lf5/images/lf5_ndc_filtering.gif | Bin 0 -> 42345 bytes docs/lf5/images/lf5_openfile.gif | Bin 0 -> 51140 bytes docs/lf5/images/lf5_openurl.gif | Bin 0 -> 61066 bytes docs/lf5/images/lf5_properties.gif | Bin 0 -> 52169 bytes docs/lf5/images/lf5_recorddetail.gif | Bin 0 -> 55142 bytes docs/lf5/images/lf5_remove_categories.gif | Bin 0 -> 66759 bytes docs/lf5/images/lf5_search.gif | Bin 0 -> 59820 bytes docs/lf5/images/lf5_selectall.gif | Bin 0 -> 65440 bytes docs/lf5/images/lf5_small.gif | Bin 0 -> 19171 bytes docs/lf5/images/lf5_standardview.gif | Bin 0 -> 54007 bytes docs/lf5/images/lf5_view.gif | Bin 0 -> 63526 bytes docs/lf5/images/small_right_arrow.gif | Bin 0 -> 76 bytes 28 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/lf5/images/blue_on_white.gif create mode 100644 docs/lf5/images/console_window.gif create mode 100644 docs/lf5/images/lf5.gif create mode 100644 docs/lf5/images/lf5_about.gif create mode 100644 docs/lf5/images/lf5_category_explorer.gif create mode 100644 docs/lf5/images/lf5_collapseall.gif create mode 100644 docs/lf5/images/lf5_colorchooser.gif create mode 100644 docs/lf5/images/lf5_compactview.gif create mode 100644 docs/lf5/images/lf5_configure.gif create mode 100644 docs/lf5/images/lf5_deselectall.gif create mode 100644 docs/lf5/images/lf5_detailedview.gif create mode 100644 docs/lf5/images/lf5_expandall.gif create mode 100644 docs/lf5/images/lf5_loglevels.gif create mode 100644 docs/lf5/images/lf5_logo.gif create mode 100644 docs/lf5/images/lf5_logo_small.gif create mode 100644 docs/lf5/images/lf5_logtable.gif create mode 100644 docs/lf5/images/lf5_ndc_filtering.gif create mode 100644 docs/lf5/images/lf5_openfile.gif create mode 100644 docs/lf5/images/lf5_openurl.gif create mode 100644 docs/lf5/images/lf5_properties.gif create mode 100644 docs/lf5/images/lf5_recorddetail.gif create mode 100644 docs/lf5/images/lf5_remove_categories.gif create mode 100644 docs/lf5/images/lf5_search.gif create mode 100644 docs/lf5/images/lf5_selectall.gif create mode 100644 docs/lf5/images/lf5_small.gif create mode 100644 docs/lf5/images/lf5_standardview.gif create mode 100644 docs/lf5/images/lf5_view.gif create mode 100644 docs/lf5/images/small_right_arrow.gif diff --git a/docs/lf5/images/blue_on_white.gif b/docs/lf5/images/blue_on_white.gif new file mode 100644 index 0000000000000000000000000000000000000000..caeb5fadd3714a4a44fff8ac8e50dc5d53262053 GIT binary patch literal 908 zcmZ?wbhEHb%x5rSIKsg2|NsB@@4wu?|Kj}lyZiTFT)+O<{Q0{kPTbJnzrLYiNqzm| zf`SQz13h@F0!HkTa{}`DVhyaQ|Sy)9Fgc)=|YC(1~u>Mz2=u63* z)?^@Z_~pJ0-U7`6_bcX!`z#hQn>(T5g<{j8B}ON^9i%u8O%l=2kr6tv$n@Qm6$k6JL;P!PEuy!Nls&{ zEfeJQm^^_T( zd8uH7GWXd%r>=A#6gsZPwv_McJ%)?3=c(N8IB|bpd)X#+&W^4ZCyyC2b=>{9uY=e8 z+mD}R-xI!kc3(ZCh2yf1h(k+*!rG!Fi9H+({LWak&(Bk}5Oh#>i(*=LQ2Juv{o`>5 zzWiV4mHFK9(BuULZW}^tzrI803-koIBJ`uJ$ zDZwH2#D?V4^L%%2dn;qibm6F}!2yTF@b|v!z$L#aSZSiRZ)f ztEw^bmP`@mOhQaoCNSJ{Z2J8CcuabOoUM@ITVa_=PJxGv1>Y@ruFm-XkEkKrhvj!U zesfmLWnr9j8xDlQ0C^jWWx^l0*}%3)^o^ji?LfaBUkhBy|nNA0nl=UfFC zjrMA~pOoM_qVc$e?^H!#$LXtz++x2JJsxx_@OdyvAK`o%)8ZIc?$FMl(6FFNT_W{( zo4wtG15>+2)!B^BD1`7&Ra5GG%n>0{DLaXw$Mc~XuYt1Q6pMty*w%{^-5I2L1q}LB zmrN{I>tbMW;4;c$n)#$ZD5B}CWWgk6#>gTitqTpRh7%?%D4+5nah99j(wK!AVqW)| zwVPfn;_wq=Usil{=1v(g{+`KMakH~t3U#d%Ghfc3?NXk#fa6H{JxdmjYB{0jQw7!p f98lFrVtOM{E#K%NmZZaJeN<^`!)BEh1_o;Yx8rXi literal 0 HcmV?d00001 diff --git a/docs/lf5/images/console_window.gif b/docs/lf5/images/console_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..315a7c56a4d72a28753f9dc3b4cdbaa6d551f418 GIT binary patch literal 56097 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 $K|v*Ph&@P8}o`s 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 VsZMvw)1LbDr$BwF8r~2H06QzTQ(yo9 literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_about.gif b/docs/lf5/images/lf5_about.gif new file mode 100644 index 0000000000000000000000000000000000000000..206b5455e43a0815852ba3b03bd8e0bbdad1e2ff GIT binary patch literal 9451 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 L5l@T(;OPGWYHL>x literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_category_explorer.gif b/docs/lf5/images/lf5_category_explorer.gif new file mode 100644 index 0000000000000000000000000000000000000000..0adf25485297edb0357662c76077ed079e127897 GIT binary patch literal 62477 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 Z{ARi1q`jro-#@VUZC?!uN=61K{}1^T&LjW; literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_collapseall.gif b/docs/lf5/images/lf5_collapseall.gif new file mode 100644 index 0000000000000000000000000000000000000000..c32a6659d4597e087281babaeaeee4777a7241f0 GIT binary patch literal 62701 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 z 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
      mU(l4R~!u!^7|2Q&IHv&AzR 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 literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_configure.gif b/docs/lf5/images/lf5_configure.gif new file mode 100644 index 0000000000000000000000000000000000000000..5855c265d6bf3dd5233e30fc954a27d484ef6c31 GIT binary patch literal 62471 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 literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_deselectall.gif b/docs/lf5/images/lf5_deselectall.gif new file mode 100644 index 0000000000000000000000000000000000000000..943c460b28a7df89ef698b89e8d36df70742d66e GIT binary patch literal 65637 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 MtRW7mS%USycdu^ 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 d`N>d@vXrMx{_mbc91F8??X06W&$K70TG literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_expandall.gif b/docs/lf5/images/lf5_expandall.gif new file mode 100644 index 0000000000000000000000000000000000000000..69f450c48d58825bf43b96b69a869f5c2b65c046 GIT binary patch literal 64917 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·?;a@Ed{@3Ua^d4nl;aOK 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
      q(gnF4UHfzI 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

      }S~$4z-_ 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 literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_logo_small.gif b/docs/lf5/images/lf5_logo_small.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6fa96d234fbf152bb80c3b0c9e3bce9a3f0ebf5 GIT binary patch literal 970 zcmV;*12z0dNk%w1VRQf;0M!5h|NsB*@9*Q|>EGYq*4Ez4%*?~X&cDCQzrVk|y~((^ z#kIAyt*x!5rnaW0rkk6snVFfAlBJK2kByC?jg69rhn#|ff_{E}baaY!b#-iPgJx!a zW@ctzUw2wsb5&JtQ&Uq(Nn=DrUP3}bIyzH3J3BHmOfxexDk>@{C_y11IUyk-9v(Fr z87~(XEg2aZ5fLU35D*Co83+gn000>P01p5F2><{9{s96200000000000000000000 z00000A^8La6aY8?EC2ui0CWHy000L6K!9*aEEzgU>mu9ZyZQQD=Q-s0{{v#9ej#%7c(Ui1qFXI761t> z8jG4;0V5{}7b`b6D;EeSBLN0BZ=0@F93=}eqqR3N1}7W<9VV~8Q3x>ww6?V|3@-=) zFs;DPNFWv?Hy1_-HzOG%049mh;6wp23!@hWBkAcUqYEsNX-~q9XMEb1Jwuz zRd1z?@lP%6l%goKkQczhiW$6Ttgt|J+~*suhnPed;oL^jmaLLC4n#1PmGxYct51KdF; zol8cvgg|>m{FfdEEU4h;K?4NPp&EJajX1;wP{bt!Mx$_(jbpbBfsX|Uv=jqX`yr8I zLgb}000KZF06`2O3?V=TB&g5=4KhZU9{>S{#*+m%0`Mb{iUF|Q5#y|YPc0dM#h{aQ z-Ef}}4C%w-C?KFm#9m|qb^{0K&1hu|bP_R*mL?9769V-CNljKG43k8T9G&nIeXyxD z!j-R``KA-tWW>!-wvCb<07H!?2%pbwO5b+s>88$K4n{`|De2H6o})w%W2kmc3}C^n sxLVMlAGzkoYp%HIdIST^Rah*ixzad^eAvV~uq-(_nH3W9 zq>XymA!qcqk)onzadC0?v-Ss#?>~I_P>|OvBO~+W%NG`lb^bi`_VtjoQR3X<_5dXF zX}C1MeI+C$q`JD=#pT?oQ>Wr{+T!BMw%$Iz6kTa@)Q&#!ndRb=kxRaz zcPY>6&01@;?e#6{iysA z`_S5{%2ODH^P{6ImX1zJNnhLJzQ<2C!xE`k4?bMJd^z&c?VD*g;}Tj12fv>5zVqn= zeSe#A_vzy5>MFH`THNsR{UYn}5?$s4@b@ihP7Rka|v8*p& zHYS=_moMw+=&+ib-Ot|n2g3gECj9^D|4jvCej*S801Ht6pZx!N0>H3Dy5f% z;aBw;p_ccjVdd<~Y?~_vGeva57Dk#Yhi~C5Gb9W(dvj%^O?*ziXsLd6M>Ftc*|FA| zu~LJ}n+q>mYhT~Tlh`Hg+Uh1MZSz!5XTV0VJjRm}MRt!HrW-xpoO}QBapSv3e*GDe z_U%oxt>@k}oPMRZo&O|q`Q=^vClB90i~YX&{?(I5i#^ciR1t>`>Qa9?znbr8NAvP9 zSx&l!*t=1nt6n5AJNmSB?KQ)Qv+Y!yE~AwJ>PNp^M^6x ztS^f+5{I#-Bg^zDBQ9+qdZI{PB6F_59*^*R#?ujQ&iP^zrWJKfkX} zJUaQhyX*HpbNSW%<7fVnejj}Qy!g7Ohs6R=%8Z0iH@yKtwC==zb;I^DNL;2fv}6H~ zb4w}w7s{7XC9bUdrIWMA5h^+g`6R=+?L%Z*abq)9;|dnUKuwqJ=BQtCzYTJXI)N zX*ss`biKQNt#fNtbp6>EMb$6QQ?0|kbnS&SeChsE7#4=TNKXb)(mr2%dojZCNK}xs zc^+D+h}=NLw5!^%>EK6jyh70c#3Op4ZOkv{Qoj!M@08jD|x&-ifl%8#m?(U z$)+C!NSUa9Zf%imVp!kO_h6_?S<7t2UT1n37h0M>X&Tnu^wD_20h{U!XU1a;a%y% z8DBnTmD0Z~-zpW`6i3TbL}1DYYCo*(YB!Brv6;d2LsQK~#KY+j3})`|Jgm_j03k%g z)CUv_*fodoa!FiD!$^lIe-sj2_&UgSA-uU!+;?EBk!R3&DOvn^JEoH7!t4o4PD(AFVNE}H0NJ$ia3%yHRTL7gB6%bGZ`TMB*<%^- zNm<6*Isx$T0va{ddrP=|4`Q>%aq>XDTrG6G2#v<&eK`q@j_l<$^|SM3Qp8`rt^QM> zLDIzJVPr<&oY%1zU`z^syRPN)ayFDFv+o0IclC*EpGu_d0{>FsNbP{(CFktSkCiwZ zs~dkmbJbK5g`U(|yqI40G2n7&K-(lA^ps`^iAuP2Vu=j(*u{bSv$#i#)06K~t zf=pi$&E?ne@Q6&z;+fb8vCv5yH|CLtO0y7WW%?P2@6AyNsc;xpkcl>l#e?CIpwvSe zC;~9y5`b?8pQvm}!8f?WG7Vi4?ZueMxC94@Mfoe<| z7lDz=Y19k7&o8vY|8n?%`pQkwc*t+fgxDSO+hDseaVe_HVLU(TYv3t<)MkoiP;a%D z2!00EiMsq&vr;u>9=!v!?~2M$^y?trsTcEUNz@4Ns6W>$-6US7U+2@YK0+()OokqK zzbz&yp@)B9I-s{(atOv_s!Ax$<*415tk1dDNw}|gsLouWfvlups48&;am;;_uX_YC zML;+ZfVq#YYie-&qa|?`Xyr&q2AYn!8a_=b)J)aB)e8oCHR9f%0&@pjS>QdBKEVrg zK*@)ATeHX)&Sbzo-H5haC?i{oQ)V&o5LZtlP1tlZNkF9*7D5@{KU8`){(A2Cp&wNo z@#NR2=o#d4c8eDsq{4k|#FG$~ zduMKCDs%$w`Y^2E;=K?-iMOw!5tj$QVIXd|rFC}*E;+UE_KDLuig$V|T8a*dFZ_f* zxqvsQJxh=EC@d8d1I5KO>56{s;5CY~(cQI_FFtR!b>xEJ0e{o#m*?R3I4z}&-up{c zO>sH=R(=$ok9If9pK8co6r$}!UfVg^H?ZTYvph^vGohh-_IRa|xJJ+NOmRtf!M}TL zBczKGNI(Ca6RFX7z{@EACWkrKZhi~@>DS-+L7j8WRz0xsM;Fh3UNyf}^t0{3r??Nu zsr9Z~XK2KL-bHK8qz2*VkKcaK;NU=tzjJnQ+2DeTdG6G*22^gONQ~r7@4I}mybR10 zjeFgbmA+PD_u)z27u`=ur+z*^we#&xzl58OHN1{w6hVONzC-KTzzy_+Jrp2Sx;p_t zgagt3Ka99E;Ryg>>~~Bo1qNuU>1f(sw9v-7!_A~fg z+i(ObCT=u8u6_m46MgZWK-_WuoMFr>S z%?`umsOIuNoRPzD**$Ox9e9%LB&3(#Fnng)Mjz=O_)R}?S6^u_jc|ZI{Od{LpLYiT z^xdqkxcR0=yGO$6Eib#%tx3J8C>rFxXARI%o>cfr1sn6THkN3_DLPJvnJwDt(eeg3 z1bCTrz@^$?r)q)5f-t$r^O|qGdV*2itLD5o7*v3`hWAOt!NMsyrZjlRwBuWTIaB8} z8+>v&Q+Gf?)6E6+P2&3=CwOpd)If8he%5{_!B}}{k zDMf`fPWv<4Vc~RtC-Uj%L1%td=WhxXOj(^e{vto&>P^WSf8isZTmz2b%>tT7diCR?*HfEh2M|671S zfg3Tjc(m2zHQ`VAOk|f~$NW6|PRPD&Ra0_3surl-tu4pkKV}S9*GbYTA*dggH8p}c z$kM{5_#L*EO-q%I6Ij~!-U?`});q4BjAtk4ak?pNRcSCoGa>>rKDgcwkkyw+x&Ku- zaq%irv$`mvuW0RK5d<&3tx}w9QJfW6>@II;?uQ5`gOof#V6NmrJuHF&a+3j}xpHG? zpyE5o%_x`bG-@-9)&UR*XBdKBfuO*V&d5`AutQt6I2wJG1`dYGs=ld28mcdm?pn<0 zlsq}pw`yuRi5RUmTb->MZ@I^gxbLc3y?3&DpY2djvmy@;ID({v$Wks@P?7>EiAj{a zddfi`g?u8&EfTE?AQA*>qu3Ejk+4YB+Ne2ng(W&Rqt+gWeo&bmOF)ReK}WVB?6GPh z7=XrlAtUfnX5^`wX@fTYRK4YOoto6Dk#Dl5%T@POk2r@NIbqb`6;NICOJVr7;_}C8 zeN;_U1tKOlGw5Yz$aUp&Vk%)`hBdkHu3^a+6O!lg$gY=?L_4ieCR$coM@U;|{7q%S zuco%>di~1!sb6yUuRnkbG|bsKRoPY7UT^RcdpOwJkh#&2C|83liArsKxHb21=hs7K zSfh)Z^zNqA)49XpC69h}J}Q-swk-?-#Hlc2D#DwJilbsmsqD|Foby!f-&Cx4GoNv@ zfOoS{T(d}Nv)Hp{lrchpA0{ByB5T|t@7k7qWY{weZJ+;?-ot*R&C=}UGG*s zR$Qw=X{*t*R+ITw)8DQ5&&`Ek3*NiUI?CpMjUX zJp?k0(yIY>DyZ@bmGrsg`l~008=t5&cE}h*>GrK~ua3;m9Y^gu64ah%zd~Jj_OxvN z>Am^ZNVOLBNSHl1Y$1hqd?eg=wA zJ0CQ*h~q$e&2oijU?3F{|IDT)6W0H`C0r9#lL?k&w!Asti3hrjpTX_%XmJ*!i;w!O z>-W>uxbF4RZaMKznP(t(5*W<@q5-rL07PQDDg0dtrNn4@k1+)>rlCYz;a|Oxl8k4v zzlra>%YVLllKu+y!`@opl*a?Z=K!aX0U8hwYhkCO034c_37i(}5%|+1q;L z5bX>QXh4#8FF&Wz8xDYj-op*iXr^U7o6iOu76#6| z>K5n(CFx*c6`&Idx&fL}-?03acd;Ee339KxixTxuHYutbML<3Bji%`L-6wua{%>ZF}}5}c97lovna zk$X)<#whr#H~QP;m&BDAjT zKQ{0pV0?61k}~-vzU7icN5=`&SoqtxyKnc!J5IjsDKIhS$Tr4igT~YmRr}GL?P*Co z`tbt*Ne6XUloyhks9DG^Uhvt}}mcCW|3KmB;<=F!;;KC>swK%Jwgxw~Mm$>^ZZ z+aGcLliQ<`+kn@R?xxcWRQKG&uHux>ql+dZ;?78W&2iCmm@*A8)*LyxFn`(|sl(`} zy$503XvS7=Ablcu!Tq{-Pc$9HN&fE;A%dsSy7d1N757ii;W~IUPe-p(=_IGc>$nJ- zIPK*M7jSwMmm1L$x7)|Te2;Q~OXL`H0B?Sj0&yB>cihNfhfyBekiA!^#nE?h3$y*| z18<97iK&C`j9xr_B6hT|K7kQsy0%(6#!k11S3?IvU=$S|fiH<-K2yS>t8aRouTHC#KzO7DGd7WejW>1L)UvK&%6rcyC=90x>ker(iOH1`HlT zbK@W-d`V|q3pX^}{cuf+`Z>WFH9le}^&Va3xVCy@C#HK!_8H&h^G`}Lz3TE>2CisE z+dnD!_asVu4Mhsuaq4&!Hwj9q^%>EHFF_X1u&o-G47@k;_yt&&-Lp@&<;&n!J?+*plhJI~tFR~x<9vwpL2VXOZ>qzf7KAN}c;B5O?z!XB8MEEKZF_e6boa$sc_zi3>DQOSC2d{i^)+Bf>FFs> zmq|FgLAV6xwCYlZ?fBiJi73fayXPjW4b{jDfaLY&fw2+Azjk*Mq&>FUSH>Q7fnk1-6(=`4Wy*d5h%J%Qsm37hyqE9}F$aQXpfiT2(X?vc&s?gMpkid=* zb0o0sRl3EHMHTN&M+kNM2A2+-__zbj5%^Wa1t2u*VCwG1&Ri~Nfo;D!q!Fc(q)?-t zmCc`CB=aHmCK*zeI3^1N2>0ig*k#lG?#K&&D!79|q?bh3ucdnhpk>*~094NK!@-GH z{2-#F9{a$jXq*nxw}ShU`?PfyR@zx~bq z`QceS5xjEi??*_6PqQCc8%mYADaOi$WVv;7BWWq}4$*n(rZY2ssiwOF41}0w`W=@x z;|>_+CP-!=fE7%UCK5~6{{qW;b~TNE>RyZ-P#CK_ocwG|2D~H&>5Th`crGd80-`Or!#QzSToQQnI6eXXM9{gM zWEw&}IJWRp+NI)jDFy($a>qSK@KNtQf47%r zWVsLAQ#+IlHKsKPAx!`vy_0PoxR_uiHRZ*JDALB+nY3Ec{@M1W_MiTI0v519e)vP? zMVBK|dL3TjOs!;*1p(kA5x4QL55;o@4Qw>@adRV$!Lf%x;YkQ4giqcdi?|Z#Wl<)- zNBpCLy=I2^n5>CF^K4VNh~{8Xm2jF^{L*#q8RA}rkf~xk$aM)bF*)bf{k_@T<+=q? z!ibi-SMTT|O}YPPcFc*5s4ICC2;WT=Owk{vNVHo5lsCkEmE1b;d`&MvAn}$MB z80RMK=fH<|y0#VkG0t@#_uIVq&c{#^2{T08+A5KIo$MVrAOTM&+v>Gzfky)JB=oUb zYh$c!&p}o89;pJ&;W4&wBmNqRLvYEC2q;?0XXP&>_XN=f=7z_e-trOQlLeOGb%6qs ze0U@0R8DTI`B@dDk@IFyy%Wy-q;0+zQ7qr~`m|-ga5$9etu1r@5T*A`yE4v@^3Yp~ zVk!9FMSDvYK)U12VJ2bP?|S`{vf1i%pH^!voz94~xyJZ7_kH-%plVQ3)?$Z)Sj+pa zOScuP;S#&@L@nDUfZ#=A4_up6NVf_|8jd9>^(+WYao3M)j{ zNX{@gTrM?Lng78JVE&T3xSg57;GU#)K)h)=bn+kLXk;o>iEae=_kQCO+z6?{N<&I z+_S?pU|iM@^rXp57@%n_Lhm}VW^;m+14Ty-R*&goT(%D2r*qTm2+zYMt}~n=etK_O z)+Kch<sHGo(LsDJSOnvY7sHNN4pDnN>o(+b}a?W6DxU)g6!_p9=GX%qd$G243x>z&ok zMBSNRShK#`Io);P%9Hu`UsA6=|8(@?^>_0h_J^)^|LD4SV}E|}mo;9T^)RyiAtw<~ z7jt!Tk3y&FFD&t-#SSQ#UP|vjscG^PZ|n5xJuG@*SsHz9#L6@(_s+tKlFhZ3?%h#^ zPZmBMPP;Z5Y+`NH2WZS!OJni~a zwP{R)=h011=j(4DcgK_~G2ocr1zYTtq#XR*7P*i%JKcSbQzT;hVp`n7C)2B)?<9Ld zpTvFmA1PaCVDIHLJuqM!~VZFXa3Rd z$4hT=E!;x&*Zz$PbCX@wPb^_Kc%CX~wp;hl{;=I~;C-xbtdx8AhR?b=&p7obeV(?v z_T@Rhm-F@AO5Yz}JdMO(GJkNXgD^ShFJDGw?%uuRTPm|=fAQ?!4cI|}q7n1M$A0pJ zx!hc6%H;_0Ni z@6VM6Ob+@jD)M@=ypxPl2=B=<+zxC8=Ljk0#7Pw(ypx?* z-rUfncU`SRP@+@xKNnq>WK1TSj&y$V(m<27*5!=G8sXd{&yDNgwe}#!7L)@(*%2!& z1f5zi!2qCkI$W*;j)^sw^8pqI8kdTNT*>EUv9ry5gf={@>Rf(H5m76^7BshACE0?r#MFG-V?Re^W@)nK zL@ie`dCPJ(^jL^Ww<=TXAFePx+_siJz!!eo$)WdnP%jVG%2fi!O)G52bxPuiNZazq z=ir_KMq|$a+3-%CSU47f$x(>{ek2YE!~&okHA%PwX4nDe#w8gTz%dXg0s$(1psb$( z<^U3=19I!2kO7H9GfCf;D9%U;`gnIK*zic{*$y1`btGhPBq=inrm3yFj)9QP@s~$k1RDD1w^EM#oTLW9uyrJX zj-+;ZI0kF+)M4nE!z=w*Qv0qQHJ-==K~e_7+TV@^bRM7MKbA6 z-S*5u0jkoVAt>09w7>O6ZQbCApa}4ZAV7G&!EeMCOBC*aJ~#Hx(DDfhuC#t2c6sz1E*IOY=Iny;a}nMKMS|}Obi5Mxn~(y)ufJbOrS$ZM3!!Od zveP{S1fr=yaQ~~Zw6(mubx{JGrt7Pu34{qlh^zhWA9w75?;I1Ae zUCp`dpd^cw0_R~o%yhh2_GcP&d=8WBtdRvCzTx9M2hSqP^3doa4xo1%C|5`7?gDtb zpim@{ClZDgaZ&0ZiQ-@V&VxlE?FC|z)F}6KMy%x40nJ#?SofpXA_`@&&*G4HBWf*b z!?O~cdGqrYRpAtA5Lcbi#Wm}C&4lgxb7>3c+zU9o67mAYiQCXbF zR{cWxJV_ExlM^bIn31H(@X)5!j(E?19sQYpvbt!tr0XPSm@j9?5hJoYnyPMOV8a7= zog8!|M!2zIPJ9z|JCZ+V){_5b3ggxVn@7xxxBymTHW?kY1-Mfm2Psqo@3P%#)XEFL z81M4SN{?Q3&YmM_GjsHCLQSvc^{KF+!DswaXKxUHoS+S|cvR)-FclBw7Lampla`tq@;Ym|92m36 zv1Nf<>0eLXwgB1aJ=5k;A`F(Jj9;4eGJ<$noOmc(#ql_DR?BYf)`|O9R8KRca)PC80ZDy%9g?RW1kiXs1OeX!5IdktlaOwJ;!{U61ok^w!~T~_*ev{_66POH1GqBY(Zs8U!Y=-VsfY2?vnIB7f#LFbjg5Y=0xkJ zf7MN+-sgNU0Bdp+J))_nF}R9I$9toTS1 zdcMcOwQY$4R9KbM=H9cA@NolKD5-iW1SK8-3gA&}g2~OoJbnP~oZXe0)2!Cpv*&YR zCuvpmwVCIwNIsr_k&jrK+^1F#5udisS_WRpT4x`4A#|+(*>d>N+w*d7dHM*`Qxa?# zhfv=mHx--jbhJOpQEmc3b;Y09hkG0MKM+tTkJI-yrLw|y16_nPw(C|WCf@e_jI-HR z;g#9haz%1Thn*da{fx_nSV%7*2Z4WC6!AF{(zYcm%xr(Scc#pBgPqr01Rl{Y=n?Te zN#AdKv;BhfSO+(ANQ_a`T#5gH`oa|Y@>TKTx1F2cP!~6>zWfOJvd4Wax^gPm`tUw-d>VO_as6bX$Wn6S0&KW{I>&p=A%M6zqkDL!<`=%|^BOEPQ>5t`tg=1o!DlAI0JzH=pzQfg$>!^kC*O^GE~pHDuYdUM z=$eoEo&FCWzDfOnOgkWs*h`g_q#Ak5*E&w^;}j2dQ#P76|2u}1q=Nxn_Cn!zl}DG& z&_A3L&5jEHplyA39k#&V$sf||rAviHl-K^+JaZQZy@Qe^>GT-pwc9&(_91F#eG_YzoMhJU1-*II`FNDQfxzQ6Libdnt*- zIa<*W^cXGwbIaX--6#AJhF+(M8{RUI%xi4bo&zTz|+FJ(J>M4 zhF}zXnQ4f_AVO+bgK)c4LY-8kWF(*r7}3hv5~C|x0n*}69x7DEg09*85pss}9bDxr zy2^ox!1LygsMkJo#Aw(3j`Sr3hMbWG4&+e&!*dSQ=(u_$GLa8=T?5-W zW)pv82L7iuaTJX?BCqa6|F%TRNdmdG!w-m##XRDC|2cJVJO^g47mjCwASxAaN?E7Z zzAhqhJ563%|EA!8;=DsM{OX@3VHj=V(;FEz+|Qp-NHw%w2})8^c4{YXM5V!MU289h z7`j)X?*y8(9aC9*Y0l#zSyN@STvb+g*abL-D;Q7W@el+yF3Wy)@5D>^#AHy;ow?&< z#;U{obRJKo{g<>}nL~vy*GIy?czw)uv=e0K^D<2@Z<<0V&B#0Z{n}mS;;Xn$A%Y`h zHA~D))*oJc+Q6ZWaA!!IiT%8WR7;}oXl7npkewSr%5J6^My`&8O+@6 zED@3y3V1h}^t*RML#X|Lo4X-DV@(d zjf$%CLOClG%E%^q%KyiJjc}e(g)>dWK3Nx@9$@J>EW$AgF}xzP+=kff)FLg=+_tnU)8XNNdWXUe zjo`tjG>2|ZFQ+o_7ksDG7$(Xk_|gT5;*@_NQOY4t+ndC@^)5v^);rH| zbL^H+Rp9sUy3Y8R9UU50O5ffU(NNg<{YK`+#O@pCS98uMeyBu*ffd_!1`?hC)p*H+ zAJqM#64PC9&JJEwXXARJ%QBB`rmVNE_vGh%*14*PXAw_AZivr^f7e-^ue$n?4Tg2f!YAMfG;vD`#s+6QBKQ0Df?)J6C|S^}CanxTHKhTK;aj2dU(<6S z;UhvZ6eT?uC}(J-q9WGz&?S~CUc@ZQw3bsb9m8}5O`xPl@esykRz%W7cCaEmD@ zR%q5b_n(h>)+LpG+pPnW^-G5o*z2%ZO-iNIF`A+zU?(jrYdBz4ZBdXMD5wV|jc=h7 z^1@%F$o>QscW^hRJMI4Nr1ea%e>w7p|4xJ+o#>!lB^z#_Y%$B|Pi3yKbH~)7g^V2I z9P?y&jdS5w$Ux?Mn?n~u%YqMTfcMHbW!%Zif!gc{zzqb_nx=;PzA3Vr6b-ptK=zXS z0#&cC3Z}*{k3FQJJ{jb5CyczXS!jVew*2JrBkV3QRY|I4K~`tCEREq$p#jUo@F0p-c9B+{gnk+Aylv?Tw zRlC;vNPhet9V3)a#egnP`}ml1xr2(SbsptGb|Ld=73x;po0|<185L!X2|?%|L73oL zSuq3XQ71zUA8=~z=S6(9Z{id}qTVL+h-Xhk=8o5I^q3LRHaT~`S#sQ`+JA;h?a z*F$b}J`26G_e2cjMj4;6>S4DJM~bpZ`W;Ji`}WC9U-YI#k`j3BWv@on(`oaD$XU9! zV7^fEF|dSX@t;?;aw3L5I>m8qBu6udlh<(JHlK5AQ_$t6_@lKsJ14!7>s%pse0YQT ze>Z18J?^gOe+YIEmDCY^`%(T6+E8wM!6|LO`kL?R=XqK_pwG`*XlUInt_qtupVc#{>7l$FtR{awj45cZkWN` z9QwI7t>g@$%Y@!E9%M}^iOg|3Q#xxurJ0TK{;*qtCD%4z3_Ndao{Zl$*4x6#4>}xc zu}p=rWIL*_J-+>h&7y3yV@un~en?fk{c0;rL1d17#ypYR7&UpCIF&Cpj|S*`oOQt5 zg`e|pPQh{+u~m5=KhGbtf^W0?A8~nP-7qGQb1ZPtPEooanzlY7VrYN^1;s=q)!%Gr z$o{tc`B%hSs--!6&US_K_{3_iWVK*I7C1Kh19hq;4-xcDOY~`R5<63WbIkZqnwq%3 zEbM{8<#EOLocfmvu{&fx#{0kZecV4df`b#Mf(c*W;o`@NhM!4NMjq?(q2~&JNz_0cs9g68cASqLAs*aDQEbB%)9%2UHJe;v{ zbQv+kGLE5^gAx{vtM}RWRqSvz3xs?x zU#r;L{yx4Rwb+)wzSs{&a>=LWi=>{Py6;z;QZ2zzBy;;ni>aO1TY#hg+ z&BX4_!7WL)@t5p&$eRv%<&XXR1OOP&>oh_Mm=T1HfFHZw`!R5AlP|whMX-~%qRz1x zs4I+rk?+{;%z1MeR?V+}R5SRslhfUo9P4mG9&?rvOK#Ci?EfgjsdunBOIL##C|88p zH5`8~h5yDo)aZK=UjcE44>h65La-%4k0p+ha_N8mu{ULKLxm7mMF7R0@8J?(%X^F% z@kCqt9YTP-Z=q$rxwwz4Z#Z72U9#ryo%N+9p`9iEy>gkt3YEPS+`WMKhziv{gzRP> zpPd-K>n^(w4N2p+)C44p-rM$?OGzQdZ4tlYQO|q^EtIWM1q?#;f_9RuP(}c6Zh)Fo zrD~1r5nn4&UpZ4rf3cyDb7K|N*C6&OB4-hZz~+ygPL=2$@UTMWW`U8qECl8$fnyzr z!6hG+BJ_3;*tUq;uE|zGcxz1;wPE~C38B}V~~0T5kg zjmk_B02A$G?wLR_`B4iua_o$~=?$8xZ?Byc0eQ)}Pm>_F z4x!ry2pt>=GdAWI{6jV6T}%9V6szsk6;9;J>njFSCCFitgjXYp_NRN10N^QR%{*yq zO9uf10G<_OxdnNp4hXjO!t1M!<^o;k%mJ^o*nFDFrd%JBqnEzoJ({Q231sT=aY^=xIDt8 zTP{>x`HyH>Sa$qaEf$ZC)~rQlr^WbS!2z2ZAA)uAOh{FEY>v{k3yf#^O4n=FP^!RX zT>15GrTC%R_;IC#x3vj5XQ}UNZ|tnKQy}ZFO3*=&{ ziZ5ZhF8hOW&T3uGj`D40-K~Gh!yyM2ssRq=KyT#jAgunr|i9;z5&5>-$nW127|h^>o)0PgsWQ|UMsJzn{Zxf zQ;CTuo3GQZ*g0HFkR6Z3TX3nC3pJEWg_YZ3Dh{bu>TMQ#IaXRXR5__udo)!0s@8-w zlpEF8TxqD~R=q7URhtu5QzBIul}Ws?fnlHV4Dc!9TQeV6;>O6^s89K#IN6fVT_r6ReBs_3VyDbN z{CSIsNz0>dgcp8sUH}{JGaF2`)mMGsR8!j(_3_p4!H}l$>#D?Kk!5Q=6}Sx2xG7xMegoh-pk_yvv;Pf1`)6F#L}_ zj&Ld4n%%RjGHooz2>Lmw`QilfBm^ums=fvq71kQ{ri3ck4#gC4ylHz@sDUBdFeen| z!PF=>%3p$|F6f1M`85>#G~`vVKFk^&5~r`Pggvmhrq*Whu=2*v()B|Yf)^HdX!TLJ z32oV#)QHI;^y?p~S*`=zFNwk`Q)~e73yfIv=Ym}p!(FXo$Z@#7jtL#je0iKo9ds}|$wZXgZNjv7j+qIit z0HvwoBl1jM%iIjdA@?*DJk7!qR`>0TDBc@i12GX(-KL$kjQKiy@=lv=~er(u!BugZcIlB}15=HWLHO%dyL6Om>a;Gc_tT|f3>RRxi z2J)pjZHzD8L3}rj|LFLGsY_0Vo8+)Oi3254OV*Vz}baC8Hjz&&)O`UsNJd+Z_J89x=jd~uPhb1PiBH9b!iZA5LAEI4Oz+nfG*u69^rr zBPCxZOKTCt{fBH`Atf{+xlafaBTe>X-Qk-tu#I%dY7AZi(}2L zZxPnIc@0VG4figGr+TvU$XJj1bFe8;hQ3?w5`JxsdsKBh?8?X((%N)3ALlJbi$ce&&g!~xQPhOW}%RG-kuM!44)f-d~n@<8`oZ&2> z`x>CP9n-5Y#7B-@)5e#sc-!xS%Ub~azt)~7=qcbG1o@Bmg1la1LrhAB(uGZS=4v=? z*dMPYI4EB4Fg2s^z;AAwJUTPuB|b4>9-d;+tCtv?%+A=iF~HyYq^G{!ZWtFa(Ro*{ zk1(!*tvrmCbPll02P<71nvCSDPYXyWQ~mpNWKJJMk&f59ISE@`O**bGaO)FR$*o2X z;B^Ce<3rPUepOD5ol4!$@Y~l=p>YC(lKT#C{J!LBS#<0v6<#Gz=P=q+HKqQufiRlWA$C)S)q za&b?knf*wPW~RT=IF4v1?54d!pkFVH=Zf-qRUuC<5~P<-KifB_Tr+;I5Z55*cIzech z3orQ?(&-My3W@2h(l$A}cIm&1JK%uT|6%DY+?xEqK7Mcaf*2tsDU)tSjm8nu;An&? zlaLT(bci|_Na~kvWTbQmC=xnGNK2^*s0fH4sHmU_C_kR-dj5p_bIx_{>zwm`zYcCu zFi<)h+hAu*~bO>cA|byw}JDL&PQf2>KNB zSP02^XhdZ|_vazuyuIxAkY?Ob`6I}Uh4UWW=MihRe2Tj!8lkrv8W!1YRW3dr_s(X^ zssbu-oj1AjOmVj{#~ewOMs4cIDW`wX?GEV|LhQ~~M!wqXioK6t=msrK7H9yotr~hx zkm4(Xi?bozRG=d0r)ejP;0BER{duqY{>|qBFDnT=6IqjRodbGkf=-7YZKeyDhmSU zq!UR5)|Ocly!dYcD*&q*h4Wk_kuz9AphzX6n1&P8zfh{HZi;8mLj0dZ6?K-hVrci^ zLYZ-n%*$iLSgot$I2wBnq`1a^AwRo|`~iuT8EVOJF)*3q36PJOntoK9t7~JiR5DsU zp2)&DPkWO=(}!>~hL4k`Y!VVvcrnVIB9JnQl82rcZkYyw($3fuN$f7`Rg4;8NKhR0Mz z#_LDtO>I0KLJ*@>_r-+0BdT+ifY2w zGx6g!Q1I#lGME6%V-L`0<4E6Rs?d}AR>m6MX^^1YRa{FcTf<#JqB)$Q0Q~emnKjb~ zbAblmDGtV9l}}WaY#UN&2xB1`-7D~iS@0_ml+$HNN=)vN#w!E1L~b0)S8M+7r#2++LDxee5zz=j=}dqP|J8+W6k;j`mSs!!!oEg=Mx*RyV7`EA76bi==2WQ=yF1u z|23zL-(}MF2VrEuov~meRl^;tmCD;z@D7Z-Go#}SO=?V&wN}QT)@TBfoDOKQN$U7i zwd$*J`Q5VrUQpmzbp$0ASp#TT@1%cB{*R)eR@U5UKxHXQi**0IdvC!Sy@A=H zU={8++?C~}WnELKUjWL=W0Rs|g-|m68?r;46E(@rxC1M#4Q3&Yl=)%hUD-FwI-=p55E5li8t@oM-rP~ z(iqYOeVUsi8wQE|fHcRE<6EWWjAK@K_4#dA?QJT>)iy0hBWG67l2>KIe9d%mLO)Eu zSE<2kXZC;F6x|ET(eB8!zF>GX)H*QzW3ksh%GYu4PV{&~zMkE(r?T`Hv-lS&C5Tj*sWDFIPQs;+G>%b?MDPc?Pfi z<;aEnlcrUe-;_3EskbeKIJ73KHFzv+IQL_1AL?vvTJs6ajhnx!F?#Fo^*pix!0r{j z(4w|i7rL+*`_~h4Bmw35>{japD-taubR#|X6%^G3*YzV>nuxvd1KL~FW2+B>x%6oo-AJ6x$4wD!a=p`V|19S%k8z@lo1-> zPjYzD1zC>LWrre z4Hr)F>VFJN0NC5%(Z2eO$Gao-3bW#)flI%Bgc=@s z6=gb)E9xrw7Im!DbmdRfS_s|xaP+(e_b6k=v(4T$-HAgdAH#$PuAoGprlSg{60o~v zr%HUxqzk9-hPQi+?)#WsD4fZ8v|FWA;%nJ#J6rOry{vxU*CvAB+fp~sxBtnyc5~s& z#wH#&jyrCs`Nziq+^4_Pruf>WZ(T)F%X`hSC0kh9+4({2uhxtbe=o(NH_zV1HWvv6 z_#O^in0#aG+y|YtlMCj$b{b$1UZcs$)H6+~GU?k{F zaIq}%(|PsiX3`qZFym0@mFo> ztMxk(T0@IQfjt73cBH;_uPS}pedztv#plzJJ^O#|g)0Ak{#UA}xH9uH*FSttLZTOse`A^p4TfYYb!?shu{dxQT*5VWI*6((#QE674 ztHVKW>^N2`_!47=5_P)mzRL2TBBfGP5a()&AA0KGfo?a^EUHo6py8uWW($YId^&Uow$mYdj}A!4TyZ z>95T$`4_$yUwC;;eX-VJ4H0Wz<-(aBEMp5rv`4An=l-}MsviI9q-}-tqgAX#x!#gj zR$Vm<(=v>SSP#&UCY5?p?y>J)3}VsR!^!sLD`xaH@G3c*$}R(tTzr-pl3V^#;~bO| zTzF^>)D~N7BBKb&<(IG1f~?3H3}xZd*<}DgV1CN%OcLE=1pys8Np_8lIGBvD#kQP)4eT@MD*^gWd zVvXj2U)|Pqd?_BbmkTynu+5K>}4PMb9*#iIwKF@1XDV<-A62n2Y zJS_{|H7`qo2H($)($p~?5OW`-tzobrHDF=6@7J`l9u>7lbHI=puCH2#PorzAwolBU zOIPvZMj;9{JcFZrWvBE}anJ9ttD8dAwJPvKM6sw=(yffmGf;i=N>q=#I#>DWzsaXB z848KhAZq|YjOdX$J;aMU-TDn1m*HtdVIb4a7q2*RNx{4)zl8pG>OAYJAnnDRJV&#! z_%e=JDJQ)(7V` zeV$9`xl@>k$OW{Q#&?HbVy1dEMh8?TcUDjbt)J4;SXa&ShMHas)!A4!;>9UZ+}+n` z{5KPCW2k=do{+1{rwZsQ8Uv2TKS=It$cu5Z7nYxd(!qF`2&=NZh=|si5%quDC$1(0 z7ZnvRDKbRGyHJE#1|7Hn9WoWf0^lehXAj780&pfqR_ZCpuS%Cu1*>X`u~8g@OeGke zAf}w9(j~5;n#9jX1&3F$OvDQqDu`p?FAdSCM}yd`O;$1a7z)c8Q8og}Dpu}ykED5k zgOsl_0n0ieKOK&gEppLxLY1@@D8k#upi4y`h#3~eNguOie7SFX$_y_f%ev|*ui26* z<|67S_6es2FrcPA6x!t8jNxpkOxDzss!JUu7N^l=D^1*i0rbWQm_(EnjALY}1+noA zO=wU7%<`1e$AapZ)eH9SQY-6BQ=TYdy!3|eLtV}_@K3xn{j>z=eZ4pAT5W7kp~XJs;jXMVs!Z8iM9i_4F*;}o$HZ&7>p4UZ>6;ww>@ zX|LQ$zoQmAdk@{DX<0@w^Tzo5!R&^|frif4I4w>Y3Z4&LV^94t?<#s8&_0J|R(T|?x)&fA=1>+S=^%Qc zq+Gn+5N?ly&c}<<*I+}@kjMq?k^lFrbri!W-ix?i4yi}6i^C~X4F;V?)9t!J~ckOTdt;#xOkI|>Atta6u zO3ObLxC`hK*(`*B6Oea^tY-N*}PbSGqamDsHLoO?|L|Z}?pzP^bg>}CZ zh7Z`)QmY}XUUO$YADH^;#2v0;FG?Aui%y1yB!cRk6t$9JEs|YBbe!13Ri+qwn-_Bd zeWLg|kxS5ic*03!UfIO%;dt_-J=(n-R~-r+Y%js(GhW%b4O%jdc$YqM{;*4=JSOo{ z9r`@mb1+Uzf|_o8nA(=$7Jt^GY&~#%pA5xcBI=u-o6uMw>rmP1Q$mrO8zG^pqnHkMfub-4iH~rq8bp6El(b8qDkW@FUxP3n(`T3-E zE-vvr>z{B%Haq4kbxjW%UmAg@Yc8_-t`rLTxX9O>Nh&hK0TM=-rmRhQWZZ zRN1{_3B`Tq=9&*(C9^KSUUls*98kKonq3=yqk|g0bTxc;X=w{$~7woBV3)GC&KA$qb!Nuc%oV!dV&ROO(x{$-KP?ES+OH^vcb1|-{tV<0&vNVt$kKj=EmX5`lMsr`VwYYL}c|znRZvzjjmd4<-*pk zR_*SNA_&&=giO)hr`cfFApLD)I=p13(Di5J6 zoF021sT@-BWDeZqSf6EPvGRE;!n|)Rj*d zIn^@~aTIu?XY|{RuX-C_+jaWWV!FGI#y&2!(sf3j6UM6qe@_Zda5FU6kY6n<(ccle zS7Ihv{?_OaCciCB{_GiexjpblFnKK+sZ1VJLcT_s<=mo6V1z7i+Zz8GBydcvE8`dS z3?-uD+=m-gNdexrHwQA7T3lo*ufA1X8l3R!eHFO!>UquVUGQaCucwQjsBPLaO^Lx{ zKbd(8zntK=8ZPE<2K}d>SiE`r@y)rLDWfq@h2K6Gy_q^E$iXHGNunx@4VKm|C*F3p z-Lz%Zx`%eD(_|@UyW* zJq%(;BX{wPX&h+%InxxbO${C{v8JRDEY<4$+p{w7B<7q~<)3DR6PJ)@@`u;)^g30Z zGgbvFDnSx_^=Fh>XOv*j2!9zXq@v$^gTcU9qj<~=azDEU7TIkgC!w5tj9 zcrwrXVQ=5#-bFhCT^9}R3Md(8vS2Cb2C2YcibtTKoaWoJS{2c!h~Cwvm^lhVE}3D* zQ2rH@-{q-@IteMZN=0`l>vg+G+^Ba~rMco@DbsW1JL@KcbND)m>hK4VO`=B6(Q0v$ zc0Vc&)yeb5KYvmvN)gK6T_5hfA=+MVL@_-G8$!!5tbSAPSK>j(#3b@}v`6AGV)w-k zuJpg=cWWq*!r`DA3z27S$Ss~CG0Q}3+~L7k>8+Qmq^o3U`*RWt$88Ud#J8>G$@5T|dS*D@1@5`~VP{z<>Jt}WV z!UPiKfoE4`P+7af#w^}oxuXxc!xlP(*>5ScdS2k6ycTb``XLc6sTa9ZL+eiz^5Ch| znMWjh(}tK&kFm?=|0U15oZgG;08|J9|RTn_y( zoQiQ`48tLbM+>@vuV?iVhqJ)c=-5{Za zR;DUv2gFC)pfh;xwXA*54FE;-9meh0!%!mzL9$!Op{ za!aw>IGm7r68e&jxI*Ela54En%H;HN;JMza5z7)5|G zkc>P#8F7Z06D^_ACPHR7mJD^;ZC&IrQ2HbE1QCT3awbpE5JHkbD})7POj|>8_&+k_ zZqVm>kEriE?BlHpYsmnarn=rk^^N`cy?h+5EZ^8zk6-tbtl7~QC<>zr-_~4oY%-#o@jDP^P|UN0;=r zk33CJUWGYbzOlEL*Ggx*5c8dUwp;%y+=id&>MRovn0H< zkRSKfe6wT%Z-??n6ovnO6PS~}4`#!&mC5jf{CJ5IBO?UD^n zpaGsQvm4}d;R*wS8;5M)&6KpNWw_AJp_TIYGe}z{^p0Sf+8OpDqkh%eyET<^=qN^>PZb>S z+_|DFC|1FMADKQM2X6fi{uGsTQNLR%5mK)oOXBU!ME5>myJ$r-2?CLHqD|-GRAz5~`0Cg- z>+mfGuHz^Z-Z~UgWvosmUz8x*jl^0~*jwVqqsgo)ooP?!oyb!wc=1pit!g{xnQTrO z(=BZXp!x`e*U+p&LuedJs?r$=zdW+CZ2s*!l?Z5BrEAk@j2!GPF!m8~f*0+zr7O_M zfP^1Ec3{0}pFYDvlDsj&Qg58xLSah@7p)DM{arZ3j`F|5YC#h5m+J1Hco)vdlEdq3 zjZctfJPllk@D_0QF=2^D>E#)Z;Q#g@b&nHfXnH!K=GS~ zW_gv@K4b>-y3$9J2c>5e>m_r8RJXICxqujZ8mER$r=ajbnt$i^w0 zhJ4pt4Bj9yB}Pol-zS@iog533UWTQ11qkEIJK5~ZWCPs|xmmq)1T_60$(Y{v4Umf! zYCqdRxJ*uV_IRdq$xqTB_b{^-W=>xjZK*PnYvEI`*SBElK@`1a@RQPx%~>6 zP$3PX%yAVZD@x=tGm(J#awDUjYc86&Hwf?bfhWD6n;0e4d}b6(m7SIi{`$Xmk_yY} z_;QWS9}PCYVbK?}6-XhkiP)J1kDLDG50TDGK|;%B)PCSW>+jZG~fE|t)F^xyD{GKhu)po1$5!fG9?cmTY7jw z*Cly@*pAR~c&2K?P+;&m)Aw6?zu#YPyX2J2x>UCMcwp8%5iCQO5dKCE%Kk%VKiFLL z5Q*rNdvp3IQ%{n^BPJJ0!BVr=ZXxyQ=2z0xLIDTUjIawU)A;H=Z6s^K=RbFMS~Y*IYsQ~VXFJH|Ef9#XNVuiQDsV9taC z12*miI8$!jF?Tdg9DEpi)9|+5Fj;;h!Gz(CFGEu7JlRVs>11@0;FIKUgHWR--JMTz z!yqoJCxkdB=FIbIGaw(XN$_Vxlx!rIGNhDArIct$SNNnnNJ`-vI!>+`PHEgoX=X@m zl}c?hO{F?3Bsrx%sY#8BfJZ(~ede4xmJ3tHr49O|2?Eeesl?pjG|JWRMMpkub{Ah0 z$V;EQuaoY+skys2eD_4K^OoV>2dR56rTj>kd!Lf-ZPwh|8ou{s8KTITt^XuL4Tm5S;U>x1W{gmlH{NX085ewco7%yV{$ri8k1$&r{9qyR} z%^WwzTmlWaVwUUWn@d2$-AFm!Be?;axq*y%LDG34nt8kc!r3e@sy5H1_GIgkce^&v z_hL3b6{1W;p0J4=0fZnCX|b991(}n<$Lq{sQRoa@W6Zy-z^DIZ{w2U07jO z7#5XRm0aj54Zm4%!VS%divk^q2uFOr@-j@2h`2kF&10I7`6v6{c|)G$f~Jw2BC}$` zW&t&-cxdEYmwB(suJT6uAdh;UpQKe>n>UG#6Hh@Fp`!+Tqb3ec194-`~*Xc;E*QKgcbThNH=8*Zt~($W;-fI&X3% z8h}W*R8})VB8ad~CWtz*#{K|ada-6Ky1^?7)FoA>9pseP)sLB1>XHzGI7De(jyI;x zN4imWszx1XP((L+rPN0NHH1G1EDainsY`G{veTf~7itJQP(>P~>2uC2re^h)2i^cQ z0`q`6+7N4Awab_LDmwSeL6ciFvUaq=cBjD@fLc=_wdR#UIK)v(?r%l}zYHi?SQMUK zbnj2;a&oQ6LE6PgpS)Vg>67+i3gV5c6k@Lr+kr=%BrhHru>-fDK_*;sQ6vOE2^0dL zr)daj8blk9#FLIets6+i9RwPHYSW<7M3^_|u8amBSZZ)!cFpgZhFdl>V{H^2i)?fm!}U<>B8nHL5C1Y#>d066RV8b8^)p`Sc^REF{}^{7ChBsy8{W^X$d64REV%J9731~ z7mI<&5kYTEgCYQ8Nlk%uxwb^`4F{4R=!!^(GNwb{h%_ipf$URYKzcJ>W+-^7t9P+O z5sj24HsAqBFaRw}&6Pz#!_uLOJA;noeg}*G-lE50Xrxv>y|fS-hDSOj*X!;;@yi{K z3r%4}n2FqT3;;0#;A-s8eNhnSXb1s^aJGPXPJw$e$MBt$PBi)?Eg{C~&?v$QjsN6E z4YbT37KDDzPC~d|gYo0&is?|@bRbUWkrxhTy#!wNhtZ0m&p+o$PeGCvL8Frh9^Ff(A?t;)%maD5Nw1al{Nn6+=mwW;ekh55kbqV$DryI3|5Om?#ipiD2G= z`)>~sNDwptGfx}BOm)}!gFIWcL8Ll4{ENEnZf9w@;|^4%XuRFkpae z8#`uB8i3YowejyjTn`a?Jg>{T=$`o5Xzez2cBC|J_IBEU;||1nr|C4Y^~Q~XzUfCQ zG{}FJm9NG%ji>s9a81JLb;9^=!qiA00HJQziWNiIEGoaaOuOHNU-5@w@zV^&Z|J9x zbK_%A33TBAFk%Oyj&2JEMx}Qk-k4X87QF=a4n-V-Yy5Sy?1?P`o-zT|xB&uq(0B@x z_!kjzB3U0(T8|ks!u8NInuT!)Z=p63`Mf#CX89O|@*)I_7JS6~?x{IUj`os!;uQf0 z3t|@}oYcQ5EgN>+Ja<4Vht;%7_bbokS7B6$1M>{G+#rRoR=l_5&YM1+t{FK2z8*S| zt3+=ogNRb6*Ub^^Cy3m}S&p}}YB5M04tAO}et1xO-@MY1ebnqN$k8%)xX>?00#$b4 zefs@8+c0m^xFYSXcRJJ)0FCi=4_xTo_mtu zRb8)pjz;cXn|H&#BC<|3jYFN-kzpkGzngGrB6v?|M3n_1V_oF9HL8dKEqdORSd9h} z=gWF46FyHf`p?^3gL&S1CnE|Hnxo%A;Z$01@j#Srw&_*CFC{95< z@x#Tsk4>J|)i%AquLb^L0<4KIaOe?x{*RV|3)lZbP5w+9@z3yBB6uzH??e@GJT2n7 z{2_G1e3UNdD7_d=LOPK<)(_SUyT%Vc_jDEKsgV$cBmc^|W_ zFl&1Jzg63w?vfkGLw=-gI+U=puFbw8zBKBrJyJgb39HR1= z^Xb+h;;Bw0{|;OvaK8K27)h^xOb}^}MyB_46!)L}&fqA*bQn9*4SkH1OMho3voXa4 zdGNN?IePBQmlK6T^S%3T?tGy!Z@w=1_ho4b)TVZ-Xm2`^7tw)@91|@B;IqlQiL7^H zv6FPsZ`BD;8w0ODb#Oy63N2y+T3z04HS=|*)fJO&H?6;&(3WlJ7+bWUL4EGmsWr~p z-G68HZ{+YVVmfWND;kVgo<470SO50G+kay+fgR3W?+JDLby0ne_}VA6kgK$OX%_02 z%L%rd{tk?7$~Pd6q|r9HI@J9f%m1L~WM5oKhT1iaB^)f^0r(YHq}0w6&Lt4Fb5J$` z*l2gmyCJU%tnpt0rHO0UDKKbf-3`~KB0H(OTq~IV>NE{_xOKefSUT~|WlL=b+Re-! z@h&udrXuka>uJ5v&b}3Bnm`y8R~xd*!oaQ;O~xqqn=+k{S_o#R630=p)>o-yy2xOW zy2Z+zY0#&8bS|tv`<1ijMYu$4ag`W@wR;(7{aaoW9H-sF$?$*X^9lJZ3iq0`ROg7%~2NzEP>C zHKQDn%E@?nE;54(FiWZ6aM<7v8(z{z(e1UO**-$Ytg3-i4W}O5n^j>vttS~Gp&I{D zVd7Wh&#q?9->pwf{}>=FFY|@dhFhR_C_?N$`!tXr1Gp#2-a(&`H~B+%^ch66Nd`=^ z?K=i2mGShu%6ju?2o_7DL6A&Rv}A$d&QZp`cW93WjfJfLQnfx$;fDA^=7LNVc$X(q zPJh}uo4~I|Y#5q<)rIQde;M7+CINirCWOCzr&$TxQ>-Q#`SuvM#} z3hFaeer_>u;V;3N4yujB*be?EHtl1Y@Y6BGh~jDt&nx7nj@4GD&m_SWk{VX4mi*R2 zEby%vO`lt0l^^(Judp2RG*BCBwPs@~ki2NjOt-$1XI6q1oojB) zgLg`$$1%0f|bo)jeDmjBf%72-*IjU zR?FUDMIAK%s&vg0q4PEBH#vLHK;g zo@dt1j6d}@kh|I%BSjEq;@W9D&2%bRtMCKw15ZPhYMZ;)#N656m>RyY@r?+ytl(&z z63z}vKW86P@Y}QcJPr|jl@JdK>HtHW$w7C$Dpz0AUzwU3+h%G7uZkTe$_VjIXKFUE z@$Pyguw+_-;me{7%~GcJ)j#63EO1aAn!#xa+sw2|QGWF(3j%9v=93t=5QUchrSXhB z_U%fc6Qo$CQfs#3QH4xNfw{uNSffqm3f9IbEB~u@MT_kcVCNqz(j7a0H)4jyM3i-C zwOz@Ur?>WEGK2-ic`NXk3?OoMB>#+0mmIE1Vjm#Qbyq%}ldmrqKEH1n@0XD-r6D%u zw+u@%wlC+b@;NUbZIe_ER0w?ZF*)l(NsP9y6czV1vx>IOu2!w$#Skqn9oXg%*;lJn zZCW%=L9p8ZG*84%5JR=4B09>|TK*d`sznfTZ1=g^6Lw@!L` z^cQYk+MN|+^)9D*eU26G^BxQOUVm)rq>BnJ?yRJxveEznT1}i#B$;K)EAYnK!^`_a zPEY$v0&jk~;kKcL?%n?wc>C|68-R4Cfjm11f&~%Ayx%$Epa7j;CU8qQ(;0t}!AzRI zZLTHw%Hs2{-00DrJDpbvOArAL{A(!Hsh9KLw~&iR@0q^+9#p9gx*MQ#1#I3QQoFoE z5nLuBjUt~LUJp!AOcVaQ^ZZ<{S6xy`Lzz#CPo0d!!E23*S|5|4O7G`~zt3Ps?T3`vZv3WRsQwvGU1<9`>OAhm)0R7XwA>W8UyEB3*ghs-?&p)%G{gt+rg&~Tfb>9Anlx= zx#qUCm9n^byudDOcZA>QmUnaaj>7%C^r)j5bNvXLwD9+D`0WtX7k7{DCslf1nd-?9 zHn|Udr1XyXyqj(T&tA_z>iG5SWA{}Ft?&7Eb9-Jl-dxL*p4ON1y|D$1p1i}BeFa6*=(^e5LWXMy(S)3EWR~rvs*tz6jel2S8E-C$ zr(HQav)zyM|GJU+-U)KmyBWHH`}L&$HK>gddm?Yy``42_TgX2$OSs9`fIkx!jS z7IQZn%L-bBS6l*Y?XPc3axLRAZ{-A`KlO2_slJd!h^&9QvPP^p5!kiso}zT!nAK;K zB4bT)pI!U)rk?QSLo{$?v}LnwI#~}#exudKN!9(8qO|atqNmZS=LvEjcg87ifau5; zP6j%>Gfo_c(?!vhJL6zJ-7#AfCEiAhZLsYpS+7O|r2*0HiBlqxStHfZ8+uwQl_&?NTD0Dwj(6um()uZ)FK^|*I{23J7DnQY^q&H}{k zr_$6_&vOBBo`N7Sd>+0OtGA11Pde`j9_5A=$V?ZggA87}1 z7Hi;kO*$dQa?Z!HboT2s49o6xTE-ZCXEs3M0gvMzD8GhEf}jCnbKpu36tw|rCSllo zK-u_Vb9;c%2NX%C`0I3OdzwD$#(1QZOWRh{L+Fw*4}G-c{QP=gHPEN2819p(n(Aw$ zgUoUuDjneB?HBQH-E)B=8OCJuWA7UQT&83POF$E+IwBgUv~!+y(@>+uKy!oKRNu^N z2bk@W9du%qouMuK6s9%ka=5+yaXW8W6=Cq*fIOaCr`@oPx5^N01!b&XDEH9Z)AzAoKC(s+pmXi7RO*l zwgL8n=9AF_BZr>vOeJNG#nd7-)_kW@R@R3vMdA1Pt)+j z-Ej=!#`l9JU>ZgnP;+3;a?&2y$Ocj98Dthvt<(7olp4|Eqo=lAsyCPNta{=nC1VMM z!=RA99-DT9T+y-KA_$5KZgzKe>?$gW4gMP#?=v8?so4n$p2PZR!^E`2bz`T}!A2F! zzqVx7~3O+aZU$;>{PO%718!Ulj3jTBJ$ zbMx^d>GsxjW3wnVEiRfRL}_X{26F?7^C2)Q__L$tMY z0i%q38qF-;0=j=45Su`oSX`GfeluQIB!?2-IREJ9bDF)mWWek~h`A?!mFKY^{Tto( z6s7J};X|3?XJ@y`oavNx*;$AUnNJrYg13NJj49Qe>}yP5#dcjH7LK~HY1al{i)mE` z46J_E))yb)%kNWOmaBQI&FyUeu-&8sb@4^_9Oug+xM}lCSNk=JLOklFe-*g51qiLC zdBF`o_-WUuIfipPqViv6i;c;cwmWNI?3x(9eA5a$Z}aA8zGkbzW6yH4a`Eb47oYP@ z%K5Ka11Pd&N{d76x}m}t{Q0fQ?tLxX?ND~xmv2<+Uxf)7MI^i?=PalXXu&qL@t!W< zQ+0$a=OfQMa079}V8@OunX~^%9k(GD`?Qm}wr09>Oepzfs@g+O0`d3@nJcw}jlq_i z_~I=0xVb!-ns7-rUTfX%jfl2^bV@nPtb#_HYGT$!$;F0AgVrIHOB-?EO>NbWM`SZE z@UcJpf8FQy2AgktHW|v2{flR{gwo&Nb#Z$O5Z?kFSzyCnw-6PgE3aDvhn}D&f1+N` zoWouJG1c>n-8Vi!xUK4+=!dRi;wBGX#d>4;HA3oLzeQApgSgDJrNIzwBRl6 z0T{dd2Emcz>=^4jnPq3{M{nHvw&8}6`*itYUYmhu*lRDf7cv-=VNYk{Yv(@tX=}3g zLpzDGJy))(UAj?h61{Db@4ArfMPdGDB8#HE`S@&^W%V^d_|@^DVV~ApH9>mW-^=72 zr(G^XjmX!n+Nx8Yc1#EwE1b4l7iU6P`Q30Ci-uOzyUScphv#cocz~M}1w_l0&wtQu8TKW?BNCLwv87Hj7R$8fJ@b&Rw2{8P$ByKY4jwNZS=TtBd2-z}y`4z3=bz81|Np8tdlyLWp-g#n|$5 zo70sq?DHp!Ywo6!wAaVyA$QjNAYUmhyJW-op$S2G#5@qVZpQT01(mLYuIZV{GP)^$ z?ql&#$u1#VLQa3JGa~mbr;p~(-Ose^Pocb4rHCsY_2)ZzWT z`odiY|5MrKr?PyO$9$Ft!aiWm7@~!PM1_Bm6L_ea6X2q!0ki06q<|l^HN5x<67;AQB2y=9yoWM}e= zz-j0K#K1QePL9H1EedjCziuF!wSN|T{-?6NuKa}+6RM(yZ2hXJ zy(427$Qu$k|MS)F`&&w~9VTsYEZz6F3r6$beyiqJ{{Gbu=*ByL2`HbAk^k}sBiFSf`x>{aSO|*5FdAOtj}4$QF{#^ z(4{%d^;sCeSfXOM$GLFN3*laF;a9!G5$Io6{|onhzSmY5 zel0JYi?;xu2_d`_W%=agc)BuSWoCc8!E~ZQh}c4M`~Bk&A^i7J*aaY0w=VB*czA?F z;iXR;7olMnYC@hjgg%RiJzZKF^E-q&BI-Z6ZJ7eo#hrYLmvBLrUz{oFp{Yz$KWi2gkN_G=1i8XS8Z^W)9IshJqm_amgu z(fDolsR;JL$LvGrZZh^kp68{r@5ay-|1u@tEY7&eA{{yPB4+V%%*%5zGr~6+TmN#D zAAV=-8*{t){=z>)&VR^^2wJD;M&iG=Z-=LjJ;bGk0HOab=wbk|jem^$|E}?gBDWHKm5197(RKrGQng zgTGu{y0MxLkG%wG$@O0`D7Bm;x~Nriqc#LiXdUhEu<^r=pMXcXQw9o&dOfbwf8tM zDHUAgCw2lm6hjtm{ZB$wkh3V`(HPndE7YHd_;>41Kmv8@lL!epqGl{lVs4-2*(KAK z_H*Y~x2J72zWr9;`=O^Yw9)mu_u*)Sve=b`_ASD=ESIfdtmE**ZJm!y`Feg!$McH+ zs?KRxt2wv(gZ7ne6cS^`EL3)mhHnqBLDn77boW_$-G4ranYuZvQ$|n294apP>m0c`n2~Oq562uGbYvr&>Il-h6hS3@!QL$d8)1&7qCPG!ig5?m%fV}RzbhLEE zJx&(YF&dV4IN)>n+QIgVrfu7Pu2#txTm{D6f(h}UyBaic=6cK{UyI+8liahyxX(-$ z-e6wZfkE5j*^x8mbT8ht*_!RfmTB29K8hmCnkd$!`^(~GxMPpUj3GCZB55aF9BH09 zbT8CSxjY_qiZH%yMl+UtVM@_(|8G}ocd{EM{^mNG|Bed9*ZF)KMJG%|W)N4Jxk?}? ztC~9B(;+ThLB=;3FnyhsX{5W3aJozOCxa7WM6rF%>e%qpWqi^$*4q7n&$y=6q$S<= z{Fs4Pmpl(gprTsJlO84)!M}Lm+pqc3#u;hTGRmCKOw0j$VS!$%$KD8UMpKpUg$bL8 zmpc=8w~Bl38rg>Y(Yc!)ubyvJ`eUMn5j44AVqYA;-;TBy5^Wq@uI!B(YZ#n0_MjGG zE&y{8XgR6n6V&g}XJ3Gph-x?QYTo{5bzd{7wCosWNf)(ee3g7_b`d$>|G}~S75Zm; zUxN}z3u_l&v-`r1E2DnmW5Z;sA=G%VNIhgnRTg- zu)TE6E%KXg+);GZDTBTL{w^vxtOXNd7w_Ni##a!_R>f$jcByBB{!BiVa@CNwPdNHc zgd)%C^i?6_qi{Ej6t5`A3#SgAA(1T&toPh1CXVYlK+%)N-+3d1VmU4xX`v%}X6mXs zGlu^1Tja^Apc|9ZUZpr;H&LjiF`aQMQX-~1-s~0aT{XR=E;IUlZByEBb%8nbxf7|8 zo|zP1kS6K3L9X%Teq&7}{<4!!Uj??M=4U0OKFkR0>z=IYBE>7|Dp8}s@p06gV7V+A z1*#;`EaMKBaoKn@ji7AUD*aMx4vpwqO7XaZ=*y#b+buYL8KfK zLlAq0%6SqRp8;mQiZMvXSlM?zUp%OU$aWJ%R`E@6taHjFt5;`eDBTA>P35~WUXz4K zQPV=_y=QXxItJ*@;b2Dp-q(_kr0H`;V_Mb zOo5)}I;XHVBB3`;!2VKA?&VqZ<% zTJwa=(@$UG(Rhde{wIVIpfyb}l#`;{@CeNi%(1En%V>TA$w3`%^76BLrPd=XN4ac3l%u0H5wiDlht1Jbf-om!RI-B^~o zKQzktH6gATT_fI7x+(Gm>V&6LmZH)#7v|`9n_Z0I_?trg1Ia3ZleLS;WSWR~cOP$@K#w543AMQx>OEYHkAptV<&yo{1c`EAAe+=GEf1S7-|JtK4<6myyY(V8lp7

      <$mPR5v{Mp%yRl3 zEWa*xN7SCKi{L2 z1_Qbth?ARPhY_WF&fzY^nUU0+U;cW_`1}nwSfdKfVQcpczG3`=#O}TMXy9JG&)Lj* z@abn}pQESaH&(-#-}e+d90sYpn}&{Ey+Z`=!lMM%UaT@ce_pEyLfJ z+ZRh*MrZL4ISxn^iX?8nZR`I2&%cmIX?x` zxZG4%xfm-{{!?rBkA!XUy3GIih_vh9!GmZBb6UrY`}fmXBl=x$wM z%D>%*#J{VBloWj`#J>m8a-qNv!Xl9d3u0Ni*8N=PPQZLiPzgLBg(cA|x_ksct_8x^ z4QW19VmfF1Im>c!q3Cjk*ipt``y%Mo;#F}G2)gvQe(6RhmSO;PEj}k7UZMmSk*+LJ z^>D%}W*d0%Gcj1Q6^>jddbksC@Bu|VRS1{j`uDDgQhAxq#GZb}j`BVig~bxoY5B%Q z(Z_EKOM+}f8U}l8qiUjj8o5g`t%W^Z@G@&B7qx>uo8c0}m_7SG26mi#PRYg0fM_bW z{wr!v-^@k-ahaXlfqQHTBD4aYvFGu@a$FS+Ke7LQzC1eg0PxRdxo^*9xXh*IAdtL5 zFSR1Tu*8$QLX6}>z?Ye9x%ocNixuOk1d3rfx|e=EFaV`$eQgJ^6YnW3D#tR$IzYjt zMD|s2Fjkz;QEH%2dSUUpBPpuKMcTP2X{#!SERx_u$snIx?_=GU!Jn84ct|>;zn#CJx8w0*|2N#U9mfH+`u}*bZ z2#Ep^Ss=<0hbiazxG(@*1!!<@iZ$t8a=99?KuvZ^U@0Jklle8~Gj8AQQg&0!oL{1$ z$~w1{G^#3KA5U7a90uMB|F}s%#Bb44C7P-VY9S?tuxtlzU^ydzz|SMlTlhy~AV^=# zHKiXc5+k;0oxN+8c z@gx*0|NPLjT3qbc$GFwPAmfP;JOEP!IF3V>2@41~!81Q5u*0Lq+gDio&rm>1dy zLZlEh!tljnz_W@SSf46uAfDnDfKc3_N8{@%b{?g!Bd?uu?S-!k07MZ6Ot$05Q1g04 z=z4$A6agl!9#}KNh8c)e1pfi4%AAMOLT=@fRI?S~@6-Tb6!0BE_>f9)ToLlr!@(nP zkQ_mT2!W|@r(z#qN5ps=3KJ1)@%RGF?V7DORNeG|SK9CjMIavQCB$y6$_%K2MsU6U zJ7P~fKy*7|l)F@JyWsA{Pdi8eEYjF4RK?<47Un|5!CDI@Q0ZVA3WV9bYTzPwU?lF$ zp>?&#E@}RCB{M<@9l+wVFm%s}6(H0kdV&EE8v@jB;ccJ?Q*c`Wp_3V4^AQ2 zN&#e#Ft7-GT@;3S2nR!nH4eLj$QoXq5~v~o_8~zU3KI7BOATQ-5;IWZGfz$d0FDz3 z<9PkbLX~KU26}V1nNDI}?vEKQy z8~MrB1-afi2-f6^>RDDG4n+`hkL{NCu{V4GB8`_2 zjZ;2c2Lmp}vC*w1*X%G&qbI?_59n|tUYJD-5Ml^-XQqY?4dj=Iv2r?3?(?#r)$YN0 zo4Ijp(`eQlcTi5_>?whR5rC3BoMrH!KLH`;9yU>RUk+pDB;WjAarvz!E|I}g3f5Ze zsYS8Y7{E98Kl?F1J|OvGw^ia-3~l}bZDc7ePv*Wp3kl+^T0eZ=_{K`|)xNRW1DFO? zuL=N|XY-HP>fbez5V{&;t;5$lM^=2zM+;u0wxDYkHDcoE3pYMajTaG!ABP{>s+F^S zasRD+02{*BBV)j%?$@((*0%wmECSmb0k-#k;OD;6h9yhO?mwv{iFW9;efeh?u*amK zhYXKL9@R6!LDdM8z1KaGsv^4#jGNw0B2mg4>C&aVezd>d2+PBm5 zR}h03AmnDO7B{pg3j^%9ZB19lCTJCwuBzDMH!MfW(-u^@4`@7<$O*A>Nx#IpA4-X6KE$MfccED^Uye7Dm9dKV zD=f9@Y79l#$gYzCemeSJe_ZWGZjk(UI#0#gdH}A4?5^x|ipU-0J2*C$CGy(%m*;^G z7yKH&XbDlGFs>XzjWr%@u0i0Jo&q5l$U6|D90IGpMx>VjP;p`^e*!XG@^y=A|2V;Vc5+z6VL%n4nn~gC0pZdh1&cC*x`n zqc~v|UJu9OnXmxl(uGq;Ea*9Jjuig=fGT|v4$fA%Cg#R^c1(|UW1Xng`P)DmjgO!{ z{MEbxb-G#VgQu4ei`K^nMC0);Z?qio;353QBhLWWQus)W=l6ZX03pUt&w_~>{~pH0jYS!7T_toa3Q65u#OKsF3m_918aAOwYbN!$OW1155w-n<_(i)7cD_=z4I7q7NvxWI^ViovTDgMpPuVXQy1sIMOpqg3*!SA~ZytotFn4~U{rBArHCF-5se^&SXz_&3q znU3Rb)z-?QO@rvR8lh6L7~;tbf(Wh0r}2s}CT{~??>p*we|`b--SE7xTmgT7;jQ!L zVkLe==zZl_YZ;#~c#Zd&f}mlavs!GB@$XNUk`c@Tu0eLC+s8xLShsl7B2t%!;+8&8 zvME#lH;}Ed@rs6E2f%l#)_Y9u-CM$2eG=Rc0dKvkcVCRhh(w)s_l9sJwvI@sn>Ce8S#oZIoM_@51Wgjw$$ zimH+#`9DeqM=+F&n`3kJvoTLAVKr=>V%T2jf>Q`g!Wsi1XOQXRBd8|aV3w2FvhO9Q zkU^TYSoy_~ka8-H-~p$;Y%UVR2#H5XXT5CUd#!=zNEd@wQa`iK8@WJi6kc?<1d1Gz zU`gsvIGl{>1Wl-^V)>K=Cfp~=II7gL!?NAX>vV5QG=8M_vWnqg@*?|dzGwazDQMf0 zoJ;#f-Xq3`MB9#V$Eo&vqv}wYa!kn`{gW;GO8wVD!Iw<_Yb`dE`mKtsd(PiT zei#P+wcycyj?&Cn3ug)Pm=yT8a#93*O=VYMeJGbReX3rO9q`}jzt>#OOX>Z&>{sst zX21Jtei!u)2@2dEw`?_B!nzvGwBKBX4(I&!J6h$r!C%;V_UMF0DcTTkEw=q}V*7`k zcVsV=^mc@pu5Wn_K+2Ye2UAjv)I#X3(+I+BXU_>_ym@JzaM5-|7sU;yI1nIviO>K& zho^T_zrh;Gw=J@5=u!X^lmXD6&R4V4^L?w|W8}YHn^g(wfNC4`N~Q7qcjn?3q5ZauT@} zx(Q=VbMn-?yTX%ZJ9Jio^3wMr#3rr&Yc>SQNi4m^@hVdWjo%HKHlM;Kn1742P13A? zCY-7%3bHT{oV?5UGXI6_Yu}xL@hjZ=#I$jAIm4W(6X|lRwHLcx)9W~!)113*G=}5Oy7k`#Z+joeX0PWZ z@L8;f^zzi-}cBz*dKb03fk$q6nWZJnT+d)n&+RNU;J@Kgh+u%cy zb$8|{?rZIWeMSA`!eDJjUjoFmNeN|+G9xI3$qxO^n2!6jtn;s|0IPTLGr08Yhi%6C z@cKUMo7b&P@{#?EIOYbqD+q;xgl);1(PkASli__B`LO-{c4|7DMD_Cn6=N*dZ1V3PJW`gn4?t7eA=wy zK#_YGkTPDSMHfq66VMMHFoq8Hm%(YeZ+uv5d{0$WM|~R?$JYH-VKOBqM5G_XX{Ppq zx^G!QM&=2LneS~^<{=lZ-Td6TIQ9Z-JrLQg*>kJMNCngzO1-_V6Gco{?W=Bx&>2dP z1D&LdD27N+6Q-bj=|u!Dp~;7%j;*kE6t<-Is00ls|u=hum)A}!AJx=DZJC- zNSe=jsq?T2&u4)fZ;HV3BA9zmv*Muck3kf9__P~37^V;)9xQi6;(v>KQ0RaURTs!_ivX zQ}_&Frs+^gAG0YvS&Np)jSq)N`|Qchcw&)~D406YD+KbEA;4*KSkh(18eiS63MjzBybBKR5lHh({ak?v{HjA8z=rY zC!qPK=_$7*Ae|PI7S)%V3s#SDjgol2G#fkx9UjL4wugA5Vj)>!NGJt@tkM)zsQ3tM z@bed3A->MBb}I(FmFZ`Ri?e2Yq=UC@ZgbqqWxI~h0}(hXIx~Qh$nxpauWKzBp64H8 z#S-5TV7eaeLGNIhF*RoT1f%m9-r1wc&6Yss*tqLUsy4;k_bwkE%6X$#B90Po57j;| zfDZ-hzES%xg1pa%b4lWBi)4!@kS30xU{wNimdc3FoJ({Oji4ld5(VjB>IpPIlEROl z)G7U0{^;K(!-bp-xm}w6Ol(bn3#gnx&7jkJIDLn_DvuWp^tWtCB4NX;I~4|uv3?x{e5q~p}*2|Kd7;E75NQ%79vS54fhwVD|HiE1wyO6}(bu63vQ zzr>siQE+&bP39#n zRsXTiO-!vXI(m%DylDE4mNswENKx|KE715VPGCnQTsScO=)L1x^W*S^g0;))-$>uB zWl-BCh=l0|S&L7L9l#!@XP=i8sEbKYJ(o zm3HZLF!pMryuaSPu9flQBU1Dz@ z3W;h5IzXT1oVAyLXOZgEBQZ&ZwL9BHsnF?K&A&cx{;=G*fx{JWGC?AZ#WtDn-!}5G zAhO0MRLkyL;T#Xf_q*zU)K#og_l5JE?ALkqCC6~=uvRgVbJtyY7jpA;JDJpO&^KVG zo-w^R8%P#A`d$#@YGU?q?RD8U*9Y>BZSq)mICX| zX+O0B3VpI4lgqgf3t`GPP0!$u%f&VW{dEpU?{C>2gy#&NUT&Pjm+B`ffYNV#ir*%# z8`4(0g~{J-b01R)t%Uat;@%HmT6qi#7=x-@vJ!XURlgu+OFnSl3E&yk@lE#v z1=X6?FcRa@;tPvT{(AQ9Yv`N*wz?FCRxDi9Jrs-JT6-I}yt=ja{;)JrYY8rB4ejsM z{Fs8~GvQt;roNmmg4f`mW9q2QmZBS<`!Qj=<-oZY*Ov`7?`P*{CRLXaPdzU1En!ar zwwC;mxL6!OdQn87mv;D~2x-I*(yB9CD)NN(F+NR+HTHwmEd7%3d+77)72VU~{T|RB z7=)!HWg4Z~+$pS=Vq11SIx84DC_ST6co0R@s3(4jqm2rZ0mH7i#BIKr>N)=- zx^P|Z_{MNO?lOPL*3hO$`-!m(DC%Fa)`s|fGpxrJDxxeE${ouiAi{3nkEToD8K|O8 z`h|8FEt0CFo+(OVKzV5(%WjnbLU(sqcE|SAO3}cNTw!+RrBXx@P|}prq66<8eS3ic zHMx8YO!t!*n;7Xgt)MZrK88cxDBSu`ZwJv4+kBuVY^(=ju^dskdL8|H9>M2;gZ8_q z4J0OjM94uezh+?TS8YjLP8~9_u@Qk1TGj&Mbhu>$=SBRn0hymjxw`EP%Fl4aHNsic z8BDq(WidhAB%ym~We7++k1Fq*h)*w(-RlI&kZE1|$K!;}p{D;`e3PL5tsKk;V%f0g z2#}e~koEkHzLn{y^VY%mt$~@Th&QdQi<3mGk(^zb8;Um?N895&?)Fj7DU{a9!c^YX z*)`BX@+GBNYUZ7c0EO@*c~PyK^iYM6gPWhE#S8d6lE;->0`9yYS4`NrEzGA#>Y^Aa zZNES(9tD$gijy24lRWypxa8ut@!M`kTI7Hhgez^QZ3e3w zoTVL3oY0P@(}@ezmB8pcozQt6sM|oH`!Y-S^@MIAonEP#UL_rA#f09Q6YW|${Wd!N zUmL=vzcFv0Y29)%#fiAPtU*%kop;-~mAK7Cjn^FeXjMty@kUYeQ^+cc@!XAc zyepV(rvHv>sLL#yTiV22P~@GY*a7B{KP zMU=Cp3mokKX4|vJ+A*rx_mmU+I#9<-aa%ZW1`9~F+LU+NOhTM)aLbF)TWnAA z#{X7Td}lG{hVpQRoUN)J2T7x%c%5MC0u4p{S8)!JFDTt!P{zLy)H}rL z2MeT3aTNulj^kX5Ej&m|OxRWwpmFYZUQk*I-x}(4HCoH&3lP}r^5-jKAuHh}uV@p16lVi1t=7Qe;nF=l{bazIm%bwOZ%*i>bd?%`3Z-es!=1|1C!1OwbEfoaRAwI zqkDCg5oxC@wfGzx`9|GLGQRCTEWmhh89&Gt}SS+4I4b+nss?QkOp%s$(5cU`- zMCgUcbGr{-yX>_>+CsMFzC9e$_0aPTBLQPh6RQyb)zr<9fRJL`P4}OS&v#yi{rJ!9 zn+v%P4H+uA*hf5+c4_NH{}vo9O$m-*!wH?bgue=oWF8V~XLMoaR)Rl1n|Vh~SC@CyZRqj}U0f+NNOr*2+hNG#EWOLToZ(--`s$ zi(x_{XBwnEK=>0BXaM+e%K>)L6YZnPD_`;~t69oOjr3z8C2AY{lsX%+;umi`d;cYm z1Sa@kBdo_N_?ruJJ&d&aKYle|5sIg}6ZQ6P7%FJ(T;7jv@R^U|TYDt#TgHp+v-s=S zVeQ2UiP_RY8dE-*SHu=h2z4HI4T|>a{yT%2491Y6go53cVpwhf5-5-qMgRvUmBZ%R zLNfSEJPoU}U2(B=4QPj?$<9*Y!x1!Av?R-og6$r`iP02|nSiR1M0?u3eN5fd7<4ly z>4FK8)g4*9GI+9+K;9}MRr$DB|6zs|e0I9aDTIfOSq_QkE+-ntFIwGW!@lYTXTH`B zzNrbC!NNp_!-FkzYR|bGn2cR>5@(%U6)~4*(n%`&-;9gG{Plf?d*fi9#ng;~Tk#o2 zD12}cJbmDE}&sA03I z27k(g{a7~Q6IGkOg{rZAYg6ggGO`h&fCr^D<)-jdPQs?vyr5L>&^>-4?g^PO3ZBVO zv2SpF#ex*Du)2*3P^KTS8#aRizg+TTfLDfK$!+g9DWLvt0r>861 z8a#CRxc^{@g=!`Ygbjlt_-_sMyj6S;4=&=y6LUMJffuAz9}@3HeiGEK>uk{7t+KoL ziH@zDg@5vTsf7c)4}acgg_3617VPvhtFrn5MfEQMGLkA0V5!Zxsj=D^7Z%%iUS%`; z0pb-#KBF}dB~rKdp^Vp}urxr+{r%&x4gSEh#KzTE6;;i?zXI2AF>x%uZyYpm_(Da% zG$S0v=EF9d9X$S+nsRUTtSeLNDQM*Y3(6F7!COeUyDoNtP&dfDxKC!h{Mr3Ma#*|) zD!t7sbb%+8rzVLF>ran+l%4x=3*Z`ioG2k3U`5tw(O+{hlJERAa+D_;qn>KSDhh$eMPI`skPb|xsYyMsW)13hH&$LSh8LS` z1+x52TN93_yDXs8N9|e3?Z4Ej(WYBOw{Dy#A~s2&ZjC;D!3X^{G=K?jt9sZgk($bg ztgUWIQ>vSt72(zR(ssC&HPzx&ZRw6IlKcG^7`u_g*ZJX+?7w|~-+hpL_aJjpDM6eLin>Zo1bBa!I}Kxs5;d*$=!3qFURoQs^SP5VMYW;~DoX7pW{IOl2my(^1sdY0v*uLx1uapn4cL*C@dpT)QN9oA0;pg0$2@#OR8buM$5;y>8h{5se7& zZqLr{i#|=#?XFDUPmJCo#{X5ukr`G}Z(*ZTz2{!Tc&YU|zih$_Sn7YUkNC8Q0U}Ss z$zWZ(5pXP^1jPB2gyCz9ZoUtZ%+(sI2u?p7>s5>~Z>J9H6b>%2iS7?W$qz0Hg0_lM z_A97M9@ZEv#=Sw>y*r*QHv7p!UD#jCSk5ox?v z1NO&b@ek&oU;18siz?68IvxwQJf;7)$=p$xoo&2If`V7+EENqTDf=o$;MBXja%efH zbuLk$z6>yjqRw1jQ>k_;g)&fVs>#DjEwC1GScD^^q1SJ4!eGW@)RGZ5^Q>ZVsYxV4 zZhR+O1OgQ`(v2uK9fO0$f#HTIWBW$xWNLnt)YflRL*ptqMQ8C7JRzG@?`O-s!{WH4 zI?mRpDm4g%2FBSl!uB=;gdovR4L&Q16@{WWjZwF_Uz$1F@}%#2ZHKt7979 zq65)Ops^c?jB3O|UIm>IkjQvm6J59l1Cn(-I|lUpFu$dXoM|KtpRU94LG_vNBxyIo zl0p^G;52hz&$e=@UVmX7yuJPsn@G;b>KxGsQvE}N9-;DLGcVNWDX+rm?iS-Zp@C6l zo7xnYWf(A9e)TBS8y^!JXSs(1+p?a&pkWR6aGEQjp>dv|7bwP$QLU3#0dTKNOHTcO zf=44%lTAGvFsf@JYtX9#jWn2-f{?&#R=ldZR=P*G5InDSn_r*U6r&0z#V)BrgIht1 z^b~XbGtndajfA{c3MkjRayIr`wg0@a{1xOw=lu25`yWBq@KnNfCB@@`>-Uf1vHNqC z!&mW}RNB02m`HW!|4dnf8(P!b8ft`SUX!1EqIpgIFv}hKk8m4XOKAR32S#>$kci{J zUt>?@2u&OiRs%S!R`4N?k&PyTf6e%NKWZ@gy0H+AJc->4ofWpC=(oaKv>(Eoe$d-y|v0wg-T)z#1GtDcuvi6 zYdKYT_|eug*A~LMKZR__YAB_U)^6f+SZec1N;uVr zd2*4ajQODhTZP{ZPp@od*hclr(oKZ>%V35MO1#rcN#a*$mdTMDm7nEta&voa#MZd| zUU8zX)~M2#{r@&ORleu!9DKQ4-(DnMk6b`3hd6K60#IB$o_J5(<7e&n(~peh2k8f~ zOhZdAhF$`<(D6>Yo=g9h_&d+fzeVvH6vHk1I*Ig+2@-p+!Hzmzl{VtB$U2t)8Z1=n z-4By66r3=5i`KW*OAlq&Op$*AJ9!n3o*3sX-YBh7qaI32=8Zs|Hfzh)Dpe<`Qj{`% z=uwq(!nyC<=7wkLbPCAPJoQZ}rL7d`h1^e94bmuL@SFb19wkZibfhRl-L$HZW=`gH z*KnYlCHs1F<0$>Qq{7bg>dS4Du^8jol8Fl)RSeZ}X589RG}99BM|9b|MZa9gvVXwh z{%Ce%O1bcxLve%t;}`FT%EdzZ2W>AhUU~@(izn$C%%~0qd^O+`rw!^N^Up{sASsvW z>LV0NU|~D@3~bl$EIwhsUoTNq-s)u*_0RpCx3yN0Kh{4S{PB1GVM?XqrtWw3(ccAU zB$Z0P`;8(}L9y0(C>haP-(o$|;;7Ej!DDBf&O6OURFmspxb;Sp@1K-(QSe=N)b&32 zos=^7qd7@0v}0LL%2roVug{zZD2rMs1^(fwY8b|IX980eh#v)^`Q@g^yhX1-llJ^~ zX2wg9{$A4rjNpw%l3W(L3W5CUyOnyA^^brW^FJ&`Z)e^Wf&(+re+sBSc$nR7_AE9C z@=$H^Fs{z{Q*YfNWZl*}`5~&mHaG9S6~XOC0XLnShsTb-yFwmJZcM%XMC$3Jukdpn>i4)u ziq%y7MmjATuUFPTw0`DLF<9>v(VOk!Z>pCoVUN~#6i6nLC>!I1&H5p~zM2FzbtfuY zQ<0rcWexOVeS9Gk#i z`IN6a1&ys2PBIiL@lQryap37gOiJu|nBd2-{Dz11tbJ0sqK!XR;0T4Ku@6g5N-oD# z&&OtE`J%__%dK^^sFx%1bdi28P4bE`5wS5zNM0pG&snHANm3&+2psc1B#$03S- zGMf(awCLL?Y(~GThFDfNzf#6P#QW(%DzTZON5mBn$wbJIIs9e5>0UECDsd#N`u;U? zbX)kJ(?nb=60A_S@;Ee1)|Wx%i6EQ(YecRqjV+K}5@AQbvz7^qHTz{>EKOuQ{@x##w@ojBp{1zO0jZa$8V`V97hPuZ zhi*fB4e^rMdpLg5vjzu*1Qf{`&;69^JzKDG0y7%GHwE7^LZpFsb`z>&I0l(aeuxQ6 z;^Z7vfyW3;yqi+a@uw9x*0LxMNhdm7Q??Q@ed@6})o5w) zu?d;54>#LBeeq_q!o^qn!vt^R1N3bxywm&G7@;a$J4WD7`$MpD#0~!n`I|b-48GD) z=I#>0vBOw7EJ8le5^QNq-chX1!fi%wX0ZZif4{Qc5KqDFO?6()jYKve>?(xrMZp|4 zyy>cnM9p`?Yroi(OJeMJ55*vMW*H(P=j&%ys;uI$ho`V;UkS)xC=I*_Y1)J^AGhOH zjf_u>c=&_YzZ{Gy0<(nPBa(unn_Zm({740GJa%$S{KkC!A(0W15c6igVpz0)A`^2C zBWfzd4s3b@&#)oM$V0|%E)}NXOK*;0;g_(JZj_2Ej+PLB?H&gQVtJXy=;yQLg_gq% zxWfJh@vc@VDI|tf!!#zd0B_u#*-8IFKT;tC$D*80wp+)jC4yTyG z!8ro0g0Pyu1%5kwau*{skdg6sN&QDaMmeCDJT8oFfHN|IClOqBXmDTn~}@p&(!^=PyuGR#YhNjMIaox}J$A=)z$1g}C4 z(m42!zzW?&h-H2XjYmNbxGg`~^XFy&Eq;EE#(cp7uqkbrR}*OR785SVd6bNO$&%N0 z6BsakDk*>zGshimhCIz?l9otmDdr~aVM-=@$gOIh5b7yZ9Dm^UER-AMfB39UjrC?6 z{Xi$~^7z?joiMv>$I6%Y?Lv(S*&z6&i3^h(vJrTko^IJpVmv7(%$F1|%g?JS{GI7u$cfd*TJ1t75j6O+siM3r!}pH%eAG628l>@JdF1?PL6j8 z6#Xv_G0LiPL@Ra6G@~i*jSkMM3HkCU7J3)3jCneC%MMDzZ7C7vg~x?90Y?ef0FoCR zSOk%zH>kfVp{<7=v&q0GA4YDR5n~a*;KqC7+y^tFI(p`Fk1uYqJXN|g)f#My#L-lg zfCCSs40L%I`H|+PkDV(6B4S?Vb+U-WL_>bkzj~AwMfU7wdK|?o%eBP&8uaN*WhUNg zi4Cqi<_NcD5b#LSqCXb&hF&?~mX>sa9TV=UmoY$r0_kLmL`pD`HNCELKww5-@28<0 z_-D;Oo(LJ|y=*c*ya|n12CVM}^E~F)$LF60xqUv17qJ4o(vgp1K+cU(Ggf&?7Q8am z8QKmAZC#jj8po_VqZpV*qfzR#GJ^|5HwvOj=jS{OVLka1Kt=}ZZwAa`7(ZKu6SuWt zJ3NJr@1^cDAgLNzjCn2HE%Q{GUz&HudYm$B34#vVKp;I9<^d*)5>{w+hHG*l4?bw*F7%xOi)$YMK;F>i`ff$VJ)s~1!fnB z3wtZTDaSkpEw;#@FK4JOo|X_!r&szQb>lD|5@w5qGWs3aXs*UFBfN>0h!m5y;;OAnm(+!XQ)cH2S!iO64>A_`WKsAX~)}*`YA-oZT9}!+FVdEfAD@l9*joK@yAY>N$ zMv8gJ!|rcxHeEWC_!C~01hDf+6US~7-B<$RQRP~xiL0jd>mZZeb=mPBru=v_dRH?z zlr8L*);He!-@nSvhnT9o16>}!#ju8R|II}UD@Xs~7r5~t(W8aS-8A}G$SeUJ7x=a? z`>j)%smh;fUw9>lG1N@X?4DJNo#VZnAh|CeEcAt29rWK7IKLw%|1m8F-=o%T@wnYe zD6iZuy{9*LFX&S%;pcUB%F6ety1Y!A{cM{X?4knUeI_owe^`dhQ;-zUnx$Gm-) z@SxI`?1OEbjb>R}>R?+Q>xXDh%dA;T-$5vH1XMTpF*5A~_V!2Ys-yOpiJ+(PI`=1< z{@RwWpK3_kWH8qtY@quFFnQM}xaQM?E>)5^9a3Y!_pl}YcE`kn4(%18sn;Dd!m{3J zpxM72ORS$)Zhu~T@OeX6b~^m?PVMLIPoMX1fBwtTCItsb!}$6>eHggSSDS>?U(cR4 z(*xM>*Ze3FYdmyL2$qM3x8uvZ?@(Og5o`pcB7x4Dz~Dt7Ci)Xt+6g2nGHjOw);TD> zw$BYf$lC4wxxNu=d`Fx!$PDUff)d21{SOb)QE&;?l7% znWFEW1=lJG>~UhJW8IfWA1e)<1)ja^&u#C|o9i#Q7R>x8EK(dOGZ=Fsm=}! zUk;71eKX+sHevm3A_6^?_id*A+uYo@h0AYCY{Qha!)w;V-xP;8@~#(R>nmUPQ@pwj z+Ip;&39=>8W6%Q0?-%XgFDaCdQo4H#TEm4vu4>%^5|uh7fHwxnZKpfItc>WdlC7y=l5L9!Agda+>s$T1CHy@ygVS{d9phcCsQ zk{Xx%ni2QZGsk6ZI5%nAWbTYBJ{xB%9gprDr;w7-`8TfrO;WmkTuyWx$2}=YIjQbC zsVO>fpM65PW8Bte(xGG0KxxV}a>Aiw{N_It(LHj?OKHM~z1^2`LTP>~@Y#6qohkSH z37`21y^g6n^;2d_KaBoO-S3#X<|^6WnST1~$20FKOQneUgZCHEIPG* z{GEf+al1m4U1RL$D9CLI>}Cux3Kw-*0_$Frv7rJwnZh9%z*ValE*8X$5qK9l+v^}A z*>y*G_aPhu`%o|1*#YUk15^`x(j3Nd4$p2NP&zjjId}MN;p_a|B<1{1Z;{E!`O#->yWj;@yvWwC zxwoPVt#=kabj*^NF7&^a%E)u`qS?uqaJNq{`EjmBrJ_k{jV9j!xouFh%O!kN<-7d-T84W{%(qI2E2iW$Y`lX>3=2uwt7?Yt??g%xQ8Lao?|PJYU73`#Ia!0MY-gu z?Z!1r%6)h%y+Aq1P%=DqGtFlcxBoWKa4TPI>k-wCgYvd7$40Wxj+3%fM%0$y!j8vh zNRH3<8nNBH;mxe!_X+#kaaWt=SKGwTww&)cq+PGJY8N(os5bg+ci%>BHi^x&G;BwG z-Yuc}H9@uaNqLVa?v7UHXvXB)iK1M*Kl*MIx|RkbpNS4Ys*c;tO~rzKJmXNF-S6oT z2PBIQeC;prLxfILdZ-s*+bIy}LV#o4d z{`?np!u4fVL;OVR`8>nHiNyC4qVyNByV0kCnBVuloN}lf|IQyNpxif9mfM+vB5~|5 z{|r9}7mZOli?=&Vj6Qo@c$WO-EM@U5m3WrMd7hzio@ICbBKkb1@H{gbX|S+X5|8ZC z%lxExQD%2h5q(ircv17^qHgh`;mZIrjU%7<)4Amu?SNo8YybG=Z~Nlk&&0oY&dW}f z%Wk{Np6JWI!png#mqUw}!^F!G&VOSn|0b@hXRoB*9*iarcHeo|w?O>2#Cf%%aI4IiBh6ibgWMsBL%7UE-=%D!Wn?3A0IAmlP{9PvePyS1if@4pKw_am9Gbai+a?uv@|6>In$UWr=Ja`UD8kZUj4`q?%PJt^*xdNUq^Qt*7WL6(2wz_cxh|f21{R7Ib14&$6 zpQEeO#T2O+1-nNZQN24n=y&HzH=6sU|A3iMnm~mdsjAw_3j$BJH>?G>UP4I~1U6Zc zP-2a)h19paz-RS#?B2QZzg`IYbevQ+5?>0LdE# zSoC{!VC^l)`lGnbK9xg#msMSfyWL>3cwO>`As8=!p{o#e48iy7b&&}inlm;Ss_llQ zC>*c=06=GZIaQLAei|&#JROLp@*Y^fl29SgrEz@97T`W^fn+6YRku$&b}a&nL}09z z?ae>ZzQ%K4v+1hny(n(vus(@2B-sYpE7!0kGC-43AEQrmv&WA0pu)ETWi^g}%K(7W z5&x(`XiwJ2<8DGNvlq%u2O8M)bdZx)TS6QO{EkHL4s7H5We5tuwaQqm5XxVveAT_{ z(T35p0KMRyVM|aPoVf@BTn20_Bx-aiuzLI(O|W3|R;YdInW2KNfR_>84d=fLjR$4E-LIG}C2#j*r1n&;O0F@VJwp zgXCkr9I`)A`QsBf5i-7_J4CmVzv7aw-|fMoCkp2!-rb{Lv)$-F-F^{b4<`kL7lC+!HIm;I~x15bMoXnf?jeKCcNdxOqJEVzB5)zRuc(A!uey`V>tRW9#S z=JEPVrU<>cz^rJjsS&@WE#VU3()>KQ?4~~tGAk_ZUlfWx@idS#^q3`Thm5GFQP`mJ zvX^ipxMjRBeDon8KF5gVo-FE!wg7X|$7BDasV5DMNFy8!`?*((snK78aK=M8S}qwQ zTxWfM=WgZuM6!+Kn(+y;GnkrKqZ*qcdV&B1aBkEZEX1=Z8~L>VxzHUbT;(v)#dNK5 zGfLX=2u7S;wqC%jl7-H(I4iK0f&<0*@k10O(tgQs^Ajkpa}6Ik;(3BcHP1_B{O(V= zdFpnJxu481X;|zPEQK5geya0KAtajIfb~n6oE;UNFJ<;sbu}`E!@c zp9Y;ZUgs1DY=EKHt$t{aXOLkwWLY>Ixqyi8?%zaSGeaQJHz=+bNDc)fp@YuLbNl zEkun|W56)SjKWZ)KkLo_JIVWzH&LYP?L{_3W2JQ|U5_Y>j|Em&rWrkC&nIAn1YmH#{qv(;vhE1B15X)w{hh`@ebw0BW3ZC`@^V z!C;rVcT1<6!yjZy5N!IE>aXi7;M?A>nn@9U>;>oAJzyN>MP$fL`n1$OY{bkkEMp?_ zW^LD4{$tB*h}ZR({jf<_MLt2F^g{5vtn`!2g7U;4JZAMzCiq62;YkLdKs1Re_?hls zaXRsR>g?#13$Lzkl~aVn3kIeBMaK7~2edL}_a$Bn;C&2e^`?D>akhdZJS>^5-JQyy ztH#H(IZ|%H&nO98ZHAj$@@G>|TK=#MITzIv>>RSz=RDpd9Qze2Qh9KTdhw@WF3i0> zEKsp7_yXb;UTGO1VQ|VrFav*1p5zUw7$ZX-T0guuqaVckcMV=xBAd@HsyGUL?;NFf z@sh#XE8FEJ;bJ;P2%$Y-D7F9Zh|ir06ctCRh#M^?llf0Nf{}r&br)L5)KAbm8NM>Y z?DX(>+O~s&mQ$yseq_8*$DrP?ANOGmbIyXruFmT!S8#V;b9Q4{y9asN%(PRDELxsPdxkrBqVuWS)h*(@(qA$T2 zmEd%(Qo`Z)csLgDx`}6ypF}km)R&OWGoRjvpq=5c$DN}(Nl){!Bfe$s-V3d8wL#Yf zPwoS|vOPn?c0%Xz>qrFoJfL1*)8y0WZ~Ts_>|1_=aJox3JhdT|r9t@&zyP%!9g?A- z2EMv|aA8kfpT=|23;y&2ZoEyuZt<+mg;wJIA2owFzstVp#-yXv{m|I_E7Cni7_)9KZ?vc9?{)Lrr}feB zn4}r>#+_%e(*HdcD7DjBk?&rfPs zOf%q-(^T!tWE#nf@#{^vr8eVFq!6e}ET!1fbdFO>dbnv$g@nZ-6+B zP2Nl3I6^U(MIFCoP_oMMgN6+V?i$hs1a8aX&;7zs_h^W+)@1Y2nQ zeYQ}Uv>f$x2=h5mY+x+dQyM$^3jhtb zz1RAdLs?2QzHefkgEzPqHQb%s@iXMPu$)R)v6=Cs=eu2cJtt4;e0aY8+kjq7G8U)T zc@OvHp3?QD%U>rcsaXewjx-U}zQ~Qdgxc_{F@%i`xqL@r)moqt45nrAZ{uV+nn_Z! zO;&B)gM+G!m+WyaagM(M9+x-_`t`D7vdCVu9+%Oh$JWgR_VwOO{y^$_DywoKKb9sd z+Vr3x#dgyK3EQ~a2~>WU?@5gypRIpElYmmGI`xZ9N6_K$IRfUkfAc;d9*{lr-hGg00hESjEc^L;z{})1)>YUUU+t#+VZ>%&r(!}dB;>!yv z>-dKOIWQq(@}PUL>&+m~Im1e8o7^3pmIH!MF{f>R zX*uXoK_vIGC>A>doHRzZjUOi=afpopNp^8X-DLgcbghOnhmJ2lMKSgMteqK6x5QZw z*>H&L901_UX&jM!-$~=L_S5jNX_W`)PZVK1$t>Lk?79UR+W;O|)E?nQHC)hWz2BcYL@k#`i~hW>bCHG*yIM{}JJm39@? zcM>zn{$;QBdWNBAuYMe1;dV*+IMXtrCcQnZzk7BKJ<{UwI^^q2?p7hzw|&*4C#^(} z;W65}aRNn#yrR4AXP(r;iFnL{Pz0)_H=qUN|IVa>lhg7kOuYLvTFwoug*VP~A|0)% zvXPB3WY^U(|SX;89W(bzhIQ!cP(yR zv8pqD&c!ysEj-&S@0w!|aFYg@`~m_b;8>;Pm}9dwO%`@2rV*$Zpks(#D?Y*w>k9Zi zn7}AMP$7|3%g^)(Gi20l&7|_eWM0&{mknAd_$^sqY9QE<|4t`MU z3zg)@Glta10&EiJ{ub#xdTov&+R_(JF&6A@YUg!20ClP7D8~1=@ZHxmeR0E=&{0qx6U^sdFOT5GzhDEO`~aEkW&|#^NB?I8;f!WxPOWT{?sibcEj(?#U|U)HS5ys zXq!~I?KS&nV7|_eZ3AnQXwvtrkb7Jaiz*5JLs%#nyd z*ZBOr)n_*#ybtLm0X}szeMtEsnL9_)4;ho2?EdO*h+?6n^2_I9;4=>tiFh{v>7Q`G zJ-eDKTb&$o2RVR`lf_SNrQ^PIx846t=BLTV*Pcs`sPv6OiYLq@02}Yn`A-uv5-7;1 zu0Y0m2ryh70*cC6!U~ zd2Rx!^O+ZwpQ~Y!qXG2qc{9fz9gtzj|BNr6ey_rU?a1c(mYz^imRFuzsVF73%$xoA z!G$>w;jLUMf!YRoBuvjPxu*bg0snCeZoaIhJtTm30fvEUQ)B0<$h+>@6=IRx+RJF| zppxC07Ak@KQ}=G3JvPD2*=GKZ;124zebXm+kZXB!$tB2%Kdbjb^3v4f-AsUxAyOIp zpq+Tv+N$iVUx_=Wp>snQOA)>|#4_o+X``}Pngvjxq2s;TY%^O=KHW(WeTkXz_+hUo zJ<(z$llk6~+>0B+(t)F^Hq#NnTU4;{U(9W9^G_E|8~$ZJ1&eC0r1@(oWL@+PT3F_- zpadM&Qu0NVDAcC}X6RcPkrtA?2t~rKo)5^Z$hx{to4>T=01T8c|EEF5H9iV|3L&anQ#rKFO7$tn7u~n&v+jBL4QOfFp|gWChhJ zdy~JTu1@fRat}J=d$~8_Ohb2B>yH}sT{gZ#N z+`}sga&+)hRXVG|q5L8xClH0>ax1tPKD8jR)ew|>aW*5~p(Ba4aCci0`uWiGOVt5PF`U=Sp15@hM`dQ#WP|T%jg>?w34L~gcHY4{5W9s zy^^n4Boa@oITc>*IS34T)lh2-O)K-_-E!+)a5#>_;CFbg$!bsY7ip+(Dsu;$SEJ)+ zm}!eb9Da8DT9!z_=-l7%dwF#fc z8qdebUCM3A%!Y7^S%ry4Efr!caiO{x%QJUP)W1IFe^YLG?QKN*2NH78r+jdqU3xB~ z|J-!xMn;k*%PGpY=QC_=>*-2*$&&dTHXks}(uel5c*Kvd-}yOpMepNO=aWAiwDo|Y zLqH#IHdj7}*@uQ**FQ5#fa*z6OrzMD=2$DnMn({ye=uLG`O!Lab2YpoA@aWL9P^mN zJWG8G|!BcnT21ew}P1tVbh2rl;3Bb*v2mT^}A7)^pH-uH7Mt=A+K_)F{^lGaTMxN!Ow z_#czhe(=rzEQ&$Pz5^L4%zuqWg{1=bN&{*J^j;<{d#-opn*biI6Pcy>9?%wQUZkZrTKUsM7Od>>h9mQ4oK2a2=nEpxVbKtZ zTjZ6HIbKxtiWuk2nqp;%jxgRyBa~PY-5C!P;TBm^;Us}lL{n->PrS`ek)mlJmJ4~H zyr2yg`uyqD2?r8b6tv-qK+>L=AQUX^&3JU|HTfNV|E`f8fbJ?joAL@0PWa~IfI{!x zk~T6lY+I_#)}NaO@kv#A;mJ?r_%sDS*E7XHpnj=P!4dfzu4fH){HG#eY^&em4~ zpH+VA7W*XFB2^t;!D)ftC=;oT$TT60a|ApP)MaYq-=LzjgKlUmEWZVNzpmk_;(VwL zFUzSv0tppaRn1nFS<)a7POnVhQT#7d9wH80Sl@u7)dRwuL|`ycWau&&tb6B4uE|*m z*{~b$toloA?HMfQ{1n^Nu(BH%IS$$nEqq-KE4RcKi^p@RM*NrJwG+WQLyz9zULKo> zWdrpBwe>wLR;xVGGiSqZ;0WxV-DMNCga(jxm3+mk-mY3_eVadx(4&xniy6Nav3wz;8% zKI49!i`>C^rMiA1!Gv?ijo9?o?iU9=V)n$$MQ3w63hHd61Qlay%X|9-WbgTL;MswhZ*Atu4_U)kO+m72l3Jh0iwlWf`AJ$*GZ*fZRL_Q9xTU=* z&{=|mUwd7mVHF(`od6E4Ejlta{g?53_1ePd^%X$^O=o*xQ0nPU@S8i`Yh_7_+J*j& zDKS5$A&vFkF2EZMMh;rVTYe}`Y5 z8!*!=v28~~FZAF19J?{oN8UbvmJU;;Q7|{We*8OI4P;-u#*SXv6em_U!qGcrO%}D@k-7&jH1gV7D)kM5R>|xk9~A zNj_^8pDN>)27=(1A|~Osw0PlASh6bHv;`K|XExh-myHMZ|SwV~TAl_tQjG8t&$ zDbGyufrvBV@$(MWI%jLa0M3$!`>X2R(GhWB*lIthX}ch_NK8-}NaAmTg4DfJAon69 zq3_|ayUkOn^>haFpBFvTjbeJ)XMgSnl2@JD@*vxc!}4wj`! zoyx-5Y}Ad%sq~!xGedigY4Ssb(Mj$xBq$!B6!%32GLlm%aWP zkZLYgaCE0iJy_I0Q%@clp#7RhEGFzxNT20n!kEe};6CgDawS?zBxO(ZxFO@QkUn`@ z;v>^MgHx1!XPMj0dionNB4RymIa35mrXy6gTNoF{Bj%fk7Y^pK3t=O+!ErK-q6)~q^HC!=j{hg@X|U0;%^CnrG|bTbude z#pbz8Y5modyXm*yJ~;Ld%!~_jkh6@XBhxJ5@z;?2Q44lv{~$Cw5E6aQqE=dU{mrV( zMb1c|^oS6!l3xhIat-B0ozowaAj6;i``Ng4U;^g$GFH;kXc}Gyt0_O79lfQ|QmL>N zWIhk`v*2!PZrBQox;~$671MO?v^25BwkgbG9!FMAH2TuD@aVdLNY6-eeE#Y5O;D3F+O0P&a{g$bmy=r(o=2mcp^ z*?zx%vb}Ts$~S1`Z`}=zrB0p^QX({zw(0y_`)%`oKkIilSdtd;ml2l=wLd4^VmYZb z_vXKt+{%dPK7B)bxTM>Y)0YbF3aN83UIa zqN8GFo^ttl!IU>{{!#_{wze{VFYK58qL+2TqsOje`b!UQ-Tkx1R8YD(?7R4dqX`Ap z5iwx9q`X(f)ISK{EQn*L^r>wKZZ4hJPXU$x1gB_?~|?bTMC}CeX=w}wnK7EfsI{eA7ZcX;eFo`Cd7CA_bwtyxki#w>$k9`djdBZ@SG~+NE9={|D zT^xLB+T^{2(H;*=GQSWz56L+mjN>t^Ac+V;A^G`UduGwf_oJ@TkNHPK(?p@;FnjCA z3J;J2k;F6ex@>CP1H`BxnDOArH$0H+xeOlV$(Vx-6P(lofD|2y%6LM_Z$+}l0xZxA zBJ$*X2F_24Y~%dOmzU&TnD27H#fV42hNq-TX;BNrd?6O!YhWFmp*x6Nu3&i>ZY8eu0L+z6nsJCp=CL zck0L3zddh%ybhw2xOj8t|;S!fo* zKEY1;&1s&2Gxe<03u)1g!DXkR_OOJQI@q}`>wu;ak{&wjZxU3#elptG)(`1~PSAQe zh}nS04ZVTKzg4*`C148;GaZl@PMB-shfjoY@I4%j` z&<*JmJOCh4@2%}rPjspe^mYrOQ}X`VbffIv3d3(aEKLd~6nOYd^_23@6fa9IE(ggE zik(>T51mT*y2Z?pU(A!=+FG_;tOdbEr^9MVdj!9V_);23F#euc4{rc0;3|ii_ckiS z(Ij`3hgx`gteVaJIQ~w6SAU&B5px4))19Ay{CT!a94RajJWsf}BOOe@_Po(j3Lcj+ zq)(xfy%eL8x53^r9$|w%cQ`Dsvc}+YO=`&zBj$#NoAbR+MT@qs_ddGFTLoSYzA@rt z8XfGvaK>eM`u&4p4EL17oqqjI=gHtYQ*!RyopW$V zH~0CB$(d(cV3MR+*48BV6dFBP9nbX?9kjlxXi5v(yaxEMIJMfxA75mhp@WB*xS!VJkXMZJ4%Q58V^gAj_x(0X{3>hCBL63 zz0JyQ30*+3lS*dpqZ^=~MCs19uXrawOhra(^atlQ%0&ghewrPm1O-7Dc7#vhKjG#I z%CNIE*cZ-Y=3DcQVPK3nIFskpM)n8YJJ9X#Mt@AMl`DhG$?z+cpnb!8PRe4JeNk5` zAqL7UH3-l;KB^<8Ij#FlyXc9`=;oViSU#LVRr2zLq z;!G2Mu5EPR6UB^#)44yOAq7JAP0|J`obF8`ToHyU*$PXSJa5jrrIsY*91C7n`z)BpFLiH|&phZn`RVY+o7An4c(2HZ75nh_TPn$vEhtD2T? z6tPTAyR7+qe6#xPX02ht>mJQS->B(^X6NIci{t3 znoKvtH_bX%)C@i}Ylhn!y`dWgG^?LIsq=2vklJhWge~5eA3*y#iS_8I%!WgK+TL9WhK{QrFPOttwj&JXY+l}9(z*Dc+d3Fo=MGK zx4ODh|2y!S*ul&A>FHG1d39$^=Nl6sp^nFAZ>zf`wUYAt`-2Kx%GBLzTHPAe-P>E; zpR0Qewt77J37_I-%Y0YyvGx3Sb;j7u^YoOt0 z-sWeg;eWQx-&5m)beq9BLzqlFVp%>gsV(rXM$rAXpfZi%nzrCZjga=XkmnkqgKeQ> z8e#9+!j?2HuD4zMt`WZ97XCfPB_`&}h0??!R*V?iH}d zzFUaqbpy@Y`|Y=xn&jro5q4L;Oaa{eAnpUV<4vTG6C}1N`mHwrx5NP!L!s;!QU)n( zHyF2;2;8Jtxk);P9J^t0ka&fdf{jnEIUx0el9KKu%#%`e4k+_v2%2$x-t7$;(oe~N z6EhK=nOLnX)_(G%6r)f;po7jQVJL)V@J*2#vre)}7;=_3ry9f(1NODB@!%;yz~hiT zAH;?0fRINUZLVrZUA@2W23Dr9XQLJgwx(4iM-(72_(C_>I{*RP0cP)zuY=4wu62)3o3_>2=o$-)I4I`ptSi&5 zuQ_rPxoRwNSSdos=w4$BJ$hUOYLGUpHt4Lj?x?;U%lVa@AWdNSyT?AX(@JE$UTjRMo~P$43zohiRnK1opFAwLCjM8+$T`OBqJK9I7&c-l zY#vW(Nm_LV*BhxUHJiE=nm{my3wv0(dd)`P=l_fCGAF6+S!wmq$8>p!%p z%mk5GP9cC>nbM#}oPP3$&xOcUe6`?AH}&of&KWu=Pg?{HneV`eHIeHpFopO7 zB0U{5rc8(Tyl3xWC68iAhG2pY>&f!Y#vaz?j(&rqmr2(r+k2?@4@d2Y0>p!+kSjtF ze>tX{eT$at`X-t&OtqSdEQpT-VL-}dvdp8^NP_Ckc_` zKCucAj4}O|t70$tq|_6~YZ+_S;FIcbsq!Zdz8ORoA>H_FC`%s{#Z9wlnt)sKap&}> z#CrJ*B(ZRzQ>bQQri4=-H~24Q2Rc-mXGuAA5h3T$onN+#| zRX_dU>4TqC4JvM+n0>e}ft8k;*%?nv6NW2XJH^?Q$gifpzA3CaVc6d$k&|gsOZR4j zu>@l-aMqY*Ko#sJX@MVrG-f$A>7=dTI{i+WWlZRwPHH1R9~h;ol^=C^xvS8wD?-Jj zJuW8zyODTqyWB`XT+sY+5Qml79cdmRuRoa=*!V&n>isO6ew=H`4%>X)*}Q%q;^}hg z)@a_%>-*nV2Jah`-MU$Io{=gU@)pkaZg3)k4jay3eMva*vI?YB}f`ED&SKA2~FO@3kW=A6)$~z$?JIYsEUA@L{FUpCALvV{sRZm zMDNIk`&dh(Wttd<3rv=#iDx=HBWK3+4!`Ee{pl58ea!afQicW}Cv6liXtlRpZkj}R z*(@*>TL&k+doM?k2%cfk3sv7|!b?VG2$%(-uYpR_(O;Bo7KFIQl`w*Hs)c20T=!jRQnp~>i`&0U}ez{oq?8m%{Glzcn zeJ^VH-3feKu$s+evbk+kq$p}XBEtsA8R>aGyr~astI|JL;zMl3E1!(IeQD_YHups@ zYY{7ZuSiNqruez7`&R4h#rd#XSCB=C8uqpG-=6M_x_|FE{5JpnISA{q%|I!=-|pkE z^Vk{S4}ZTiD0H3?)jt7b&ZQhU!IJe z|Gm}u{rpvpUMm2G9#UHRvpZqu`S<5+_|o6~mAjt*4nH?8{rkN$=E?kf_^ zOePsefPn7-P?)M>CWS3}86t`^MA>G>@w6<%RPqhkE@o1N_m&ZcI3tcbnemb*S5OZ5 OMm)0YAQBP@==>k{B!u|@ literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_ndc_filtering.gif b/docs/lf5/images/lf5_ndc_filtering.gif new file mode 100644 index 0000000000000000000000000000000000000000..e44fc2f955aba19e163b331a1ac4199e8addc929 GIT binary patch literal 42345 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

      q@l>gdRIK#>^xsFUb|;*- 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 F06VK0Qw#tA literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_openfile.gif b/docs/lf5/images/lf5_openfile.gif new file mode 100644 index 0000000000000000000000000000000000000000..4ca07c554d4d759120849d86adb21b6c00cfdf4a GIT binary patch literal 51140 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

      Zwy!v@it?y<|tA-AAQe|dhg~?l? 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 literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_properties.gif b/docs/lf5/images/lf5_properties.gif new file mode 100644 index 0000000000000000000000000000000000000000..1758d1f86ad431da93164f98c44d74834a146281 GIT binary patch literal 52169 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 literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_recorddetail.gif b/docs/lf5/images/lf5_recorddetail.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd7c942f7800edd2f4a13a30596206bb69ab20cb GIT binary patch literal 55142 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 literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_remove_categories.gif b/docs/lf5/images/lf5_remove_categories.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c45926fa3366fc904e3d49330a6d79b5739b0c2 GIT binary patch literal 66759 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� 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[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 V&UoXFKMr~1l21-~-4_G|06SqN`p5tP literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_search.gif b/docs/lf5/images/lf5_search.gif new file mode 100644 index 0000000000000000000000000000000000000000..bd218ab970325072e986cd43df57366f21210886 GIT binary patch literal 59820 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 literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_small.gif b/docs/lf5/images/lf5_small.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c6fc10313447f9bc1bb17c50104bad41ef1fb32 GIT binary patch literal 19171 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Ƅub(MS~Q}ZV0nIDummuZET#0%L=q(Onr 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

      3>(W~4jEYN<+-dB^&iL&< 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 K5(k3;{r>@Sh?so< literal 0 HcmV?d00001 diff --git a/docs/lf5/images/small_right_arrow.gif b/docs/lf5/images/small_right_arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..deca2b4b865d965932fb12067ac8a49aa4a9e4bf GIT binary patch literal 76 zcmZ?wbhEHbS2(POes-L56w;O!wY0DE?#tiZd|ifC!LU b1}4Fl{>+7E=f<(DIi#Few*B{f5e91jL;)6B literal 0 HcmV?d00001 From 90be41a12183a8be078e5333e19387b08181e06b Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 11 Jun 2002 21:18:27 +0000 Subject: [PATCH 030/342] Lf5 documentation. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309576 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/lf5/configuration.xml | 114 ++++++ src/xdocs/lf5/examples.xml | 649 ++++++++++++++++++++++++++++++++ src/xdocs/lf5/features.xml | 249 ++++++++++++ src/xdocs/lf5/overview.xml | 76 ++++ src/xdocs/lf5/readingfiles.xml | 99 +++++ 5 files changed, 1187 insertions(+) create mode 100644 src/xdocs/lf5/configuration.xml create mode 100644 src/xdocs/lf5/examples.xml create mode 100644 src/xdocs/lf5/features.xml create mode 100644 src/xdocs/lf5/overview.xml create mode 100644 src/xdocs/lf5/readingfiles.xml diff --git a/src/xdocs/lf5/configuration.xml b/src/xdocs/lf5/configuration.xml new file mode 100644 index 0000000000..ea38eabbf3 --- /dev/null +++ b/src/xdocs/lf5/configuration.xml @@ -0,0 +1,114 @@ + + + + + Brad Marlborough + LogFactor5 Users' Guide + + + +

      + + +

      There are two ways of configuring LogFactor5: using a log4j properties file, + or using the Configure menu in the LogFactor5 GUI. +

      + +

      Configuration Using a Properties File

      + +

      The LF5Appender has a single property that can + be set via a log4j properties file, the + MaxNumberOfRecords property. This property is used by + LogFactor5 to determine the maximum number of records to + display at any one time in the GUI. If this maximum number is + exceeded, LogFactor5 begins to remove the oldest records, one + at a time. Removing records in this fashion reduces the risk + that your computer will run out of memory while the GUI is + running. If the MaxNumberOfRecords property is not set, + LogFactor5 sets a default value of 5000.

      + +

      To set the MaxNumberOfRecords property using a regular + java.util.Properties file, you should use the following + line (replace A1 with the name of your appender): +

      + +
           log4j.appender.A1.MaxNumberOfRecords=2000
      +
      + +

      To set the MaxNumberOfRecords property using an XML + properties file, you should use the following lines (replace + the name LF5Appender with the name of your appender):

      +
      +    <appender name="LF5Appender" class="org.apache.log4j.lf5.LF5Appender">
      +       <param name="MaxNumberOfRecords" value="1000"/>
      +    </appender>
      +
      +    <root>
      +      <priority value ="debug" />
      +      <appender-ref ref="LF5Appender"/>
      +    </root>
      +
      + +

      Note: Setting the maximum number of records to display + via the Configure->Set Max Number Of Records menu in the + LogFactor5 GUI will override any value that you set in this + configuration file. +

      + +

      Configuration Using the GUI

      +

      Save

      + +

      LogFactor5 allows you to save the current configuration of + your logging console using the Configure menu. The + Configure->Save menu option saves your current GUI + configuration to a file called + lf5_configuration.xml. This configuration file is a + saved to the location <USER_HOME>/lf5 on your local + drive. +

      + +

      The information saved in the configuration file is as + follows:

      + +
        +
      • The current configuration of the logger explorer window including all + selected and de-selected channels
      • +
      • The current configuration of all level
      • +
      • The view settings, and
      • +
      • The last NDC filter used (if the Restore All NDC's item was not selected + prior to saving).
      • +
      + +

      Once you have saved a configuration, your configuration is loaded each time + that you start LogFactor5.

      + +

      Reset

      + +

      You can remove your currently saved configuration by using + the Configure->Reset menu option. This will delete the + lf5_configuration.xml file from your local file system.

      + +

      Set Max Number Of Records

      + +

      The Configure menu also includes a "Set Max Number Of Records" option, + which allows you to change the maximum number of records that will be displayed + in the GUI at any time. Setting the maximum number of records using this menu + item will override any value that you set in your log4j property file (see below). + Note: The value that you set using this option is not saved into + the lf5_configuration file.

      + +

      Removing Empty Categories

      + +

      When you save your configuration using the Configure->Save menu option, + and then start logging from a different application, you will likely find that + many of the categories you saved are empty. You can remove these "dead" + categories from the display by right clicking on the root of the category tree + in the category explorer, and choosing the "Remove All Empty Categories" + option. This will prune the category explorer tree to display only those channels + that contain information.

      + +

      + +
      + + \ No newline at end of file diff --git a/src/xdocs/lf5/examples.xml b/src/xdocs/lf5/examples.xml new file mode 100644 index 0000000000..dbd132c73e --- /dev/null +++ b/src/xdocs/lf5/examples.xml @@ -0,0 +1,649 @@ + + + + + Brad Marlborough + LogFactor5 Users' Guide + + + +
      + +

      Example 1: InitUsingDefaultConfigurator +

      +

      Example Description:

      + +

      The LogFactor5 library has a DefaultLF5Configurator class which provides a + very basic LogFactor5 configuration for you. This class can be used to programmatically + register an LF5Appender at the root of the org.apache.log4j.Category + tree. The InitUsingDefaultConfigurator.java class demonstrates how to use this + configurator.

      + +

      When using this class, all that you have to do is make a call to the static l + method DefaultLF5Configurator.configure( ), and your basic configuration will + be done for you.

      + +

      Running the Example:

      +

      Option 1:

      + + +
        +
      • Navigate to the examples\lf5 directory and double + click the InitUsingDefaultConfigurator.bat + file.
      • +
      + + +

      Option 2:

      +
        +
      • Ensure that the log4j.jar file is in your CLASSPATH
      • + +
      • Ensure that the LOG4J_HOME environment variable is set to + the directory where you installed log4j
      • + +
      • At the command line, change to the LOG4J_HOME\dist\classes + directory
      • + +
      • Type the following at the command line: java + examples.lf5.InitUsingDefaultConfigurator.InitUsingDefaultConfigurator + +
      • +
      + +

      Example 2: InitUsingPropertiesFile

      +

      Example Description:

      + +

      The log4j environment is fully configurable + programmatically. However, it is far more flexible to + configure log4j using configuration files. One common method + of configuring log4j involves using a properties file, and the + org.apache.log4j.PropertyConfigurator class. The + PropertyConfigurator class allows you to load properties from + a standard properties document consisting of key=value + pairs. This example demonstrates how to load LogFactor5 via a + configuration file used by a PropertyConfigurator.

      + +

      This example uses a very basic properties file, which is + loaded via a PropertyConfigurator. The example.properties + file has only one property, which registers a LF5Appender with + the root of the Category tree. The + InitUsingPropertiesFile.java class loads this file using the + PropertyConfigurator class.

      + +

      Note: The example.properties file used in this example + is loaded as a resource via your CLASSPATH. For this reason, the + example will only work if the directory where you installed + LogFactor5 is in your CLASSPATH

      + +

      Running the Example:

      +

      Option 1:

      +
        + +
      • Navigate to the examples/lf5 directory and double + click the InitUsingPropertiesFile.bat file. +
      • +
      + +

      Option 2:

      +
        +
      • Ensure that the log4j.jar file is in your CLASSPATH
      • +
      • Ensure that the LOG4J_HOME environment variable is set to the directory + where you installed log4j
      • + +
      • Copy the provided log4j.properties file to a directory + that is currently in your CLASSPATH.
      • + +
      • At the command line, change to the LOG4J_HOME\dist\classes + directory +
      • + +
      • Type the following at the command line: java + examples.lf5.InitUsingPropertiesFile.InitUsingPropertiesFile +
      • +
      + + + + + +

      Example 3: InitUsingXMLPropertiesFile +

      + +

      Example Description:

      + +

      Log4j can also be configured using an XML properties file, + and the org.apache.log4j.xml.DOMConfigurator class. The + DOMConfigurator class allows you to load properties from an + XML based properties file. This example demonstrates how to + load LogFactor5 via an XMLconfiguration file used by a + DOMConfigurator. +

      + +

      This example uses a very basic XML properties file. The + example.xml file registers an LF5Appender with the root of the + Category tree. The InitUsingXMLPropertiesFile.java class loads + this file using the DOMConfigurator class.

      +

      Note: The example.xml file used in this example is + loaded as a resource via your CLASSPATH. For this reason, the + example will only work if the directory where you installed + LogFactor5 is in your CLASSPATH. You will also need an XML + parser (e.g. Xerces or JAXP) in order to run this example. +

      + +

      Running the Example:

      + +

      Option 1:

      +
        +
      • Navigate to the examples/lf5 directory and double + click the InitUsingXMLPropertiesFile.bat file. +
      • +
      + +

      Option 2:

      +
        +
      • Ensure that the log4j.jar file is in your CLASSPATH
      • + +
      • Ensure that the LOG4J_HOME environment variable is set to + the directory where you installed log4j +
      • + +
      • At the command line, change to the LOG4J_HOME\dist\classes + directory
      • + +
      • Type the following at the command line: java + examples.lf5.InitUsingXMLPropertiesFile.InitUsingXMLPropertiesFile +
      • +
      + + + + + +

      Example 4: + InitUsingLog4JProperties

      + +

      Example Description:

      + +

      The log4j library does not make any assumptions about its + environment. In particular, there are no default log4j + appenders. Under certain well-defined circumstances however, + the static initializer of the org.apache.log4j.Category + class will attempt to automatically configure log4j. The + Java language guarantees that the static initializer of a + class is called once and only during the loading of a class + into memory. This automatic configuration is done from a + file named log4j.properties. If you have a + log4j.properties file in your CLASSPATH at the time that you + instantiate a Category, log4j will register any appenders in + this file at the root of the Category tree. +

      + +

      This example provides you with a very basic + log4j.properties file that you can add to your CLASSPATH in + order to register the LF5Appender with the Category + class. If you put this file somewhere in your CLASSPATH, all + logging requests will now automatically be redirected to the + LogFactor5 logging console in addition to any other + Appenders you may have enabled. +

      + +

      If you look at the InitUsingLog4JProperties.java file you + will notice that no Configurators are used in the code. A + Category is instantiated using the getInstance() method, and + logging calls such as cat.debug( ) can be used immediately. +

      + +

      Note: Adding the log4j.properties file to your + CLASSPATH will reduce the number of lines of code you have + to write (e.g. you will not need to add lines such as + PropertyConfigurator.configure(configFileResource)). However, + you should be aware that using this default static + initialization has application wide effects. All logging + will be directed to LogFactor5 if you use this approach! +

      + +

      Note: If you are using a log4j.properties file in a web application, + you need to be aware of the fact that the static initialization process uses + the system class loader. As a result, if you add the log4j.properties + file to your web application CLASSPATH, the classloader will not find + the file! g4jSpecial/LF5Update/jakarta-log4j/docs/lf5/UsersGuide/example4.html +

      + +

      Running the Example:

      + +

      Option 1:

      + +
        +
      • Navigate to the examples/lf5 directory and double + click the InitUsingLog4JProperties.bat file. +
      • +
      + +

      Option 2:

      +
        +
      • Ensure that the log4j.jar file is in your CLASSPATH
      • + +
      • Ensure that the LOG4J_HOME environment variable is set + to the directory where you installed log4j
      • + +
      • Copy the provided log4j.properties file to a directory + that is currently in your CLASSPATH.
      • + +
      • At the command line, change to the LOG4J_HOME\dist\classes directory
      • + +
      • Type the following at the command line: java + examples.lf5.InitUsingLog4JProperties.InitUsingLog4JProperties
      • + +
      • After you are done running the example, make sure to remove this file again, + otherwise the logging console will always be registered at the Category root + automatically.
      • +
      + + + + + +

      Example 5: InitUsingMultipleAppenders +

      +

      Example Description:

      + +

      In Log4J, output destinations are called + appenders. Currently, appenders exit for the console, rolling + log files, remote socket servers, NT Event Loggers, and remote + UNIX Syslog daemons. Suppose you want to output log messages + to more than one appender...

      + +

      This example demonstrates how to use LogFactor5 along with + Log4J's RollingFileAppender to output log messages to both the + LogFactor5 console and a series of rolling log files. The + example.properties registers two appenders with the root of + the Category tree.

      + +
      log4j.rootCategory=, A1, R
      +
      +# A1 is set to be a LF5Appender which outputs to a swing
      +# logging console.
      +
      +log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
      +
      +# R is the RollingFileAppender that outputs to a rolling log
      +# file called rolling_log_file.log.
      +
      +log4j.appender.R=org.apache.log4j.RollingFileAppender
      +log4j.appender.R.File=rolling_log_file.log
      +
      + +

      Users must also define a Pattern Layout for the log + file. That is, which pieces of information you want logged to + the log file and in which order. Information on the various + conversion specifiers (i.e. d, p, t, l, m, n) are documented + in the PatternLayout class of the Log4J API.

      + +
      log4j.appender.R.layout=org.apache.log4j.PatternLayout
      +# Next line is editited to fit.
      +log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n\
      +  %p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n%c[slf5s.CATEGORY]%n\
      +  %l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n
      +
      + +

      Users also have the ability to set the size of the rolling log file(s) and + the number of backup files that should be kept. In this case the the size of + the maximum size of the log file is 100KB and the number of backup files kept + is 1.

      +
      +log4j.appender.R.MaxFileSize=100KB
      +log4j.appender.R.MaxBackupIndex=1
      +
      + +

      The InitUsingMultipleAppenders.java class loads this file + using the PropertyConfigurator class.

      + +

      Note: Another approach would be to add the + RollingFileAppender configuration to the log4j.properties + file. This would cause the InitUsingLog4JProperties example to + use both the LogFactor5 console and a rolling log file as it's + output destinations. +

      + +

      Running the Example:

      +

      Option 1:

      +
        + +
      • Navigate to the examples/lf5 directory and double + click the InitUsingMultipleAppenders.bat file.
      • + +
      + +

      Option 2:

      +
        +
      • Ensure that the log4j.jar file is in your CLASSPATH
      • + +
      • Ensure that the LOG4J_HOME environment variable is set to the directory + where you installed log4j
      • + +
      • At the command line, change to the LOG4J_HOME\dist\classes + directory
      • + +
      • Type the following at the command line: java + examples.lf5.InitUsingMultipleAppenders.InitUsingMultipleAppenders +
      • +
      + + + + + +

      Example 6: UsingSocketAppenders

      +

      Example Description:

      + +

      When logging messages from an application, it is often useful + to log the messages to a remote location over a socket. Log4j + comes with a variety of classes designed for this + purpose. This example is designed to show you how to use these + log4j classes in conjunction with the LF5Appender. +

      + +

      Two specific log4j classes are instrumental for logging + messages over a socket: the + org.apache.log4j.net.SocketAppender class and the + org.apache.log4j.net.SocketServer class.

      + +

      The SocketAppender class:

      + +

      The SocketAppender class is used on the application side, + where log messages are being created. This class sends all + logging messages to a specific host and port as specified in a + properties file. The properties file can be either an + application specific properties file, or the system + log4j.properties file. In this example, the + socketclient.properties file contains the information that + registers the SocketAppender with log4j. The following lines + from the socketclient.properties file register the + SocketAppender with log4j: +

      +
      +       log4j.appender.A1=org.apache.log4j.net.SocketAppender
      +       log4j.appender.A1.RemoteHost=localhost
      +       log4j.appender.A1.Port=8887
      +
      + +

      For additional details about properties files, refer to the log4j documentation + or the other LogFactor5 examples. +

      + +

      The SocketServer class:

      + +

      The SocketServer class listens on a port specified as a + command line argument. The host and port of the machine + running the SocketServer class must correspond to the host and + port in the socketclient.properties file. The SocketServer + class uses a separate properties file to determine which + Appenders it should forward incoming messages to. In this + example, the socketserver.properties file contains the + information that registers the LF5Appender with log4j. The + following lines from the socketserver.properties file register + the LF5Appender with log4j on the server side:

      + +
      +       log4j.appender.A=org.apache.log4j.lf5.LF5Appender
      +       log4j.appender.A1.MaxNumberOfRecords=700
      +
      + +

      The first line registers the LF5Appender with log4j, and the + second line tells LogFactor5 the maximum number of records to + display in the GUI at any one time. For additional + information about how the SocketServer class loads properties + files (including default properties files) please refer to the + log4j documenation. +

      + +

      Running the Example:

      ate/jakarta-log4j/docs/lf5/UsersGuide/example6.html +

      Option 1:

      +
        +
      • Navigate to the examples/lf5 directory and double click the UsingSocketAppenders.bat + file. After the server has finished loading, switch to the console window + with the "Press any key to continue message" and press a key. This + will start the client, which will log messages to the SocketServer running + on port 8887.
      • +
      +

      Option 2:

      + +
        +
      • Navigate to the examples/lf5 directory and double + click the StartLog4JSocketServer.bat file. Wait until + the server is finished loading, and the LogFactor5 GUI shows + the log message "Waiting to accept a new + client". You can now double click the + StartLogFactor5Client.bat, which will start the + client and log some messages to the SocketServer. +
      • +
      + +

      Option 3:

      +
        +
      • Ensure that the log4j.jar file is in your CLASSPATH for both the SocketServer + and the client class (UsingSocketAppenders.class).
      • +
      • At the command line, change to the LOG4J_HOME\dist\classes + directory
      • +
      • Start the SocketServer using the following command:
      • +
        java org.apache.log4j.net.SocketServer 8887 socketserver.properties
        +
      • At the command line, start the client using the following command:
      • +
         java examples.lf5.UsingSocketAppenders.UsingSocketAppenders
        +	
        +
      + + + + + +

      Example 7: OpeningLogFiles

      +

      Example Description:

      + +

      Log4J's RollingFileAppender gives you the ability to output + log messages to a series of rolling files. However, there are no + utilities available for reading in and viewing those files once they + have been written. LogFactor5 provides developers with two easy ways + to open and view log files. Log files can be opened locally using + the 'Open' menu item or log files can be opened from a remote server + using the 'Open URL' menu item.

      + +

      An additional feature that was added to LogFactor5 was the + ability to start the console window independent of Log4J. That is to + say, you do not need to add a LF5Appender to your properties file to + use LogFactor5. The benefit of this feature is that developers who + run utilities like Ant to test their applications can now view their + log files off-line (i.e. after their application has completed the + test and the JVM has shut down). Moreover, the ability to open log + files on a remote server provides the ability for multiple + developers working on the same application to view log files + independently. It also gives developers the ability to view log + files both internally and from remote locations.

      + +

      This example uses the sample.log file created by Log4J's + RollingFileAppender. 1The format of the log file can be set in + the log4j.properties or a standard properties file and + must follow the LogFactor5 layout conventions in order + for LogFactor5 to open the file. The following is an example + of a properties file with the LogFactor5 conversion pattern + added:

      + +
      log4j.rootCategory= R
      +
      +# R is the RollingFileAppender that outputs to a rolling log
      +# file called sample.log.
      +
      +log4j.appender.R=org.apache.log4j.RollingFileAppender
      +log4j.appender.R.File=sample.log
      +
      +# Define a pattern layout for the file.
      +# For more information on conversion characters (i.e. d,p,t,c,l,m,n)
      +# please see the PatternLayout class of the Log4j API.
      +
      +log4j.appender.R.layout=org.apache.log4j.PatternLayout
      +log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n\
      +%p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n\
      +%c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n
      +
      +# Set the max size of the file
      +
      +log4j.appender.R.MaxFileSize=500KB
      + +

      You are free to use any or all of the main conversion + characters to create ml your log file (i.e. %p for + Priority). There are only two requirements for the conversion + pattern. First, the conversion pattern string must + start with the tag [slf5s.start]. Second, for each + log4j conversion character listed in the conversion pattern + string, a corresponding LogFactor5 tag must be placed + immediately after the character. The following is a + complete list of the log4j characters and LogFactor5 tags: +

      + +
      Date - %d{DATE}[slf5s.DATE]
      +Priority - %p[slf5s.PRIORITY]
      +NDC - %x[slf5s.NDC]
      +Thread - %t[slf5s.THREAD]
      +Category - %c[slf5s.CATEGORY]
      +Location - %l[slf5s.LOCATION]
      +Message - %m[slf5s.MESSAGE]
      +
      + +

      Note: The order of the characters does not matter so + you are free to layout your log file any way you like. Just + remember to include the LogFactor5 start tag at the beginning + of the string and any LogFactor5 tags after each corresponding + log4j conversion character.

      + +

      Running the Example:

      +
        + +
      • Navigate to the examples/lf5 directory and double + click the StartLogFactor5Console.bat file.
      • + +
      • Under the 'File' menu, select 'Open'.
      • + +
      • Open the sample.log file located in the examples/lf5/OpeningLogFiles directory.
      • + +
      • Clear the log table using the Clear Log Table button.
      • +
      + + + + +

      Example 8

      +

      Example 8a: UsingLogMonitorAdapter

      +

      Example Description:

      + +

      Ideally LogFactor5's intended use is with Log4J, but this + does not preclude its use with other logging schemes. The + LogMonitorAdapter API allows developers to log directly to the + LogFactor5 GUI Monitor with a minimum of effort. +

      + +

      The UsingLogMonitorAdapter.java class demonstrates how to use + the LogMonitorAdapter. This example requests a new instance + of the LogMonitorAdapter, and uses the log4j Priority + levels.

      + +
           _adapter = LogMonitorAdapter.newInstance(LogMonitorAdapter.LOG4J_LOG_LEVELS);
      +

      When you log to the LogFactor5 GUI Monitor, simply call one of the many log + methods on the LogMonitorAdapter object:

      +
           _adapter.log(channel,"Doh this is a debugging");
      +
      +     _adapter.log(channel,LogLevel.INFO,"Hmmm fobidden doughnut");
      +     _adapter.log(channel,LogLevel.WARN,"Danger Danger Will Robinson",
      +         new RuntimeException("DANGER"), "32");
      +     _adapter.log(channel,LogLevel.ERROR,"Exit stage right->");
      +     _adapter.log(channel,LogLevel.FATAL,"What's up Doc?",
      +         new NullPointerException("Unfortunate exception"));
      +
      + +

      Running the Example:

      +

      Option 1:

      +
        +
      • Navigate to the examples/lf5 directory and double click the UsingLogMonitorAdapter.bat + file.
      • +
      + +

      Option 2:

      +
        +
      • Ensure that the log4j.jar file is in your CLASSPATH
      • +
      • Ensure that the LOG4J_HOME environment variable is set to the directory + where you installed log4j
      • +
      • At the command line, change to the LOG4J_HOME\dist\classes + directory
      • +
      • Type the following at the command line: java examples.lf5.UsingLogMonitorAdapter.UsingLogMonitorAdapter +
      • +
      + +

      Example 8b: CustomizedLogLevels

      +

      Example Description:

      + +

      What good is a LogMonitorAdapter if you can only use preset + LogLevels? This example illustrates how to use the + LogMonitorAdapter with a set of user-defined LogLevels.

      + +

      The CustomizedLogLevels.java class demonstrates how to customize LogLevels ml + to suit your logging needs. As with the previous example we request an instance + of the LogMonitorAdapter, but this time an array of defined LogLevels is supplied:

      + +
           _adapter = LogMonitorAdapter.newInstance(new LogLevel[] {DEFAULT, LEVEL_ONE,
      +           LEVEL_TWO,LEVEL_THREE, LEVEL_FOUR });
      +
      + +

      The LogMonitorAdapter will set the first entry in the array to be the default + LogLevel. For example, when logging a message where no LogLevel has been specified, + the DEFAULT LogLevel will be used. The default LogLevel can also be set using + the LogMonitorAdapter's setDefaultLevel method, while the severe LogLevel can + be set as follows: +

      + +
           _adapter.setSevereLevel(LEVEL_ONE);
      +

      + +

      Logging messages then follow the same rules as the example above.

      + +
           _adapter.log(channel,"Using the customized LogLevels");
      +
      +     _adapter.log(channel,LEVEL_FOUR,"This is a test");
      +     _adapter.log(channel,LEVEL_THREE,"Hmmm fobidden doughnut");
      +     _adapter.log(channel,LEVEL_ONE,"Danger Danger Will Robinson",
      +         new RuntimeException("DANGER"), "32");
      +     _adapter.log(channel,LEVEL_TWO,"Exit stage right->");
      +     _adapter.log(channel,LEVEL_FOUR,"What's up Doc?",
      +         new NullPointerException("Unfortunate exception"));
      +      
      + +

      Running the Example:

      +

      Option 1:

      +
        + +
      • Navigate to the examples/lf5 directory and double + click the + CustomizedLogLevels_UsingLogMonitorAdapter.bat + file.
      • +
      + +

      Option 2:

      +
        +
      • Ensure that the log4j.jar file is in your CLASSPATH
      • + +
      • Ensure that the LOG4J_HOME environment variable is set to + the directory where you installed log4j
      • + +
      • At the command line, change to the LOG4J_HOME\dist\classes + directory
      • + +
      • Type the following at the command line: java + examples.lf5.UsingLogMonitorAdapter.CustomizedLogLevels +
      • +
      +
      + +
      \ No newline at end of file diff --git a/src/xdocs/lf5/features.xml b/src/xdocs/lf5/features.xml new file mode 100644 index 0000000000..a90dca72fb --- /dev/null +++ b/src/xdocs/lf5/features.xml @@ -0,0 +1,249 @@ + + + + + Brad Marlborough + LogFactor5 Features Users' Guide + + + +
      + +

      Manage Log Messages

      + +

      The Log Table pane shows the listing of LogRecords that have + been sent to the LogFactor5 appender. The newest log messages + appear at the bottom of the table. +

      + +

      Log Table

      + +

      Log + Level Selection

      + +

      The LogFactor5 toolbar applies directly to the Log Table + area. Log levels can be toggled on and off to filter out + messages that you want to view or hide. Levels include FATAL, + ERROR, WARN, INFO and DEBUG.

      + + +

      Log Levels

      + +

      Log Level Color Configuration

      + +

      To help distiguish the various log events displayed in the + LogTable, LogFactor5 allows users to set the colors of their + log events based on level.

      + +

      Log Level Color Configuration

      + +

      Full Text Searching

      + +

      The Log Table supports full text searching. To perform a + search, choose Edit->Find from the menu bar or CTRL-F and + then enter the text you want to search for. LogFactor5 will + find any strings that are an exact match for the string you + entered. Pressing F3 will find the next occurrence of the + string. +

      + +

      Full Text Searching

      + +

      Log Table Views

      + + + + + +

      The Log Table has three views; compact, standard and + detailed. The compact view only displays the Nested Diagnostic + Context (NDC), logger and message. The standard view is the + default view, and displays the level, NDC, logger and message + of the logging event. The detailed view displays, in addition, + the date, message number, location (i.e. the method that is + logging the message), thread description and the + throwable. The view selector on the toolbar switches between + the three views. Columns in the Log Table can be re-sized and + moved by interacting with the column headers. +

      + +

      Log Table View

      + +

      Log Record Details

      + +

      The Log Record Detail area displays all of the attributes of + the LogRecord which is selected in the Log Table. When a row, + or LogRecord, is selected in the Log Table, the complete + details of that LogRecord are displayed in the LogRecord + Detail area, independent of the view in effect. +

      + +

      LogRecord Details +

      + + + + +

      Logger Explorer

      + +

      The Logger Explorer area enables the filtering of incoming + log messages based on logger. If a logger is deselected + (no checkmark is shown next to it) then new messages on that + logger will not be displayed. The Logger Explorer has no + effect on log messages already in the Log Table. +

      + +

      The Logger Explorer displays loggers in a hierarchical + tree-like fashion. Loggers are identified with + dot-separated names similar to Java package and class + names. The name components are mapped to the levels in the + hierarchy in the Logger Explorer. For example, the logger + name org.apache.applications.log4j.InitUsing Log4JProperties + is displayed below: +

      + +

      Logger Explorer

      + + +

      Selecting and Deselecting Loggers

      + +

      When a logger in a hierarchy is deselected, no messages at + that level or below will appear in the Log Table. For example, + if just the first InitUsingMultipleAppenders logger in the + examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders + logger is deselected, then messages with the logger examples + would be displayed in the Log Table, but messages with the + logger InitUsingMultipleAppenders.InitUsingMultipleAppenders + would be filtered and not displayed in the Log Table. +

      + +

      To quickly select or deselect loggers in the hierarchy, + the right-mouse button can be used to bring up the pop-up menu + displayed below.

      + +

      Deselect All Descendants

      + +

      Select All Descendants

      + + +

      Expanding and Collapsing the Logger Tree

      + +

      You can also expand and collapse the hierarchy tree using + the pop-up menu displayed below.

      + +

      Expand Tree

      + +

      Collapse Tree

      + +

      NDC Record Filtering

      + + +

      Log4j provides a lightweight technique for stamping log + requests initiated from the same client within a multithreaded + system. The Nested Diagnostic Context (NDC) provides an easy + way to differentiate logging output of one client from + another. The NDC is also useful for differentiating log + messages being output by different members of a large + development team building an application on the same + server. To improve the sorting of potentially thousands of log + records being output from multiple clients, a NDC filter has + been provided. To use the NDC filter, select the Edit menu + item and choose 'Sort by NDC'. Fill in the name of the NDC you + would like to filter on. All records containing the filter key + word will be displayed in the Log Table. To restore all of the + log records use the Edit -> Restore all NDC's. You can also + use the Edit->Find feature to locate NDC's without removing + log records from the Log Table. Furthermore, you can use the + Configure->Save feature to persist the last NDC filter key + word that was used. Note however that restoring all NDCs will + effectively erase the NDC filter key word. Refer to the Configuration section below for more + information on saving NDC filter key words.

      + +

      NDC Filtering

      + + +

      Read Log Files

      +
      + +

      Read a File

      + +

      LogFactor5 supports reading in log files that were created + using log4j's RollingFileAppender. The benefit of this + feature is that developers who run utilities like Ant to test + their applications can now view their log files off-line + (i.e. after their application has completed the test and the + JVM has shut down). Reading log files currently only works for + files written a LogFactor5's unique ConversionPattern. For + more information on setting the LogFactor5 conversion pattern, + please see the OpeningLogFiles example. To open a file and + read it into LogFactor5, you need to start the logging console + using the StartLogFactor5Console.bat file provided in the bin + directory. Once the console is open, choose File->Open from + the menu at the top of the GUI. +

      + +

      Log Table

      + +

      Read a File From a URL

      + +

      LogFactor5 supports reading log files created using log4j + from a URL. Having the ability to open log files on a remote + server provides the ability for multiple developers working on + the same application to view log files independently. It also + gives developers the ability to view log files both internally + and from remote locations. Reading log files currently only + works for files written a LogFactor5's unique + ConversionPattern. For more information on setting the + LogFactor5 conversion pattern, please see the OpeningLogFiles example. To open a + file and read it into LogFactor5, you need to start the + logging console using the StartLogFactor5Console.bat file + provided in the bin directory. Once the console is open, + choose File->Open URL from the menu at the top of the GUI. +

      + +

      Log Table

      + +

      << Return to Top of Page >>

      + +

      Configuration

      + +

      Save Configuration Information

      + +

      LogFactor5 allows you to save your current + configuration. When you choose the Configuration->Save + option from the menu at the top of the GUI, the loggers and + levels that you currently have selected, along with the last + NDC filter key word used (assuming 'Restore all NDC's' has not + been selected), are saved to your local file system. This + means that the next time you start up the console you will not + need to reselect the loggers, levels, and NDC filter that you + would like used for filtering. +

      + +

      LogFactor5 also allows you to remove your saved + configuration, and to configure the maximum number of records + that will be displayed at any time in the logging + console. Setting the maximum number of records to display + allows you to optimize LogFactor5's performance for your + system. The maximum number of records can also be configured + via a log4j properties file. +

      + +

      Log Table

      +
      + + \ No newline at end of file diff --git a/src/xdocs/lf5/overview.xml b/src/xdocs/lf5/overview.xml new file mode 100644 index 0000000000..bfea0bb6fd --- /dev/null +++ b/src/xdocs/lf5/overview.xml @@ -0,0 +1,76 @@ + + + + + Brad Marlborough + LogFactor5 Users' Guide + + + +
      + +

      What is LogFactor5? - LogFactor5 is a Swing based GUI + that leverages the power of log4j logging framework and + provides developers with a sophisticated, feature-rich, + logging interface for managing log messages. +

      + +

      How does it work? - LogFactor5 seamlessly plugs into + log4j and provides developers with an alternate destination + for outputting messages.

      + +

      Benefits:

      +
        +
      • Quickly isolate problems in your application.
      • +
      • Enable only the categories that you are interested in without affecting + other messages.
      • +
      • Filter out priority levels you don't need.
      • +
      • Filter out records based on NDC.
      • +
      • Reduce the time required to locate specific messages.
      • +
      • Read in and view log4j log files from either a file or a URL.
      • +
      • Start the LogFactor5 GUI up independent of your application.
      • +
      +

      Features: +

        +
      • Real-time category and log level filtering.
      • +
      • Read log files from a file.
      • +
      • Read log files from a URL.
      • +
      • Customizable Log Table view.
      • +
      • Category level tree navigation.
      • +
      • NDC record filtering.
      • +
      • Full text searching on logged messages.
      • +
      • Save configuration and filtering settings for later sessions.
      • +
      • Configure the number of log records to be displayed.
      • +
      • Customizable record colors.
      • +
      • Configurable font face and size.
      • +
      • Customizable Log Table column layout.
      • +
      • Full support for all log4j levels.
      • +
      • Full support for custom levels.
      • +
      • Dynamic message counting.
      • +
      +

      + +

      LogFactor5 System Requirements:

      + +

      LogFactor5 requires Java (TM) Virtual Machine 1.2.2 and log4j + 1.2 or later. +

      + +

      Documentation and Help

      +
        +
      • All documentation is in HTML format.
      • + +
      • For additional documentation on logging, please see the Suggested Reading + section.
      • +
      +

      Platform Support

      +
        +
      • LogFactor5 is written in 100% Java and will work with any + system supporting the Java 2 platform.
      • +
      +

      + +
      + +
      \ No newline at end of file diff --git a/src/xdocs/lf5/readingfiles.xml b/src/xdocs/lf5/readingfiles.xml new file mode 100644 index 0000000000..9039bda156 --- /dev/null +++ b/src/xdocs/lf5/readingfiles.xml @@ -0,0 +1,99 @@ + + + + + Brad Marlborough + LogFactor5 Users' Guide + + + +
      + +

      FileAppender and derived classes give you the + ability to output log messages to a files. LogFactor5 provides + developers with two easy ways to open and view these log + files. Log files can be opened locally using the File->Open + menu item or log files can be opened from a remote server + using the File->Open URL menu item. +

      + +

      An additional feature that was added to LogFactor5 was the + ability to start the console window independently of + log4j. That is to say, you do not need to add a + LF5Appender to your properties file to use + LogFactor5. The benefit of this feature is that developers who + run utilities like Ant to test their applications can now view + their log files off-line (i.e. after their application has + completed the test and the JVM has shut down). Moreover, the + ability to open log files on a remote server provides the + ability for multiple developers working on the same + application to view log files independently. It also gives + developers the ability to view log files both internally and + from remote locations. +

      + +

      LogFactor5 can read in log files created with + RollingFileAppender. The format of the log file + can be set in the log4j.properties or a standard properties + file and must follow the LogFactor5 layout conventions + in order for LogFactor5 to read the file. The following is an + example of a properties file with the LogFactor5 conversion + pattern added: +

      + +
      
      +log4j.rootLogger=debug, R
      +
      +# R is the RollingFileAppender that outputs to a rolling log 
      +# file called sample.log.
      +
      +log4j.appender.R=org.apache.log4j.RollingFileAppender
      +log4j.appender.R.File=sample.log
      +
      +# Define a pattern layout for the file.  
      +# For more information on conversion characters (i.e. d,p,t,c,l,m,n)
      +# please see the PatternLayout class of the Log4j API.
      +
      +log4j.appender.R.layout=org.apache.log4j.PatternLayout
      +
      +# The following normally appears on one single line.
      +log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n\
      +   %p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n\
      +   %c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n
      +
      +# Set the max size of the file 
      +log4j.appender.R.MaxFileSize=500KB
      + +

      You are free to use any or all of the main conversion + characters to create your log file (i.e. %p for + Priority). There are only two requirements for the conversion + pattern. First, the conversion pattern string must + start with the tag [slf5s.start]. Second, for each + log4j conversion character listed in the conversion pattern + string, a corresponding LogFactor5 tag must be placed + immediately after the character. The following is a + complete list of the log4j characters and LogFactor5 tags: +

      + +
      Date - %d{DATE}[slf5s.DATE]
      +Priority - %p[slf5s.PRIORITY]
      +NDC - %x[slf5s.NDC]
      +Thread - %t[slf5s.THREAD]
      +Category - %c[slf5s.CATEGORY]
      +Location - %l[slf5s.LOCATION]
      +Message - %m[slf5s.MESSAGE]
      +
      + +

      Note: The order of the characters does not matter so + you are free to layout your log file any way you like. Just + remember to include the LogFactor5 start tag at the beginning + of the string and any LogFactor5 tags after each corresponding + log4j conversion character. For more information or to see a + working example, try the OpeningLogFiles example in the + examples directory. +

      +
      + +
      + + From 4210363f75979d301ce4811942c6b17d7eaf257f Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 11 Jun 2002 21:49:10 +0000 Subject: [PATCH 031/342] Added troubleshooting section to LF5 docs. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309577 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/lf5/trouble.xml | 297 ++++++++++++++++++++++++++++++++++ src/xdocs/stylesheets/lf5.xml | 26 +++ 2 files changed, 323 insertions(+) create mode 100644 src/xdocs/lf5/trouble.xml create mode 100644 src/xdocs/stylesheets/lf5.xml diff --git a/src/xdocs/lf5/trouble.xml b/src/xdocs/lf5/trouble.xml new file mode 100644 index 0000000000..d1cbcd40fd --- /dev/null +++ b/src/xdocs/lf5/trouble.xml @@ -0,0 +1,297 @@ + + + + + Brad Marlborough + LogFactor5 Users' Guide + + + +
      + +

      Q. How do I send log messages to both LogFactor5 and a rolling log file? +

      + +

      A. Log4J gives you the ability to log to mulitple + appenders. The RollingFileAppender class is the + appender used to log messages to a series of files. The + following code snippet shows how to configure a + log4j.properties file or a standard properites file so that it + logs to both the LogFactor5 console and a rolling log + file.

      + +
      # Register both appenders with the root of the Category tree.
      +
      +log4j.rootCategory=, A1, R
      +
      +# A1 is set to be a LF5Appender which outputs to a swing
      +# logging console.   
      +  
      +log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
      +
      +# R is the RollingFileAppender that outputs to a rolling log 
      +# file called rolling_log_file.log.
      +
      +log4j.appender.R=org.apache.log4j.RollingFileAppender
      +log4j.appender.R.File=rolling_log_file.log
      +
      +# Configure a pattern layout, the size of the file and the number
      +# of backup files.
      +
      +log4j.appender.R.layout=org.apache.log4j.PatternLayout
      +log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n%p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n%c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n
      +log4j.appender.R.MaxFileSize=100KB
      +log4j.appender.R.MaxBackupIndex=1
      + +

      For more information on logging to multiple appenders along + with a demo, please see the IntiUsingMultipleAppenders example in the + examples folder. +

      + +
      + +

      Q. What is the maximum number of log records that will be visible at any + one time? +

      + +

      A. The logging console will only display up to 5000 LogRecords as a + default. When this limit has reached, the oldest record will be removed from + those that are displayed.

      +
      + +

      Q. Is the maximum number of records shown configurable?

      + +

      A. The maximum number of records shown is configurable + via a log4j properties file, or via the Configure menu item in + the LogFactor5 GUI. Our memory profiling has shown that with a + logging message of 25 words in length, and a stack trace + nested seven methods deep, every 1000 records displayed in the + logging console uses about 6 MB of memory. For this reason, + when you are setting the maximum number of log records to be + shown, it is possible to run out of memory if you are not + careful. The default maximum number of records is set to 5000 + records to minimize the possibility of running out of + memory.

      +
      + +

      Q. Why does the command prompt hang when I close the + console?

      + +

      A. If you close the LogFactor5 console (as opposed to + exiting) you are effectively hiding the console and turning + off any logging to console. However, closing the console does + not shut down the Java virtual machine. As a result, the + command prompt hangs until the virtual machine is properly + shut down.

      +
      + +

      Q. How do I shut down the console completely including the virtual machine? + +

      +

      A. Selecting exit (as opposed to close) will shut down the LogFactor5 + console along with the virtual machine.

      +
      + +

      Q. I have not added LogFactor5 via a configurator or the addAppender() method, + yet the console still pops up every time. What's happening?

      + +

      A. The example log4j.properties file that ships with + LogFactor5 is in your CLASSPATH, and is being loaded during + static initialization of the Category class. If you remove the + file from your CLASSPATH, or rename the file, the logging + console should stop loading.

      +
      + + +

      Q. If I close the LogFactor5 logging console, but don't shut down the virtual + machine (i.e. use close rather than exit) does the console continue to log messages? +

      + +

      A. No. Once the LogFactor5 console is closed, it stops logging messages. + This does not effect any other appenders you may be using (i.e. rolling log + files).

      +
      + +

      Q. When I call the removeAppender( ) method on the Category class, the logging + window does not disappear. What's happening?

      +

      A. The LF5Appender is being removed from the list of registered + Appenders in the Category class, and messages are no longer being sent to the + logging window. However, the logging window is being kept alive by the Swing + thread, so you will need to close the window manually in order to get rid of + it.

      +
      + +

      Q. How do I send log messages to LogFactor5 using log4j's SocketAppender + and SocketServer classes?

      + +

      A. Log4 gives you the ability to send messages to a remote location + over a socket for logging purposes. The org.apache.log4j.net.SocketAppender + and org.apache.log4j.net.SocketServer classes are the key classes used in remote + logging.

      + +

      If you want to use the LF5Appender to log messages remotely, + you can simply register the LF5Appender in the properties file + being loaded by your SocketServer. The following steps give + you a high level description of how to do this. For more + information on using the SocketAppender, along with a demo, + please see the UsingSocketAppenders example in the examples + folder.

      + +

      STEP 1: On the client side (the application producing the + logging messages), modify your configuration properties file + to write to a SocketAppender. If you add lines similar to the + following to your configuration file, it should do the trick: +

      +
      +    log4j.rootCategory=, A1
      +    log4j.appender.A1=org.apache.log4j.net.SocketAppender
      +    log4j.appender.A1.RemoteHost=localhost
      +    log4j.appender.A1.Port=8888
      +
      + +

      Once you have loaded this configuration, all messages will be written to the + machine and port that you specify.

      + +

      STEP 2: On the server side (where you are listening for + messages), you will need to run log4j's SocketServer + class. You should create a configuration file with + configuration information similar to the following:

      +
      +    log4j.rootCategory=DEBUG,A 
      +    log4j.category.org.apache.log4j.net.SocketNode=DEBUG
      +    log4j.appender.A=org.apache.log4j.lf5.LF5Appender
      +
      + +

      STEP 3: Set up your CLASSPATH on both the client and server + to run log4j and LogFactor5.

      + +

      STEP 4: Run the SocketServer at the command line. The command + line syntax for the SocketServer is as follows:

      + +
      +    java org.apache.log4j.net.SocketServer portNumber configurationFile configurationDirectory 
      +
      + + +

      For example, we ran the following at the command line: java + org.apache.log4j.net.SocketServer 8888 + C:\temp\socketserver.properties C:\temp +

      + +

      STEP 5: Start your client, and start logging messages to the SocketAppender.

      + +
      + +

      Q. How do I save my current configuration?

      + +

      A. LogFactor5 has a Configure menu item in the top + menu bar. If you choose save from this menu, it will save your + current configuration. If you choose reset from this menu, it + will delete any saved configuration information. +

      +
      + +

      Q. What configuration information is saved?

      +

      A. If you choose Configure->Save from the LogFactor5 menu, LogFactor5 + saves the configuration of the category explorer window. This means that the + next time you open LogFactor5, any channels that you have selected or de-selected + will remain as they were when you last exited the GUI.

      +
      + +

      Q. When I open LogFactor5, I have a bunch of old categories from another + application. What's going on here, and how do I get rid of these dead categories? +

      + +

      A. You must have saved your configuration in the other + application. LogFactor5 is displaying your saved + configuration, as well as any new categories in the + application you are now running. To remove these empty + categories, right-click at the root of the category tree in + the category explorer window, and choose "Remove All + Empty Categories". If you want to get rid of this old + configuration information permanently, you should choose + Configure->Reset from the menu as well.


      + +

      Q. I'm using Ant to build my project and one of my tasks is to execute a + series of JUnit tests. When I attempt to use the LF5Appender as an appender + I get the following exception thrown:

      + +
      +    java.lang.NullPointerException 
      +    at javax.swing.ImageIcon.<init>(ImageIcon.java:134)
      +    at org.apache.log4j.lf5.viewer.channelexplorer.ChannelNodeRenderer.<init>(ChannelNodeRenderer.java:71) 
      +    ... etc.
      +
      + +

      What do I need to do to fix this problem?

      + +

      A. This problem is related to the way that Ant's class + loader works. The solution for this problem is to fork the + junit task into a separate Java Virtual Machine. The + appropriate code to fork the VM is a follows: +

      + +
      +    <junit fork="yes">
      +      ...
      +    </junit>
      +
      +
      + +

      Q. When I try to open a file, I get the following error: + 'Error - Invalid log file format!'. What is going + on?

      + +

      A. LogFactor5 can read in log files created with + Log4J's RollingFileAppender. The format of the log file + must follow the LogFactor5 layout conventions in order + for LogFactor5 to open the file. For more information on + LogFactor5's layout conventions and how to set the conversion + pattern in a Log4J properties file, please see the + OpeningLogFiles example.

      + +
      + +

      Q. Why can't I set my own custom date format?

      + +

      A. Log4j allows users to cutomize the date format of + their log records. Unfortunately LogFactor5 does not support + this feature. LogFactor5 uses a date manager to ensure that + only one date format is ever used. The reason for this is that + LogFactor5 can read in log files created with Log4J's + RollingFileAppender. However, the data in the log files is + text rather than objects. In order for LogFactor5 to read in + the log file, it must know the exact format of the data in + order to parse the information. This include the format of the + date. Any files containing invalid date formats would not be + able to be opened and read. As a result, users are forced to + use a default date format provided by Log4j ( %d{Date} ).

      + +
      + +

      Q. Why does the LogFactor5 GUI hang when I use Tomcat + 1.4's reload feature to reload my application?

      + +

      A. When an application using LogFactor5 is deployed + using Tomcat, the GUI binds itself to the naming context of + the application. However, when the application is reloaded + using Tomcat's reload feature, the naming context is nulled + and a new naming context is created. Since the VM is not shut + down and restarted during the reload process, and there is no + longer a naming context to bind to, the LogFactor5 console + hangs. When the application is reloaded, a new LogFactor5 + console is created while the old one is left hanging in limbo. + One way around this problem is to use Tomcat in conjunction + with JBoss to redeploy the application. JBoss also has a + reload feature that allows users to redeploy their application + without having to bounce the web/application server. The + difference is that JBoss has a naming context manager that + keeps track of an applications naming context between deploys + rather than nulling the context and creating a new one. As a + result, the LogFactor5 console will remain bound to the + application between each deploy.

      + +
      + +
      diff --git a/src/xdocs/stylesheets/lf5.xml b/src/xdocs/stylesheets/lf5.xml new file mode 100644 index 0000000000..7815b3b2e4 --- /dev/null +++ b/src/xdocs/stylesheets/lf5.xml @@ -0,0 +1,26 @@ + + + + Log4j project + LogFactor5 + + + + + + + + + + + + + + + + + + + + From 879fad10ea3d0b026ceda0f9e75bf97713f8605b Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 11 Jun 2002 22:00:56 +0000 Subject: [PATCH 032/342] Added a faq section to lf5 docs. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309578 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/lf5/faq.xml | 40 +++++++++++++++++++++++++++++++++++++++ src/xdocs/lf5/trouble.xml | 25 ++++++++++++++++-------- 2 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 src/xdocs/lf5/faq.xml diff --git a/src/xdocs/lf5/faq.xml b/src/xdocs/lf5/faq.xml new file mode 100644 index 0000000000..b4b67cdd9f --- /dev/null +++ b/src/xdocs/lf5/faq.xml @@ -0,0 +1,40 @@ + + + + + Brad Marlborough + LogFactor5 Users' Guide + + + +
      + + +

      Q. What is LogFactor5?

      + +

      A. LogFactor5 is a Swing based GUI that leverages the power of Apache's + Log4J logging toolkit and provides developers with a sophisticated, feature-rich, + logging interface for managing log messages.

      +
      + +

      Q. Do I need to know how to use Log4J in order to use LogFactor5?

      + +

      A. Yes, the documentation for LogFactor5 assumes the user has some understanding + of how Log4J works. Note however that the LogFactor5 examples will run regardless + of a user's Log4J knowledge level.

      +
      + +

      Q. What are the memory requirements for LogFactor5?

      +

      A. The LogFactor5 logging console window uses around 13 MB of memory + to run on a Windows OS. Our memory profiling has shown that with a logging message + of 25 words in length, and a stack trace nested seven methods deep, every 1000 + records displayed in the logging console uses about 6.5 MB of memory. For this + reason, when you are setting the maximum number of log records to be shown, + you should be careful that you have enough memory to display all of the records. + The default maximum number of records that will be displayed is set to 5000 + to minimize the possibility of running out of memory. We recommend that Windows + users have at least 96 MB of RAM when using LogFactor5.

      + +
      + +
      diff --git a/src/xdocs/lf5/trouble.xml b/src/xdocs/lf5/trouble.xml index d1cbcd40fd..e68889340a 100644 --- a/src/xdocs/lf5/trouble.xml +++ b/src/xdocs/lf5/trouble.xml @@ -39,7 +39,10 @@ log4j.appender.R.File=rolling_log_file.log # of backup files. log4j.appender.R.layout=org.apache.log4j.PatternLayout -log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n%p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n%c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n +# Edited to fit. +log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n\ + %p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n\ + %c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n log4j.appender.R.MaxFileSize=100KB log4j.appender.R.MaxBackupIndex=1 @@ -170,7 +173,8 @@ log4j.appender.R.MaxBackupIndex=1 line syntax for the SocketServer is as follows:

      -    java org.apache.log4j.net.SocketServer portNumber configurationFile configurationDirectory 
      +    java org.apache.log4j.net.SocketServer portNumber configurationFile\
      +                                           configurationDirectory 
       
      @@ -211,16 +215,21 @@ log4j.appender.R.MaxBackupIndex=1 the category explorer window, and choose "Remove All Empty Categories". If you want to get rid of this old configuration information permanently, you should choose - Configure->Reset from the menu as well.


      + Configure->Reset from the menu as well.

      -

      Q. I'm using Ant to build my project and one of my tasks is to execute a - series of JUnit tests. When I attempt to use the LF5Appender as an appender - I get the following exception thrown:

      +
      + +

      Q. I'm using Ant to build my project and one of my tasks + is to execute a series of JUnit tests. When I attempt to use + the LF5Appender as an appender I get the following exception + thrown: +

           java.lang.NullPointerException 
      -    at javax.swing.ImageIcon.<init>(ImageIcon.java:134)
      -    at org.apache.log4j.lf5.viewer.channelexplorer.ChannelNodeRenderer.<init>(ChannelNodeRenderer.java:71) 
      +    at javax.swing.ImageIcon.<init>(ImageIcon.java:134)
      +    at org.apache.log4j.lf5.viewer.channelexplorer.ChannelNodeRenderer.
      +                                       <init>(ChannelNodeRenderer.java:71) 
           ... etc.
       
      From 37f7eb5398c18308624d12ae30f3675ed0786361 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 12 Jun 2002 01:29:33 +0000 Subject: [PATCH 033/342] The log4j site can now be built from the main build file. The files build/siteBuild.sh and build/siteBuild.xml are no longer needed. The "dist" target now depends on "site2" such that a new distribution can be built in one single step. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309579 13f79535-47bb-0310-9956-ffa450edef68 --- build.properties.sample | 6 ++++ build.xml | 65 ++++++++++++++++++++++++++++++++--- build/siteBuild.sh | 34 ------------------ build/siteBuild.xml | 49 -------------------------- src/xdocs/contributors.xml | 2 +- src/xdocs/stylesheets/lf5.xml | 1 + 6 files changed, 68 insertions(+), 89 deletions(-) delete mode 100644 build/siteBuild.sh delete mode 100644 build/siteBuild.xml diff --git a/build.properties.sample b/build.properties.sample index fdd5e3d905..78029a9b06 100644 --- a/build.properties.sample +++ b/build.properties.sample @@ -18,6 +18,12 @@ jms.jar=/java/JMQ1.1/lib/jms.jar jmx.jar=/java/jmx/lib/jmxri.jar jmx-extra.jar=/java/jmx/lib/jmxtools.jar + +# jakarta-site2 module is used to transform xml files to html using +# Anakia. You do not need to worry about this property unless you +# intend to build the log4j web site yourself. +jakarta-site2=../jakarta-site2 + # Required to run Checkstyle. Available from http://checkstyle.sf.net checkstyle.jar=/java/checkstyle-2.2/checkstyle-all-2.2.jar diff --git a/build.xml b/build.xml index 86bf9c1e1d..f27b6dc151 100644 --- a/build.xml +++ b/build.xml @@ -35,11 +35,14 @@ + + + + + - - @@ -75,6 +78,13 @@ + + + + + + + @@ -334,6 +344,7 @@ org.apache.log4j.config, org.apache.log4j.helpers, org.apache.log4j.jmx, + org.apache.log4j.lf5, org.apache.log4j.net, org.apache.log4j.nt, org.apache.log4j.or, @@ -350,7 +361,7 @@ protected="true" author="true" use="true" - overview="${docs}/overview.html" + overview="${docs.dest}/overview.html" doctitle="log4j version ${version}<br>API Specification" windowtitle="Log4j Version ${version}" header="<b>Log4j ${version}</b>" @@ -363,10 +374,54 @@ + + + + + + + + + + + + AnakiaTask is not present! Please check to make sure that + velocity.jar is in your classpath. + + + + + + + + + + + + + + + + - + @@ -403,7 +458,7 @@ - + diff --git a/build/siteBuild.sh b/build/siteBuild.sh deleted file mode 100644 index d6707e7683..0000000000 --- a/build/siteBuild.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -if [ "$JAVA_HOME" = "" ] ; then - echo You must set JAVA_HOME to point at your Java Development Kit directory - exit 1 -fi - -# convert the existing path to unix -if [ "$OSTYPE" = "cygwin32" ] || [ "$OSTYPE" = "cygwin" ] ; then - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# Add in the jakarta-site2 library files -for i in ../../jakarta-site2/lib/*.jar -do - CLASSPATH=$CLASSPATH:"$i" -done - - -# convert the unix path to windows -if [ "$OSTYPE" = "cygwin32" ] || [ "$OSTYPE" = "cygwin" ] ; then - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` -fi - -echo "CLASSPATH=$CLASSPATH" - -BUILDFILE=siteBuild.xml - -#echo $CLASSPATH - -java $ANT_OPTS -classpath "$CLASSPATH" org.apache.tools.ant.Main \ - -Dant.home=$ANT_HOME \ - -buildfile ${BUILDFILE} \ - "$@" diff --git a/build/siteBuild.xml b/build/siteBuild.xml deleted file mode 100644 index 5f9f8442f7..0000000000 --- a/build/siteBuild.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - AnakiaTask is not present! Please check to make sure that - velocity.jar is in your classpath. - - - - - - - - - - diff --git a/src/xdocs/contributors.xml b/src/xdocs/contributors.xml index 87634e456d..a24f7bd81b 100644 --- a/src/xdocs/contributors.xml +++ b/src/xdocs/contributors.xml @@ -8,7 +8,7 @@
      - +

      Log4j is the result of contributions from several dozen developers and hundreds of users across the globe. Some of the more prominent contributors are listed below in alphabetical diff --git a/src/xdocs/stylesheets/lf5.xml b/src/xdocs/stylesheets/lf5.xml index 7815b3b2e4..f0952e7cf4 100644 --- a/src/xdocs/stylesheets/lf5.xml +++ b/src/xdocs/stylesheets/lf5.xml @@ -14,6 +14,7 @@ + From 341562519819aaa839eef2f1a20ee238d6e1360c Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 12 Jun 2002 13:55:34 +0000 Subject: [PATCH 034/342] - Changed LICENSE.APL references to LICENSE.txt. - Made it plenty clear that the o.a.l.performance package is for internal use only. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309585 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/log4j/config/PropertyGetter.java | 2 +- .../apache/log4j/config/PropertyPrinter.java | 2 +- .../apache/log4j/config/PropertySetter.java | 7 ++- .../log4j/config/PropertySetterException.java | 9 ++-- .../org/apache/log4j/net/SMTPAppender.java | 2 +- .../apache/log4j/net/SimpleSocketServer.java | 2 +- .../org/apache/log4j/net/SyslogAppender.java | 2 +- src/java/org/apache/log4j/net/test/Loop.java | 2 +- .../org/apache/log4j/net/test/SMTPMin.java | 2 +- .../org/apache/log4j/net/test/SocketMin.java | 2 +- .../org/apache/log4j/net/test/SyslogMin.java | 2 +- .../apache/log4j/nt/NTEventLogAppender.java | 2 +- src/java/org/apache/log4j/nt/test/NTMin.java | 2 +- .../org/apache/log4j/or/DefaultRenderer.java | 2 +- .../org/apache/log4j/or/ObjectRenderer.java | 2 +- src/java/org/apache/log4j/or/RendererMap.java | 2 +- .../apache/log4j/or/ThreadGroupRenderer.java | 2 +- .../log4j/performance/ListVsVector.java | 2 +- .../apache/log4j/performance/NOPWriter.java | 53 +++++++++---------- .../apache/log4j/performance/NewVsSetLen.java | 2 +- .../log4j/performance/NullAppender.java | 13 +++-- .../apache/log4j/performance/SystemTime.java | 2 +- .../org/apache/log4j/performance/package.html | 20 ++++--- .../apache/log4j/test/AsyncAppenderTest.java | 7 ++- .../log4j/test/ConfigurationFileParsing.java | 2 +- .../varia/ExternallyRolledFileAppender.java | 7 ++- src/xdocs/download.xml | 7 +-- 27 files changed, 82 insertions(+), 79 deletions(-) diff --git a/src/java/org/apache/log4j/config/PropertyGetter.java b/src/java/org/apache/log4j/config/PropertyGetter.java index 3c6f8db373..bc88da1d2b 100644 --- a/src/java/org/apache/log4j/config/PropertyGetter.java +++ b/src/java/org/apache/log4j/config/PropertyGetter.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. + * distribution in the LICENSE.txt file. */ package org.apache.log4j.config; diff --git a/src/java/org/apache/log4j/config/PropertyPrinter.java b/src/java/org/apache/log4j/config/PropertyPrinter.java index 23c950cf10..8f1e4d491f 100644 --- a/src/java/org/apache/log4j/config/PropertyPrinter.java +++ b/src/java/org/apache/log4j/config/PropertyPrinter.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. + * distribution in the LICENSE.txt file. */ package org.apache.log4j.config; diff --git a/src/java/org/apache/log4j/config/PropertySetter.java b/src/java/org/apache/log4j/config/PropertySetter.java index 7feff64adc..8f6a15597b 100644 --- a/src/java/org/apache/log4j/config/PropertySetter.java +++ b/src/java/org/apache/log4j/config/PropertySetter.java @@ -1,10 +1,9 @@ /* * Copyright (C) The Apache Software Foundation. All rights reserved. * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.APL file. - */ + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ // Contributors: Georg Lundesgaard diff --git a/src/java/org/apache/log4j/config/PropertySetterException.java b/src/java/org/apache/log4j/config/PropertySetterException.java index b8cb0e00a5..3accdf308e 100644 --- a/src/java/org/apache/log4j/config/PropertySetterException.java +++ b/src/java/org/apache/log4j/config/PropertySetterException.java @@ -1,10 +1,9 @@ /* * Copyright (C) The Apache Software Foundation. All rights reserved. * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.APL file. - */ + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ package org.apache.log4j.config; @@ -41,4 +40,4 @@ String getMessage() { } return msg; } -} \ No newline at end of file +} diff --git a/src/java/org/apache/log4j/net/SMTPAppender.java b/src/java/org/apache/log4j/net/SMTPAppender.java index bca7acaa80..3e4929d673 100644 --- a/src/java/org/apache/log4j/net/SMTPAppender.java +++ b/src/java/org/apache/log4j/net/SMTPAppender.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.net; diff --git a/src/java/org/apache/log4j/net/SimpleSocketServer.java b/src/java/org/apache/log4j/net/SimpleSocketServer.java index f8ca382ffb..5210b192b8 100644 --- a/src/java/org/apache/log4j/net/SimpleSocketServer.java +++ b/src/java/org/apache/log4j/net/SimpleSocketServer.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.net; diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/java/org/apache/log4j/net/SyslogAppender.java index d3c2d83396..664da4b9a6 100644 --- a/src/java/org/apache/log4j/net/SyslogAppender.java +++ b/src/java/org/apache/log4j/net/SyslogAppender.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.net; diff --git a/src/java/org/apache/log4j/net/test/Loop.java b/src/java/org/apache/log4j/net/test/Loop.java index e5242f3546..40643b6d97 100644 --- a/src/java/org/apache/log4j/net/test/Loop.java +++ b/src/java/org/apache/log4j/net/test/Loop.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.net.test; diff --git a/src/java/org/apache/log4j/net/test/SMTPMin.java b/src/java/org/apache/log4j/net/test/SMTPMin.java index 6777157b08..51e86e62ed 100644 --- a/src/java/org/apache/log4j/net/test/SMTPMin.java +++ b/src/java/org/apache/log4j/net/test/SMTPMin.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.net.test; diff --git a/src/java/org/apache/log4j/net/test/SocketMin.java b/src/java/org/apache/log4j/net/test/SocketMin.java index 15ab781eb6..cf317ba82e 100644 --- a/src/java/org/apache/log4j/net/test/SocketMin.java +++ b/src/java/org/apache/log4j/net/test/SocketMin.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.net.test; diff --git a/src/java/org/apache/log4j/net/test/SyslogMin.java b/src/java/org/apache/log4j/net/test/SyslogMin.java index 3c8f039777..6cacc7371c 100644 --- a/src/java/org/apache/log4j/net/test/SyslogMin.java +++ b/src/java/org/apache/log4j/net/test/SyslogMin.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.net.test; diff --git a/src/java/org/apache/log4j/nt/NTEventLogAppender.java b/src/java/org/apache/log4j/nt/NTEventLogAppender.java index 0f663a3524..d63a919442 100644 --- a/src/java/org/apache/log4j/nt/NTEventLogAppender.java +++ b/src/java/org/apache/log4j/nt/NTEventLogAppender.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.nt; diff --git a/src/java/org/apache/log4j/nt/test/NTMin.java b/src/java/org/apache/log4j/nt/test/NTMin.java index 52351c12ea..49fc20a95a 100644 --- a/src/java/org/apache/log4j/nt/test/NTMin.java +++ b/src/java/org/apache/log4j/nt/test/NTMin.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.nt.test; diff --git a/src/java/org/apache/log4j/or/DefaultRenderer.java b/src/java/org/apache/log4j/or/DefaultRenderer.java index d4066c94e1..acf191d5a7 100644 --- a/src/java/org/apache/log4j/or/DefaultRenderer.java +++ b/src/java/org/apache/log4j/or/DefaultRenderer.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.or; diff --git a/src/java/org/apache/log4j/or/ObjectRenderer.java b/src/java/org/apache/log4j/or/ObjectRenderer.java index 5d98d69ce4..843bad4d06 100644 --- a/src/java/org/apache/log4j/or/ObjectRenderer.java +++ b/src/java/org/apache/log4j/or/ObjectRenderer.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.or; diff --git a/src/java/org/apache/log4j/or/RendererMap.java b/src/java/org/apache/log4j/or/RendererMap.java index 620c10c3ae..e71bdd7d18 100644 --- a/src/java/org/apache/log4j/or/RendererMap.java +++ b/src/java/org/apache/log4j/or/RendererMap.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.or; diff --git a/src/java/org/apache/log4j/or/ThreadGroupRenderer.java b/src/java/org/apache/log4j/or/ThreadGroupRenderer.java index db00814b4e..3f63860409 100644 --- a/src/java/org/apache/log4j/or/ThreadGroupRenderer.java +++ b/src/java/org/apache/log4j/or/ThreadGroupRenderer.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.or; diff --git a/src/java/org/apache/log4j/performance/ListVsVector.java b/src/java/org/apache/log4j/performance/ListVsVector.java index 16440ceae9..6322d02a88 100644 --- a/src/java/org/apache/log4j/performance/ListVsVector.java +++ b/src/java/org/apache/log4j/performance/ListVsVector.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.performance; diff --git a/src/java/org/apache/log4j/performance/NOPWriter.java b/src/java/org/apache/log4j/performance/NOPWriter.java index 9662360c38..6876544b08 100644 --- a/src/java/org/apache/log4j/performance/NOPWriter.java +++ b/src/java/org/apache/log4j/performance/NOPWriter.java @@ -1,5 +1,9 @@ -// Copyright 1996-1999, International Business Machines -// Corporation. All Rights Reserved. +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ package org.apache.log4j.performance; @@ -7,42 +11,35 @@ import java.io.IOException; /** - Extends {@link Writer} with methods that return immediately without - doing anything. This class is used to measure the cost of - constructing a log message but not actually writing to the - OutputStream. - - @author Ceki Gülcü -*/ + *

      Extends {@link Writer} with methods that return immediately + * without doing anything. This class is used to measure the cost of + * constructing a log message but not actually writing to any device. + *

      + + *

      The + * org.apache.log4j.performance.NOPWriter class is + * intended for internal use only. Consequently, it is not + * included in the log4j.jar file.

      + * + * @author Ceki Gülcü + * */ public class NOPWriter extends Writer { - //public - //NOPWriter() { - //} - + public void write(char[] cbuf) throws IOException {} - public - void write(char[] cbuf) throws IOException {} + public void write(char[] cbuf, int off, int len) throws IOException {} - public - void write(char[] cbuf, int off, int len) throws IOException {} + public void write(int b) throws IOException {} - public - void write(int b) throws IOException {} + public void write(String s) throws IOException {} - public - void write(String s) throws IOException {} + public void write(String s, int off, int len) throws IOException {} - public - void write(String s, int off, int len) throws IOException {} - - public - void flush() throws IOException { + public void flush() throws IOException { } - public - void close() throws IOException { + public void close() throws IOException { System.err.println("Close called."); } } diff --git a/src/java/org/apache/log4j/performance/NewVsSetLen.java b/src/java/org/apache/log4j/performance/NewVsSetLen.java index 07f96e789d..ae6de43b6b 100644 --- a/src/java/org/apache/log4j/performance/NewVsSetLen.java +++ b/src/java/org/apache/log4j/performance/NewVsSetLen.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.performance; diff --git a/src/java/org/apache/log4j/performance/NullAppender.java b/src/java/org/apache/log4j/performance/NullAppender.java index e7ce56eb77..937c58a1dd 100644 --- a/src/java/org/apache/log4j/performance/NullAppender.java +++ b/src/java/org/apache/log4j/performance/NullAppender.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.performance; @@ -12,9 +12,14 @@ import org.apache.log4j.AppenderSkeleton; /** - A bogus appender which calls the format method of its layout object - but does not write the result anywhere. - */ + * A bogus appender which calls the format method of its layout object + * but does not write the result anywhere. + * + *

      The + * org.apache.log4j.performance.NullAppender class is + * intended for internal use only. Consequently, it is not + * included in the log4j.jar file.

      + * */ public class NullAppender extends AppenderSkeleton { public static String s; diff --git a/src/java/org/apache/log4j/performance/SystemTime.java b/src/java/org/apache/log4j/performance/SystemTime.java index aff304c065..44bf68b196 100644 --- a/src/java/org/apache/log4j/performance/SystemTime.java +++ b/src/java/org/apache/log4j/performance/SystemTime.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.performance; diff --git a/src/java/org/apache/log4j/performance/package.html b/src/java/org/apache/log4j/performance/package.html index 91f326a97c..e57b59e1f6 100644 --- a/src/java/org/apache/log4j/performance/package.html +++ b/src/java/org/apache/log4j/performance/package.html @@ -3,13 +3,17 @@ - -

      Package to measure the performance of the different log4j components. + +

      Package to measure the performance of the different log4j + components. +

      -
      -
      - -Last modified: Thu Dec 16 10:32:43 MET 1999 - - +

      The + org.apache.log4j.performance package is intended + for internal use only. Consequently, the classes in this + package are not included in the log4j.jar file. +

      + + + diff --git a/src/java/org/apache/log4j/test/AsyncAppenderTest.java b/src/java/org/apache/log4j/test/AsyncAppenderTest.java index b3eff7faa4..17060f196e 100644 --- a/src/java/org/apache/log4j/test/AsyncAppenderTest.java +++ b/src/java/org/apache/log4j/test/AsyncAppenderTest.java @@ -1,9 +1,8 @@ /* Copyright (C) The Apache Software Foundation. All rights reserved. * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.APL file. - */ + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/ConfigurationFileParsing.java b/src/java/org/apache/log4j/test/ConfigurationFileParsing.java index 0e274df7fc..d6b0a52ae0 100644 --- a/src/java/org/apache/log4j/test/ConfigurationFileParsing.java +++ b/src/java/org/apache/log4j/test/ConfigurationFileParsing.java @@ -3,7 +3,7 @@ * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * distribution in the LICENSE.txt file. */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java b/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java index 736abe1baf..a48619ebe8 100644 --- a/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java +++ b/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java @@ -1,10 +1,9 @@ /* * Copyright (C) The Apache Software Foundation. All rights reserved. * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.APL file. - */ + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ package org.apache.log4j.varia; diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 9f5b052c36..d3012a1537 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -39,9 +39,10 @@ replacement for log4j 1.1.3. The only exception is the renaming of the CategoryFactory class to LoggerFactory class such that subclasses of - Category class to be modified and recompiled. By - the way, we strongly discourage casual users from subclassing - the Category or Logger classes. + Category class must be modified and + recompiled. By the way, we strongly discourage casual users + from subclassing the Category or + Logger classes.

      We also maintain a list of earlier From cc9c070bf92a5a9de08d46b70211c6b432262e54 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 12 Jun 2002 21:06:28 +0000 Subject: [PATCH 035/342] Added LF5 examples. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309586 13f79535-47bb-0310-9956-ffa450edef68 --- .../InitUsingDefaultConfigurator.java | 131 +++++++++++++ .../InitUsingLog4JProperties.java | 113 +++++++++++ .../InitUsingLog4JProperties/log4j.properties | 17 ++ .../InitUsingMultipleAppenders.java | 138 +++++++++++++ .../example.properties | 34 ++++ .../InitUsingPropertiesFile.java | 117 +++++++++++ .../example.properties | 17 ++ .../InitUsingXMLPropertiesFile.java | 110 +++++++++++ .../InitUsingXMLPropertiesFile/example.xml | 15 ++ examples/lf5/OpeningLogFiles/sample.log | 184 ++++++++++++++++++ .../CustomizedLogLevels.java | 102 ++++++++++ .../UsingLogMonitorAdapter.java | 86 ++++++++ .../UsingSocketAppenders.java | 132 +++++++++++++ .../socketclient.properties | 18 ++ .../socketserver.properties | 19 ++ examples/lf5/index.html | 11 ++ 16 files changed, 1244 insertions(+) create mode 100644 examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java create mode 100644 examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java create mode 100644 examples/lf5/InitUsingLog4JProperties/log4j.properties create mode 100644 examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java create mode 100644 examples/lf5/InitUsingMultipleAppenders/example.properties create mode 100644 examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java create mode 100644 examples/lf5/InitUsingPropertiesFile/example.properties create mode 100644 examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java create mode 100644 examples/lf5/InitUsingXMLPropertiesFile/example.xml create mode 100644 examples/lf5/OpeningLogFiles/sample.log create mode 100644 examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java create mode 100644 examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java create mode 100644 examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java create mode 100644 examples/lf5/UsingSocketAppenders/socketclient.properties create mode 100644 examples/lf5/UsingSocketAppenders/socketserver.properties create mode 100644 examples/lf5/index.html diff --git a/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java b/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java new file mode 100644 index 0000000000..fe2fec0528 --- /dev/null +++ b/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java @@ -0,0 +1,131 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. + */ +package examples.lf5.InitUsingDefaultConfigurator; + +import org.apache.log4j.lf5.DefaultLF5Configurator; +import org.apache.log4j.lf5.LogLevel; +import org.apache.log4j.lf5.util.LogMonitorAdapter; +import org.apache.log4j.Category; +import org.apache.log4j.NDC; + +import java.io.IOException; + +/** + * This class is a simple example of how to configure the LogFactor5 + * logging window using the DefaultLF5Configurator. + * + * The DefaultLF5Configurator uses a default configuration file stored + * in the lf5.jar in order to provide a default configuration for + * the LF5Appender. + * + * To make this example work, ensure that the lf5.jar and lf5-license.jar + * files are in your classpath, and then run the example at the command line. + * + * @author Brent Sprecher + */ + +// Contributed by ThoughtWorks Inc. + +public class InitUsingDefaultConfigurator { + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + private static Category cat = + Category.getInstance(InitUsingDefaultConfigurator.class); + + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String[] args) throws IOException { + // Configure the LF5Appender using the DefaultLF5Configurator. This + // will add the LF5Appender to the root of the Category tree. + DefaultLF5Configurator.configure(); + + // Add an NDC to demonstrate how NDC information is output. + NDC.push("#23856"); + // Log some information. + for (int i = 0; i < 10; i++) { + cat.debug("Hello, my name is Homer Simpson."); + cat.info("Mmmmmm .... Chocolate."); + cat.warn("Mmm...forbidden donut."); + } + // Clean up NDC + NDC.pop(); + NDC.remove(); + + NDC.push("Another NDC"); + // Log some information. + cat.fatal("Hello, my name is Bart Simpson."); + cat.error("Hi diddly ho good neighbour."); + // Clean up NDC + NDC.pop(); + NDC.remove(); + + // Call methods on both classes. + InitUsingDefaultConfigurator.foo(); + InnerInitUsingDefaultConfigurator.foo(); + + cat.info("Exiting InitUsingDefaultConfigurator."); + + } + + public static void foo() { + cat.debug("Entered foo in InitUsingDefaultConfigurator class"); + + NDC.push("#123456"); + cat.debug("Hello, my name is Marge Simpson."); + cat.info("D'oh!! A deer! A female deer."); + // Clean up NDC + NDC.pop(); + NDC.remove(); + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- + + public static class InnerInitUsingDefaultConfigurator { + static Category cat = + Category.getInstance(InnerInitUsingDefaultConfigurator.class.getName()); + + static void foo() throws IOException { + // Configure the LF5Appender again. You can call + // DefaultLF5Configurator.configure() as often as you want + // without unexpected behavior. + DefaultLF5Configurator.configure(); + + cat.info("Entered foo in InnerInitUsingDefaultConfigurator class."); + } + } +} + + + + + diff --git a/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java b/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java new file mode 100644 index 0000000000..e834c81901 --- /dev/null +++ b/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. + */ +package examples.lf5.InitUsingLog4JProperties; + +import org.apache.log4j.Category; + +import java.io.IOException; + +/** + * This class is a simple example of how to use the LogFactor5 logging + * window. + * + * The LF5Appender is the primary class that enables logging to the + * LogFactor5 logging window. The simplest method of using this Appender + * is to add the following line to your log4j.properties file: + * + * log4j.appender.A1=org.apache.log4j.lf5.LF5Appender + * + * The log4j.properties file MUST be in you system classpath. If this file + * is in your system classpath, a static initializer in the Category class + * will load the file during class initialization. The LF5Appender will be + * added to the root category of the Category tree. + * + * To make this example work, ensure that the lf5.jar and lf5-license.jar + * files are in your classpath. Next, create a log4j.properties file and + * add this line to it, or add this line to your existing log4j.properties + * file. Run the example at the command line and explore the results! + * + * @author Brent Sprecher + */ + +// Contributed by ThoughtWorks Inc. + +public class InitUsingLog4JProperties { + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + + private static Category cat = + Category.getInstance(InitUsingLog4JProperties.class); + + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String argv[]) { + // Add a bunch of logging statements ... + cat.debug("Hello, my name is Homer Simpson."); + cat.debug("Hello, my name is Lisa Simpson."); + cat.debug("Hello, my name is Marge Simpson."); + cat.debug("Hello, my name is Bart Simpson."); + cat.debug("Hello, my name is Maggie Simpson."); + + cat.info("We are the Simpsons!"); + cat.info("Mmmmmm .... Chocolate."); + cat.info("Homer likes chocolate"); + cat.info("Doh!"); + cat.info("We are the Simpsons!"); + + cat.warn("Bart: I am through with working! Working is for chumps!" + + "Homer: Son, I'm proud of you. I was twice your age before " + + "I figured that out."); + cat.warn("Mmm...forbidden donut."); + cat.warn("D'oh! A deer! A female deer!"); + cat.warn("Truly, yours is a butt that won't quit." + + "- Bart, writing as Woodrow to Ms. Krabappel."); + + cat.error("Dear Baby, Welcome to Dumpsville. Population: you."); + cat.error("Dear Baby, Welcome to Dumpsville. Population: you.", + new IOException("Dumpsville, USA")); + cat.error("Mr. Hutz, are you aware you're not wearing pants?"); + cat.error("Mr. Hutz, are you aware you're not wearing pants?", + new IllegalStateException("Error !!")); + + + cat.fatal("Eep."); + cat.fatal("Mmm...forbidden donut.", + new SecurityException("Fatal Exception")); + cat.fatal("D'oh! A deer! A female deer!"); + cat.fatal("Mmmmmm .... Chocolate.", + new SecurityException("Fatal Exception")); + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- + +} diff --git a/examples/lf5/InitUsingLog4JProperties/log4j.properties b/examples/lf5/InitUsingLog4JProperties/log4j.properties new file mode 100644 index 0000000000..98b54b5ddf --- /dev/null +++ b/examples/lf5/InitUsingLog4JProperties/log4j.properties @@ -0,0 +1,17 @@ +# For the general syntax of property based configuration files see the +# documenation of org.apache.log4j.PropertyConfigurator. + +# The root category uses the appender called A1. Since no priority is +# specified, the root category assumes the default priority for root +# which is DEBUG in log4j. The root category is the only category that +# has a default priority. All other categories need not be assigned a +# priority in which case they inherit their priority from the +# hierarchy. + +log4j.rootCategory=, A1 + +# A1 is set to be a LF5Appender which outputs to a swing +# logging console. + +log4j.appender.A1=org.apache.log4j.lf5.LF5Appender +log4j.appender.A1.MaxNumberOfRecords=1000 diff --git a/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java b/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java new file mode 100644 index 0000000000..8147e41756 --- /dev/null +++ b/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java @@ -0,0 +1,138 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. + */ +package examples.lf5.InitUsingMultipleAppenders; + +import org.apache.log4j.lf5.LogLevel; +import org.apache.log4j.Category; +import org.apache.log4j.PropertyConfigurator; + +import java.io.IOException; +import java.net.URL; + +/** + * This example shows how to use LogFactor5 with other Log4J appenders + * (In this case the RollingFileAppender). + * + * The following lines can be added to the log4j.properties file or a + * standard Java properties file. + * + * # Two appenders are registered with the root of the Category tree. + * + * log4j.rootCategory=, A1, R + * + * # A1 is set to be a LF5Appender which outputs to a swing + * # logging console. + * + * log4j.appender.A1=org.apache.log4j.lf5.LF5Appender + * + * # R is the RollingFileAppender that outputs to a rolling log + * # file called rolling_log_file.log. + * + * log4j.appender.R=org.apache.log4j.RollingFileAppender + * log4j.appender.R.File=rolling_log_file.log + * + * log4j.appender.R.layout=org.apache.log4j.PatternLayout + * log4j.appender.R.layout.ConversionPattern=Date - %d{DATE}%nPriority + * - %p%nThread - %t%nCategory - %c%nLocation - %l%nMessage - %m%n%n + * log4j.appender.R.MaxFileSize=100KB + * log4j.appender.R.MaxBackupIndex=1 + * + * To make this example work, either run the InitUsingMultipleAppenders.bat + * file located in the examples folder or run it at the command line. If you + * are running the example at the command line, you must ensure that the + * example.properties file is in your classpath. + * + * @author Brent Sprecher + * @author Brad Marlborough + */ + +// Contributed by ThoughtWorks Inc. + +public class InitUsingMultipleAppenders { + + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + + private static Category cat = + Category.getInstance(InitUsingMultipleAppenders.class); + + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String argv[]) { + // Use a PropertyConfigurator to initialize from a property file. + String resource = + "/examples/lf5/InitUsingMultipleAppenders/example.properties"; + URL configFileResource = + InitUsingMultipleAppenders.class.getResource(resource); + PropertyConfigurator.configure(configFileResource); + + // Add a bunch of logging statements ... + cat.debug("Hello, my name is Homer Simpson."); + cat.debug("Hello, my name is Lisa Simpson."); + cat.debug("Hello, my name is Marge Simpson."); + cat.debug("Hello, my name is Bart Simpson."); + cat.debug("Hello, my name is Maggie Simpson."); + + cat.info("We are the Simpsons!"); + cat.info("Mmmmmm .... Chocolate."); + cat.info("Homer likes chocolate"); + cat.info("Doh!"); + cat.info("We are the Simpsons!"); + + cat.warn("Bart: I am through with working! Working is for chumps!" + + "Homer: Son, I'm proud of you. I was twice your age before " + + "I figured that out."); + cat.warn("Mmm...forbidden donut."); + cat.warn("D'oh! A deer! A female deer!"); + cat.warn("Truly, yours is a butt that won't quit." + + "- Bart, writing as Woodrow to Ms. Krabappel."); + + cat.error("Dear Baby, Welcome to Dumpsville. Population: you."); + cat.error("Dear Baby, Welcome to Dumpsville. Population: you.", + new IOException("Dumpsville, USA")); + cat.error("Mr. Hutz, are you aware you're not wearing pants?"); + cat.error("Mr. Hutz, are you aware you're not wearing pants?", + new IllegalStateException("Error !!")); + + + cat.fatal("Eep."); + cat.fatal("Mmm...forbidden donut.", + new SecurityException("Fatal Exception")); + cat.fatal("D'oh! A deer! A female deer!"); + cat.fatal("Mmmmmm .... Chocolate.", + new SecurityException("Fatal Exception")); + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- + +} diff --git a/examples/lf5/InitUsingMultipleAppenders/example.properties b/examples/lf5/InitUsingMultipleAppenders/example.properties new file mode 100644 index 0000000000..ac1f374302 --- /dev/null +++ b/examples/lf5/InitUsingMultipleAppenders/example.properties @@ -0,0 +1,34 @@ +# For the general syntax of property based configuration files see the +# documenation of org.apache.log4j.PropertyConfigurator. + +# The root category uses two appenders called A1 and R. Since no priority is +# specified, the root category assumes the default priority for root +# which is DEBUG in log4j. The root category is the only category that +# has a default priority. All other categories need not be assigned a +# priority in which case they inherit their priority from the +# hierarchy. + +log4j.rootCategory=, A1, R + +# A1 is set to be a LF5Appender which outputs to a swing +# logging console. + +log4j.appender.A1=org.apache.log4j.lf5.LF5Appender + +# R is the RollingFileAppender that outputs to a rolling log +# file called rolling_log_file.log. + +log4j.appender.R=org.apache.log4j.RollingFileAppender +log4j.appender.R.File=rolling_log_file.log + +# Define a pattern layout for the file. +# For more information on conversion characters (i.e. d,p,t,c,l,m,n) +# please see the PatternLayout class of the Log4j API. + +log4j.appender.R.layout=org.apache.log4j.PatternLayout +log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n%p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n%c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n + +# Set the max size of the file and the number of backup files + +log4j.appender.R.MaxFileSize=100KB +log4j.appender.R.MaxBackupIndex=1 \ No newline at end of file diff --git a/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java b/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java new file mode 100644 index 0000000000..ab8cd2d85f --- /dev/null +++ b/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. + */ +package examples.lf5.InitUsingPropertiesFile; + +import org.apache.log4j.lf5.LogLevel; +import org.apache.log4j.Category; +import org.apache.log4j.PropertyConfigurator; + +import java.io.IOException; +import java.net.URL; + +/** + * This is another simple example of how to use the LogFactor5 + * logging console. + * + * The LF5Appender is the primary class that enables logging to the + * LogFactor5 logging window. If the following line is added to a properties + * file, the LF5Appender will be appended to the root category when + * the properties file is loaded: + * + * log4j.appender.A1=org.apache.log4j.lf5.LF5Appender + * + * To make this example work, you must ensure that the example.properties file + * is in your classpath.You can then run the example at the command line. + * + * @author Brent Sprecher + */ + +// Contributed by ThoughtWorks Inc. + +public class InitUsingPropertiesFile { + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + + private static Category cat = + Category.getInstance(InitUsingPropertiesFile.class); + + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String argv[]) { + // Use a PropertyConfigurator to initialize from a property file. + String resource = + "/examples/lf5/InitUsingPropertiesFile/example.properties"; + URL configFileResource = + InitUsingPropertiesFile.class.getResource(resource); + PropertyConfigurator.configure(configFileResource); + + // Add a bunch of logging statements ... + cat.debug("Hello, my name is Homer Simpson."); + cat.debug("Hello, my name is Lisa Simpson."); + cat.debug("Hello, my name is Marge Simpson."); + cat.debug("Hello, my name is Bart Simpson."); + cat.debug("Hello, my name is Maggie Simpson."); + + cat.info("We are the Simpsons!"); + cat.info("Mmmmmm .... Chocolate."); + cat.info("Homer likes chocolate"); + cat.info("Doh!"); + cat.info("We are the Simpsons!"); + + cat.warn("Bart: I am through with working! Working is for chumps!" + + "Homer: Son, I'm proud of you. I was twice your age before " + + "I figured that out."); + cat.warn("Mmm...forbidden donut."); + cat.warn("D'oh! A deer! A female deer!"); + cat.warn("Truly, yours is a butt that won't quit." + + "- Bart, writing as Woodrow to Ms. Krabappel."); + + cat.error("Dear Baby, Welcome to Dumpsville. Population: you."); + cat.error("Dear Baby, Welcome to Dumpsville. Population: you.", + new IOException("Dumpsville, USA")); + cat.error("Mr. Hutz, are you aware you're not wearing pants?"); + cat.error("Mr. Hutz, are you aware you're not wearing pants?", + new IllegalStateException("Error !!")); + + + cat.fatal("Eep."); + cat.fatal("Mmm...forbidden donut.", + new SecurityException("Fatal Exception")); + cat.fatal("D'oh! A deer! A female deer!"); + cat.fatal("Mmmmmm .... Chocolate.", + new SecurityException("Fatal Exception")); + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- + +} diff --git a/examples/lf5/InitUsingPropertiesFile/example.properties b/examples/lf5/InitUsingPropertiesFile/example.properties new file mode 100644 index 0000000000..ab421d3b3a --- /dev/null +++ b/examples/lf5/InitUsingPropertiesFile/example.properties @@ -0,0 +1,17 @@ +# For the general syntax of property based configuration files see the +# documenation of org.apache.log4j.PropertyConfigurator. + +# The root category uses the appender called A1. Since no priority is +# specified, the root category assumes the default priority for root +# which is DEBUG in log4j. The root category is the only category that +# has a default priority. All other categories need not be assigned a +# priority in which case they inherit their priority from the +# hierarchy. + +log4j.rootCategory=, A1 + +# A1 is set to be a LF5Appender which outputs to a swing +# logging console. + +log4j.appender.A1=org.apache.log4j.lf5.LF5Appender +log4j.appender.A1.MaxNumberOfRecords=700 diff --git a/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java b/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java new file mode 100644 index 0000000000..13e76d55f9 --- /dev/null +++ b/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. + */ +package examples.lf5.InitUsingXMLPropertiesFile; + +import org.apache.log4j.Category; +import org.apache.log4j.xml.DOMConfigurator; + +import java.io.IOException; +import java.net.URL; + +/** + * This is another simple example of how to use the LogFactor5 + * logging console. + * + * To make this example work, ensure that the lf5.jar, lf5-license.jar + * and example.xml files are in your classpath. Once your classpath has + * been set up, you can run the example from the command line. + * + * @author Brent Sprecher + */ + +// Contributed by ThoughtWorks Inc. + +public class InitUsingXMLPropertiesFile { + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + + private static Category cat = + Category.getInstance(InitUsingXMLPropertiesFile.class); + + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String argv[]) { + // Use a PropertyConfigurator to initialize from a property file. + String resource = + "/examples/lf5/InitUsingXMLPropertiesFile/example.xml"; + URL configFileResource = + InitUsingXMLPropertiesFile.class.getResource(resource); + DOMConfigurator.configure(configFileResource.getFile()); + + // Add a bunch of logging statements ... + cat.debug("Hello, my name is Homer Simpson."); + cat.debug("Hello, my name is Lisa Simpson."); + cat.debug("Hello, my name is Marge Simpson."); + cat.debug("Hello, my name is Bart Simpson."); + cat.debug("Hello, my name is Maggie Simpson."); + + cat.info("We are the Simpsons!"); + cat.info("Mmmmmm .... Chocolate."); + cat.info("Homer likes chocolate"); + cat.info("Doh!"); + cat.info("We are the Simpsons!"); + + cat.warn("Bart: I am through with working! Working is for chumps!" + + "Homer: Son, I'm proud of you. I was twice your age before " + + "I figured that out."); + cat.warn("Mmm...forbidden donut."); + cat.warn("D'oh! A deer! A female deer!"); + cat.warn("Truly, yours is a butt that won't quit." + + "- Bart, writing as Woodrow to Ms. Krabappel."); + + cat.error("Dear Baby, Welcome to Dumpsville. Population: you."); + cat.error("Dear Baby, Welcome to Dumpsville. Population: you.", + new IOException("Dumpsville, USA")); + cat.error("Mr. Hutz, are you aware you're not wearing pants?"); + cat.error("Mr. Hutz, are you aware you're not wearing pants?", + new IllegalStateException("Error !!")); + + + cat.fatal("Eep."); + cat.fatal("Mmm...forbidden donut.", + new SecurityException("Fatal Exception")); + cat.fatal("D'oh! A deer! A female deer!"); + cat.fatal("Mmmmmm .... Chocolate.", + new SecurityException("Fatal Exception")); + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- + +} diff --git a/examples/lf5/InitUsingXMLPropertiesFile/example.xml b/examples/lf5/InitUsingXMLPropertiesFile/example.xml new file mode 100644 index 0000000000..d167c5f158 --- /dev/null +++ b/examples/lf5/InitUsingXMLPropertiesFile/example.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/lf5/OpeningLogFiles/sample.log b/examples/lf5/OpeningLogFiles/sample.log new file mode 100644 index 0000000000..1adbea56e8 --- /dev/null +++ b/examples/lf5/OpeningLogFiles/sample.log @@ -0,0 +1,184 @@ +[slf5s.start]26 Jul 2001 15:54:44,673[slf5s.DATE] +DEBUG[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:102)[slf5s.LOCATION] +Hello, my name is Homer Simpson.[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,743[slf5s.DATE] +DEBUG[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:103)[slf5s.LOCATION] +Hello, my name is Lisa Simpson.[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,743[slf5s.DATE] +DEBUG[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:104)[slf5s.LOCATION] +Hello, my name is Marge Simpson.[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,753[slf5s.DATE] +DEBUG[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:105)[slf5s.LOCATION] +Hello, my name is Bart Simpson.[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,793[slf5s.DATE] +DEBUG[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:106)[slf5s.LOCATION] +Hello, my name is Maggie Simpson.[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,793[slf5s.DATE] +INFO[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:108)[slf5s.LOCATION] +We are the Simpsons![slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE] +INFO[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:109)[slf5s.LOCATION] +Mmmmmm .... Chocolate.[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE] +INFO[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:110)[slf5s.LOCATION] +Homer likes chocolate[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE] +INFO[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:111)[slf5s.LOCATION] +Doh![slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE] +INFO[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:112)[slf5s.LOCATION] +We are the Simpsons![slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE] +WARN[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:114)[slf5s.LOCATION] +Bart: I am through with working! Working is for chumps!Homer: Son, I'm proud of you. I was twice your age before I figured that out.[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE] +WARN[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:117)[slf5s.LOCATION] +Mmm...forbidden donut.[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE] +WARN[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:118)[slf5s.LOCATION] +D'oh! A deer! A female deer![slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE] +WARN[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:119)[slf5s.LOCATION] +Truly, yours is a butt that won't quit.- Bart, writing as Woodrow to Ms. Krabappel.[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE] +ERROR[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:122)[slf5s.LOCATION] +Dear Baby, Welcome to Dumpsville. Population: you.[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,903[slf5s.DATE] +ERROR[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:123)[slf5s.LOCATION] +Dear Baby, Welcome to Dumpsville. Population: you.[slf5s.MESSAGE] + +java.io.IOException: Dumpsville, USA + at examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:123) +[slf5s.start]26 Jul 2001 15:54:44,903[slf5s.DATE] +ERROR[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:125)[slf5s.LOCATION] +Mr. Hutz, are you aware you're not wearing pants?[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:44,903[slf5s.DATE] +ERROR[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:126)[slf5s.LOCATION] +Mr. Hutz, are you aware you're not wearing pants?[slf5s.MESSAGE] + +java.lang.IllegalStateException: Error !! + at examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:126) +[slf5s.start]26 Jul 2001 15:54:44,903[slf5s.DATE] +FATAL[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:130)[slf5s.LOCATION] +Eep.[slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:45,063[slf5s.DATE] +FATAL[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:131)[slf5s.LOCATION] +Mmm...forbidden donut.[slf5s.MESSAGE] + +java.lang.SecurityException: Fatal Exception + at examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:131) +[slf5s.start]26 Jul 2001 15:54:45,063[slf5s.DATE] +FATAL[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:133)[slf5s.LOCATION] +D'oh! A deer! A female deer![slf5s.MESSAGE] + +[slf5s.start]26 Jul 2001 15:54:45,063[slf5s.DATE] +FATAL[slf5s.PRIORITY] +[slf5s.NDC] +main[slf5s.THREAD] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY] +examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:134)[slf5s.LOCATION] +Mmmmmm .... Chocolate.[slf5s.MESSAGE] + +java.lang.SecurityException: Fatal Exception + at examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:134) diff --git a/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java b/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java new file mode 100644 index 0000000000..cd3b28d142 --- /dev/null +++ b/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. + */ + +package examples.lf5.UsingLogMonitorAdapter; + +import org.apache.log4j.lf5.LogLevel; +import org.apache.log4j.lf5.util.AdapterLogRecord; +import org.apache.log4j.lf5.util.LogMonitorAdapter; + +/** + * This class is a simple example of how use the LogMonitorAdapter to + * bypass the Log4JAppender and post LogRecords directly to the LogMonitor + * using customized LogLevels + * + * To make this example work, ensure that the lf5.jar and lf5-license.jar + * files are in your classpath, and then run the example at the command line. + * + * @author Richard Hurst + */ + +// Contributed by ThoughtWorks Inc. + +public class CustomizedLogLevels { + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + public final static LogLevel LEVEL_ONE = new LogLevel("LEVEL 1", 1); + public final static LogLevel LEVEL_TWO = new LogLevel("LEVEL 2", 2); + public final static LogLevel LEVEL_THREE = new LogLevel("LEVEL 3", 3); + public final static LogLevel LEVEL_FOUR = new LogLevel("LEVEL 4", 4); + public final static LogLevel DEFAULT = new LogLevel("DEFAULT", 0); + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + private static LogMonitorAdapter _adapter; + + static { + // The first LogLevel in the Array will be used as the default LogLevel. + _adapter = LogMonitorAdapter.newInstance(new LogLevel[]{DEFAULT, LEVEL_ONE, + LEVEL_TWO, LEVEL_THREE, LEVEL_FOUR, LogLevel.FATAL}); + // if a different log level is to be used it can be specified as such + // _adapter.setDefaultLevel(LEVEL_THREE); + } + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String[] args) { + CustomizedLogLevels test = new CustomizedLogLevels(); + test.doMyBidding(); + } + + public void doMyBidding() { + // tell the LogMonitorAdapter which LogLevel is the severe Level if necessary + _adapter.setSevereLevel(LEVEL_ONE); + + String levels = this.getClass().getName(); + + // will used the default Level + _adapter.log(levels, "Using the customized LogLevels"); + + _adapter.log(levels, LEVEL_FOUR, "This is a test"); + _adapter.log(levels, LEVEL_THREE, "Hmmm fobidden doughnut"); + _adapter.log(levels, LEVEL_ONE, "Danger Danger Will Robinson", + new RuntimeException("DANGER"), "32"); + _adapter.log(levels, LEVEL_TWO, "Exit stage right->"); + _adapter.log(levels, LEVEL_FOUR, "What's up Doc?", + new NullPointerException("Unfortunate exception")); + + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- +} + + + + + diff --git a/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java b/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java new file mode 100644 index 0000000000..6943a31207 --- /dev/null +++ b/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. + */ +package examples.lf5.UsingLogMonitorAdapter; + +import org.apache.log4j.lf5.LogLevel; +import org.apache.log4j.lf5.util.AdapterLogRecord; +import org.apache.log4j.lf5.util.LogMonitorAdapter; + +/** + * This class is a simple example of how use the LogMonitorAdapter to + * bypass the Log4JAppender and post LogRecords directly to the LogMonitor + * + * To make this example work, ensure that the lf5.jar and lf5-license.jar + * files are in your classpath, and then run the example at the command line. + * + * @author Richard Hurst + */ + +// Contributed by ThoughtWorks Inc. + +public class UsingLogMonitorAdapter { + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + private static LogMonitorAdapter _adapter; + + static { + _adapter = LogMonitorAdapter.newInstance(LogMonitorAdapter.LOG4J_LOG_LEVELS); + } + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String[] args) { + UsingLogMonitorAdapter test = new UsingLogMonitorAdapter(); + test.doMyBidding(); + } + + public void doMyBidding() { + String category = this.getClass().getName(); + + // will default to debug log level + _adapter.log(category, "Doh this is a debugging"); + + _adapter.log(category, LogLevel.INFO, "Hmmm fobidden doughnut"); + _adapter.log(category, LogLevel.WARN, "Danger Danger Will Robinson", + new RuntimeException("DANGER"), "32"); + _adapter.log(category, LogLevel.ERROR, "Exit stage right->"); + _adapter.log(category, LogLevel.FATAL, "What's up Doc?", + new NullPointerException("Unfortunate exception")); + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- +} + + + + + diff --git a/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java b/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java new file mode 100644 index 0000000000..a40cfddc21 --- /dev/null +++ b/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. + */ + +package examples.lf5.UsingSocketAppenders; + +import org.apache.log4j.Category; +import org.apache.log4j.PropertyConfigurator; + +import java.io.IOException; +import java.net.URL; + +/** + * This is another simple example of how to use the LogFactor5 + * logging console. + * + * The LF5Appender is the primary class that enables logging to the + * LogFactor5 logging window. If the following line is added to a properties + * file, the LF5Appender will be appended to the root category when + * the properties file is loaded: + * + * log4j.appender.A1=org.apache.log4j.lf5.LF5Appender + * + * To make this example work, you must ensure that the example.properties file + * is in your classpath.You can then run the example at the command line. + * + * @author Brent Sprecher + */ + +// Contributed by ThoughtWorks Inc. + +public class UsingSocketAppenders { + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + + private static Category cat1 = + Category.getInstance(UsingSocketAppenders.class); + private static Category cat2 = + Category.getInstance("TestClass.Subclass"); + private static Category cat3 = + Category.getInstance("TestClass.Subclass.Subclass"); + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String argv[]) { + // Use a PropertyConfigurator to initialize from a property file. + String resource = + "/examples/lf5/UsingSocketAppenders/socketclient.properties"; + URL configFileResource = + UsingSocketAppenders.class.getResource(resource); + PropertyConfigurator.configure(configFileResource); + + // Add a bunch of logging statements ... + cat1.debug("Hello, my name is Homer Simpson."); + cat1.debug("Hello, my name is Lisa Simpson."); + cat2.debug("Hello, my name is Marge Simpson."); + cat2.debug("Hello, my name is Bart Simpson."); + cat3.debug("Hello, my name is Maggie Simpson."); + + cat2.info("We are the Simpsons!"); + cat2.info("Mmmmmm .... Chocolate."); + cat3.info("Homer likes chocolate"); + cat3.info("Doh!"); + cat3.info("We are the Simpsons!"); + + cat1.warn("Bart: I am through with working! Working is for chumps!" + + "Homer: Son, I'm proud of you. I was twice your age before " + + "I figured that out."); + cat1.warn("Mmm...forbidden donut."); + cat1.warn("D'oh! A deer! A female deer!"); + cat1.warn("Truly, yours is a butt that won't quit." + + "- Bart, writing as Woodrow to Ms. Krabappel."); + + cat2.error("Dear Baby, Welcome to Dumpsville. Population: you."); + cat2.error("Dear Baby, Welcome to Dumpsville. Population: you.", + new IOException("Dumpsville, USA")); + cat3.error("Mr. Hutz, are you aware you're not wearing pants?"); + cat3.error("Mr. Hutz, are you aware you're not wearing pants?", + new IllegalStateException("Error !!")); + + + cat3.fatal("Eep."); + + cat3.fatal("Mmm...forbidden donut.", + new SecurityException("Fatal Exception ... ")); + + cat3.fatal("D'oh! A deer! A female deer!"); + cat2.fatal("Mmmmmm .... Chocolate.", + new SecurityException("Fatal Exception")); + + // Put the main thread is put to sleep for 5 seconds to allow the + // SocketServer to process all incoming messages before the Socket is + // closed. This is done to overcome some basic limitations with the + // way the SocketServer and SocketAppender classes manage sockets. + try { + Thread.currentThread().sleep(5000); + } catch (InterruptedException ie) { + } + + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- + +} diff --git a/examples/lf5/UsingSocketAppenders/socketclient.properties b/examples/lf5/UsingSocketAppenders/socketclient.properties new file mode 100644 index 0000000000..b0513655a1 --- /dev/null +++ b/examples/lf5/UsingSocketAppenders/socketclient.properties @@ -0,0 +1,18 @@ +# For the general syntax of property based configuration files see the +# documenation of org.apache.log4j.PropertyConfigurator. + +# The root category uses the appender called A1. Since no priority is +# specified, the root category assumes the default priority for root +# which is DEBUG in log4j. The root category is the only category that +# has a default priority. All other categories need not be assigned a +# priority in which case they inherit their priority from the +# hierarchy. + +log4j.rootCategory=, A1 + +# A1 is set to be a LF5Appender which outputs to a swing +# logging console. + +log4j.appender.A1=org.apache.log4j.net.SocketAppender +log4j.appender.A1.RemoteHost=localhost +log4j.appender.A1.Port=8887 diff --git a/examples/lf5/UsingSocketAppenders/socketserver.properties b/examples/lf5/UsingSocketAppenders/socketserver.properties new file mode 100644 index 0000000000..da14ac04ce --- /dev/null +++ b/examples/lf5/UsingSocketAppenders/socketserver.properties @@ -0,0 +1,19 @@ +# For the general syntax of property based configuration files see the +# documenation of org.apache.log4j.PropertyConfigurator. + +# The root category uses the appender called A1. Since no priority is +# specified, the root category assumes the default priority for root +# which is DEBUG in log4j. The root category is the only category that +# has a default priority. All other categories need not be assigned a +# priority in which case they inherit their priority from the +# hierarchy. + +#log4j.rootCategory=DEBUG, A1 +log4j.rootCategory=, A1 + +# A1 is set to be a LF5Appender which outputs to a swing +# logging console. + +#log4j.category.org.apache.log4j.net.SocketNode=DEBUG +log4j.appender.A1=org.apache.log4j.lf5.LF5Appender +log4j.appender.A1.MaxNumberOfRecords=700 \ No newline at end of file diff --git a/examples/lf5/index.html b/examples/lf5/index.html new file mode 100644 index 0000000000..9a39752b21 --- /dev/null +++ b/examples/lf5/index.html @@ -0,0 +1,11 @@ + + + + + + +

      See Examples + section in the LogFactor5 user guide. +

      + + From c680f7bc4205783d035796627d69aea2af201802 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 12 Jun 2002 21:29:57 +0000 Subject: [PATCH 036/342] Added a bold-red warning about being JDBCAppender replaced in the future. You can't miss it. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309587 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/jdbc/JDBCAppender.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/log4j/jdbc/JDBCAppender.java b/src/java/org/apache/log4j/jdbc/JDBCAppender.java index aa8b0885c3..5660b188af 100644 --- a/src/java/org/apache/log4j/jdbc/JDBCAppender.java +++ b/src/java/org/apache/log4j/jdbc/JDBCAppender.java @@ -14,11 +14,12 @@ /** +

      WARNING: This version of JDBCAppender + is very likely to be completely replaced in the future. Moreoever, + it does not log exceptions.

      + The JDBCAppender provides for sending log events to a database. -

      WARNING This version of JDBCAppender does not log - exceptions. -

      Each append call adds to an ArrayList buffer. When the buffer is filled each log event is placed in a sql statement From 634ef4bc40824bd3b4a3107ef32d201e9a146754 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 12 Jun 2002 21:31:35 +0000 Subject: [PATCH 037/342] Changes corrections in documentation. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309588 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 12 + docs/HISTORY | 4 + .../log4j/lf5/config/defaultconfig.properties | 16 + src/java/org/apache/log4j/lf5/lf5.properties | 8 + src/xdocs/documentation.xml | 6 + src/xdocs/index.xml | 15 +- src/xdocs/lf5/examples.xml | 430 ++++++++---------- src/xdocs/plan.xml | 19 +- 8 files changed, 248 insertions(+), 262 deletions(-) create mode 100644 src/java/org/apache/log4j/lf5/config/defaultconfig.properties create mode 100644 src/java/org/apache/log4j/lf5/lf5.properties diff --git a/build.xml b/build.xml index f27b6dc151..69fadc7204 100644 --- a/build.xml +++ b/build.xml @@ -189,6 +189,13 @@ + + + + + @@ -203,6 +210,11 @@ + + + + + diff --git a/docs/HISTORY b/docs/HISTORY index 3183155360..9000e2acce 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -5,9 +5,13 @@ client code. [***] Changes requiring important modifications to existing client code. + June 12th, 2002, - Release of version 1.2.4 + - Added LF5 documentation and examples. Further tests are required + for full integration. [*] + - XMLLayout can now output messages which contain embedded CDATA sections. This resolves bug #9750. Many thanks Michael A. McAngus for supplying the relevant patch. [*] diff --git a/src/java/org/apache/log4j/lf5/config/defaultconfig.properties b/src/java/org/apache/log4j/lf5/config/defaultconfig.properties new file mode 100644 index 0000000000..10e30ba828 --- /dev/null +++ b/src/java/org/apache/log4j/lf5/config/defaultconfig.properties @@ -0,0 +1,16 @@ +# For the general syntax of property based configuration files see the +# documenation of org.apache.log4j.PropertyConfigurator. + +# The root category uses the appender called A1. Since no priority is +# specified, the root category assumes the default priority for root +# which is DEBUG in log4j. The root category is the only category that +# has a default priority. All other categories need not be assigned a +# priority in which case they inherit their priority from the +# hierarchy. + +log4j.rootCategory=, A1 + +# A1 is set to be a LogMonitorAppender which outputs to a swing +# logging console. + +log4j.appender.A1=org.apache.log4j.lf5.LF5Appender diff --git a/src/java/org/apache/log4j/lf5/lf5.properties b/src/java/org/apache/log4j/lf5/lf5.properties new file mode 100644 index 0000000000..af0892e74d --- /dev/null +++ b/src/java/org/apache/log4j/lf5/lf5.properties @@ -0,0 +1,8 @@ +# +# These properties should not be changed! +# +product.name=LogFactor5 +product.version.number=1.3 +product.release.date=March 30, 2002 + + diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index ec3ea813dd..21addad732 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -24,6 +24,12 @@ javadoc documentation,

      + +

      +

    4. + LogFactor5 documentation, +
    5. +

    6. diff --git a/src/xdocs/index.xml b/src/xdocs/index.xml index 61cc1bd460..73337c040c 100644 --- a/src/xdocs/index.xml +++ b/src/xdocs/index.xml @@ -53,14 +53,13 @@ remote log4j server, a remote Unix Syslog daemon, or even a NT Event logger among many other output targets.

      -

      On a 233 MHz ThinkPad running JDK 1.1.7B, it costs about 46 - nanoseconds to determine if that statement should be logged or - not. Actual logging is also quite fast, ranging from 79 - microseconds using the SimpleLayout, 164 microseconds using - the TTCCLayout and around a millisecond when printing - exceptions. The performance of the PatternLayout is almost as - good as the dedicated layouts, except that it is a lot more - flexible.

      +

      On an AMD Duron clocked at 800Mhz running JDK 1.3.1, it costs + about 5 nanoseconds to determine if a logging statement should + be logged or not. Actual logging is also quite fast, ranging + from 21 microseconds microseconds using the SimpleLayout, 37 + microseconds using the TTCCLayout. The performance of the + PatternLayout is almost as good as the dedicated layouts, + except that it is much more flexible.

      The package is being constantly improved thanks to input from users and code contributed by authors in the community. diff --git a/src/xdocs/lf5/examples.xml b/src/xdocs/lf5/examples.xml index dbd132c73e..f28726655b 100644 --- a/src/xdocs/lf5/examples.xml +++ b/src/xdocs/lf5/examples.xml @@ -24,30 +24,20 @@ be done for you.

      Running the Example:

      -

      Option 1:

      +

      Let LOG4J_HOME be the the directory where you + installed log4j.

        -
      • Navigate to the examples\lf5 directory and double - click the InitUsingDefaultConfigurator.bat - file.
      • -
      - - -

      Option 2:

      -
        -
      • Ensure that the log4j.jar file is in your CLASSPATH
      • - -
      • Ensure that the LOG4J_HOME environment variable is set to - the directory where you installed log4j
      • +
      • Ensure that LOG4J_HOME/dist/classes is in your + CLASSPATH.
      • -
      • At the command line, change to the LOG4J_HOME\dist\classes - directory
      • - -
      • Type the following at the command line: java - examples.lf5.InitUsingDefaultConfigurator.InitUsingDefaultConfigurator +
      • Ensure that a JAXP compatible XML parser is in is in your + CLASSPATH.
      • +
      • Type the following at the command line: + +

        java examples.lf5.InitUsingDefaultConfigurator.InitUsingDefaultConfigurator

      @@ -58,49 +48,43 @@ programmatically. However, it is far more flexible to configure log4j using configuration files. One common method of configuring log4j involves using a properties file, and the - org.apache.log4j.PropertyConfigurator class. The - PropertyConfigurator class allows you to load properties from - a standard properties document consisting of key=value - pairs. This example demonstrates how to load LogFactor5 via a - configuration file used by a PropertyConfigurator.

      + org.apache.log4j.PropertyConfigurator class. The + PropertyConfigurator class allows you to load + properties from a standard properties document consisting of + key=value pairs. This example demonstrates how to load + LogFactor5 via a configuration file used by a + PropertyConfigurator.

      This example uses a very basic properties file, which is - loaded via a PropertyConfigurator. The example.properties - file has only one property, which registers a LF5Appender with - the root of the Category tree. The - InitUsingPropertiesFile.java class loads this file using the - PropertyConfigurator class.

      - -

      Note: The example.properties file used in this example - is loaded as a resource via your CLASSPATH. For this reason, the - example will only work if the directory where you installed - LogFactor5 is in your CLASSPATH

      + loaded via a PropertyConfigurator. The + example.properties file has only one property, which + registers a LF5Appender with the root of the + Category tree. The InitUsingPropertiesFile class + loads this file using the PropertyConfigurator + class.

      + +

      Note: The example.properties file used in this + example is loaded as a resource via your CLASSPATH. For this + reason, the example will only work if the + LOG4J_HOME/dist/classes directory is in your + CLASSPATH

      Running the Example:

      -

      Option 1:

      -
        -
      • Navigate to the examples/lf5 directory and double - click the InitUsingPropertiesFile.bat file. -
      • -
      +

      Let LOG4J_HOME be the the directory where you + installed log4j.

      -

      Option 2:

        -
      • Ensure that the log4j.jar file is in your CLASSPATH
      • -
      • Ensure that the LOG4J_HOME environment variable is set to the directory - where you installed log4j
      • - -
      • Copy the provided log4j.properties file to a directory - that is currently in your CLASSPATH.
      • - -
      • At the command line, change to the LOG4J_HOME\dist\classes - directory -
      • +
      • Ensure that LOG4J_HOME/dist/classes is in your + CLASSPATH.
      • + +
      • Ensure that a JAXP compatible XML parser is in is in your + CLASSPATH.
      • -
      • Type the following at the command line: java - examples.lf5.InitUsingPropertiesFile.InitUsingPropertiesFile +
      • Type the following at the command line: + +

        java + examples.lf5.InitUsingPropertiesFile.InitUsingPropertiesFile

        x
      @@ -124,36 +108,33 @@

      This example uses a very basic XML properties file. The example.xml file registers an LF5Appender with the root of the Category tree. The InitUsingXMLPropertiesFile.java class loads - this file using the DOMConfigurator class.

      -

      Note: The example.xml file used in this example is - loaded as a resource via your CLASSPATH. For this reason, the - example will only work if the directory where you installed - LogFactor5 is in your CLASSPATH. You will also need an XML - parser (e.g. Xerces or JAXP) in order to run this example. + this file using the DOMConfigurator class. +

      + +

      Note: The example.xml file used in this example + is loaded as a resource via your CLASSPATH. For this reason, + the example will only work if the + LOG4J_HOME/dist/classes directory is in your + CLASSPATH. You will also need an XML parser in order to run + this example.

      Running the Example:

      -

      Option 1:

      -
        -
      • Navigate to the examples/lf5 directory and double - click the InitUsingXMLPropertiesFile.bat file. -
      • -
      +

      Let LOG4J_HOME be the the directory where you + installed log4j.

      -

      Option 2:

        -
      • Ensure that the log4j.jar file is in your CLASSPATH
      • +
      • Ensure that LOG4J_HOME/dist/classes is in your + CLASSPATH.
      • -
      • Ensure that the LOG4J_HOME environment variable is set to - the directory where you installed log4j -
      • - -
      • At the command line, change to the LOG4J_HOME\dist\classes - directory
      • +
      • Ensure that a JAXP compatible XML parser is in is in your + CLASSPATH.
      • -
      • Type the following at the command line: java - examples.lf5.InitUsingXMLPropertiesFile.InitUsingXMLPropertiesFile +
      • Type the following at the command line: + +

        java + examples.lf5.InitUsingXMLPropertiesFile.InitUsingXMLPropertiesFile

      @@ -161,85 +142,73 @@ -

      Example 4: - InitUsingLog4JProperties

      - -

      Example Description:

      - -

      The log4j library does not make any assumptions about its - environment. In particular, there are no default log4j - appenders. Under certain well-defined circumstances however, - the static initializer of the org.apache.log4j.Category - class will attempt to automatically configure log4j. The - Java language guarantees that the static initializer of a - class is called once and only during the loading of a class - into memory. This automatic configuration is done from a - file named log4j.properties. If you have a - log4j.properties file in your CLASSPATH at the time that you - instantiate a Category, log4j will register any appenders in - this file at the root of the Category tree. -

      - -

      This example provides you with a very basic - log4j.properties file that you can add to your CLASSPATH in - order to register the LF5Appender with the Category - class. If you put this file somewhere in your CLASSPATH, all - logging requests will now automatically be redirected to the - LogFactor5 logging console in addition to any other - Appenders you may have enabled. -

      - -

      If you look at the InitUsingLog4JProperties.java file you - will notice that no Configurators are used in the code. A - Category is instantiated using the getInstance() method, and - logging calls such as cat.debug( ) can be used immediately. -

      - -

      Note: Adding the log4j.properties file to your - CLASSPATH will reduce the number of lines of code you have - to write (e.g. you will not need to add lines such as - PropertyConfigurator.configure(configFileResource)). However, - you should be aware that using this default static - initialization has application wide effects. All logging - will be directed to LogFactor5 if you use this approach! -

      - -

      Note: If you are using a log4j.properties file in a web application, - you need to be aware of the fact that the static initialization process uses - the system class loader. As a result, if you add the log4j.properties - file to your web application CLASSPATH, the classloader will not find - the file! g4jSpecial/LF5Update/jakarta-log4j/docs/lf5/UsersGuide/example4.html -

      +

      Example 4: + InitUsingLog4JProperties

      + +

      Example Description:

      -

      Running the Example:

      +

      The log4j library does not make any assumptions about its + environment. In particular, there are no default log4j + appenders. Under certain well-defined circumstances however, + the static initializer of the org.apache.log4j.Category + class will attempt to automatically configure log4j. The + Java language guarantees that the static initializer of a + class is called once and only during the loading of a class + into memory. This automatic configuration is done from a file + named log4j.properties. If you have a log4j.properties + file in your CLASSPATH at the time that you instantiate a + Category, log4j will register any appenders in this file at + the root of the Category tree. +

      -

      Option 1:

      - -
        -
      • Navigate to the examples/lf5 directory and double - click the InitUsingLog4JProperties.bat file. -
      • -
      +

      This example provides you with a very basic log4j.properties + file that you can add to your CLASSPATH in order to register + the LF5Appender with the Category class. If you put this file + somewhere in your CLASSPATH, all logging requests will now + automatically be redirected to the LogFactor5 logging console + in addition to any other Appenders you may have enabled. +

      -

      Option 2:

      -
        -
      • Ensure that the log4j.jar file is in your CLASSPATH
      • +

        If you look at the InitUsingLog4JProperties.java file you + will notice that no Configurators are used in the code. A + Category is instantiated using the getInstance() method, and + logging calls such as cat.debug( ) can be used immediately. +

        -
      • Ensure that the LOG4J_HOME environment variable is set - to the directory where you installed log4j
      • +

        Note: Adding the + LOG4J_HOME/examples/lf5/InitUsingLog4JProperties/log4j.properties + file to your CLASSPATH will reduce the number of lines of code + you have to write (e.g. you will not need to add lines such as + PropertyConfigurator.configure(configFileResource)). However, + you should be aware that using this default static + initialization has application wide effects. All logging will + be directed to LogFactor5 if you use this approach! +

        + +

        Running the Example:

        + +
          +
        • Ensure that LOG4J_HOME/dist/classes is in your + CLASSPATH.
        • -
        • Copy the provided log4j.properties file to a directory - that is currently in your CLASSPATH.
        • +
        • Ensure that a JAXP compatible XML parser is in is in your + CLASSPATH.
        • -
        • At the command line, change to the LOG4J_HOME\dist\classes directory
        • +
        • Copy the provided + LOG4J_HOME/examples/lf5/InitUsingLog4JProperties/log4j.properties + file to a directory that is currently in your + CLASSPATH.
        • -
        • Type the following at the command line: java - examples.lf5.InitUsingLog4JProperties.InitUsingLog4JProperties
        • +
        • Type the following at the command line: -
        • After you are done running the example, make sure to remove this file again, - otherwise the logging console will always be registered at the Category root - automatically.
        • -
        +

        java + examples.lf5.InitUsingLog4JProperties.InitUsingLog4JProperties

        + + +
      • After you are done running the example, make sure to + remove the log4j.properties file again, otherwise the + log4j will always be using the same configuration.
      • +
      @@ -308,27 +277,18 @@ log4j.appender.R.MaxBackupIndex=1

      Running the Example:

      -

      Option 1:

      -
        - -
      • Navigate to the examples/lf5 directory and double - click the InitUsingMultipleAppenders.bat file.
      • -
      - -

      Option 2:

        -
      • Ensure that the log4j.jar file is in your CLASSPATH
      • +
      • Ensure that LOG4J_HOME/dist/classes is in your + CLASSPATH.
      • -
      • Ensure that the LOG4J_HOME environment variable is set to the directory - where you installed log4j
      • +
      • Ensure that a JAXP compatible XML parser is in is in your + CLASSPATH.
      • -
      • At the command line, change to the LOG4J_HOME\dist\classes - directory
      • +
      • Type the following at the command line: -
      • Type the following at the command line: java - examples.lf5.InitUsingMultipleAppenders.InitUsingMultipleAppenders +

        java + examples.lf5.InitUsingMultipleAppenders.InitUsingMultipleAppenders

      @@ -400,39 +360,23 @@ log4j.appender.R.MaxBackupIndex=1 log4j documenation.

      -

      Running the Example:

      ate/jakarta-log4j/docs/lf5/UsersGuide/example6.html -

      Option 1:

      -
        -
      • Navigate to the examples/lf5 directory and double click the UsingSocketAppenders.bat - file. After the server has finished loading, switch to the console window - with the "Press any key to continue message" and press a key. This - will start the client, which will log messages to the SocketServer running - on port 8887.
      • -
      -

      Option 2:

      - +

      Running the Example:

        -
      • Navigate to the examples/lf5 directory and double - click the StartLog4JSocketServer.bat file. Wait until - the server is finished loading, and the LogFactor5 GUI shows - the log message "Waiting to accept a new - client". You can now double click the - StartLogFactor5Client.bat, which will start the - client and log some messages to the SocketServer. -
      • -
      +
    7. Ensure that LOG4J_HOME/dist/classes is in your + CLASSPATH.
    8. + +
    9. Ensure that a JAXP compatible XML parser is in is in your + CLASSPATH.
    10. + +
    11. Start the SocketServer using the following command:
    12. + +

      java org.apache.log4j.net.SimpleSocketServer 8887 + LOG4J_HOME/examples/lf5/UsingSocketAppenders/socketserver.properties

      + +
    13. At another command line, start the client using the + following command:
    14. -

      Option 3:

      -
        -
      • Ensure that the log4j.jar file is in your CLASSPATH for both the SocketServer - and the client class (UsingSocketAppenders.class).
      • -
      • At the command line, change to the LOG4J_HOME\dist\classes - directory
      • -
      • Start the SocketServer using the following command:
      • -
        java org.apache.log4j.net.SocketServer 8887 socketserver.properties
        -
      • At the command line, start the client using the following command:
      • -
         java examples.lf5.UsingSocketAppenders.UsingSocketAppenders
        -	
        +

        java examples.lf5.UsingSocketAppenders.UsingSocketAppenders

      @@ -443,24 +387,28 @@ log4j.appender.R.MaxBackupIndex=1

      Example Description:

      Log4J's RollingFileAppender gives you the ability to output - log messages to a series of rolling files. However, there are no - utilities available for reading in and viewing those files once they - have been written. LogFactor5 provides developers with two easy ways - to open and view log files. Log files can be opened locally using - the 'Open' menu item or log files can be opened from a remote server - using the 'Open URL' menu item.

      + log messages to a series of rolling files. However, there are + no utilities available for reading in and viewing those files + once they have been written. LogFactor5 provides developers + with two easy ways to open and view log files. Log files can + be opened locally using the 'Open' menu item or log files can + be opened from a remote server using the 'Open URL' menu + item. +

      An additional feature that was added to LogFactor5 was the - ability to start the console window independent of Log4J. That is to - say, you do not need to add a LF5Appender to your properties file to - use LogFactor5. The benefit of this feature is that developers who - run utilities like Ant to test their applications can now view their - log files off-line (i.e. after their application has completed the - test and the JVM has shut down). Moreover, the ability to open log - files on a remote server provides the ability for multiple - developers working on the same application to view log files - independently. It also gives developers the ability to view log - files both internally and from remote locations.

      + ability to start the console window independent of Log4J. That + is to say, you do not need to add a LF5Appender to your + properties file to use LogFactor5. The benefit of this feature + is that developers who run utilities like Ant to test their + applications can now view their log files off-line (i.e. after + their application has completed the test and the JVM has shut + down). Moreover, the ability to open log files on a remote + server provides the ability for multiple developers working on + the same application to view log files independently. It also + gives developers the ability to view log files both internally + and from remote locations. +

      This example uses the sample.log file created by Log4J's RollingFileAppender. 1The format of the log file can be set in @@ -468,7 +416,8 @@ log4j.appender.R.MaxBackupIndex=1 must follow the LogFactor5 layout conventions in order for LogFactor5 to open the file. The following is an example of a properties file with the LogFactor5 conversion pattern - added:

      + added: +

      log4j.rootCategory= R
       
      @@ -518,10 +467,17 @@ Message - %m[slf5s.MESSAGE]
       	log4j conversion character.

      Running the Example:

      +
        +
      • Ensure that LOG4J_HOME/dist/classes is in your + CLASSPATH.
      • + +
      • Ensure that a JAXP compatible XML parser is in is in your + CLASSPATH.
      • -
      • Navigate to the examples/lf5 directory and double - click the StartLogFactor5Console.bat file.
      • +
      • Type the following at the command line: java + org.apache.log4j.lf5.StartLogFactor5 +
      • Under the 'File' menu, select 'Open'.
      • @@ -564,20 +520,17 @@ Message - %m[slf5s.MESSAGE]

      Running the Example:

      -

      Option 1:

        -
      • Navigate to the examples/lf5 directory and double click the UsingLogMonitorAdapter.bat - file.
      • -
      +
    15. Ensure that LOG4J_HOME/dist/classes is in your + CLASSPATH.
    16. + +
    17. Ensure that a JAXP compatible XML parser is in is in your + CLASSPATH.
    18. -

      Option 2:

      -
        -
      • Ensure that the log4j.jar file is in your CLASSPATH
      • -
      • Ensure that the LOG4J_HOME environment variable is set to the directory - where you installed log4j
      • -
      • At the command line, change to the LOG4J_HOME\dist\classes - directory
      • -
      • Type the following at the command line: java examples.lf5.UsingLogMonitorAdapter.UsingLogMonitorAdapter +
      • Type the following at the command line: + +

        java + examples.lf5.UsingLogMonitorAdapter.UsingLogMonitorAdapter

      @@ -620,28 +573,17 @@ Message - %m[slf5s.MESSAGE]

      Running the Example:

      -

      Option 1:

        - -
      • Navigate to the examples/lf5 directory and double - click the - CustomizedLogLevels_UsingLogMonitorAdapter.bat - file.
      • -
      - -

      Option 2:

      -
        -
      • Ensure that the log4j.jar file is in your CLASSPATH
      • - -
      • Ensure that the LOG4J_HOME environment variable is set to - the directory where you installed log4j
      • +
      • Ensure that LOG4J_HOME/dist/classes is in your + CLASSPATH.
      • -
      • At the command line, change to the LOG4J_HOME\dist\classes - directory
      • +
      • Ensure that a JAXP compatible XML parser is in is in your + CLASSPATH.
      • -
      • Type the following at the command line: java - examples.lf5.UsingLogMonitorAdapter.CustomizedLogLevels +
      • Type the following at the command line: + +

        java + examples.lf5.UsingLogMonitorAdapter.CustomizedLogLevels

      diff --git a/src/xdocs/plan.xml b/src/xdocs/plan.xml index 72a51a640c..7d240c8e77 100644 --- a/src/xdocs/plan.xml +++ b/src/xdocs/plan.xml @@ -3,7 +3,7 @@ Ceki Gulcu - Release plan for log4j 1.2 + Release plan for log4j 1.3 @@ -35,10 +35,13 @@
      -

      With log4j 1.2 still in beta, the workplan for log4j 1.3 is - obviously not final. It is included here to give you an idea - of the future. The items are not listed in any particular - order. +

      The workplan for log4j 1.3 is not final. It is included here + to give you an idea of the future. The items are not listed in + any particular order. As always, there is no scheduled + release date. The lack of schedule suprises and disturbs some + people. Writing good software, like good cooking, takes + time. If we make you wait, it is to create a better and more + reliable product.

      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 X^}1KS_SLU{1#DmiJJ_)zARqucTDrQN literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_openurl.gif b/docs/lf5/images/lf5_openurl.gif new file mode 100644 index 0000000000000000000000000000000000000000..91a4765597081a62f54f84820ff5348e602316a4 GIT binary patch literal 61066 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

      6&pkdbMH^pUT@&oeh1quUS>4p&mmg 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 literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_loglevels.gif b/docs/lf5/images/lf5_loglevels.gif new file mode 100644 index 0000000000000000000000000000000000000000..204a029068104899e0f0e3f20e127232652aaf56 GIT binary patch literal 62411 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≀2w5Q4j|nv?F(# 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 No$YORyVe5&06PNOKve($ literal 0 HcmV?d00001 diff --git a/docs/lf5/images/lf5_compactview.gif b/docs/lf5/images/lf5_compactview.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd84c9219c5cd7588fb7c422aac37d14362e1822 GIT binary patch literal 53415 zcmX7vc|6o#)W^TGkF_CtmO%8v2=iJvh_x<_Y>jrvi>i4X`Tc8a9U@#aze*9n@9{xO{ul@eb zVC3xY|2uoUzrX)uZ<)bR`t{5F`1sDo#>UFZFUIWb($doA{QTRujQxGg$9FSt-@aXX zJ2*G@W^QU|e4Mc}ILPSioE#q*A0J;{K0h$271P$X z|LWDN@o}ZbS8rdwT;D4$X5{4Lc5l3R@v{2)SlWx_`D(Z7>czUc*Y)-F^pq4*{Y-oN zxw5jd;^LR#mGhY;l!GTva&pEev#vcMzd7{r$;rv7tQ38m)x&UdN>1)cNqO#*-k+G5 z$gr`=$`bZW>>?7In?sc&BO{+YDgANdh7++dBqW5PqvPk7MI;LN`1n}*)iaco0t5M+ zoN`=UBN@`tH{6PyoSaM@(w&{T83F=WyBuq4>zg-|&CLEYGcz+Vh*vUAGBmtvXlQ6= zhLX4%rK6*R#jeICJjLfX;oZP(pg2Ezl zaY<=}pgR|Ugw)p6H#}=>dfwdf;$>@Fdq-#2tM1p7p5DIxfx)5SkE-R9e;AACLhcJ%$n@z0ZAzyEv{1R%_U`ia-OdJeLpiP#s`?P@#tG@K@TX=%M*OC#kc5n z`GRDbS09`Dps&6}^;w3$vFgZ2e~o+EX@R#a?vw{xIsLQ?we{Qn?+O0Pbqgz4rfUU} zt)jXjoZm@G8)#l5K>-MW-z)&2L?X&I9jKH;hHyk6 g2onTJ2*<>OgT7dQmzS$f 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

      @@ -234,11 +237,7 @@

      - Here is workplan for the 1.2 release. As always, there is no - scheduled release date. The lack of schedule suprises and - disturbs some people. Writing good software, like good - cooking, takes time. If we make you wait, it is to create a - better and more reliable product. + Here is workplan for the 1.2 release.

      From 450e7fe1df556564b865c4393f4c535f41201dc0 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 12 Jun 2002 21:41:35 +0000 Subject: [PATCH 038/342] Added a witness for the latest XMLLayout test. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309589 13f79535-47bb-0310-9956-ffa450edef68 --- tests/witness/xmlLayout.3 | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 tests/witness/xmlLayout.3 diff --git a/tests/witness/xmlLayout.3 b/tests/witness/xmlLayout.3 new file mode 100644 index 0000000000..cf1c467763 --- /dev/null +++ b/tests/witness/xmlLayout.3 @@ -0,0 +1,5 @@ + +hi]]>]]> + + + From 2650b124cf3cc85ea02cea927e6472ccc95a1d2a Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 13 Jun 2002 18:00:06 +0000 Subject: [PATCH 039/342] javadoc corrections PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309591 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/log4j/DailyRollingFileAppender.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/java/org/apache/log4j/DailyRollingFileAppender.java b/src/java/org/apache/log4j/DailyRollingFileAppender.java index c90a209481..10f042e134 100644 --- a/src/java/org/apache/log4j/DailyRollingFileAppender.java +++ b/src/java/org/apache/log4j/DailyRollingFileAppender.java @@ -52,11 +52,10 @@ - - - - - " + Layout.LINE_SEP); sbuf.append("" + Layout.LINE_SEP); - sbuf.append("" + Layout.LINE_SEP); if(locationInfo) { diff --git a/src/java/org/apache/log4j/SimpleLayout.java b/src/java/org/apache/log4j/SimpleLayout.java index 565ca5479b..8c58eeb91b 100644 --- a/src/java/org/apache/log4j/SimpleLayout.java +++ b/src/java/org/apache/log4j/SimpleLayout.java @@ -49,7 +49,7 @@ void activateOptions() { String format(LoggingEvent event) { sbuf.setLength(0); - sbuf.append(event.level.toString()); + sbuf.append(event.getLevel().toString()); sbuf.append(" - "); sbuf.append(event.getRenderedMessage()); sbuf.append(LINE_SEP); diff --git a/src/java/org/apache/log4j/TTCCLayout.java b/src/java/org/apache/log4j/TTCCLayout.java index 5ce94e60b2..ae3b7d7422 100644 --- a/src/java/org/apache/log4j/TTCCLayout.java +++ b/src/java/org/apache/log4j/TTCCLayout.java @@ -175,11 +175,11 @@ String format(LoggingEvent event) { buf.append(event.getThreadName()); buf.append("] "); } - buf.append(event.level.toString()); + buf.append(event.getLevel().toString()); buf.append(' '); if(this.categoryPrefixing) { - buf.append(event.categoryName); + buf.append(event.getLoggerName()); buf.append(' '); } diff --git a/src/java/org/apache/log4j/chainsaw/EventDetails.java b/src/java/org/apache/log4j/chainsaw/EventDetails.java index 12ddc51c65..a0538e6dd9 100644 --- a/src/java/org/apache/log4j/chainsaw/EventDetails.java +++ b/src/java/org/apache/log4j/chainsaw/EventDetails.java @@ -73,8 +73,8 @@ class EventDetails { EventDetails(LoggingEvent aEvent) { this(aEvent.timeStamp, - aEvent.level, - aEvent.categoryName, + aEvent.getLevel(), + aEvent.getLoggerName(), aEvent.getNDC(), aEvent.getThreadName(), aEvent.getRenderedMessage(), diff --git a/src/java/org/apache/log4j/helpers/Loader.java b/src/java/org/apache/log4j/helpers/Loader.java index 7d30c6749d..6376ecf42d 100644 --- a/src/java/org/apache/log4j/helpers/Loader.java +++ b/src/java/org/apache/log4j/helpers/Loader.java @@ -27,7 +27,9 @@ public class Loader { // We conservatively assume that we are running under Java 1.x static private boolean java1 = true; - + + static private boolean ignoreTCL = false; + static { String prop = OptionConverter.getSystemProperty("java.version", null); @@ -38,6 +40,10 @@ public class Loader { java1 = false; } } + String ignoreTCLProp = OptionConverter.getSystemProperty("log4j.ignoreTCL", null); + if(ignoreTCLProp != null) { + ignoreTCL = OptionConverter.toBoolean(ignoreTCLProp, true); + } } /* A cache for @@ -63,38 +69,36 @@ built-in class loader in JDK 1.1. */ - static - public - URL getResource(String resource) { + static public URL getResource(String resource) { ClassLoader classLoader = null; URL url = null; try { - if(!java1) { - classLoader = getTCL(); - if(classLoader != null) { - LogLog.debug("Trying to find ["+resource+"] using context classloader " - +classLoader+"."); - url = classLoader.getResource(resource); - if(url != null) { - return url; - } - } - } - - // We could not find resource. Ler us now try with the - // classloader that loaded this class. - classLoader = Loader.class.getClassLoader(); - if(classLoader != null) { - LogLog.debug("Trying to find ["+resource+"] using "+classLoader - +" class loader."); - url = classLoader.getResource(resource); - if(url != null) { - return url; - } - } + if(!java1) { + classLoader = getTCL(); + if(classLoader != null) { + LogLog.debug("Trying to find ["+resource+"] using context classloader " + +classLoader+"."); + url = classLoader.getResource(resource); + if(url != null) { + return url; + } + } + } + + // We could not find resource. Ler us now try with the + // classloader that loaded this class. + classLoader = Loader.class.getClassLoader(); + if(classLoader != null) { + LogLog.debug("Trying to find ["+resource+"] using "+classLoader + +" class loader."); + url = classLoader.getResource(resource); + if(url != null) { + return url; + } + } } catch(Throwable t) { - LogLog.warn(TSTR, t); + LogLog.warn(TSTR, t); } // Last ditch attempt: get the resource from the class path. It @@ -102,7 +106,7 @@ URL getResource(String resource) { // loader which the parent of the system class loader. Hence the // code below. LogLog.debug("Trying to find ["+resource+ - "] using ClassLoader.getSystemResource()."); + "] using ClassLoader.getSystemResource()."); return ClassLoader.getSystemResource(resource); } @@ -146,7 +150,9 @@ private static ClassLoader getTCL() throws IllegalAccessException, * */ static public Class loadClass (String clazz) throws ClassNotFoundException { - if(java1) { + // Just call Class.forName(clazz) if we are running under JDK 1.1 + // or if we are instructed to ignore the TCL. + if(java1 || ignoreTCL) { return Class.forName(clazz); } else { try { diff --git a/src/java/org/apache/log4j/helpers/OptionConverter.java b/src/java/org/apache/log4j/helpers/OptionConverter.java index a96b537f84..3a4b6d744d 100644 --- a/src/java/org/apache/log4j/helpers/OptionConverter.java +++ b/src/java/org/apache/log4j/helpers/OptionConverter.java @@ -310,6 +310,10 @@ Object instantiateByClassName(String className, Class superClass, if(!superClass.isAssignableFrom(classObj)) { LogLog.error("A \""+className+"\" object is not assignable to a \""+ superClass.getName() + "\" variable."); + LogLog.error("The class \""+ superClass.getName()+"\" was loaded by [" + +superClass.getClassLoader()+"] whereas object of type\"" + +classObj.getClass().getName() +"\" was loaded by [" + +classObj.getClass().getClassLoader()+"]."); return defaultValue; } return classObj.newInstance(); diff --git a/src/java/org/apache/log4j/helpers/PatternParser.java b/src/java/org/apache/log4j/helpers/PatternParser.java index f6fecf39e5..1e78876ebe 100644 --- a/src/java/org/apache/log4j/helpers/PatternParser.java +++ b/src/java/org/apache/log4j/helpers/PatternParser.java @@ -388,7 +388,7 @@ String convert(LoggingEvent event) { case THREAD_CONVERTER: return event.getThreadName(); case LEVEL_CONVERTER: - return event.level.toString(); + return event.getLevel().toString(); case NDC_CONVERTER: return event.getNDC(); case MESSAGE_CONVERTER: { @@ -538,7 +538,7 @@ private class CategoryPatternConverter extends NamedPatternConverter { } String getFullyQualifiedName(LoggingEvent event) { - return event.categoryName; + return event.getLoggerName(); } } } diff --git a/src/java/org/apache/log4j/lf5/LF5Appender.java b/src/java/org/apache/log4j/lf5/LF5Appender.java index 444b76e136..e27dbee258 100644 --- a/src/java/org/apache/log4j/lf5/LF5Appender.java +++ b/src/java/org/apache/log4j/lf5/LF5Appender.java @@ -88,11 +88,11 @@ public LF5Appender(LogBrokerMonitor monitor) { */ public void append(LoggingEvent event) { // Retrieve the information from the log4j LoggingEvent. - String category = event.categoryName; + String category = event.getLoggerName(); String logMessage = event.getRenderedMessage(); String nestedDiagnosticContext = event.getNDC(); String threadDescription = event.getThreadName(); - String level = event.level.toString(); + String level = event.getLevel().toString(); long time = event.timeStamp; LocationInfo locationInfo = event.getLocationInformation(); @@ -255,4 +255,4 @@ protected static int getDefaultMonitorHeight() { // Nested Top-Level Classes or Interfaces: //-------------------------------------------------------------------------- -} \ No newline at end of file +} diff --git a/src/java/org/apache/log4j/net/JMSAppender.java b/src/java/org/apache/log4j/net/JMSAppender.java index 165ed1a7ea..ef278c205f 100644 --- a/src/java/org/apache/log4j/net/JMSAppender.java +++ b/src/java/org/apache/log4j/net/JMSAppender.java @@ -12,26 +12,99 @@ import org.apache.log4j.spi.ErrorCode; import org.apache.log4j.helpers.LogLog; -import javax.jms.*; +import java.util.Properties; +import javax.jms.TopicConnection; +import javax.jms.TopicConnectionFactory; +import javax.jms.Topic; +import javax.jms.TopicPublisher; +import javax.jms.TopicSession; +import javax.jms.Session; +import javax.jms.ObjectMessage; import javax.naming.InitialContext; import javax.naming.Context; import javax.naming.NameNotFoundException; import javax.naming.NamingException; /** - A simple appender based on JMS. + * A simple appender that publishes events to a JMS Topic. The events + * are serialized and transmitted as JMS message type {@link + * ObjectMessage}. - @author Ceki Gülcü -*/ + *

      JMS {@link Topic topics} and {@link TopicConnectionFactory topic + * connection factories} are administered objects that are retrieved + * using JNDI messaging which in turn requires the retreival of a JNDI + * {@link Context}. + + *

      There are two common methods for retrieving a JNDI {@link + * Context}. If a file resource named jndi.properties is + * available to the JNDI API, it will use the information found + * therein to retrieve an initial JNDI context. To obtain an initial + * context, your code will simply call: + +

      +   InitialContext jndiContext = new InitialContext();
      +   
      + + *

      Calling the no-argument InitialContext() method + * will also work from within Enterprise Java Beans (EJBs) because it + * is part of the EJB contract for application servers to provide each + * bean an environment naming context (ENC). + + *

      In the second approach, several predetermined properties are set + * and these properties are passed to the InitialContext + * contructor to connect to the naming service provider. For example, + * to connect to JBoss naming service one would write: + +

      +   Properties env = new Properties( );
      +   env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
      +   env.put(Context.PROVIDER_URL, "jnp://hostname:1099");
      +   env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
      +   InitialContext jndiContext = new InitialContext(env);
      +
      + + * where hostname is the host where the JBoss applicaiton + * server is running. + * + *

      To connect to the the naming service of Weblogic application + * server one would write: + +

      +   Properties env = new Properties( );
      +   env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
      +   env.put(Context.PROVIDER_URL, "t3://localhost:7001");
      +   InitialContext jndiContext = new InitialContext(env);
      +
      + + *

      Other JMS providers will obviously require different values. + * + * The initial JNDI context can be obtained by calling the + * no-argument InitialContext() method in EJBs. Only + * clients running in a separate JVM need to be concerned about the + * jndi.properties file and calling {@link + * InitialContext#InitialContext()} or alternatively correctly + * setting the different properties before calling {@link + * InitialContext#InitialContext(java.util.Hashtable)} method. + + + @author Ceki Gülcü */ public class JMSAppender extends AppenderSkeleton { - TopicConnection topicConnection; - TopicSession topicSession; - TopicPublisher topicPublisher; + String securityPrincipalName; + String securityCredentials; + String initialContextFactoryName; + String urlPkgPrefixes; + String providerURL; String topicBindingName; String tcfBindingName; + String userName; + String password; boolean locationInfo; + TopicConnection topicConnection; + TopicSession topicSession; + TopicPublisher topicPublisher; + public JMSAppender() { } @@ -82,31 +155,76 @@ boolean getLocationInfo() { return locationInfo; } - public - void activateOptions() { + /** + * Options are activated and become effective only after calling + * this method.*/ + public void activateOptions() { TopicConnectionFactory topicConnectionFactory; try { - Context ctx = new InitialContext(); - topicConnectionFactory = (TopicConnectionFactory) lookup(ctx, tcfBindingName); - topicConnection = topicConnectionFactory.createTopicConnection(); - topicConnection.start(); + Context jndi; + + LogLog.debug("Getting initial context."); + if(initialContextFactoryName != null) { + Properties env = new Properties( ); + env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactoryName); + if(providerURL != null) { + env.put(Context.PROVIDER_URL, providerURL); + } else { + LogLog.warn("You have set InitialContextFactoryName option but not the " + +"ProviderURL. This is likely to cause problems."); + } + if(urlPkgPrefixes != null) { + env.put(Context.URL_PKG_PREFIXES, urlPkgPrefixes); + } + + if(securityPrincipalName != null) { + env.put(Context.SECURITY_PRINCIPAL, securityPrincipalName); + if(securityCredentials != null) { + env.put(Context.SECURITY_CREDENTIALS, securityCredentials); + } else { + LogLog.warn("You have set SecurityPrincipalName option but not the " + +"SecurityCredentials. This is likely to cause problems."); + } + } + jndi = new InitialContext(env); + } else { + jndi = new InitialContext(); + } + + LogLog.debug("Looking up ["+tcfBindingName+"]"); + topicConnectionFactory = (TopicConnectionFactory) lookup(jndi, tcfBindingName); + LogLog.debug("About to create TopicConnection."); + if(userName != null) { + LogLog.debug("--------User name: "+userName); + topicConnection = topicConnectionFactory.createTopicConnection(userName, + password); + } else { + topicConnection = topicConnectionFactory.createTopicConnection(); + } + LogLog.debug("Creating TopicSession, non-transactional, " + +"in AUTO_ACKNOWLEDGE mode."); topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); - Topic topic = (Topic) lookup(ctx, topicBindingName); + LogLog.debug("Looking up topic name ["+topicBindingName+"]."); + Topic topic = (Topic) lookup(jndi, topicBindingName); + + LogLog.debug("Creating TopicPublisher."); topicPublisher = topicSession.createPublisher(topic); + + LogLog.debug("Starting TopicConnection."); + topicConnection.start(); - ctx.close(); + jndi.close(); } catch(Exception e) { errorHandler.error("Error while activating options for appender named ["+name+ "].", e, ErrorCode.GENERIC_FAILURE); } } - protected - Object lookup(Context ctx, String name) throws NamingException { + protected Object lookup(Context ctx, String name) throws NamingException { try { return ctx.lookup(name); } catch(NameNotFoundException e) { @@ -115,8 +233,7 @@ Object lookup(Context ctx, String name) throws NamingException { } } - protected - boolean checkEntryConditions() { + protected boolean checkEntryConditions() { String fail = null; if(this.topicConnection == null) { @@ -138,9 +255,9 @@ boolean checkEntryConditions() { /** Close this JMSAppender. Closing releases all resources used by the appender. A closed appender cannot be re-opened. */ - public - synchronized // avoid concurrent append and close operations - void close() { + public synchronized void close() { + // The synchronized modifier avoids concurrent append and close operations + if(this.closed) return; @@ -164,8 +281,7 @@ void close() { /** This method called by {@link AppenderSkeleton#doAppend} method to do most of the real appending work. */ - public - void append(LoggingEvent event) { + public void append(LoggingEvent event) { if(!checkEntryConditions()) { return; } @@ -184,17 +300,101 @@ void append(LoggingEvent event) { } /** - If true, the information sent to the remote subscriber will include - location information. By default no location information is sent - to the subscriber. */ - public - void setLocationInfo(boolean locationInfo) { + * Returns the value of the InitialContextFactoryName option. + * See {@link #setInitialContextFactoryName} for more details on the + * meaning of this option. + * */ + public String getInitialContextFactoryName() { + return initialContextFactoryName; + } + + /** + * Setting the InitialContextFactoryName method will cause + * this JMSAppender instance to use the {@link + * InitialContext#InitialContext(Hashtable)} method instead of the + * no-argument constructor. If you set this option, you should also + * at least set the ProviderURL option. + * + *

      See also {@link #setProviderURL(String)}. + * */ + public void setInitialContextFactoryName(String initialContextFactoryName) { + this.initialContextFactoryName = initialContextFactoryName; + } + + public String getProviderURL() { + return providerURL; + } + + public void setProviderURL(String providerURL) { + this.providerURL = providerURL; + } + + String getURLPkgPrefixes( ) { + return urlPkgPrefixes;; + } + + public void setURLPkgPrefixes(String urlPkgPrefixes ) { + this.urlPkgPrefixes = urlPkgPrefixes; + } + + public String getSecurityCredentials() { + return securityCredentials; + } + + public void setSecurityCredentials(String securityCredentials) { + this.securityCredentials = securityCredentials; + } + + + public String getSecurityPrincipalName() { + return securityPrincipalName; + } + + public void setSecurityPrincipalName(String securityPrincipalName) { + this.securityPrincipalName = securityPrincipalName; + } + + public String getUserName() { + return userName; + } + + /** + * The user name to use when {@link + * TopicConnectionFactory#createTopicConnection(String, String) + * creating a topic session}. If you set this option, you should + * also set the Password option. See {@link + * #setPassword(String)}. + * */ + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassword() { + return password; + } + + /** + * The paswword to use when creating a topic session. + */ + public void setPassword(String password) { + this.password = password; + } + + + /** + If true, the information sent to the remote subscriber will + include caller's location information. By default no location + information is sent to the subscriber. */ + public void setLocationInfo(boolean locationInfo) { this.locationInfo = locationInfo; } - public - boolean requiresLayout() { + /** + * The JMSAppender sends serialized events and consequently does not + * require a layout. + * */ + public boolean requiresLayout() { return false; } } diff --git a/src/java/org/apache/log4j/net/JMSSink.java b/src/java/org/apache/log4j/net/JMSSink.java index 877df006e4..299eeee55c 100644 --- a/src/java/org/apache/log4j/net/JMSSink.java +++ b/src/java/org/apache/log4j/net/JMSSink.java @@ -8,7 +8,7 @@ package org.apache.log4j.net; import org.apache.log4j.spi.LoggingEvent; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.apache.log4j.spi.RendererSupport; import org.apache.log4j.spi.LoggerRepository; @@ -16,35 +16,52 @@ import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.helpers.LogLog; -import javax.jms.*; +import javax.jms.Message; +import javax.jms.MessageListener; +import javax.jms.TopicConnection; +import javax.jms.Topic; +import javax.jms.TopicConnectionFactory; +import javax.jms.TopicSubscriber; +import javax.jms.Session; +import javax.jms.TopicSession; +import javax.jms.ObjectMessage; +import javax.jms.JMSException; import javax.naming.InitialContext; import javax.naming.Context; import javax.naming.NameNotFoundException; import javax.naming.NamingException; +import java.util.Properties; /** - A simple application receiving the logging events sent by a JMSAppender. - + * A simple application that consumes logging events sent by a {@link + * JMSAppender}. + * + * + * @author Ceki Gülcü + * */ +public class JMSSink implements javax.jms.MessageListener { - @author Ceki Gülcü -*/ -public class JMSSink { + static Logger logger = Logger.getLogger(JMSSink.class); static public void main(String[] args) { - if(args.length != 3) { + if(args.length != 5) { usage("Wrong number of arguments."); } - + String tcfBindingName = args[0]; String topicBindingName = args[1]; - PropertyConfigurator.configure(args[2]); + String username = args[2]; + String password = args[3]; + PropertyConfigurator.configure(args[4]); - LoggerRepository rep = LogManager.getLoggerRepository(); - if(rep instanceof RendererSupport) { - ((RendererSupport) rep).setRenderer(Message.class, new MessageRenderer()); - } + new JMSSink(tcfBindingName, topicBindingName, username, password); + + } + public JMSSink( String tcfBindingName, String topicBindingName, String username, + String password) { + try { Context ctx = new InitialContext(); TopicConnectionFactory topicConnectionFactory; @@ -52,7 +69,8 @@ static public void main(String[] args) { tcfBindingName); TopicConnection topicConnection = - topicConnectionFactory.createTopicConnection(); + topicConnectionFactory.createTopicConnection(username, + password); topicConnection.start(); TopicSession topicSession = topicConnection.createTopicSession(false, @@ -60,47 +78,49 @@ static public void main(String[] args) { Topic topic = (Topic)ctx.lookup(topicBindingName); - //TopicSubscriber topicSubscriber = topicSession.createSubscriber(topic); - TopicSubscriber topicSubscriber = - topicSession.createDurableSubscriber(topic, "x"); - + TopicSubscriber topicSubscriber = topicSession.createSubscriber(topic); + + topicSubscriber.setMessageListener(this); - LoggingEvent event; - Category remoteCategory; - - while(true) { - ObjectMessage msg = (ObjectMessage)topicSubscriber.receive(); - event = (LoggingEvent) msg.getObject(); - remoteCategory = Category.getInstance(event.categoryName); - remoteCategory.callAppenders(event); + } catch(Exception e) { + logger.error("Could not read JMS message.", e); + } + } - // dump the JMSMessage - // remoteCategory.debug(msg); + public void onMessage(javax.jms.Message message) { + LoggingEvent event; + Logger remoteLogger; - } - } catch(Exception e) { - LogLog.error("Could not read JMS message.", e); + try { + if(message instanceof ObjectMessage) { + ObjectMessage objectMessage = (ObjectMessage) message; + event = (LoggingEvent) objectMessage.getObject(); + remoteLogger = Logger.getLogger(event.getLoggerName()); + remoteLogger.callAppenders(event); + } else { + logger.warn("Received message is of type "+message.getJMSType() + +", was expecting ObjectMessage."); + } + } catch(JMSException jmse) { + logger.error("Exception thrown while processing incoming message.", + jmse); } } - protected - static - Object lookup(Context ctx, String name) throws NamingException { + protected static Object lookup(Context ctx, String name) throws NamingException { try { return ctx.lookup(name); } catch(NameNotFoundException e) { - LogLog.error("Could not find name ["+name+"]."); + logger.error("Could not find name ["+name+"]."); throw e; } } - - static - void usage(String msg) { + static void usage(String msg) { System.err.println(msg); System.err.println("Usage: java " + JMSSink.class.getName() - + " TopicConnectionFactoryBindingName TopicBindingName configFile"); + + " TopicConnectionFactoryBindingName TopicBindingName username password configFile"); System.exit(1); } } diff --git a/src/java/org/apache/log4j/net/SocketNode.java b/src/java/org/apache/log4j/net/SocketNode.java index 0bea95ebf8..981689af19 100644 --- a/src/java/org/apache/log4j/net/SocketNode.java +++ b/src/java/org/apache/log4j/net/SocketNode.java @@ -66,10 +66,10 @@ public void run() { // read an event from the wire event = (LoggingEvent) ois.readObject(); // get a logger from the hierarchy. The name of the logger is taken to be the name contained in the event. - remoteLogger = hierarchy.getLogger(event.categoryName); - event.logger = remoteLogger; + remoteLogger = hierarchy.getLogger(event.getLoggerName()); + //event.logger = remoteLogger; // apply the logger-level filter - if(event.level.isGreaterOrEqual(remoteLogger.getEffectiveLevel())) { + if(event.getLevel().isGreaterOrEqual(remoteLogger.getEffectiveLevel())) { // finally log the event as if was generated locally remoteLogger.callAppenders(event); } diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/java/org/apache/log4j/net/SyslogAppender.java index 664da4b9a6..a3fae197e8 100644 --- a/src/java/org/apache/log4j/net/SyslogAppender.java +++ b/src/java/org/apache/log4j/net/SyslogAppender.java @@ -228,7 +228,7 @@ int getFacility(String facilityName) { public void append(LoggingEvent event) { - if(!isAsSevereAsThreshold(event.level)) + if(!isAsSevereAsThreshold(event.getLevel())) return; // We must not attempt to append if sqw is null. @@ -241,7 +241,7 @@ void append(LoggingEvent event) { String buffer = (facilityPrinting? facilityStr : "") + layout.format(event); - sqw.setLevel(event.level.getSyslogEquivalent()); + sqw.setLevel(event.getLevel().getSyslogEquivalent()); sqw.write(buffer); String[] s = event.getThrowableStrRep(); diff --git a/src/java/org/apache/log4j/nt/NTEventLogAppender.java b/src/java/org/apache/log4j/nt/NTEventLogAppender.java index d63a919442..b4012394a7 100644 --- a/src/java/org/apache/log4j/nt/NTEventLogAppender.java +++ b/src/java/org/apache/log4j/nt/NTEventLogAppender.java @@ -110,7 +110,7 @@ public void append(LoggingEvent event) { } } // Normalize the log message level into the supported categories - int nt_category = event.level.toInt(); + int nt_category = event.getLevel().toInt(); // Anything above FATAL or below DEBUG is labeled as INFO. //if (nt_category > FATAL || nt_category < DEBUG) { diff --git a/src/java/org/apache/log4j/spi/LoggingEvent.java b/src/java/org/apache/log4j/spi/LoggingEvent.java index e20db2dc4f..fb78c7b42f 100644 --- a/src/java/org/apache/log4j/spi/LoggingEvent.java +++ b/src/java/org/apache/log4j/spi/LoggingEvent.java @@ -45,15 +45,34 @@ public class LoggingEvent implements java.io.Serializable { * *

      It is set by the LoggingEvent constructor or set by a remote * entity after deserialization. + * + * @deprecated This field will be marked as private or be completely + * removed in future releases. Please do not use it. * */ - transient public Category logger; + transient private Category logger; - /** The category (logger) name. */ - public final String categoryName; + /** + *

      The category (logger) name. + * + * @deprecated This field will be marked as private in future + * releases. Please do not access it directly. Use the {@link + * #getLoggerName} method instead. + + * */ + final public String categoryName; - /** Level of logging event. Level cannot be serializable - because it is a flyweight. Due to its special seralization it - cannot be declared final either. */ + /** + * Level of logging event. Level cannot be serializable because it + * is a flyweight. Due to its special seralization it cannot be + * declared final either. + * + *

      This field should not be accessed directly. You shoud use the + * {@link #getLevel} method instead. + * + * @deprecated This field will be marked as private in future + * releases. Please do not access it directly. Use the {@link + * #getLevel} method instead. + * */ transient public Priority level; /** The nested diagnostic context (NDC) of logging event. */ @@ -154,20 +173,31 @@ public LoggingEvent(String fqnOfCategoryClass, Category logger, this.timeStamp = timeStamp; } - - /** Set the location information for this logging event. The collected information is cached for future use. */ - public - LocationInfo getLocationInformation() { + public LocationInfo getLocationInformation() { if(locationInfo == null) { locationInfo = new LocationInfo(new Throwable(), fqnOfCategoryClass); } return locationInfo; } + /** + * Return the level of this event. Use this form instead of directly + * accessing the level field. */ + public Level getLevel() { + return (Level) level; + } + + /** + * Return the name of the logger. Use this form instead of directly + * accessing the categoryName field. + */ + public String getLoggerName() { + return categoryName; + } /** Return the message for this logging event. @@ -267,9 +297,7 @@ String getRenderedMessage() { /** Returns the time when the application started, in milliseconds elapsed since 01.01.1970. */ - public - static - long getStartTime() { + public static long getStartTime() { return startTime; } diff --git a/src/java/org/apache/log4j/varia/LevelMatchFilter.java b/src/java/org/apache/log4j/varia/LevelMatchFilter.java index 483aee8ae0..1d47c4b053 100644 --- a/src/java/org/apache/log4j/varia/LevelMatchFilter.java +++ b/src/java/org/apache/log4j/varia/LevelMatchFilter.java @@ -79,7 +79,7 @@ int decide(LoggingEvent event) { } boolean matchOccured = false; - if(this.levelToMatch.equals(event.level)) { + if(this.levelToMatch.equals(event.getLevel())) { matchOccured = true; } diff --git a/src/java/org/apache/log4j/varia/LevelRangeFilter.java b/src/java/org/apache/log4j/varia/LevelRangeFilter.java index 9e3d1e187c..faefb6febc 100644 --- a/src/java/org/apache/log4j/varia/LevelRangeFilter.java +++ b/src/java/org/apache/log4j/varia/LevelRangeFilter.java @@ -59,14 +59,14 @@ public class LevelRangeFilter extends Filter { public int decide(LoggingEvent event) { if(this.levelMin != null) { - if (event.level.isGreaterOrEqual(levelMin) == false) { + if (event.getLevel().isGreaterOrEqual(levelMin) == false) { // level of event is less than minimum return Filter.DENY; } } if(this.levelMax != null) { - if (event.level.toInt() > levelMax.toInt()) { + if (event.getLevel().toInt() > levelMax.toInt()) { // level of event is greater than maximum // Alas, there is no Level.isGreater method. and using // a combo of isGreaterOrEqual && !Equal seems worse than diff --git a/src/java/org/apache/log4j/xml/XMLLayout.java b/src/java/org/apache/log4j/xml/XMLLayout.java index ac68ec2b39..de1db86fbe 100644 --- a/src/java/org/apache/log4j/xml/XMLLayout.java +++ b/src/java/org/apache/log4j/xml/XMLLayout.java @@ -100,11 +100,11 @@ public String format(LoggingEvent event) { // We yield to the \r\n heresy. buf.append("\r\n"); From cc319fe6438006f16476bc002e97905af312542f Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 31 Jul 2002 18:18:35 +0000 Subject: [PATCH 062/342] Improved error reporting for the "Appender not assingable to Appender" problem. Added blurb on the MDC bug in the HISTORY file. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309624 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY | 15 ++++++++++----- .../org/apache/log4j/helpers/OptionConverter.java | 8 ++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/HISTORY b/docs/HISTORY index b8e9d64a79..57d64f3a41 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -23,11 +23,16 @@ Modified existing appenders to comply with these new directives. [*] - - Log4j now will check if a system property called "log4j.ignoreTCL" - is set. If it is it will ignore the Thread Context ClassLoader when - loading classes. This solves the irrating "appender is not - appender" messages observed when log4j.jar is loaded by multiple - class loaders. [*] + - Log4j now will check if a system property named "log4j.ignoreTCL" + is set. If it is set, then it will ignore the Thread Context + ClassLoader when loading classes. This solves the irrating + "appender is not assignable to Appender" messages observed when + log4j.jar is loaded by multiple class loaders. + + The error reporting for this problem was also improved. [*] + + - Fixed bug #10528 whereby calling the MDC.get method with a null + argument would throw a NullPointerException. [*] July 5th, 2002 diff --git a/src/java/org/apache/log4j/helpers/OptionConverter.java b/src/java/org/apache/log4j/helpers/OptionConverter.java index 3a4b6d744d..00e7017864 100644 --- a/src/java/org/apache/log4j/helpers/OptionConverter.java +++ b/src/java/org/apache/log4j/helpers/OptionConverter.java @@ -310,10 +310,10 @@ Object instantiateByClassName(String className, Class superClass, if(!superClass.isAssignableFrom(classObj)) { LogLog.error("A \""+className+"\" object is not assignable to a \""+ superClass.getName() + "\" variable."); - LogLog.error("The class \""+ superClass.getName()+"\" was loaded by [" - +superClass.getClassLoader()+"] whereas object of type\"" - +classObj.getClass().getName() +"\" was loaded by [" - +classObj.getClass().getClassLoader()+"]."); + LogLog.error("The class \""+ superClass.getName()+"\" was loaded by "); + LogLog.error("["+superClass.getClassLoader()+"] whereas object of type "); + LogLog.error("\"" +classObj.getName()+"\" was loaded by [" + +classObj.getClassLoader()+"]."); return defaultValue; } return classObj.newInstance(); From 14decbfa70eeeb021adf660af7973c6867535797 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 1 Aug 2002 16:14:56 +0000 Subject: [PATCH 063/342] Small improvements to JMSAppender and JMSSink. Preparing to release 1.2.6. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309625 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/net/JMSAppender.java | 3 +-- src/java/org/apache/log4j/net/JMSSink.java | 27 +++++++++++++++++-- src/xdocs/download.xml | 10 +++---- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/java/org/apache/log4j/net/JMSAppender.java b/src/java/org/apache/log4j/net/JMSAppender.java index ef278c205f..21895c9255 100644 --- a/src/java/org/apache/log4j/net/JMSAppender.java +++ b/src/java/org/apache/log4j/net/JMSAppender.java @@ -196,9 +196,8 @@ public void activateOptions() { topicConnectionFactory = (TopicConnectionFactory) lookup(jndi, tcfBindingName); LogLog.debug("About to create TopicConnection."); if(userName != null) { - LogLog.debug("--------User name: "+userName); topicConnection = topicConnectionFactory.createTopicConnection(userName, - password); + password); } else { topicConnection = topicConnectionFactory.createTopicConnection(); } diff --git a/src/java/org/apache/log4j/net/JMSSink.java b/src/java/org/apache/log4j/net/JMSSink.java index 299eeee55c..f55e62963a 100644 --- a/src/java/org/apache/log4j/net/JMSSink.java +++ b/src/java/org/apache/log4j/net/JMSSink.java @@ -14,6 +14,7 @@ import org.apache.log4j.spi.LoggerRepository; import org.apache.log4j.or.jms.MessageRenderer; import org.apache.log4j.PropertyConfigurator; +import org.apache.log4j.xml.DOMConfigurator; import org.apache.log4j.helpers.LogLog; import javax.jms.Message; @@ -27,6 +28,9 @@ import javax.jms.ObjectMessage; import javax.jms.JMSException; +import java.io.BufferedReader; +import java.io.InputStreamReader; + import javax.naming.InitialContext; import javax.naming.Context; import javax.naming.NameNotFoundException; @@ -44,7 +48,7 @@ public class JMSSink implements javax.jms.MessageListener { static Logger logger = Logger.getLogger(JMSSink.class); - static public void main(String[] args) { + static public void main(String[] args) throws Exception { if(args.length != 5) { usage("Wrong number of arguments."); } @@ -53,10 +57,29 @@ static public void main(String[] args) { String topicBindingName = args[1]; String username = args[2]; String password = args[3]; - PropertyConfigurator.configure(args[4]); + + + String configFile = args[4]; + if(configFile.endsWith(".xml")) { + new DOMConfigurator().configure(configFile); + } else { + new PropertyConfigurator().configure(configFile); + } + new JMSSink(tcfBindingName, topicBindingName, username, password); + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + // Loop until the word "exit" is typed + System.out.println("Type \"exit\" to quit JMSSink."); + while(true){ + String s = stdin.readLine( ); + if (s.equalsIgnoreCase("exit")) { + System.out.println("Exiting. Kill the application if it does not exit " + + "due to daemon threads."); + return; + } + } } public JMSSink( String tcfBindingName, String topicBindingName, String username, diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 7f6991d19a..a3c9aee8cb 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -9,14 +9,14 @@ -

      -

      log4j 1.2.5 is available in TAR.GZ format - or in ZIP +

      +

      log4j 1.2.6 is available in TAR.GZ format + or in ZIP format.

      -

      Release 1.2.5 fixes minor bugs. See the Release 1.2.6 fixes minor bugs. See the HISTORY file for the exact details.

      From 5358344fc33ef1af2b16835a32a8c9f3fb85cf9c Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 1 Aug 2002 16:36:10 +0000 Subject: [PATCH 064/342] typo correction PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309626 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/HISTORY b/docs/HISTORY index 57d64f3a41..31704221ab 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -25,7 +25,7 @@ - Log4j now will check if a system property named "log4j.ignoreTCL" is set. If it is set, then it will ignore the Thread Context - ClassLoader when loading classes. This solves the irrating + ClassLoader when loading classes. This solves the irritating "appender is not assignable to Appender" messages observed when log4j.jar is loaded by multiple class loaders. From 3363bdeed342597f640bc822139641c16579e13e Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 2 Aug 2002 20:47:04 +0000 Subject: [PATCH 065/342] - Removed double semi-colons on line 332 in JMSAppender.java - Minor changes in JMSAppender.java PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309628 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY | 2 +- src/java/org/apache/log4j/net/JMSAppender.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/HISTORY b/docs/HISTORY index 31704221ab..cbd2fd5679 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -18,7 +18,7 @@ name. The public access categoryName field should not be accessed directly. Similarly, added the getLevel method which is now the preferred way of accessing the event's level. The public access - level field should not be accessd directly. The javadocs now mark + level field should not be accessed directly. The javadocs now mark the categoryName and level fields as deprecated. Modified existing appenders to comply with these new directives. [*] diff --git a/src/java/org/apache/log4j/net/JMSAppender.java b/src/java/org/apache/log4j/net/JMSAppender.java index 21895c9255..a97adc47e0 100644 --- a/src/java/org/apache/log4j/net/JMSAppender.java +++ b/src/java/org/apache/log4j/net/JMSAppender.java @@ -329,7 +329,7 @@ public void setProviderURL(String providerURL) { } String getURLPkgPrefixes( ) { - return urlPkgPrefixes;; + return urlPkgPrefixes; } public void setURLPkgPrefixes(String urlPkgPrefixes ) { From 918a8842cf67198a58a12c2004b18ba68e60a7cf Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 6 Aug 2002 09:13:08 +0000 Subject: [PATCH 066/342] Added missing files. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309629 13f79535-47bb-0310-9956-ffa450edef68 --- tests/input/socketServer7.properties | 8 ++++++++ tests/input/socketServer8.properties | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 tests/input/socketServer7.properties create mode 100644 tests/input/socketServer8.properties diff --git a/tests/input/socketServer7.properties b/tests/input/socketServer7.properties new file mode 100644 index 0000000000..ee5169df4b --- /dev/null +++ b/tests/input/socketServer7.properties @@ -0,0 +1,8 @@ +log4j.rootLogger=DEBUG, A +log4j.Logger.org.apache.log4j.test.ShortSocketServer=WARN +log4j.Logger.org.apache.log4j.net.SocketNode=WARN +log4j.appender.A=org.apache.log4j.FileAppender +log4j.appender.A.file=output/temp +log4j.appender.A.Append=false +log4j.appender.A.layout=org.apache.log4j.PatternLayout +log4j.appender.A.layout.ConversionPattern=%5p %x %X{hostID} %X{key7} [%t] %c{1} - %m%n diff --git a/tests/input/socketServer8.properties b/tests/input/socketServer8.properties new file mode 100644 index 0000000000..e88af64081 --- /dev/null +++ b/tests/input/socketServer8.properties @@ -0,0 +1,8 @@ +log4j.rootLogger=DEBUG, A +log4j.Logger.org.apache.log4j.test.ShortSocketServer=WARN +log4j.Logger.org.apache.log4j.net.SocketNode=WARN +log4j.appender.A=org.apache.log4j.FileAppender +log4j.appender.A.file=output/temp +log4j.appender.A.Append=false +log4j.appender.A.layout=org.apache.log4j.PatternLayout +log4j.appender.A.layout.ConversionPattern=%5p %x %X{hostID} %X{key8} [%t] %c{1} - %m%n From 6094d8b1c337bc249ab4e84fdbb8929a840d7c4b Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 28 Aug 2002 21:19:48 +0000 Subject: [PATCH 067/342] Added test cases for default initialization procedure. We now search for the file log4j.xml as well as the file log4j.properties in log4j initialization. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309630 13f79535-47bb-0310-9956-ffa450edef68 --- tests/build.xml | 52 ++++++++++++++++++- tests/input/defaultInit3.properties | 7 +++ tests/input/xml/defaultInit.xml | 17 ++++++ .../apache/log4j/defaultInit/TestCase1.java | 45 ++++++++++++++++ .../apache/log4j/defaultInit/TestCase2.java | 49 +++++++++++++++++ .../apache/log4j/defaultInit/TestCase3.java | 49 +++++++++++++++++ .../apache/log4j/defaultInit/TestCase4.java | 50 ++++++++++++++++++ 7 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 tests/input/defaultInit3.properties create mode 100644 tests/input/xml/defaultInit.xml create mode 100644 tests/src/java/org/apache/log4j/defaultInit/TestCase1.java create mode 100644 tests/src/java/org/apache/log4j/defaultInit/TestCase2.java create mode 100644 tests/src/java/org/apache/log4j/defaultInit/TestCase3.java create mode 100644 tests/src/java/org/apache/log4j/defaultInit/TestCase4.java diff --git a/tests/build.xml b/tests/build.xml index 8ea45c8b67..c89dc585a6 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -96,7 +96,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/input/defaultInit3.properties b/tests/input/defaultInit3.properties new file mode 100644 index 0000000000..ce38951cac --- /dev/null +++ b/tests/input/defaultInit3.properties @@ -0,0 +1,7 @@ + +log4j.rootCategory=DEBUG, D3 +log4j.appender.D3=org.apache.log4j.FileAppender +log4j.appender.D3.File=output/temp +log4j.appender.D3.Append=false +log4j.appender.D3.layout=org.apache.log4j.PatternLayout +log4j.appender.D3.layout.ConversionPattern=%d [%t] %-5p %.16c - %m%n \ No newline at end of file diff --git a/tests/input/xml/defaultInit.xml b/tests/input/xml/defaultInit.xml new file mode 100644 index 0000000000..58adbd40c3 --- /dev/null +++ b/tests/input/xml/defaultInit.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java new file mode 100644 index 0000000000..b228766479 --- /dev/null +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ + +package org.apache.log4j.defaultInit; + +import junit.framework.TestCase; +import junit.framework.TestSuite; +import junit.framework.Test; + +import java.util.Vector; + +import org.apache.log4j.*; +import org.apache.log4j.performance.NullAppender; + +public class TestCase1 extends TestCase { + + public TestCase1(String name) { + super(name); + } + + public void setUp() { + } + + public void tearDown() { + LogManager.shutdown(); + } + + public void noneTest() { + Logger root = Logger.getRootLogger(); + boolean rootIsConfigured = root.getAllAppenders().hasMoreElements(); + assertTrue(!rootIsConfigured); + } + + public static Test suite() { + TestSuite suite = new TestSuite(); + suite.addTest(new TestCase1("noneTest")); + return suite; + } + +} + diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java new file mode 100644 index 0000000000..35ed69d450 --- /dev/null +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ + +package org.apache.log4j.defaultInit; + +import junit.framework.TestCase; +import junit.framework.TestSuite; +import junit.framework.Test; + +import java.util.Vector; +import java.util.Enumeration; + +import org.apache.log4j.*; +import org.apache.log4j.performance.NullAppender; + +public class TestCase2 extends TestCase { + + public TestCase2(String name) { + super(name); + } + + public void setUp() { + } + + public void tearDown() { + LogManager.shutdown(); + } + + public void xmlTest() { + Logger root = Logger.getRootLogger(); + boolean rootIsConfigured = root.getAllAppenders().hasMoreElements(); + assertTrue(rootIsConfigured); + Enumeration e = root.getAllAppenders(); + Appender appender = (Appender) e.nextElement(); + assertEquals(appender.getName(), "D1"); + } + + public static Test suite() { + TestSuite suite = new TestSuite(); + suite.addTest(new TestCase2("xmlTest")); + return suite; + } + +} + diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java new file mode 100644 index 0000000000..e61af6d234 --- /dev/null +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ + +package org.apache.log4j.defaultInit; + +import junit.framework.TestCase; +import junit.framework.TestSuite; +import junit.framework.Test; + +import java.util.Vector; +import java.util.Enumeration; + +import org.apache.log4j.*; +import org.apache.log4j.performance.NullAppender; + +public class TestCase3 extends TestCase { + + public TestCase3(String name) { + super(name); + } + + public void setUp() { + } + + public void tearDown() { + LogManager.shutdown(); + } + + public void propertiesTest() { + Logger root = Logger.getRootLogger(); + boolean rootIsConfigured = root.getAllAppenders().hasMoreElements(); + assertTrue(rootIsConfigured); + Enumeration e = root.getAllAppenders(); + Appender appender = (Appender) e.nextElement(); + assertEquals(appender.getName(), "D3"); + } + + public static Test suite() { + TestSuite suite = new TestSuite(); + suite.addTest(new TestCase3("propertiesTest")); + return suite; + } + +} + diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java new file mode 100644 index 0000000000..19126d14b9 --- /dev/null +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ + +package org.apache.log4j.defaultInit; + +import junit.framework.TestCase; +import junit.framework.TestSuite; +import junit.framework.Test; + +import java.util.Vector; +import java.util.Enumeration; + +import org.apache.log4j.*; +import org.apache.log4j.performance.NullAppender; + +public class TestCase4 extends TestCase { + + public TestCase4(String name) { + super(name); + } + + public void setUp() { + } + + public void tearDown() { + LogManager.shutdown(); + } + + public void combinedTest() { + Logger root = Logger.getRootLogger(); + boolean rootIsConfigured = root.getAllAppenders().hasMoreElements(); + assertTrue(rootIsConfigured); + Enumeration e = root.getAllAppenders(); + Appender appender = (Appender) e.nextElement(); + assertEquals(appender.getName(), "D1"); + assertEquals(e.hasMoreElements(), false); + } + + public static Test suite() { + TestSuite suite = new TestSuite(); + suite.addTest(new TestCase4("combinedTest")); + return suite; + } + +} + From 6be2dd0c183be45c1bf0e47e17ca76dd336e5c75 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 28 Aug 2002 21:23:37 +0000 Subject: [PATCH 068/342] We now search for the file log4j.xml as well as the file log4j.properties in log4j initialization. Internally used string constants were marked as deprecated. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309631 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/LogManager.java | 136 +++++++++------------- 1 file changed, 52 insertions(+), 84 deletions(-) diff --git a/src/java/org/apache/log4j/LogManager.java b/src/java/org/apache/log4j/LogManager.java index 0189b8a4b8..522b0ec937 100644 --- a/src/java/org/apache/log4j/LogManager.java +++ b/src/java/org/apache/log4j/LogManager.java @@ -23,84 +23,40 @@ import java.util.Enumeration; /** - Use the LogManager to retreive instances of {@link Logger}. - - @author Ceki Gülcü -*/ + * Use the LogManager class to retreive {@link Logger} + * instances or to operate on the current {@link + * LoggerRepository}. When the LogManager class is loaded + * into memory the default initalzation procedure is inititated. The + * default intialization procedure is described in the short log4j manual. + * + * @author Ceki Gülcü */ public class LogManager { /** - This string constant is set to log4j.properties the name - of the file that will be searched by default in classpath. If the - file can be found, then it is fed to the {@link - PropertyConfigurator}. - - See also {@link #DEFAULT_CONFIGURATION_KEY} for a more general - alternative. - -

      See also the full description of default - intialization procedure. - - @since 0.8.5 */ - static public final String DEFAULT_CONFIGURATION_FILE = "log4j.properties"; - - /** - This string constant is set to log4j.configuration. - -

      It corresponds to name of a system property that, if set, - specifies the name of the resource containing the properties file - or {@link URL} with which log4j should configure itself. See - {@link OptionConverter#selectAndConfigure} for more detailed - information on the processing of this option. - -

      Setting the log4j.configuration system property - overrides the default search for the file log4j.properties. - -

      Note that all property keys are case sensitive. - -

      See also the full description of default - intialization procedure. - - @since 1.0 */ - static final public String DEFAULT_CONFIGURATION_KEY="log4j.configuration"; - - /** - This string constant is set to log4j.configuratorClass. - -

      It corresponds to name of a system property that, if set, - specifies the class name to use to automatically configure - log4j. See {@link OptionConverter#selectAndConfigure} for more - detailed information on the processing of this option. - -

      Setting the log4j.configuration system property - overrides the default search for the file log4j.properties. - -

      Note that all property keys are case sensitive. - -

      See also the full description of default - intialization procedure. + * @deprecated This variable is for internal use only. It will + * become package protected in future versions. + * */ + static public final String DEFAULT_CONFIGURATION_FILE = "log4j.properties"; + + static final String DEFAULT_XML_CONFIGURATION_FILE = "log4j.xml"; - @since 1.2 */ - static final public String CONFIGURATOR_CLASS_KEY="log4j.configuratorClass"; - /** - Setting the system property log4j.defaultInitOverride to - "true" or any other value than "false" will skip default - configuration process. - -

      The current value of the DEFAULT_INIT_OVERRIDE_KEY string - constant is log4j.defaultInitOverride. - -

      See also the full description of default - intialization procedure. + * @deprecated This variable is for internal use only. It will + * become private in future versions. + * */ + static final public String DEFAULT_CONFIGURATION_KEY="log4j.configuration"; -

      Note that all property keys are case sensitive. + /** + * @deprecated This variable is for internal use only. It will + * become private in future versions. + * */ + static final public String CONFIGURATOR_CLASS_KEY="log4j.configuratorClass"; - @since 0.8.5 */ + /** + * @deprecated This variable is for internal use only. It will + * become private in future versions. + */ public static final String DEFAULT_INIT_OVERRIDE_KEY = "log4j.defaultInitOverride"; @@ -117,35 +73,47 @@ specifies the class name to use to automatically configure String override =OptionConverter.getSystemProperty(DEFAULT_INIT_OVERRIDE_KEY, null); - // if there is no default init override, them get the resource + // if there is no default init override, then get the resource // specified by the user or the default config file. if(override == null || "false".equalsIgnoreCase(override)) { - String resource = OptionConverter.getSystemProperty( - DEFAULT_CONFIGURATION_KEY, - DEFAULT_CONFIGURATION_FILE); + + String configurationOptionStr = OptionConverter.getSystemProperty( + DEFAULT_CONFIGURATION_KEY, + null); String configuratorClassName = OptionConverter.getSystemProperty( CONFIGURATOR_CLASS_KEY, null); URL url = null; - try { - // so, resource is not a URL: - // attempt to get the resource from the class path - url = new URL(resource); - } catch (MalformedURLException ex) { - url = Loader.getResource(resource); - } + + // if the user has not specified the log4j.configuration + // property, we search first for the file "log4j.xml" and then + // "log4j.properties" + if(configurationOptionStr == null) { + url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE); + if(url == null) { + url = Loader.getResource(DEFAULT_CONFIGURATION_FILE); + } + } else { + try { + url = new URL(configurationOptionStr); + } catch (MalformedURLException ex) { + // so, resource is not a URL: + // attempt to get the resource from the class path + url = Loader.getResource(configurationOptionStr); + } + } // If we have a non-null url, then delegate the rest of the // configuration to the OptionConverter.selectAndConfigure // method. if(url != null) { - LogLog.debug("Using URL ["+url+"] for automatic log4j configuration."); + LogLog.debug("Using URL ["+url+"] for automatic log4j configuration."); OptionConverter.selectAndConfigure(url, configuratorClassName, LogManager.getLoggerRepository()); } else { - LogLog.debug("Could not find resource: ["+resource+"]."); + LogLog.debug("Could not find resource: ["+configurationOptionStr+"]."); } } } From d1384c8ba3a83bd30fb5e496fb23620367505601 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 2 Oct 2002 16:29:08 +0000 Subject: [PATCH 069/342] Syncing CVS rep with what has been visible on the web page for some time now. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309635 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/documentation.xml | 29 +++++++++++++++++++++++------ src/xdocs/download.xml | 6 ++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index 569ad4f88b..745f456641 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -62,17 +62,34 @@

      If you would like your log4j-relateed article to be listed diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index a3c9aee8cb..079ddd57cf 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -248,7 +248,13 @@ + +

      qmmslog
      + +
      Qmmslog is a port of log4j to the Qt/C++ platform. +
      +
      log4r
      A Powerful Logger for Ruby. From 4fae91e549f77b968f8a82f60aff10ad8dca77b7 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 9 Oct 2002 18:36:39 +0000 Subject: [PATCH 070/342] Removed double semi-colons which cause compilation problems. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309636 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/performance/NewVsSetLen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/performance/NewVsSetLen.java b/src/java/org/apache/log4j/performance/NewVsSetLen.java index ae6de43b6b..b69b80ea84 100644 --- a/src/java/org/apache/log4j/performance/NewVsSetLen.java +++ b/src/java/org/apache/log4j/performance/NewVsSetLen.java @@ -160,7 +160,7 @@ void main(String[] args) { for(int second = 0; second < 16;) { System.out.println("SECOND loop="+second +", RUN_LENGTH=" +RUN_LENGTH+", len="+len); - t = (int)newBuffer(len, second);; + t = (int)newBuffer(len, second); System.out.print("
      '.'yyyy-MM Rollover at the beginning of each monthAssuming the first day of the week is Sunday, at Sunday 00:00, - March 25th, 2001, /foo/bar.log will be copied to - /foo/bar.log.2001-03. Logging for the month of April - will be output to /foo/bar.log until it rolls over - at the beginning of May. + At midnight of May 31st, 2002 /foo/bar.log will be + copied to /foo/bar.log.2002-05. Logging for the month + of June will be output to /foo/bar.log until it is + also rolled over the next month.
      '.'yyyy-ww @@ -64,10 +63,11 @@ Rollover at the first day of each week. The first day of the week depends on the locale.At midnight, on March 31st, 2001, /foo/bar.log - will be copied to /foo/bar.log.2001-08. Logging for - the 9th week of 2001 will be output to /foo/bar.log - until it is rolled over the next week. + Assuming the first day of the week is Sunday, on Saturday + midnight, June 9th 2000, the file /foo/bar.log will be + copied will be copied to /foo/bar.log.2001-23. Logging for the + 24th week of 2002 will be output to /foo/bar.log until + it is rolled over the next week.
      '.'yyyy-MM-dd From 9c537c0e1370aa126a15557502b246e998eb4b95 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 13 Jun 2002 21:48:19 +0000 Subject: [PATCH 040/342] Javadoc corrections. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309592 13f79535-47bb-0310-9956-ffa450edef68 --- .../log4j/DailyRollingFileAppender.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/java/org/apache/log4j/DailyRollingFileAppender.java b/src/java/org/apache/log4j/DailyRollingFileAppender.java index 10f042e134..63ac084412 100644 --- a/src/java/org/apache/log4j/DailyRollingFileAppender.java +++ b/src/java/org/apache/log4j/DailyRollingFileAppender.java @@ -64,18 +64,18 @@ week depends on the locale. Assuming the first day of the week is Sunday, on Saturday - midnight, June 9th 2000, the file /foo/bar.log will be - copied will be copied to /foo/bar.log.2001-23. Logging for the - 24th week of 2002 will be output to /foo/bar.log until - it is rolled over the next week. + midnight, June 9th 2002, the file /foo/bar.log will be + copied to /foo/bar.log.2002-23. Logging for the 24th week + of 2002 will be output to /foo/bar.log until it is + rolled over the next week.
      '.'yyyy-MM-dd Rollover at midnight each day.At midnight, on March 9th, 2001, /foo/bar.log will - be copied to /foo/bar.log.2001-03-08. Logging for the + At midnight, on March 8th, 2002, /foo/bar.log will + be copied to /foo/bar.log.2002-03-08. Logging for the 9th day of March will be output to /foo/bar.log until it is rolled over the next day. @@ -84,19 +84,19 @@ Rollover at midnight and midday of each day.At noon, on March 9th, 2001, /foo/bar.log will be - copied to /foo/bar.log.2001-03-09-AM. Logging for the + At noon, on March 9th, 2002, /foo/bar.log will be + copied to /foo/bar.log.2002-03-09-AM. Logging for the afternoon of the 9th will be output to /foo/bar.log - until it is rolled over the next morning, i.e at midnight 00:00. + until it is rolled over at midnight.
      '.'yyyy-MM-dd-HH Rollover at the top of every hour.At approximately 11:00,000, on March 9th, 2001, + At approximately 11:00.000 o'clock on March 9th, 2002, /foo/bar.log will be copied to - /foo/bar.log.2001-03-09-10. Logging for the 11th hour + /foo/bar.log.2002-03-09-10. Logging for the 11th hour of the 9th of March will be output to /foo/bar.log until it is rolled over at the beginning of the next hour. From 0bb85f448bf0badf753aa33df766c0ba0ec56d72 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 18 Jun 2002 14:11:38 +0000 Subject: [PATCH 041/342] Updated Jon Skeet's bio. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309599 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/contributors.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/xdocs/contributors.xml b/src/xdocs/contributors.xml index a24f7bd81b..ab43c743d0 100644 --- a/src/xdocs/contributors.xml +++ b/src/xdocs/contributors.xml @@ -64,9 +64,13 @@
    19. Jon Skeet - -

      Jon acts as a moderator for the log4j mailing lists where - he is one of the most active participants. + +

      Jon is a software developer in his mid-twenties living in + the UK. He is a Java enthusiast and very active participant + in the comp.lang.java.* newsgroups as well as a moderator + for the log4j mailing lists. He is a committer for the Ant + project, involved (when time permits!) in tidying up the + code documentation.

    20. From aa37cbcf3675053aa2a6c310af8fb9d421bb12d4 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 19 Jun 2002 10:01:05 +0000 Subject: [PATCH 042/342] Minor documentation changes or improvements. Indentation changes. SimpleSocketServer now takes XML configuration files in addition to files in properties format. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309600 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 10 ++- docs/HISTORY | 5 +- .../log4j/DailyRollingFileAppender.java | 80 +++++++++---------- .../apache/log4j/net/SimpleSocketServer.java | 49 ++++++------ src/java/org/apache/log4j/net/SocketNode.java | 10 ++- src/xdocs/lf5/examples.xml | 59 ++++---------- src/xdocs/lf5/faq.xml | 39 +++++---- src/xdocs/lf5/trouble.xml | 5 +- 8 files changed, 123 insertions(+), 134 deletions(-) diff --git a/build.xml b/build.xml index 69fadc7204..7061549023 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + @@ -191,7 +191,7 @@ + includes="${stem}/lf5/**/*.properties"/> @@ -213,6 +213,7 @@ + @@ -330,6 +331,9 @@ ${stem}/jdbc/*.class, ${stem}/varia/*.class, ${stem}/chainsaw/*.class, + ${stem}/lf5/**/*.class, + ${stem}/lf5/**/*.properties, + ${stem}/lf5/**/*.gif, ${stem}/nt/*.class, ${stem}/xml/*.class, ${stem}/jmx/*.class, @@ -491,7 +495,7 @@ **/*.bak, **/goEnv.bat, **/Makefile, **/goEnv.bat, docs/pub-support/*, - dist/classes/org/**, + dist/classes/org/**, src/java/org/apache/log4j/test/**/*, **/.#*"/> diff --git a/docs/HISTORY b/docs/HISTORY index 9000e2acce..2bfe454cd6 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -9,11 +9,14 @@ - Release of version 1.2.4 + - The JDBCAppender is marked as slated for replacement. Do not build + critical software using it. + - Added LF5 documentation and examples. Further tests are required for full integration. [*] - XMLLayout can now output messages which contain embedded CDATA - sections. This resolves bug #9750. Many thanks Michael + sections. This resolves bug #9750. Many thanks to Michael A. McAngus for supplying the relevant patch. [*] - The dispatcher thread associated with AsyncAppender is now marked diff --git a/src/java/org/apache/log4j/DailyRollingFileAppender.java b/src/java/org/apache/log4j/DailyRollingFileAppender.java index 63ac084412..50d1e9e75a 100644 --- a/src/java/org/apache/log4j/DailyRollingFileAppender.java +++ b/src/java/org/apache/log4j/DailyRollingFileAppender.java @@ -143,13 +143,19 @@ public class DailyRollingFileAppender extends FileAppender { private String datePattern = "'.'yyyy-MM-dd"; /** - The actual formatted filename that is currently being written to. + The log file will be renamed to the value of the + scheduledFilename variable when the next interval is entered. For + example, if the rollover period is one hour, the log file will be + renamed to the value of "scheduledFilename" at the beginning of + the next hour. + + The precise time when a rollover occurs depends on logging + activity. */ private String scheduledFilename; /** - The timestamp when we shall next recompute the filename. - */ + The next time we estimate a rollover should occur. */ private long nextCheck = System.currentTimeMillis () - 1; Date now = new Date(); @@ -160,14 +166,13 @@ public class DailyRollingFileAppender extends FileAppender { int checkPeriod = TOP_OF_TROUBLE; - + // The gmtTimeZone is used only in computeCheckPeriod() method. static final TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT"); /** The default constructor does nothing. */ - public - DailyRollingFileAppender() { + public DailyRollingFileAppender() { } /** @@ -188,19 +193,16 @@ public DailyRollingFileAppender (Layout layout, String filename, expected by {@link SimpleDateFormat}. This options determines the rollover schedule. */ - public - void setDatePattern(String pattern) { + public void setDatePattern(String pattern) { datePattern = pattern; } /** Returns the value of the DatePattern option. */ - public - String getDatePattern() { + public String getDatePattern() { return datePattern; } - public - void activateOptions() { + public void activateOptions() { super.activateOptions(); if(datePattern != null && fileName != null) { now.setTime(System.currentTimeMillis()); @@ -212,8 +214,8 @@ void activateOptions() { scheduledFilename = fileName+sdf.format(new Date(file.lastModified())); } else { - LogLog.error("Either Filename or DatePattern options are not set for ["+ - name+"]."); + LogLog.error("Either File or DatePattern options are not set for appender [" + +name+"]."); } } @@ -290,6 +292,9 @@ void rollOver() throws IOException { } String datedFilename = fileName+sdf.format(now); + // It is too early to roll over because we are still within the + // bounds of the current interval. Rollover will occur once the + // next interval is reached. if (scheduledFilename.equals(datedFilename)) { return; } @@ -303,8 +308,12 @@ void rollOver() throws IOException { } File file = new File(fileName); - file.renameTo(target); - LogLog.debug(fileName +" -> "+ scheduledFilename); + boolean result = file.renameTo(target); + if(result) { + LogLog.debug(fileName +" -> "+ scheduledFilename); + } else { + LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"]."); + } try { // This will also close the file. This is OK since multiple @@ -318,17 +327,14 @@ void rollOver() throws IOException { } /** - This method differentiates DailyRollingFileAppender from its - super class. - -

      Before actually logging, this method will check whether it is - time to do a rollover. If it is, it will schedule the next - rollover time and then rollover. - - - */ - protected - void subAppend(LoggingEvent event) { + * This method differentiates DailyRollingFileAppender from its + * super class. + * + *

      Before actually logging, this method will check whether it is + * time to do a rollover. If it is, it will schedule the next + * rollover time and then rollover. + * */ + protected void subAppend(LoggingEvent event) { long n = System.currentTimeMillis(); if (n >= nextCheck) { now.setTime(n); @@ -345,16 +351,10 @@ void subAppend(LoggingEvent event) { } /** - RollingCalendar is a helper class to - DailyRollingFileAppender. Using this class, it is easy to compute - and access the next Millis(). - - It subclasses the standard {@link GregorianCalendar}-object, to - allow access to the protected function getTimeInMillis(), which it - then exports. - - @author Eirik Lygre */ - + * RollingCalendar is a helper class to DailyRollingFileAppender. + * Given a periodicity type and the current time, it computes the + * start of the next interval. + * */ class RollingCalendar extends GregorianCalendar { int type = DailyRollingFileAppender.TOP_OF_TROUBLE; @@ -371,13 +371,11 @@ void setType(int type) { this.type = type; } - public - long getNextCheckMillis(Date now) { + public long getNextCheckMillis(Date now) { return getNextCheckDate(now).getTime(); } - public - Date getNextCheckDate(Date now) { + public Date getNextCheckDate(Date now) { this.setTime(now); switch(type) { diff --git a/src/java/org/apache/log4j/net/SimpleSocketServer.java b/src/java/org/apache/log4j/net/SimpleSocketServer.java index 5210b192b8..8467d891d9 100644 --- a/src/java/org/apache/log4j/net/SimpleSocketServer.java +++ b/src/java/org/apache/log4j/net/SimpleSocketServer.java @@ -13,23 +13,24 @@ import org.apache.log4j.Category; import org.apache.log4j.LogManager; import org.apache.log4j.PropertyConfigurator; +import org.apache.log4j.xml.DOMConfigurator; /** - A simple {@link SocketNode} based server. - + * A simple {@link SocketNode} based server. + *

      -     Usage: java org.apache.log4j.net.SimpleSocketServer port configFile
      +   Usage: java org.apache.log4j.net.SimpleSocketServer port configFile
       
      -     where port is a part number where the server listens and
      -     configFile is a configuration file fed to the {@link
      -     PropertyConfigurator}.
      +   where port is a part number where the server listens and
      +   configFile is a configuration file fed to the {@link
      +   PropertyConfigurator} or to {@link DOMConfigurator} if an XML file.
          
      - - @author Ceki Gülcü - - @since 0.8.4 */ - + * + * @author Ceki Gülcü + * + * @since 0.8.4 + * */ public class SimpleSocketServer { static Category cat = Category.getInstance(SimpleSocketServer.class.getName()); @@ -39,11 +40,12 @@ public class SimpleSocketServer { public static void main(String argv[]) { - if(argv.length == 2) + if(argv.length == 2) { init(argv[0], argv[1]); - else + } else { usage("Wrong number of arguments."); - + } + try { cat.info("Listening on port " + port); ServerSocket serverSocket = new ServerSocket(port); @@ -55,30 +57,31 @@ void main(String argv[]) { new Thread(new SocketNode(socket, LogManager.getLoggerRepository())).start(); } - } - catch(Exception e) { + } catch(Exception e) { e.printStackTrace(); } } - static - void usage(String msg) { + static void usage(String msg) { System.err.println(msg); System.err.println( "Usage: java " +SimpleSocketServer.class.getName() + " port configFile"); System.exit(1); } - static - void init(String portStr, String configFile) { + static void init(String portStr, String configFile) { try { port = Integer.parseInt(portStr); - } - catch(java.lang.NumberFormatException e) { + } catch(java.lang.NumberFormatException e) { e.printStackTrace(); usage("Could not interpret port number ["+ portStr +"]."); } - PropertyConfigurator.configure(configFile); + + if(configFile.endsWith(".xml")) { + new DOMConfigurator().configure(configFile); + } else { + new PropertyConfigurator().configure(configFile); + } } } diff --git a/src/java/org/apache/log4j/net/SocketNode.java b/src/java/org/apache/log4j/net/SocketNode.java index 4bcbd8235d..0bea95ebf8 100644 --- a/src/java/org/apache/log4j/net/SocketNode.java +++ b/src/java/org/apache/log4j/net/SocketNode.java @@ -39,8 +39,7 @@ public class SocketNode implements Runnable { static Logger logger = Logger.getLogger(SocketNode.class); - public - SocketNode(Socket socket, LoggerRepository hierarchy) { + public SocketNode(Socket socket, LoggerRepository hierarchy) { this.socket = socket; this.hierarchy = hierarchy; try { @@ -64,15 +63,18 @@ public void run() { try { while(true) { + // read an event from the wire event = (LoggingEvent) ois.readObject(); + // get a logger from the hierarchy. The name of the logger is taken to be the name contained in the event. remoteLogger = hierarchy.getLogger(event.categoryName); event.logger = remoteLogger; + // apply the logger-level filter if(event.level.isGreaterOrEqual(remoteLogger.getEffectiveLevel())) { + // finally log the event as if was generated locally remoteLogger.callAppenders(event); } } - } - catch(java.io.EOFException e) { + } catch(java.io.EOFException e) { logger.info("Caught java.io.EOFException closing conneciton."); } catch(java.net.SocketException e) { logger.info("Caught java.net.SocketException closing conneciton."); diff --git a/src/xdocs/lf5/examples.xml b/src/xdocs/lf5/examples.xml index f28726655b..24c5f2d920 100644 --- a/src/xdocs/lf5/examples.xml +++ b/src/xdocs/lf5/examples.xml @@ -26,11 +26,16 @@

      Running the Example:

      Let LOG4J_HOME be the the directory where you - installed log4j.

      + installed log4j and let VERSION stand for the log4j version.

        +
      • Ensure that LOG4J_HOME/dist/lib/log4j-VERSION.jar + is in your CLASSPATH.
      • +
      • Ensure that LOG4J_HOME/dist/classes is in your - CLASSPATH.
      • + CLASSPATH. This directory contains the binary class files for + running the lf5 examples. It is not needed under normal + operational circumstances.
      • Ensure that a JAXP compatible XML parser is in is in your CLASSPATH.
      • @@ -75,16 +80,12 @@ installed log4j.

          -
        • Ensure that LOG4J_HOME/dist/classes is in your - CLASSPATH.
        • - -
        • Ensure that a JAXP compatible XML parser is in is in your - CLASSPATH.
        • +
        • Set up your CLASSPATH as in Example 1 above.
        • Type the following at the command line:

          java - examples.lf5.InitUsingPropertiesFile.InitUsingPropertiesFile

          x + examples.lf5.InitUsingPropertiesFile.InitUsingPropertiesFile

        @@ -125,11 +126,7 @@ installed log4j.

          -
        • Ensure that LOG4J_HOME/dist/classes is in your - CLASSPATH.
        • - -
        • Ensure that a JAXP compatible XML parser is in is in your - CLASSPATH.
        • +
        • Set up your CLASSPATH as in Example 1 above.
        • Type the following at the command line: @@ -188,11 +185,7 @@

          Running the Example:

            -
          • Ensure that LOG4J_HOME/dist/classes is in your - CLASSPATH.
          • - -
          • Ensure that a JAXP compatible XML parser is in is in your - CLASSPATH.
          • +
          • Set up your CLASSPATH as in Example 1 above.
          • Copy the provided LOG4J_HOME/examples/lf5/InitUsingLog4JProperties/log4j.properties @@ -279,11 +272,7 @@ log4j.appender.R.MaxBackupIndex=1

            Running the Example:

              -
            • Ensure that LOG4J_HOME/dist/classes is in your - CLASSPATH.
            • - -
            • Ensure that a JAXP compatible XML parser is in is in your - CLASSPATH.
            • +
            • Set up your CLASSPATH as in Example 1 above.
            • Type the following at the command line: @@ -362,11 +351,7 @@ log4j.appender.R.MaxBackupIndex=1

              Running the Example:

                -
              • Ensure that LOG4J_HOME/dist/classes is in your - CLASSPATH.
              • - -
              • Ensure that a JAXP compatible XML parser is in is in your - CLASSPATH.
              • +
              • Set up your CLASSPATH as in Example 1 above.
              • Start the SocketServer using the following command:
              • @@ -469,11 +454,7 @@ Message - %m[slf5s.MESSAGE]

                Running the Example:

                  -
                • Ensure that LOG4J_HOME/dist/classes is in your - CLASSPATH.
                • - -
                • Ensure that a JAXP compatible XML parser is in is in your - CLASSPATH.
                • +
                • Set up your CLASSPATH as in Example 1 above.
                • Type the following at the command line: java org.apache.log4j.lf5.StartLogFactor5 @@ -521,11 +502,7 @@ Message - %m[slf5s.MESSAGE]

                  Running the Example:

                    -
                  • Ensure that LOG4J_HOME/dist/classes is in your - CLASSPATH.
                  • - -
                  • Ensure that a JAXP compatible XML parser is in is in your - CLASSPATH.
                  • +
                  • Set up your CLASSPATH as in Example 1 above.
                  • Type the following at the command line: @@ -574,11 +551,7 @@ Message - %m[slf5s.MESSAGE]

                    Running the Example:

                      -
                    • Ensure that LOG4J_HOME/dist/classes is in your - CLASSPATH.
                    • - -
                    • Ensure that a JAXP compatible XML parser is in is in your - CLASSPATH.
                    • +
                    • Set up your CLASSPATH as in Example 1 above.
                    • Type the following at the command line: diff --git a/src/xdocs/lf5/faq.xml b/src/xdocs/lf5/faq.xml index b4b67cdd9f..33bb853b80 100644 --- a/src/xdocs/lf5/faq.xml +++ b/src/xdocs/lf5/faq.xml @@ -12,28 +12,33 @@

                      Q. What is LogFactor5?

                      -

                      A. LogFactor5 is a Swing based GUI that leverages the power of Apache's - Log4J logging toolkit and provides developers with a sophisticated, feature-rich, - logging interface for managing log messages.

                      +

                      A. LogFactor5 is a Swing based GUI that leverages the + power of log4j to provide developers with a sophisticated, + feature-rich, visual tool for managing log messages.

                      +
                      -

                      Q. Do I need to know how to use Log4J in order to use LogFactor5?

                      +

                      Q. Do I need to know how to use log4j in order to use LogFactor5?

                      -

                      A. Yes, the documentation for LogFactor5 assumes the user has some understanding - of how Log4J works. Note however that the LogFactor5 examples will run regardless - of a user's Log4J knowledge level.

                      -
                      +

                      A. Yes, the documentation for LogFactor5 assumes the + user has some understanding of how log4j works. Note however + that the LogFactor5 examples will run regardless of a user's + log4j knowledge level.


                      Q. What are the memory requirements for LogFactor5?

                      -

                      A. The LogFactor5 logging console window uses around 13 MB of memory - to run on a Windows OS. Our memory profiling has shown that with a logging message - of 25 words in length, and a stack trace nested seven methods deep, every 1000 - records displayed in the logging console uses about 6.5 MB of memory. For this - reason, when you are setting the maximum number of log records to be shown, - you should be careful that you have enough memory to display all of the records. - The default maximum number of records that will be displayed is set to 5000 - to minimize the possibility of running out of memory. We recommend that Windows - users have at least 96 MB of RAM when using LogFactor5.

                      + +

                      A. The LogFactor5 logging console window uses around + 13 MB of memory to run on a Windows OS. Our memory profiling + has shown that with a logging message of 25 words in length, + and a stack trace nested seven methods deep, every 1000 + records displayed in the logging console uses about 6.5 MB of + memory. For this reason, when you are setting the maximum + number of log records to be shown, you should be careful that + you have enough memory to display all of the records. The + default maximum number of records that will be displayed is + set to 5000 to minimize the possibility of running out of + memory. We recommend that Windows users have at least 96 MB of + RAM when using LogFactor5.

                      diff --git a/src/xdocs/lf5/trouble.xml b/src/xdocs/lf5/trouble.xml index e68889340a..a72db0c0aa 100644 --- a/src/xdocs/lf5/trouble.xml +++ b/src/xdocs/lf5/trouble.xml @@ -20,9 +20,10 @@ logs to both the LogFactor5 console and a rolling log file.

                      -
                      # Register both appenders with the root of the Category tree.
                      +
                      # Register both appenders
                      +with the root of the logger tree.
                       
                      -log4j.rootCategory=, A1, R
                      +log4j.rootLogger=, A1, R
                       
                       # A1 is set to be a LF5Appender which outputs to a swing
                       # logging console.   
                      
                      From fb4d0e5a1ac9cfe08c8fd1d2444426e57175c21f Mon Sep 17 00:00:00 2001
                      From: Ceki Gulcu 
                      Date: Tue, 25 Jun 2002 23:23:51 +0000
                      Subject: [PATCH 043/342] Remomed the harmless but totally useless "nooptimize"
                       variable. It got in by mistake.
                      
                      PR:
                      Obtained from:
                      Submitted by:
                      Reviewed by:
                      
                      
                      git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309601 13f79535-47bb-0310-9956-ffa450edef68
                      ---
                       src/java/org/apache/log4j/Category.java | 5 -----
                       1 file changed, 5 deletions(-)
                      
                      diff --git a/src/java/org/apache/log4j/Category.java b/src/java/org/apache/log4j/Category.java
                      index 3ac81c3375..97f43bb53b 100644
                      --- a/src/java/org/apache/log4j/Category.java
                      +++ b/src/java/org/apache/log4j/Category.java
                      @@ -77,9 +77,6 @@ public class Category implements AppenderAttachable {
                         //final Hierarchy defaultHierarchy = new Hierarchy(new
                         //					   RootCategory(Level.DEBUG));
                       
                      -
                      -  static int nooptimize;
                      -
                         /**
                            The name of this category.
                         */
                      @@ -514,7 +511,6 @@ LoggerRepository  getLoggerRepository() {
                         public
                         static
                         Category getInstance(String name) {
                      -     nooptimize++;
                           return LogManager.getLogger(name);
                         }
                       
                      @@ -531,7 +527,6 @@ Category getInstance(String name) {
                         public
                         static
                         Category getInstance(Class clazz) {
                      -    nooptimize++;
                           return LogManager.getLogger(clazz);
                         }
                       
                      
                      From 609e953ef6d9d2f2133bfe90af41064ebd720fee Mon Sep 17 00:00:00 2001
                      From: bradm 
                      Date: Wed, 26 Jun 2002 16:05:25 +0000
                      Subject: [PATCH 044/342] fixed minor bug in MRUFileManager and refactored file
                       separators
                      
                      git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309602 13f79535-47bb-0310-9956-ffa450edef68
                      ---
                       .../lf5/viewer/configure/ConfigurationManager.java     |  3 +--
                       .../log4j/lf5/viewer/configure/MRUFileManager.java     | 10 +++-------
                       2 files changed, 4 insertions(+), 9 deletions(-)
                      
                      diff --git a/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java b/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java
                      index 3e389d8d5a..0fb1c26b3c 100644
                      --- a/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java
                      +++ b/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java
                      @@ -330,8 +330,7 @@ protected void deleteConfigurationFile() {
                       
                         protected String getFilename() {
                           String home = System.getProperty("user.home");
                      -    String sep = (home.startsWith(MRUFileManager.UNIX_SEPARATOR))
                      -        ? MRUFileManager.UNIX_SEPARATOR : MRUFileManager.DOS_SEPARATOR;
                      +    String sep = System.getProperty("file.separator");
                       
                           return home + sep + "lf5" + sep + CONFIG_FILE_NAME;
                         }
                      diff --git a/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java b/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java
                      index 5163a073cd..5e124ca7f2 100644
                      --- a/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java
                      +++ b/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java
                      @@ -29,8 +29,6 @@ public class MRUFileManager {
                         //--------------------------------------------------------------------------
                         private static final String CONFIG_FILE_NAME = "mru_file_manager";
                         private static final int DEFAULT_MAX_SIZE = 3;
                      -  public static final String UNIX_SEPARATOR = "/";
                      -  public static final String DOS_SEPARATOR = "\\";
                       
                         //--------------------------------------------------------------------------
                         //   Protected Variables:
                      @@ -74,7 +72,6 @@ public void save() {
                             // do nothing
                             e.printStackTrace();
                           }
                      -
                         }
                       
                         /**
                      @@ -112,7 +109,6 @@ public InputStream getInputStream(int index) throws IOException,
                           return null;
                         }
                       
                      -
                         /**
                          * Adds a file name to the MRU file list.
                          */
                      @@ -168,7 +164,7 @@ public void moveToTop(int index) {
                          */
                         public static void createConfigurationDirectory() {
                           String home = System.getProperty("user.home");
                      -    String sep = (home.startsWith(UNIX_SEPARATOR)) ? UNIX_SEPARATOR : DOS_SEPARATOR;
                      +    String sep = System.getProperty("file.separator");
                           File f = new File(home + sep + "lf5");
                           if (!f.exists()) {
                             try {
                      @@ -253,7 +249,7 @@ protected void load() {
                       
                         protected String getFilename() {
                           String home = System.getProperty("user.home");
                      -    String sep = (home.startsWith(UNIX_SEPARATOR)) ? UNIX_SEPARATOR : DOS_SEPARATOR;
                      +    String sep = System.getProperty("file.separator");
                       
                           return home + sep + "lf5" + sep + CONFIG_FILE_NAME;
                         }
                      @@ -264,7 +260,7 @@ protected String getFilename() {
                         protected void setMaxSize(int maxSize) {
                           if (maxSize < _mruFileList.size()) {
                             for (int i = 0; i < _mruFileList.size() - maxSize; i++) {
                      -        _mruFileList.removeFirst();
                      +        _mruFileList.removeLast();
                             }
                           }
                       
                      
                      From be46bde95223f733d498f1c9887c42b876c0c082 Mon Sep 17 00:00:00 2001
                      From: bradm 
                      Date: Wed, 26 Jun 2002 16:15:15 +0000
                      Subject: [PATCH 045/342] fixed bootstrap loader bug, removed About Dialog box,
                       fixed link to channelexplorer_new.gif
                      
                      git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309603 13f79535-47bb-0310-9956-ffa450edef68
                      ---
                       .../log4j/lf5/viewer/LogBrokerMonitor.java    | 29 +++----------------
                       1 file changed, 4 insertions(+), 25 deletions(-)
                      
                      diff --git a/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java b/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java
                      index 5eacbedb35..438619e252 100644
                      --- a/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java
                      +++ b/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java
                      @@ -12,7 +12,6 @@
                       import org.apache.log4j.lf5.LogRecordFilter;
                       import org.apache.log4j.lf5.util.DateFormatManager;
                       import org.apache.log4j.lf5.util.LogFileParser;
                      -import org.apache.log4j.lf5.util.ProductProperties;
                       import org.apache.log4j.lf5.util.StreamUtils;
                       import org.apache.log4j.lf5.viewer.categoryexplorer.CategoryExplorerTree;
                       import org.apache.log4j.lf5.viewer.categoryexplorer.CategoryPath;
                      @@ -475,8 +474,6 @@ protected void initComponents() {
                           //
                           // Configure the Frame.
                           //
                      -    ProductProperties props = ProductProperties.getInstance();
                      -
                           _logMonitorFrame = new JFrame("LogFactor5");
                       
                           _logMonitorFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                      @@ -1070,8 +1067,6 @@ protected JMenu createHelpMenu() {
                           JMenu helpMenu = new JMenu("Help");
                           helpMenu.setMnemonic('h');
                           helpMenu.add(createHelpProperties());
                      -    helpMenu.addSeparator();
                      -    helpMenu.add(createHelpAbout());
                           return helpMenu;
                         }
                       
                      @@ -1096,25 +1091,6 @@ protected void showPropertiesDialog(String title) {
                           );
                         }
                       
                      -  protected JMenuItem createHelpAbout() {
                      -    JMenuItem aboutMI = new JMenuItem("About LogFactor5...");
                      -    aboutMI.setMnemonic('a');
                      -    //aboutMI.setAccelerator( KeyStroke.getKeyStroke("control A") );
                      -
                      -    aboutMI.addActionListener(
                      -        new ActionListener() {
                      -          protected LogFactor5AboutDialog dialog =
                      -              new LogFactor5AboutDialog(_logMonitorFrame);
                      -
                      -          public void actionPerformed(ActionEvent e) {
                      -            dialog.show();
                      -          }
                      -        }
                      -
                      -    );
                      -    return aboutMI;
                      -  }
                      -
                         protected JMenu createEditMenu() {
                           JMenu editMenu = new JMenu("Edit");
                           editMenu.setMnemonic('e');
                      @@ -1216,7 +1192,10 @@ protected JToolBar createToolBar() {
                           _fontSizeCombo = fontSizeCombo;
                       
                           ClassLoader cl = this.getClass().getClassLoader();
                      -    URL newIconURL = cl.getResource("org/apache/log4j/viewer/" +
                      +    if(cl == null) {
                      +        cl = ClassLoader.getSystemClassLoader();
                      +    }
                      +    URL newIconURL = cl.getResource("org/apache/log4j/lf5/viewer/" +
                               "images/channelexplorer_new.gif");
                       
                           ImageIcon newIcon = null;
                      
                      From cbb7bdbf009864007e8649bcd83ae3f2757166ce Mon Sep 17 00:00:00 2001
                      From: bradm 
                      Date: Wed, 26 Jun 2002 16:32:51 +0000
                      Subject: [PATCH 046/342] removed text and binary files that are no longer
                       required.
                      
                      git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309604 13f79535-47bb-0310-9956-ffa450edef68
                      ---
                       src/java/org/apache/log4j/lf5/lf5.properties  |   8 -
                       .../log4j/lf5/util/ProductProperties.java     | 248 ------------------
                       .../lf5/viewer/LogFactor5AboutDialog.java     | 136 ----------
                       .../log4j/lf5/viewer/images/lf5_about.gif     | Bin 23106 -> 0 bytes
                       .../lf5/viewer/images/lf5_small_icon.png      | Bin 42566 -> 0 bytes
                       5 files changed, 392 deletions(-)
                       delete mode 100644 src/java/org/apache/log4j/lf5/lf5.properties
                       delete mode 100644 src/java/org/apache/log4j/lf5/util/ProductProperties.java
                       delete mode 100644 src/java/org/apache/log4j/lf5/viewer/LogFactor5AboutDialog.java
                       delete mode 100644 src/java/org/apache/log4j/lf5/viewer/images/lf5_about.gif
                       delete mode 100644 src/java/org/apache/log4j/lf5/viewer/images/lf5_small_icon.png
                      
                      diff --git a/src/java/org/apache/log4j/lf5/lf5.properties b/src/java/org/apache/log4j/lf5/lf5.properties
                      deleted file mode 100644
                      index af0892e74d..0000000000
                      --- a/src/java/org/apache/log4j/lf5/lf5.properties
                      +++ /dev/null
                      @@ -1,8 +0,0 @@
                      -#
                      -# These properties should not be changed!
                      -#
                      -product.name=LogFactor5
                      -product.version.number=1.3
                      -product.release.date=March 30, 2002
                      -
                      -
                      diff --git a/src/java/org/apache/log4j/lf5/util/ProductProperties.java b/src/java/org/apache/log4j/lf5/util/ProductProperties.java
                      deleted file mode 100644
                      index dc9e41ba01..0000000000
                      --- a/src/java/org/apache/log4j/lf5/util/ProductProperties.java
                      +++ /dev/null
                      @@ -1,248 +0,0 @@
                      -/*
                      - * Copyright (C) The Apache Software Foundation. All rights reserved.
                      - *
                      - * This software is published under the terms of the Apache Software
                      - * License version 1.1, a copy of which has been included with this
                      - * distribution in the LICENSE.txt file.
                      - */
                      -package org.apache.log4j.lf5.util;
                      -
                      -import java.io.BufferedInputStream;
                      -import java.io.ByteArrayInputStream;
                      -import java.io.IOException;
                      -import java.io.InputStream;
                      -import java.util.Properties;
                      -
                      -/**
                      - * ProductProperties holds the properties dealing with
                      - * this product.  There is never a need
                      - * for multiple instances of this class, thus this class
                      - * is a singleton.
                      - *
                      - * The properties file format is as follows:
                      - *
                      - *  #Any arbitrary comments are denoted with a #
                      - *
                      - *  #Mandatory properties
                      - *  product.name=
                      - *  product.version.number=
                      - *  product.release.date=
                      - *  product.release.type=
                      - *
                      - *
                      - * Note that this class will throw an ExceptionInInitializerError if
                      - * initialization fails, or if the required properties are absent.
                      - *
                      - * @author Robert Shaw
                      - * @author Michael J. Sikorsky
                      - * @author Brent Sprecher
                      - */
                      -
                      -// Contributed by ThoughtWorks Inc.
                      -
                      -public class ProductProperties {
                      -  //--------------------------------------------------------------------------
                      -  //   Constants:
                      -  //--------------------------------------------------------------------------
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Protected Variables:
                      -  //--------------------------------------------------------------------------
                      -
                      -  /** Collection of properties. */
                      -  protected Properties _productProperties;
                      -  //protected final boolean _validFlag;
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Private Variables:
                      -  //--------------------------------------------------------------------------
                      -  private static ProductProperties _reference = null;
                      -  private static Object _synchronizingObject = new Object();
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Constructors:
                      -  //--------------------------------------------------------------------------
                      -
                      -  /**
                      -   * Construct an ProductProperties with the mandatory properties.
                      -   * Use the constructor that configures a ProductProperties
                      -   * off of a properties file if you wish to take advantage
                      -   * of additional properties.
                      -   *
                      -   */
                      -  private ProductProperties() {
                      -    this(new Resource("org/apache/log4j/lf5/lf5.properties"));
                      -  }
                      -
                      -  private ProductProperties(Resource resource) {
                      -    super();
                      -
                      -    _productProperties = new Properties();
                      -
                      -    try {
                      -      InputStream source = getSource(resource);
                      -      byte[] contents = StreamUtils.getBytes(source);
                      -      _productProperties = getProperties(contents);
                      -      source.close();
                      -      validateProductProperties();
                      -    } catch (Exception e) {
                      -      String error = e.getMessage();
                      -      throw new ExceptionInInitializerError(error);
                      -    }
                      -  }
                      -
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Public Methods:
                      -  //--------------------------------------------------------------------------
                      -
                      -  public static ProductProperties getInstance() {
                      -    if (_reference == null) {
                      -      synchronized (_synchronizingObject) {
                      -        if (_reference == null) {
                      -          _reference = new ProductProperties();
                      -        }
                      -      }
                      -    }
                      -    return _reference;
                      -  }
                      -
                      -  /**
                      -   * Mandatory internally recognized property.
                      -   */
                      -  public static String getPropertyNameOfProductName() {
                      -    return "product.name";
                      -  }
                      -
                      -  /**
                      -   * Mandatory internally recognized property.
                      -   */
                      -  public static String getPropertyNameOfProductVersionNumber() {
                      -    return "product.version.number";
                      -  }
                      -
                      -  /**
                      -   * Mandatory internally recognized property.
                      -   */
                      -  public static String getPropertyNameOfProductReleaseDate() {
                      -    return "product.release.date";
                      -  }
                      -
                      -  /**
                      -   * Get the product name.
                      -   */
                      -  public String getProductName() {
                      -    return _productProperties.getProperty(getPropertyNameOfProductName());
                      -  }
                      -
                      -  /**
                      -   * Set the product name.
                      -   */
                      -  public void setProductName(String productName) {
                      -    _productProperties.setProperty(getPropertyNameOfProductName(),
                      -        productName);
                      -  }
                      -
                      -  /**
                      -   * Get the product version number.
                      -   */
                      -  public String getProductVersionNumber() {
                      -    return
                      -        _productProperties.getProperty(getPropertyNameOfProductVersionNumber());
                      -  }
                      -
                      -  /**
                      -   * Set the product version number.
                      -   */
                      -  public void setProductVersionNumber(String productVersionNumber) {
                      -    _productProperties.setProperty(getPropertyNameOfProductVersionNumber(),
                      -        productVersionNumber);
                      -  }
                      -
                      -  /**
                      -   * Get the product release date.
                      -   */
                      -  public String getProductReleaseDate() {
                      -    return
                      -        _productProperties.getProperty(getPropertyNameOfProductReleaseDate());
                      -  }
                      -
                      -  /**
                      -   * Set the product release date.
                      -   */
                      -  public void setProductReleaseDate(String productReleaseDate) {
                      -    _productProperties.setProperty(getPropertyNameOfProductReleaseDate(),
                      -        productReleaseDate);
                      -  }
                      -
                      -  /**
                      -   * Retrieve any of the mandatory properties, or any additional
                      -   * properties that were placed in the database configuration file.
                      -   */
                      -  public String get(String name) {
                      -    return _productProperties.getProperty(name);
                      -  }
                      -
                      -  /**
                      -   * Set any property.
                      -   */
                      -  public Object set(String name, String value) {
                      -    return _productProperties.setProperty(name, value);
                      -  }
                      -
                      -  public String getLogFactor5() {
                      -    return getString("lf5");
                      -  }
                      -
                      -  public String getString(String propertyName) {
                      -    return String.valueOf(get(propertyName));
                      -  }
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Protected Methods:
                      -  //--------------------------------------------------------------------------
                      -  /**
                      -   * @throws java.lang.Exception
                      -   */
                      -  protected void validateProductProperties() throws Exception {
                      -    String value = null;
                      -
                      -    value = getProductVersionNumber();
                      -    if ((value == null) || value.equals("")) {
                      -      throw new Exception("Product version number is null.");
                      -    }
                      -
                      -    value = getProductReleaseDate();
                      -    if ((value == null) || value.equals("")) {
                      -      throw new Exception("Product release date is null.");
                      -    }
                      -
                      -  }
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Private Methods:
                      -  //--------------------------------------------------------------------------
                      -
                      -  private InputStream getSource(Resource resource) {
                      -    return new BufferedInputStream(
                      -        ResourceUtils.getResourceAsStream(this, resource));
                      -  }
                      -
                      -  private Properties getProperties(byte[] contents) throws IOException {
                      -    ByteArrayInputStream source = new ByteArrayInputStream(contents);
                      -    Properties result = new Properties();
                      -    result.load(source);
                      -    source.close();
                      -    return result;
                      -  }
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Nested Top-Level Classes or Interfaces
                      -  //--------------------------------------------------------------------------
                      -}
                      -
                      -
                      -
                      -
                      -
                      -
                      diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5AboutDialog.java b/src/java/org/apache/log4j/lf5/viewer/LogFactor5AboutDialog.java
                      deleted file mode 100644
                      index ef24a82ac1..0000000000
                      --- a/src/java/org/apache/log4j/lf5/viewer/LogFactor5AboutDialog.java
                      +++ /dev/null
                      @@ -1,136 +0,0 @@
                      -/*
                      - * Copyright (C) The Apache Software Foundation. All rights reserved.
                      - *
                      - * This software is published under the terms of the Apache Software
                      - * License version 1.1, a copy of which has been included with this
                      - * distribution in the LICENSE.txt file.
                      - */
                      -package org.apache.log4j.lf5.viewer;
                      -
                      -import org.apache.log4j.lf5.util.ProductProperties;
                      -import org.apache.log4j.lf5.util.Resource;
                      -
                      -import javax.swing.*;
                      -import java.awt.*;
                      -import java.awt.event.ActionEvent;
                      -import java.awt.event.ActionListener;
                      -import java.net.URL;
                      -
                      -/**
                      - * LogFactor5AboutDialog
                      - *
                      - * @author Michael J. Sikorsky
                      - * @author Robert Shaw
                      - * @author Brent Sprecher
                      - * @author Brad Marlborough
                      - */
                      -
                      -// Contributed by ThoughtWorks Inc.
                      -
                      -public class LogFactor5AboutDialog extends JDialog {
                      -  //--------------------------------------------------------------------------
                      -  //   Constants:
                      -  //--------------------------------------------------------------------------
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Protected Variables:
                      -  //--------------------------------------------------------------------------
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Private Variables:
                      -  //--------------------------------------------------------------------------
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Constructors:
                      -  //--------------------------------------------------------------------------
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Public Methods:
                      -  //--------------------------------------------------------------------------
                      -
                      -  public LogFactor5AboutDialog(Frame owner) {
                      -    super(owner, "About LogFactor5", true);
                      -
                      -    ProductProperties props = ProductProperties.getInstance();
                      -
                      -    setTitle("About LogFactor5");
                      -
                      -    JPanel imagePanel = new JPanel();
                      -    Resource aboutResource = new Resource("org/apache/log4j/lf5/viewer/images/" +
                      -        "lf5_about.gif");
                      -    URL aboutIconURL = aboutResource.getURL();
                      -    ImageIcon aboutIcon = null;
                      -    if (aboutIconURL != null) {
                      -      aboutIcon = new ImageIcon(aboutIconURL);
                      -    }
                      -
                      -    JLabel imageLabel = new JLabel();
                      -
                      -    if (aboutIcon != null) {
                      -      imageLabel.setIcon(aboutIcon);
                      -    }
                      -    imagePanel.add(imageLabel);
                      -
                      -    JPanel textPanel = new JPanel();
                      -    textPanel.setLayout(new GridLayout(3, 1));
                      -
                      -
                      -    int numberOfRows = 13;
                      -    numberOfRows = 11; // we need less room for a registered user.
                      -    JPanel mainPanel = new JPanel();
                      -    mainPanel.setLayout(new GridLayout(numberOfRows, 1));
                      -    JLabel aboutLF5 = new JLabel("LogFactor5 v" + props.getProductVersionNumber(), JLabel.CENTER);
                      -    aboutLF5.setHorizontalAlignment(SwingConstants.CENTER);
                      -    JLabel donate = new JLabel("Contributed by ThoughtWorks Inc.");
                      -    donate.setHorizontalAlignment(SwingConstants.CENTER);
                      -    mainPanel.add(aboutLF5);
                      -    mainPanel.add(Box.createVerticalStrut(10));
                      -    mainPanel.add(donate);
                      -    mainPanel.add(Box.createVerticalStrut(10));
                      -
                      -    JButton ok = new JButton("OK");
                      -    JPanel southPanel = new JPanel();
                      -    southPanel.setLayout(new FlowLayout());
                      -    southPanel.add(ok);
                      -    ok.addActionListener(
                      -        new ActionListener() {
                      -          public void actionPerformed(ActionEvent e) {
                      -            hide();
                      -          }
                      -        }
                      -
                      -    );
                      -    getContentPane().add(imagePanel, BorderLayout.NORTH);
                      -    getContentPane().add(mainPanel, BorderLayout.CENTER);
                      -    getContentPane().add(southPanel, BorderLayout.SOUTH);
                      -    setSize(414, 400);
                      -    center();
                      -  }
                      -  //--------------------------------------------------------------------------
                      -  //   Protected Methods:
                      -  //--------------------------------------------------------------------------
                      -
                      -  protected void center() {
                      -    Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
                      -    Dimension comp = getSize();
                      -
                      -    setLocation(((screen.width - comp.width) / 2),
                      -        ((screen.height - comp.height) / 2));
                      -
                      -  }
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Private Methods:
                      -  //--------------------------------------------------------------------------
                      -
                      -  //--------------------------------------------------------------------------
                      -  //   Nested Top-Level Classes or Interfaces:
                      -  //--------------------------------------------------------------------------
                      -
                      -}
                      -
                      -
                      -
                      -
                      -
                      -
                      diff --git a/src/java/org/apache/log4j/lf5/viewer/images/lf5_about.gif b/src/java/org/apache/log4j/lf5/viewer/images/lf5_about.gif
                      deleted file mode 100644
                      index cdc59ef00faa8c9b0eb6bda94746a056957ae81b..0000000000000000000000000000000000000000
                      GIT binary patch
                      literal 0
                      HcmV?d00001
                      
                      literal 23106
                      zcmeEr#C-8aN0*W5;(g%P0-0V@
                      z{_C%wmYw*I5=8}RiAv=WW0LH>X=>l5tRKrUUVlX$K7H`5RCjQ2uvwQYTadL^gKb&|
                      zak?4v$%5}Goc`3C`|@ky^{S(ntxl~K*GQ%1swMBYmWS76(qDRP7KK?Zk~QRnXij&s
                      zPapG?L}-3_?^Vyra`aTrn}J~_NT@~_@ug0=Pmb+_8Q-^R-RrLn?aq2A88sjO6)6^Vn2FpKBZ}X
                      znRfp4^uhcyIUKIof{_U~;|3#T{L$z7rN`|0>%f#Q|MjZ(i7w~58b_cy(^GD?%hjNN
                      zK+yjk!v9bIZxCSn34u@pZ~(#omH*#P00?jZAOVwhD`qH;fQsLCvbAC)3C5vYrrlOK
                      zmIfF1+L~;un#e+^r84QXS5M{fnl{=_wb#6VF5*00rqfaTp;RV_EFL(LHCL_@N5rhV
                      zd|XgvDa>m(Est0oRmRON!)!IyN$MJ^;
                      z_Er`uHbcov^;*@|FUFIz<{yYT)B5(N`EC|Ep4Wci5Q`m2o)Zb(QPFY{wiRhIRvUum
                      z9?yqsA1{n&hMc<%csw;N{_u@MVptsK_Q%Tq;Nt@sQw(ZsCPY4XZvv+__%8Z4lw@GS
                      zuXYfJ`}P;HgM!d{?2s#P)jPy8Nt`&u*|SMvwkNnoLiX_z^wv6fB3!g*%de}-pPKzS;x!Rh@5$DDlM@Bafg&`K&
                      zjBd8_sEF#uiRfo#URqV^Fr4E^bLT2U6TL4}{W+TWZkj3umdeYPz#3C;ZpKVYyccf|
                      zB)*7sE->HkT#j`Vf{RYySEjiaNG2J|<_17Xqwn}?vrkf=CITY9rnvNG>x_?kbq81<
                      zzNK=ZAAc7Rc2p_V?b?*HdgR3%Jnvej6xD!w0jD-rr`9+tb_qbeYE`9+
                      zqxIsg)Xql52XkAw#}Z~~^7DDpOR%xjeiLp`gRvOWi_s*>B|)kd$LhR@Zx5fd!an}g
                      z8ja9f(oJYlzu><`y}LVWZq+iczeq4+78qHjArq%Jy8jK_txU(b8|{0ACTNb@b<4PhZ~#<_f4
                      z|2(oOWgZ|DeWJ9C!e*NX6t(s1N)etw5#JugR){Z?y&w#3F1vmv{KGD+R=
                      zs&fK2H@A;tzWX~|ND%ibL?f-c)5p8i#!Et4*>;G}g5J=1oU?Y?`0EoCBTK(rKIgRr
                      z(%$$?m3}W@Mp)Djlt~P(P>oBR#{$V5hPSXY)I2l6Q$bIzO-=?}M7Hl80teF&A3hz*
                      z9ir2X*h{xbaF`%`mJ?ym^^|-MPOuDvUTauXAb_>DXMje+=W)fx@V$?U;!ou6`exo=jp+ss1ul-8vU;qF+Ngj4<_sglQ9sdGR|7md%kahu7OK$8%Il$
                      z0KBPo^^8*oL!zU-F6H+CJYGmDu^IdF1*|LK7#<*}f{9akSNCH69zmMZdl-g+
                      zYbal_g)^Q23hr*>c@U{-8M)*OR<3|waDeA3@bUd(k*3tw>5Rb$qxc&cHrH@{sJjg9
                      zpF3+@v!YW*mdcem!q^M|eCcXKpzESY-&?mU!3LHza%73caxxz*=F+&Ba7#{2$s`QL
                      zS%YdALRA*Y4G^UKqqYpcR)%6;q$CP`vE&T_>q|kPPx^wfg#W1H?PK(aGE2Abb!inj
                      zN)W}Nuw>>|4D$p3I{7!$hFqQ&!pwTclIBF_(&e?|nnU>MMDs$cN9A~G1wc*g`R^CyX8u+{bAp;Eg!O5tPQ^NaJVR4&DrFPj&n83Mx
                      zSR>D+niqN`!<12@rIuU+23!%APUV(Z<(aI&hZ0hM*Y8R6Zy1^INx7b=N|cJMbK+h&
                      z)D2v4O`;eQDSd8@7OGfa`M+4}65Rqb2@S*QBQ`e;a>zM6tR_2c1hj4^()I;yV*bs8
                      zzIL%$w2757ICoiqd)uN@2Oisj7uqa;VGM>%AEYtzOtHF9!Y>cxckOAU891sH+c`x88Bgb(CR@QhQ6>Hd)k
                      zJhYf?Ik2dM1rQx#{zJ5cS#O?Ku;{k=P-y)$;Qq
                      zLdt@h`(=T6&AoJm78eWrE%(a-?WByOX2STqwY?TSZPyI7ALiJnU9@}DDB?%}a{jNC
                      z^|oikE2gAL@|&hwGee+-Z#Erb3O%cdcwn!R%7gsET|eW!4ja+KG**0^8Ey2YJev5_
                      zt65_eK{Ts)9A(&Rlb{_k`+6;N82B2lhJT;4v%6W7><0G=BZjO
                      z{yZ_#{Fg3MW{*1|7bBmwm2NrzNQ3n36{Y{ZZmW(ODKG!N(%7$qDBMXAjXYvlFq8aa
                      zZ(*iN)CWZb%21vcMk?{_xeGVP?{4b5wYMr$oyO?bq+8x-7A)_0$>ZPek2xN^`PqVK
                      z|L}e0Pp~vrl$L2gX$F<*F%uI)V(-)UYaWT*Lv~YNEp-+7jhM8ht>ji(hvD3Ec
                      zm!5bKUC--GJL`9Z_dBI{7e#p#1-gl31{fs-hH?>b!7NF_C!h4hS0EembPdY#K8KON
                      zt-gg&zJ@*leJs+TCLll9-lnILIkS1_8k&bb!bY6C
                      zFb+kAkGru`wSfQwfD-3NPk8Vypw=f?<+eCwZb-$mrt;A11n
                      z5X9axd@E)2dn9#8c9LmCBXI_}p@z#K!7r35zhWrt4I87^rS-obklc>}1;+vL!(2_s
                      zK(42cUQC$wYH_(@%nf(M>v>>;SdbG2@7)or%(31aHNAmT;7dC1xiNh68`D`$UV3c-
                      zUyQd(Yw)Ubocec-Z4HYFe0%Q@`_HxZAvEsyoaRKMAxm{Uo>Iz$!O>s3qBo@B;g@u~
                      zyV0K}=wc4>|C+`GOdw7z6-JDWFWvxipw`WardL|}54pLM;-01Dap9vpnO2|SujzXk
                      z1(e6iSdT^4{CJj|1g+~vvAh8^t^n;Y3VMq?JgC@biw})(m`K_lrgNkjCl>q^00_xW
                      zDOm%{VnME*EM*lzJ}_sRF_)J=Y=vaPF!7q&FahpMXzM*xCOJ-?0HRnFbt>+5&B?A>
                      zFBnw&_*-HqQ9O-iWr$@!e0p2Rqo?s3#~iaBGO@eqiN+A`?1cT}&?Tpsz>f%8kVZ6n
                      zV$P9+GduD>x|358smy!uyUwwA+%d!>>3y3{u_M|<$~F2v(-7mB{qa$(Rd^-`UiT0l
                      zM>fzjKlTki9<3&-3dGDEmr`<{T?_}3qwqA6Ky3*o)%9SWH>UXO4{5t2f;&*XydZnA
                      zY{(S8#buC8q5_MWcVxZ!BUs21TUujm?v10Oc88eyJalJ2*8;4Sypr}#JI}=-!Gc#o
                      zrZ`V-Do^oep3xcvxyK>rAgkeNs&fRV?VyRtMjZT5{%zqvg!edY0Zt{!oqeF9QfX^i
                      zU`n{EBB{b)AE;U$%q8zo=o((QZ5C{bgQ~l>>Q)42;rHPEI}Z5O;}{~VXCtBX4?pq&
                      zz`45qdD{^u9X`LPi~tu$5z2_nh=*S?9aupf>N|ODO9laCib_ib;_b5uiqeCuv7U
                      z{Is3i&xzp0BW_Kl=Ix9ALi5wjA@mA$(|Goi}CFjsv8w>ORi)wUuVIV#f
                      zSjGV+lMQ-|01f?s!VpkA8+_AC05yO?vlYXTQa%Zepbd50?95!11H&Wm8RQ^$3l*V=
                      zhAVZq2EIJ{z=o(Hx>pU+`=X)WRvN~8(z_dMtIyh4`lU(CYzjs=6$2p}*v6K|gjkod
                      z33@{sNOI9`Py
                      zUPp%7u^Xn>^0oN>T(*I_u063i+>zE;0M%}n!=t+ERB#9u#EWg=DS#pY#eY)uY26@X
                      z$1*`h^$WNTvDSM2!<*vODkXC*H&>|Nwg)G7BV8o0$0E7iB02i;eiTU;8{uer<;Gyz
                      zX3tzP(BQgM!a+1|vk`pTX!z6pZz$fLm@rXysbs52GeuvIL?6~mn0|-**PA{@sN$j;
                      z$n)Tt%0Xc#amyRx@NZN7`N@#gRLFjuXPHIUM|lkkMu<1I3krlrXBSDS0LU-#C@=$f
                      zyInR8itHk@#T-A^#a>3^m&
                      zgyYt2%~p8GyMRpr^hob9Mhp3crQ!Ds&&%=D7tZwGMD~wDiWZlK*$0|ke>t&*ju?Qz
                      zr@F8p6o5?!uT3mYLml4+3sP5r@$I}4LV!#GZ`~MCo;#yPOk>#!V;NL$EdNOCbk#GK
                      z#681WoTimr2s~yq84r?b^C02ewj88?KTZbN`Oi^h*f#=H%ZqCW`iI@04LO_A_}aCgW*42
                      zTQG=y8$rlRtJ&PZ7yyX+^#NL)Xoy`5I!&dUr-%%dFLUh@B7TdI(#SSICMNM5c1gN
                      zV)>bTn`!hGt1TRp<
                      zAUc-x!AkGBYjzh#9~xWJYq$hHvx61B2q|R!6DY(aprF?Br^PYRmp8>uuS#(G`Ni5o
                      z-jpoVIIt29t)7V
                      zMbu{B{!IV2FKN><_O14dMn5r_yOHmf$(LDI=CYaXE#Hgr_me9NzO$0v1+Fq8Z%>&A
                      zfj!qgParg(Vl+R6e8-kL$@l~^YWg!a@0NyVe{8ukf&?*Ai43-g_?Q;8lXOOb)YBh
                      zo$^83USyX>QNECV<7U_J&uXqaoY^h>&BMTVcu<4s=gqv6mI5@zLDoha*8aK#M(gBP
                      zc;6aNNDyf@*(s*;X1w!wxQ$O1#9jiD!RCTr5lrts_<&#lV9@ktMCsWd^TT=f=pXs}
                      z-u_#i@3!4C&I1zJ`t2>>k~I?6R`Qki3<+O+Y+=Yj$}ZuG@>_@w3%z3wzFcS|e@YyI
                      z+7BC70!81l(QmLc-)cE^i$2`xH9r{n%C_aaFJ5b6sCWME>zruG}
                      zGOC(g{U$O4`$R++<)`w}(}_Np!dq&D^J*9`L;4}K$NWM1LXgtJX#DTMSG?Vye-D%|el|Z2AzObY3=3*y
                      zu$>3cA@AHCfLhYQ8L#le87^PHVFL1H6Q6NTb|@6$bhwf>PF2n1d0yOdt3dj@7s09x
                      zKSoO8p4=xWudu;z6K|oH{h|J2=hqX10a1C#bqgMaIr(S>|V0RKVeMg1EcK{CrLlX(^3BUvQ4o=p?ZO@eVfpD)zmulw8!m
                      z<%Q~$=>pGmh8H4iJSEKf4;5Ze6hH_$O&e^uC_=_*`R#fmwkbo?RvJy;+e@ZF2y>*=
                      zx4J_j3n2;kG5~-BX2i5Qly_)-RLh=CKSnqScRd}EA@(nJ;R_wW%NY(
                      zG|UQ5i(qa;C*T_L;4iwv<6duCwm1^`z%=ePmMp
                      zr1JCnkhV-Y$q)GR>T`d~H-lWe-**?n1N|_V{Q!#hu&PYG-2QF&-I*Z~O^H^_OEiRr
                      zfvG|T_b&mS`6tVR9WJ+_U6n}|k7m!A$_oaj|I}
                      zrqn&xZR#+v%}9N1rtV8jHDw|&4tKOA7Vfs`Xd@LgIT46|zSt@t!j=R<;1eK>Vki35
                      zjhd6>YDGp!9vER3ld3GHNyK@j)({zUs*JwCB?C2m$yHl#At@G*eo|@a*MQ9Q-6QH(
                      zJ$tnyL2@Us9jd<5{3ZkGuh7G<^51Z&j9G7anH)Nef3PG_zpFT^TE;M3jyzG;r5H`<{b6F1~6HBGN}e5h*-U?U3m@G}&-U1M^G79U;G7
                      zv#zG=$_Bq6&5JRwad?VVw~hA-`)~$gD9lkzgxkY3CMN1Ly&={v*O(5
                      z4aCJeR){*kyb_Gq`&N?5kM=mK+^Hlwqx#l0p3cf?o90>@p$n?1cK(UgaRcvlslbzf
                      zcG$lXRf68*+WxP-0+(q(s#SAJd?B0pN>N&r2$-1P7%Q0(+dk9IRRyufT0GLPV)tR3
                      z87LE6bJ)RVNo(~XZiu;S!+O$0XW_jk7Ed$fb|9qT^EnTNzaD&FeAMf@?U|i#QtYYJ
                      zSVNP^fMiq3nzVK||9e@y%=*%B{sU)n+UrCK7qLC=vi#X8e1Yc43Pq
                      zdIMWpp;k+^&FGHLxjCAyn+`j|(0W0RXM=m)j{v8M(u1uIc1|b6#5#>@ddt!0hvs~&TZU)?9_GDnuZwA8EYQ#c;e{gjv{Dn)loMM}>+$7N8g20vcDt{)F
                      zHwaZ7%uD_0%Kz!xQbSduSY#a2A#b_po~jZJMM`~R_^dOPU#>sYa%v)C&2-wtuSTM{
                      zSzT%GH|$PTg8P--Lm|6|tMoNBnm%1a89o8dOq(c8*M9`NWz>HJWJEv%a6#b7
                      zYV-U_06w|LGREe|vURH1D*{wGYb0t20@1{bYkJ(`d;=09LJ|;0S}#gk)h6tb6t@B!
                      zk!iguZTGw(ed!v&#i~Asc{-8DbdD^9uR-f{@hKzVB}G<|`aT;VoWlAgRrK8eYv(D^
                      zlE7T`q%^w94#&$Qzw?sfW+YKTTZn*2XC$VRuC^AFNVJf-
                      ziXzPl>lY3DEm||63)8S4X^8$*MZXRnLeO+-m|-9X3RD`n&Q9HJJ*$ATK;Q;vj?L9$KtRx
                      zD!~%XUUX!d*sQ1SwDx>uPpn2O0hCsGRlT#{G@lIRFdg%M?D;g5F50J-%|2fkHSFtW
                      ziV7+_Bsm_0);c18fde5)58QVMF;({$}#l90`r=EC5iy9IG`BV1#
                      z)sPlu(HuwOC90(3L|IOTngMNUyEZm9+2|}`e9Bb{_`>+eSfx}})4p@+SEBdCfr*cF
                      z+pjObnrMnLSUiQ*F6gNQNR$R5N1O7S&HdiXoL$=tDtwW`c91%=h>y(37%KE%5u>lF
                      z0OuBHJ^~#G39$(o?S1tyb)x@`9Fr@%fCow7)I4)fO3}2JtVBYKWDKm~2`(Od`negs
                      zSZDerD3F$i@=4MXIqQ1ZWRRFrrtTSF7^iKt<0u%t5t|t9zQz>%fBFbW
                      z*ro5k)J;D^6*>nNSgFQ4Bsoc$s?+Z+E5VzBXOzA=Z>3?os1IIM4Q;yK!cq9By4)R*
                      zG+&MR@$eF!?h;q1XC0UDl_q*)54*AwP1}Bj?%^T7w3dvq&3J1$=LITJ)h5kOcS$3}
                      zFA#cTkmIfu_wz=9)S_x0nEcibFBq_HdRN^t{Se4LpJv~JZu$~3h>H{)rP>T&{=QT}
                      z1^}y~&iuL~095nfmZq9nfQKG)BBYp)OZf3kVr%?sA6Za#yCbGw{*yqce?E&=S2PcJ
                      zXXT00B}vR>LQ>ShRaF?9SPY`SnY>B=vyR|Kn1f+q%FNQhhoIzHMzVzz_;y$W?_~<2
                      z{*6InZ$LZYg)!=*0KtrI>ZD_;Q-$KE5m1j8DY;H)exqH{w2;oMaUsT^q!LC3kPj{8xW*2%*lxg-$UmR41R_W>O7Po
                      z-l2jR^+>{dZUx$sgOsm$2Zon`d`rs2qtuo4z@ORe?3Il;SE?dHSP_~JPFh(DFsn5D
                      zna>U<6HA7F!LS)Fp=XL@31(EB7)ien@>c=4r<&TN^UEAh1vWjEaMH}
                      zs9PG`xv~xMbViA+qlmv{!sA9l1
                      zd!ez(aCpgs%gABbQ<3=6;gw!E{UxbT8JF;d>h=Bb{dZxu68afaRQf*mw_n0>SQZXm
                      zaBa?rAwS&kY`j35K)zEAoc4B)RGr9bxTrruvc9JuB9E_o
                      z_D5@*L!5d`z0O&cwmHt|04OP+D!AcrG5Nqdm3F6Z$^I(y7oP+r<2l@+2|
                      zHTiB1QxK?1%4Mc18K9bL!e$}XleYmE(CcxzAa(N@R|+0{;6v>>qkP_=={=zNa);X2
                      zZ1kLP!e0;`%h&4{-%f#|4_1ifoNqt|gH$1PE#sAPZw2!oi@+~-B8b103AMTK0Izb%U;Y8@Ip0XxaQ
                      zqrY#q*eVTS(|cM)*HK0Jg+X?1O+x}fG4)5IjxhxmC*hi&w_L1~S)uAOI^s$~zsUK)
                      zU0uJNI{9-i_AmD3>N0thAi=o6%drlYzgFGVVIu(~ak-^xbu%(_0t4>UvkYCa#Css`
                      zU(<(zQpG0#TbF*R(GP_3sCUC}GxNt#TeIEq0vTI#8P#CKyn1*;9LM@=w9WIIKjp~1
                      zMU_Uz)9-0;kJKl!^&EPtmbP=aj0^2ICjw(zK*L4_z7xzVqbaV7QHZ(Gj)RfnE$Pu@
                      z(Mi2(X2Wo>gbER<0`c4F7Y8~zDf(U)M$})%Kb9#|jkQsel5Wj>pdI^AOMWGPNwb?l(2wE3JEx}!DfA(1GX8zP(A1_n_fVpkA_L{o%(Cm>vD!E1#=
                      zISo?+tm%^q|yjE24K=>Gah
                      z>s%Pdr~)4aj98;nqSfP^Q&J25Yt`lB;hHJ$h3Vlue1*ttl}}kP_~YlDkHq@aOkVkz
                      zHMSL|kyxxk+~0ZU(&YwKV>A$&A_N{UI6BfB$YcHgnlR2Qt3EwSB2zw;T;lpajZ^pb@g1>WhnS{}2})NOW9G8*YdETl8fM6n~r9uvmSX*Ll&pVhZ&|wby()OE4mqY1zdv
                      z%OlNpI0s0+z^({mDKxq-Q`eGd;2c=Gy@0OnNUPW!Cer2<5z)^do26Uywth>R3#@_v
                      zepvX91mXmLe|BofruE&W?cQrw-T!p14Hglx_uVnLQ17EOv^sD`0LHGC7av@%O9O1k
                      z-lYkK5#r5n%ZL;P_03r*P?np=@*J+NYVR|v#7)(2&~O!jjaWIiMsp^My11B6^;?*a
                      z9235`N)qf@{Pz*%a(W=K$4ptSz-v58{OWp${Y!wcZ?2W&Fnbbdo?s@^Js#GertxDL
                      z2HEsjq}y0&Eq&rcinws$D_&9ncTwKh7Ab?<8-owU!!*C2s4ibjy|{)YO!i3T6Ve?nYip$D&>k%y+#+UPi3~NuVVzBF!bGWIF$k|QDdL4DaO>cA563B?V1VC3xcYg}KWa|(H)U%h)8
                      zrbAY0pZv;_ztf(TdoZoHVkq%ZrqqQ;_2KK`bPA!a%i+orakp2EqVo=q1-c7LtF)G|
                      zE-^l-O~Z}J1=;fkaev21e!u-}sOIW`ncz
                      zDbnXO3^{UEngudh@h;3;2;X#gWXc_?htBlI`%^*+E{_A$7b$xv`KBZVoYwC
                      z--63~?)fE^DkDF81-^#kjJ%|ybC#HjB9e==w&Y9%crySse58{q?=!N*h9QXEvQdx{
                      zVW$iE3_FPfYh6Mt{qe}r?TxU)RsQPUSLeB~;(C&o_bDZ-RxQD{2MT4Hnnl^>icZ8^
                      zq^j?0joxpv^wT2rxNE?c)T{M{0gZm?d`2X%3@lm-0pK-O^3T0vVckjbV>circi!Ln?5V`WQATuY
                      z{8pCSR)1yLt~pz)8nr1k6KvovnZfCpan(TPr|5tl^Fk{-pa-Xc;B1sA9DH;apbQ7@
                      zwxI@{09TZS%qMZw4leJ3nqNL?^VB`(ktri$b8}kV5O}&X&-UnS^3!he$G3OqW=H+^
                      znpt9&0RXfh>2bRetuQhgA8*&NT>LRIKf83J^afRy3&
                      znlgSl0v;^j4_FlK!Knc7jKI{%Xm}VZR{B1U^&ZaqBO&W)5{(wFr2b=E7N=Zo*r9W%Bs?4iE>`1`~J#tX~7sIZW4-
                      zH70#=!zhi{adg{I55Jn5h7aLW^m#(9uLXJH_7ScRo`xRRe{yCDN~;KcPC?YLdm@fP
                      z-!V}_i{dJB^6hh|l`nsx`hr??f9yVtByfMK@EHwjC1xT3=DL-91qRm>#tH!9UO`Dj
                      zc)^l8J22SUCJCD0@^?QLP2d0o&!0_Lra!0Sg-!w~P#P5V0eQH%2loO@4!}b{&awH}
                      zSX}G_0yNyAWKIRZeM!uuf_h%Rp-{&Z&&T!b-*H{YLmY0ok&uJ54Z|_*^XvVejMv+N
                      z-_=}Glm;6g#5NrZUG3_?wf|s?z#{n!Cze0NU%@c00Fj-4Uw{1jh93w0yZ|=Zf1?~Y
                      zrUmFXB&z8pp-=udNd9N&K~!uCx`VEs8ir2IiXt;W4+3vz@ROCHRyzO(mrT0s@(Yd}H1ly+-80Z^5g>xtW$r|9<#LMruS
                      zBh2MN$`po&9JcM056P|84ikCnUx7}qH>uOLbG|(@C${NgKRH`DUu|_t%NFwPzR2ms
                      z2ikh<6(&A1D)gVnRH#A|oFx?Yf06WsgH`t2R
                      z@68lHWm;>?;h0LRFXvi3z3p{KGZKh)mvG7j5U9ogZDX_3{x7OaJ@U}w%lbD@g
                      zmQ-@1T1uTk2+;#FtI7Jf!^j+tF30F7(%0$0v{64!kVLke`A!P8$GMad9t@B5
                      zg#f^K!n^hC+!$3F*JTnw`{;-XL~0%oOZaX>CC=Ix&oQ1-SGyuX;{Mn9YX&E6w&ZXW
                      z0Xs?L-^=qhgnb(`Jd~@SmPG$D;7eDqZ!3_oDS*w@Q~IdKSy$;F0cW3vL8lsFPH!Z$
                      zqYT!VMaM(MIx*i9(fW}|!w04glXH;2gnkZL;36XYu8l`X&UAxEC_b|zob55%%1lL&
                      z%$?xjVWd6;mIa~WXc^{pb;m#>dUK3AHvi>v04nXB7#WgKfoQRmjrh
                      zIFAChhN4l*Cj6nuZvl;`broNi^W3;y-IkvT;!VbxzUGJ1Shy>C0AKZxnx8b9o|
                      zG8|n=Z3Vo4fo~@fl^917hg!~q#Rva1MGIx!uyPogkEOR`M)pc_HBB|ZUkR670x3CV_KDH|L}`HPh;
                      zTl3q2;bTgHl1bJ!8J)yS>T&xF*VUogCE#oIX5_SPwd8}GFiDiL@(
                      zGlLhYcu{!8%<9BEX?eiA(e~18K@2Ov!RqN-J)bLYXR7L^STaRf3uvMV&|G0oc5}G=E5787i^AL@X
                      zLu4_Rh!xyoDcJ$HDl_~Q(0d9X{1_5veeL*!PlD-O8^13}aTk~@cSQFKGvj*41}zAp
                      z%i6jeVZLz`av)&WFfip}3EfS$U0Z!%N`S|kEo^H?L_|}6pYY=1AXS}>0{|DPUI$3_c~AcpZ86{%k%b&8(tY%mh>(^?%f0K12$FiF`JngqWjkz$K_Zz|
                      z%HRHLJl%67B5v*#*W>F-Omq9tlNh>=LYPc3FZ;RLFlF~DUA(YufJSR9>4bxD5!GmQf%D>=a5c=5im5kfITfKrVRiLVudj}cb9ro2zNHSOG6kL_
                      zA)!0H(n9fYKJ5)w{E}m+Q(l{7C`7MJY^ui%Ccqfvvh`Zf)~pBD9O4|qCxw)v9~osZ
                      zd}4@~CO@=yEZ*1glj?{}@C=h4Sh{or+@pzUcP5F}nBryk$BCiyW_EtRD_S
                      zmwuU8`GG%$88o0L3G+X9@my7q)RFBvlsgma_;thEdkFoH)i?*c6ZTdH{up)0T*!W?
                      zqLbHr>+6kMDIN}JkFWAlM-RDUAgJ|qe
                      zaYz>G`&Eqcz~gFER+QVnOM4`gLA`*E@DtI4>yaUZy`jUsg}$cbD~Fytvn}Y@5;VF@FwPMs4$9w=%Gg=piKjpQ;8nwK|QwdUoGZq!NDshF2KQ
                      zcRoG_&ZL#0cK(*{VNi4q=x7+-LtEoTBV&bi06Q%de5nOv!IFt$&kqW01MKY_5wZ#I
                      zp)o+y>XMseRA|G5u6nxDeA+oP)?EShT_g+Iy7NRtWp-J8u3&kVi;;3;&VwHEWNVaJ
                      z#@@wB{hQA+c?l8sUwqSpLI~$RjI#=I`RV%!kXdAR*&&0PUPJPq7LTzbO$=*L0;}~s
                      z^-py2&*DeMIlEglE1yrdfA<=B!O`-yiJ$?THmf$$Yjk%Kfnru7s$S4Iu^J-$vyW>7
                      z_HdHmd61gGtEu*qCKXU1%B@NT60*12v(Ab@a?A{y=g(
                      za`ej#wy&r%`<|Zc0s_O#z*_-BU+{?I4;ZlyEMHjE5Ean1tc9_y%VL0oW6l-YhMawI
                      zocFWN&E&)F)nJ8XA$GPKzz}B})rt@B?(}1)qQ-haRd;xmLB?a5zJ#A>NBVZ_lO61@
                      zR%g1NDvDND1-UYcd1tR`E>Np8p5H_B+kNGiDB+N_`~d*+E}j%X5F_%*F&ArDqoR5}
                      zM`gfLq2S~aWlm5O4`C?M;I`V;!`aaLb5e+m)vX=i!{VzDrBmb^<2
                      zO{9Dpx-T8UBhzkY(zRpXjP9=)@{&p_ji0qi$Iq)REq&LJ9tCB+uX#+UI2VB!0a&c}f@c_Ha5;SKK)z6W{|HvPh5
                      zA_Y~18Lmer)B60g_gPG-$eck2(0(O^yto|CBJv~!0dha6=aAKmszZ~6Jik%v!)It$
                      zvjL_|RkJro9-;!CqN7?RKrUk}t$Jb=5zI2yvnbcZDx!EJ`*U&SDY6;8-Rnx5KKEp@
                      z;oAYti_~+L16%{HHjEwTC=k{Ux6OVaUP4tT2r-bCipP{C``md*ME!QW0t!HotJ8eyMwmk#)
                      zdE!gNan{PXbB|g3HQ+|ZnCl{Dq(O3k3r?RVZC;SO=k#!ET3sjp(R=P%oX
                      zl3kL8pA;C4sx1G~gVh@hFpQEzSg;5ljj$hXTrDD{8<>&c?>FGf2E^34Fi2~fFCYgpDU
                      zgx#Cij7S_|Mvb~q(u@w#-REpq&i4DgCvthd&%_c_gk_u@)eGbIi*D4bY^sj|!dx}q
                      zdHFO}3i?-D96F;i3=S3M6q$8{YZ5;U*BBvH#_Bfwhhi1Z_;$}5^
                      z_WRl3H)o#Dh+bkZfyBs^JE+qs1^=ep?k2+?EvJ5G4FqQdptf_9MpIc_A%~*y>5@lx
                      zYakQ=WbW?kNIf4T6H(lOWyq}hb!#I~z>sC6)@Pc#IiS(t%vc9me*LEmq8zXDl2g~_
                      z<=X)iRLjmKOoVa^$)kHpAih6K)KFKXLiC-WlR_i@PJ5y6@>MopV%cKSOecLvMm<2Vl!6QlMVA!o5Y
                      zaiuJvnhM|}{TR^poL2qhVv&fiDuXZ2^J^$U*mOoo8!K@Jigd6OG}BI@okD(bDfC=(
                      z`KsNZ3e5n~FeDG4U_>(bq>a#2f1FoG*Xb@~#9}uP!dn$9w{QgJ)NUSzS)rI~oI-SXPogP8AkE-xAgOpQMz0(u8t4ODF(vWjAgnY)Zb~0%;wN?LM
                      zG`2A9nfeJ{)ZId@#(KU4e}4jA2(fY7BZi(EujfsV?Bn%6cRHSmJ@_r=`~05HThs92
                      zko+DO);8@4G0Sntkdq^tdAWyq9+(LRW**NaZD?f$QSwmWo|~AtzdJh*iUdl#Z>=7+
                      zgg8H?(;gxdncjiY)G`-UzzT2>c)YJ5y|FKM|
                      z>wRKSk9=RZ5PqA_qgun?ohe$z7`%ieMk_A}u$$?Y(1Dn^22EacR=0*!iRP@ok)bdv
                      z4$SD-H6PPSrwo)$y3s=To@Mu@{jgEzHaj)D%ep)C
                      zV?gv$;5fX;do#)!p=#;e9=fg^L3a)dgkZ?qoboBD^4z2!OSkl-$8<~=v1>0*ruTBE
                      zL(v>}aiK46_M$);AW;wmUH}9DG7FwE;}r_ztBp@S<@f)18=QRAu}ZSe`iDNX=d--o
                      zB3|ZM+(k0^5(Rs)rbLfJz~EjTMelq`(Z>gboU@Yv6(r=BJC6a3R$iNV@1MC||MOq7
                      zc}-aE2wOBh-=a)R$IbEpCq>Q{1jW|ldr~xK(^Pgn^Xwl`rRx%4m!G}9?@C#4Cj#`l
                      z+BCY{t8`Hfd`oNiY9Bm3O$vW+{Q+#crd#I2hf(&GOOsvj4wME!YzQ)tj}?Ol5AxZw
                      zA&rk6Zrot81B4-n`K>glSWz5}f||)8hXF1gjiV7S&3Hij9;+fEX~KL4yYs
                      zXK$QUVO9lMu?D8LNIF+f(iU-B4EZx=OclR>tML7!hj86DJWPTlv6w4YG+`h|mJIp8
                      zfh~*gApY>7sRYlT-5LO5;wupwBxa=Evid@UH5OpUhJEBn5!<(M%a)CRc5m7Ufcrjz
                      zfp~G^O_1kNzI^$J8qYV3ke)`m0_)eYD==bYLU-@o!$=W7nS7W7Xwa)ck4AlZHSg6t
                      zkxzj>{l=@e6s=ET=FBc>a?*(>D^4iz1S@tLK>;7)aKnq1FtS6!2~995Gm%6hi2w`R
                      z=&(bVum};0n7nuog_^oZ5eg`H>S>P^RtW!UD6Ni4YAL5W!%?aal7hgb#q3KhwXaNQ
                      zp#`!$SVGCP&SEPxxQv|3M!WE0iZ8(a8Ure+;yMhmkQO7MF)AK|Ogt&dv+T0Wc-XA7
                      z&pabbsuo5==_?`eYt4e!bn8<%+F%1t&_M|uR5;_1OO83_q^m)?M<2~jQtiI;?o2ex
                      zldQ7JO6Zh5_&^19zy0vrA|$PB*pH?%Zd#F#0AMvRfSnj}2nCqTn9vS7ETRxGj($br
                      z*J0V@$irh@@5-NUu{4%5&@RRR}GBXXM(~$1iObI21
                      z@YY+Y=&(cE4s9rvwFYp*&A8(J^sUg7OGY%&l^1R9IY%Ldbkgm%`|i?9GhI(-Y!&X=
                      zXN5RFsm{ni3B9@lyAL;)m-e?5AOChV7?4!!2~2uqhnWMseiIbbhfmuAV2|H(TZ-u1u4Xb
                      zJ{Nt}}2T1~fhD!;7;E?>8{YL!IKXqF@G=m^;u)`Hjd~Q!
                      zoWr~{q`^Ad(GJaQcBY(Nk7wF5;}f{2m5^Y;L#0Ux(oWQc6+po!1~L$W_`roSn5}9+
                      zFcJ`WMTZI@rdavQ-yQ$>mq-zfC?+UqR*GB_XrvNT?5scEC
                      z9;P63O!%BJdub$EQP}tu+7Tf{NP89?(WkxwwQmDm*kepC0?4avO>6fnB(c1m*e8RzV+igk0td(?ty6LB)lzNg@;rUTP_&
                      z8x28Vn3IDmds+X5&i&yHR~Z)#@x&Dy>TEKdD!~jw0s%Mm1&FVcidZNzyK0W^0!dWj
                      z61mw;Z}R3)$01%G#@VuRzKnS@17oGSQ-*iS6MOXBUVXkNBHHbfpDjOhMoSJ6fa@L6-5)@5HL9u&|gMEUC0N%_W<&w-AmTO~od#zK}4
                      zE(wH8I*a3IDJ5HS#!Ainsl0xgrC$=&sEgSGp0?oBPMPO)ktxBZF2lpk?B$1^(QUo3
                      zTBom!3khBA)5yXq*0FxGH!4f(@sz{Xn2mRf>nv~Fy6{dZILle`43%9KHYO@;!FyiW
                      z7)la}-wyv-)LGGbRjf`B0H55%S!#$$t|S!5UGa*sjcshPX4j!bE-O@zgcfFf0;4^?
                      z#|E0zLr?$GObOmd2?evz9m3=hKOU(piDM3y`@P#^GsfPfR{Zb3?UEZ
                      zvDFBdsge;cND#9W3G@YEE}Y!oL|I+0f;GFp*=~22h*m{`7kSAW?{vx=<}N^wW>Sb7
                      zd(phJ_IxTn@C6!PwX#=zw!}`$Dp5@~um_&74?zgjBm54G-~{W6p$r|CRSco`u2``FGlpo=64AnBHf*r_
                      z?ClC_+A6cQm%qGisiXJI;b!l8;KSy5!Z&DnZDW3q#l|*_h$gKHD6HI;z)KrAMEU>b
                      zRfM!QtUyA5S5?8di4obM`=Y8op{lG;Cf(5#0orOx#vH(c{u!s-QVAJ{fQDvR>ahGF
                      zl}Umz9`N8UmwONzYggelIlT8lHZU^I~
                      zVOcje#(DOifH$0`n{~^JQXaNr#s#U1nd*bL`W~@fVXg;_0;ZvxUe}#pipr$yE5htf
                      zBxz|thlnNfi%>=uONY6rKPdq(Iw4O|8vXP=R4S5m;9-;^HDD48Nn!59L(G#xYY1Si
                      z@nYx>W~iDrh=XJbgz%uXmOw2?PBctF;4n@PWX%IwuGSQM3tF2|&;AML7oMLAAn6LS61`XJ2+@kM2
                      z?25kVqkAR{`&0t#C<+UZMhzf|3kZTIItqad3I#;OYA7NjHsV*0EGV6%w8|ES8j0LEgRq5vHa#TMf$U`hi(&H)WkNz7u#01o9g0|TAw
                      zwlt8|R%n7|?f^#zPk<}9oGMcezyy14*i!i3+{Qc&8O{@T`vK2Wwy!*#Mn{aEr#w2&hiI(5Aq!?k3Sgd$vHn
                      zxWWm;v46}!89}6x5H5kBaYf#zKG>)w#Lxu%tqi*{Dickj>||{0Oj-D=CeA1D{LEP}
                      zsST6@#}1E$0D}*41mjMONH!?72$3z`SuP6
                      zD@L;`l=3I(ObT0qkz^v=a3Uur>3!aVK3u~5o)X}q@(is)qCkZF+7KolDO$=g0FZJ8
                      zoP{Xr#$Nz1bIS5^C@3lBQ7tKg@;(kN;L=^rA~2+)@p6-5uEa0$61QH?s!D9x$Rz|l
                      z<^TlK1VKWo3{&(F6WJCMF&ZE?9Mdt&>IP5p6_;ZrFLM@`FK%#ACUvnFHw*
                      zNN4rtYq%zIH9qkJ9FZMqR1We+=0eT7?sEpM>@jVSI408-zw6rk^FL*g`N)hwiEw(t
                      z4GG=jJxV}fN;6M;5>@yK8B^0kwuXp0)Xw^Yy=J5`u6P2o<5S3&|A8<)LKbx34`)aJ0wtbMQj+UQ2!$h<|sCg5Z|uGQE^jZAXPWT
                      zFjvGzY>0A2hqE}l5M5&QE)TLfG3Q48W=GS-)WkyQKJHchF;+1TAb&{@q7v3jiiLnm
                      zFRK7w-k?{1wPc5kN}I~5+7kjO#xR3wBTdzotfD@f)iIZ7GIwxMzRVW4hz$aCTe-Ce
                      z>y*v3uG|`QCyDW%O2b3MPC`4x8rxMu%pfaS1x5}CMl@{0s>bcquR9s2{b7$CT^FQ6ife{vm^gTNA1E$xFm1Zf|V+^V%vpF`C>#R
                      zrZZL!AxlpoGd7fl2_lEAVJPxSIU^K#>03k#(U`Snt4w#MwKCNd`FM8QViHcN4n=N8
                      z+&nWqlJE(_RX+5TG}Q>77HRCTAYJ_@zpU{hr1m9bq9#)WYv;An#P2;|qEhv3SMrs0
                      z_H{GXk9XU(Lt6qac&bQvILNf2X6IPeTiToU~`+*cZ?%srj;^t)>?yb
                      z>aZv8P9sd#sCFgHY56CI&yS+|4n<&O132nM2+VlP??aU$
                      zQVa0n3a~J8*c!>kLVfspp}=h|i3*UwDffcO==PNnuPiBOiTTBefk+N8Z;ExsDY)^#c&tjS-;f8rT7}*#YWU2ZCTZ
                      zRFX}Vk8~$EZoK2&479z-=)LBnKA5ojXe1nKch3ArUHPZbG=hjkggo^E}@QyDtUelm-sSd6tAl#_u>ed-l-i$up*<5Y+gVjwX=**raie2-$Qu$*hy2EPE
                      zPM|C81q@7CR-z)7cN_mZnOhdxNukzv?+gxqn396{35dW9!UCf~_K0J-F9hSG31een
                      z4RbV5irLqsce!2Cm;ei~rAaUI23I?)q9aDhWNTU?ZyKk!fF!!Hr+evT;g>LI)|#1a
                      z_|EjGwYi%ig-wUhbop2cruzBZOFhVK|ERCNY+#L;wz&0B!xcVpciq7acD8a7Zt|p-X2nCi#
                      zyvG}X;OACcq6{@wL|0n73*#+}+yJ5%CNkA&e)vT`>Q)>swLBKL5*A=o8)i3+U+CH(
                      zAG@S=IRX5!)&c`ZWR&GvPO}rTi(9}d_BRu8I#?k?xJtVuk_@%0{D@(;wO#wQM@GYA
                      zo5PcOAlTGr&#Ro9@0?BCs#$l@ixyAYxm@GS#WM-UqYzLbE0La(cTqTwEGzH?4}LgQ
                      z&~8}Bv75|?>Z;x%$y-y72I7YWIw>Cn2*{!@a<#BiTNDu+)EJwkM;fy6`^&*xv*iVI
                      z%RCYXTyXz4@0W}O5J?9x7u=~fMb76O1!I&iYMsghgKzYF&w&Gu8@QXjc_4yd129v>
                      zfi}Iw1JO;qw~H1&g8O?wqG{zlLhoy1$d*F5mX^*hMBYP=<|q!iu*YvVlLLtk8gHdh
                      zs^W0uULFU@C**A3@VQ<6eY~(54M0?v6qYAE@hZ-6Z)^xM=e{F*zo{7WxH#J<2v>C}
                      zNC}*mi?jv4M8Svb*&7@`LSmUZHsf9C_Qqh_xm}y$_#``gAf)3zp$BNCI?)v!G#5P>
                      zUAHm1r^Pc#uc$tgvTt4UIZ$i7BJ_QFpWsA1-RoOXj8BsuKfY@TEv}u%?%ch*v{pk}Vm#xqecj7Tp0ag|A+6n&S{~W`
                      zqF(-n2$~&X8a(r*y|jPDx|t$<#S`0K$LD{(cZ%aoS7zvgpy)62=nM2xN?hqr9D~VC
                      zTzeAIuW#ygpN*jKzOdc|@O|qaPT#|j>~P%QE4kiaWCCX5>;=0Fxf8qFK1cN8?Tx%r
                      z@2u_t&yMgO3cBz?;9?BIbNn;;G*d@DtO@2Ii9xANeFU~yjlYInNEofOvU1rD;dymYyj>bwPwtC(Oaf3lmMhlmtMhB4HmQuC(3yp
                      z5%z0|v#ZpuP0^wRC5#b1hWz>lo&>~;ClDf}I37GVW=|d>*>>>d%av2V(Y%TV4Rm;r
                      zKq9b2_!8m;nlEpDOV)xP-awWh{UP=nu_aE#*fD?pk@`tuKzULVEveMfN(TRCfM5nR
                      zEqD_bI(1=0gg*HsRADc?a8!n6ETx80QAI^nh!ogB6%kk=h9Y8ZpcobrVs&Ol8!*~o
                      zLXB$K0Yr{;n6$A$*G{&4B%-0-59!vy4
                      ztg_BZYpu54ifgXA?#gSgzWxequ)+>YY_Y~3i)^yWF3W7Q&OQrmw9+3=OKr8*UW;wE
                      b+HT8jx88mWZn)x(OK!R5o{O%m0RaFzq4{0l
                      
                      diff --git a/src/java/org/apache/log4j/lf5/viewer/images/lf5_small_icon.png b/src/java/org/apache/log4j/lf5/viewer/images/lf5_small_icon.png
                      deleted file mode 100644
                      index d3462e327dbc0377cb2b15011541cde383b6667d..0000000000000000000000000000000000000000
                      GIT binary patch
                      literal 0
                      HcmV?d00001
                      
                      literal 42566
                      zcmbq(Q;=p&&}Q4VZQGvqv~AmVzir!gPurNbZQHi(o$ud>-J8AJipY~yCn}>dv+88#
                      zsdyq3aA1IdfZ(MhMV0<>qW=gA;@{KR%j@wU19KLUQi1x{e4tFi|Bay?BsHCZ
                      zfM8MnBjEWhz~{f0#4chQF3R?1F7Ad-ra-cW#!mLOrY4q#MB19Ck&30QDG(DoBQpmh6Eo>qEI$wsh?Ikqnz~2!Rhq3+786qF
                      zTReK0!h{qtLItg+`E1T>&c!JUzmT~58N3LY1IkD|byBf5Pe(1}urcC8oma6KAK&+T
                      z&L-uHZuCX_--nuqJsV#0j^+31x0)yB>5tnXuN5zI-`5GPJhJH)28!%z>*~h8G0-Q)
                      z@H@6f#wb||R1;I|4yhwOZJ~Ur>Vj?pZzEHbKdo58m`M3_*Gye{uy?wh8y{%}xV;PT#cQl7xe9DKqU^*?^$;^=0oq-rb45F9^!z
                      zGUXi~f7-q|)AI0Fb}VDx)rr3Jb8CByGysOU5PNymlq*7Xeu#U56X#OjH0O|5KN~*x
                      z5McV$NPtzKKL@x-(Jv4C2cK(S`YE2zU$@Kr#(XwW0Fl=fN3i=Q&#NG>fz_6}mwBR@
                      zoz}0)M%PR|sq*AR*9?}wZ^-tb#Xpa=0#=O(#!O`TtmOy4XJKyNe)RHle{LQGwFGTa
                      zNAgatDr1k9;&T3v^Z#Ev6SpB4B2u70h34Z45(k=xUhU)3@bB13+FFZmYptUE@1Xi_IB$qAQ@VGLk#&>F9dBg%u41a&+S)GJWh`*!2l%3r
                      zE6!_RB1rMN=_!$k4ZrWNYVJ^I(*L~hpSW;_+Xc2NMAC1>+XMjN#9Zs=J@A&w>wDbS
                      zy<9g4Zg#aEPV5QFGcpXxOqY(yFy`UiFfgp$mvj60HMO)R8+m%Ll^i(uHMK4};PJQn
                      zZ*+l<8rG+i8_|?Z^xfTcOl$*vUtUM+>$`QI%kVZ%$K~jm&wFmQold4olu|l;G3fXK
                      zuORNdS5AAL08X&3yH6+62D%!l%{rW=+is#67>@WfpPyqH7?v8`otzxG!$5U%>AZ`4
                      zrP_cnHRws9hio18*T
                      z%HzhnGN4Xlukf<3t{9k}nAUD}+s<&GuGKOG9MD{@yMZm~xNPhEv3(P<-D>}gOgW0t
                      za#vlW{cERjL~-TarP^&>*$KMj3yyx#x6`8VX8!kFf32dHh`N#vgH(M(BjbGjYy6yI
                      zyprLef;L2d?|}k@ALrA6i7;k&zy=0$TBcmQh_!tdERh!@k-6#1o(SH450HWe^amqc
                      zn45vGc{Kd23YevFkm%RSg%Rnz*Q$?k{TjHV2SN{KPG0_V(sXT(dCm^KK#LQ}1FR2V
                      z%~LZHzJ;dW)E44U2K@qxb}k_t+d%RSDSfC|MHUJ>11c!`@FXUIN}a&h&R^0DBJ7PF
                      zTR_bWaxj%|uDJaNETy$qMbA~$q++5}xP#FqB%}PUN`|s-tYRalj7;77khqGS-NUqb
                      zWrJTi!dBG~%DuE0hEZC~zjTEbbj6zXeDRg>@9+*Nc{g=cB|@fPU9@R8kihwpnvS!r
                      zL{RQtucCd-`?X24pSavMoEEABl$KXoG%(7}O|#_8a&DBS;TP!oLgVpNwGn9VAPLco
                      zYO^rZARz(f++c6u;~HKXu;MOm@3AMT4n{>Ny9SrFKSeDC9X6$g#;A>2L7+i&c9*CU
                      zQ|N-PPQ`&k|)?ipKq>f_+S~z
                      z9yn=)`In^6z_Sn!rIOag5UR=WkkC90m=(4yo9bzh!688;umDfM#%Xv6ZI1g3b${ht
                      zj&gjr-Q*_ex0#wZ##%)Tu4~_$R3=X#!2!}4K#oYjxye){6|IUMOwIf#bMk24OCtIx
                      z*jM9W69z(c(Q!@dn2i*m2ELCf>IS8I4l
                      z2F>cp(ozMdXP}Mru}&&C5nowRJDDs<;ELsZGUwk{4xQshEfFBk%{aUa0y5q8mJ%u{
                      z>h3J`O67HIPA+(PN+deh7N{lm<3D@Mml1u$|87ZufM@an$P`eBkI&Kzw%GA$T^z>L
                      zmaa}^|GGF#&|Vh`jcA5&!U~^WPQ!Hk6b`QFX6(@WbY-%{nap1SPp1)N
                      zbhd7Xn@=f(BZ{wU5I0ni(!5pt45@v=eKh~=Z(*JIfT=08|LE-Rm-!3-NCK*+ss-^p
                      zG*|jyEw#E_1LNaYJb0?T
                      zz_P}SbOE*z$k1o^w_Rd`SzM%~ET$8Uz$`dK+J)VTE4V0P_bY*l_hYX}|jk>?0C}$eWeodvy_#9}vSB
                      z?7tG+i(RG5q&~CPvk>nyPQsYhxfZiMb?9Z>D%?fOITG)qa5&xa8_^s&+SvMz{PL6!<;sk04tTPg8b{WPeq_6GYO&P`4az}$wkU!un
                      zNxbilPP}h0$#g-#gv&SFs{G4v+=e6LbG>g?wKMcR>3ZOn&b%R=c-tdL5IbDUm+T^h
                      zK~#y%wuBZC!___-;zHb01`%CsoAua;O(olI0DEyt=ObaxTn;Rib3MwT>v*7`Oh|Vl
                      zVGf+_0JY3KKilrc$lC)J9gO!~*w|Z7#ilP7ek+MBYDAbI1uC>Jf=%7DMzOB$z2CnV
                      z`xHyqfmke8zf}4j&b780WNlBAZJ=39-&beD%-#6TKrpw)gQTpA0yY#Le0O_0&`Zqh
                      zv=vxTM6ls1X0_K&A!2vf5U1yeETDY!RGgj9b|#&I!zfZrrJ}PbQ3o}~qPbR&=KUAP
                      z*QuL{01C2wtNlqNCjgD3LM?bSJelXZ5+q5t)eXzUW44(ZJA45KqJWOBl?8vyOKnyPa`?XQf&_kt>*WEW*N0IaFgeSotK1C_!<*u=er@CS!teWpJm5gLX{9zi
                      zbh)c7t5Ek0VQCn1JEIv6$edfa#QM3B>j8_d9)*xGPHq`MQS7ttxgUpkhzJvW37`3B
                      z**Sx1kfQ)DEGnxm(?D?O;920uZR^QMEadVIcF6U8L5wM%8*@w`a3oFDk6ArH#_<)K
                      zp2HcFwZjyU`kEAUh6}rZB+VMcX~20ziNx;nP$_eT>9($-m?^+Vt|z5AmvbeQ$VphNjX~ByRt1#*nInOFV*?rA`Ud1{
                      z3XG#j-CKmX%l#+uONmJEjd!DOpfho^nY{1qUHLRzFaCse2IsQI_vZae0{x|h7C-EO
                      zU?yOF2X#B+aXQ(ZBNw9CnZvN|KDco$F81ZiJ5KuAR=r5faKcX>ROmtGy?fljWrfhT
                      zwOg0^m{XtH&NTH5MCV4|l0-zZvXYm$y5`yja`tTs^7J>XLL5nWZDZ>`Nfz)oO;XnF
                      zxm*6EodA`-w!-sOVzItuuE_S=$GV7O^1h;J*r_j&oi*e>JOH0x6IYH4X3&;8k|3u4*bz4;7R>P>PU1M*rH*D^JA5EvM>Tamq
                      z+o?ftm>RLHsXRY`Z$8_X>?LWZe&cF;b+Z0hYPPqKGt;ojQA^h_*aaq1qbU|H6Lgw=D-6L2Ku)KRUa+d{%V~eG0bbeo{dOfrw6FI
                      z<*U0X8eB__wI}gWnnG#OCViCi46PhRwrW#bn*sN{3EYo85%h3P0GW8x(qM-_84Nge
                      z3bjzPRD5#pj%*-XOo`JtXSs4GLjkQYPu_t&F$7iT*z>sy<-o2wZpcuM6`)+L>cKaua1$K0)LM1IMOT!|xMUe*eL-r)SL
                      zd%RT5*JWjjXgQ&bt6X*jAk>-p0@Tp*l@{X9L7{486MXtgSflGy8RSlp0r~l~31W41
                      zY;J6g2qH@5i?b0QWPg@aNl$cbjXXa3UDPezIGyo(N=91HXgwYpJzem7PRRNK=R4R9
                      z;GPO(lzuDU#@;j}lj1mdfcw2%R-{0?b{^yAer8I)gyI;;Jv8*AY~TN0O%SHO>20*9
                      z#t1JGJ^r%i=)U3D3n%9X^}7~~c3N-J7rH)$?hGw`nAs#11bzwkgzxc1Np>Z(f3vMy
                      zMrhfcni;dtbRW*yxoa(m-kH^z_0ufeiI)D>C8l|~^nsOMhSC1Pv(i=B_HMh+owXRp
                      zh3QRao>A9a^PJ7)E#A_wYoW%K<|9huCk~=~E`Sq6rkR<96SE?|9pxC0)-S?zLteY6
                      zBL7*O%b~J(S=!&N3g&p~apl^@1i#Vv!?2-2EbnoZje$e%AUl9h
                      zN{IYt@iuJ$pHI8yZ0x*RLcyNZD3+J5diJ}KJ+wRa3vsqCk61Ua)k^O0bKGeeJO35$
                      z+*)nq3*-qPb@c^PbF}jcHJ_I$W&Nz{?iB4UIMOCM2fzB3YI;H_NdfS8|6F8wG#{F6
                      zFg;Bz&<^dchx7H$Dc~(UI-Q9uQk|HimuSKBHRfI);tFNM+VGmq!{n8q=WV&%Y(||%7s`fPd=eH_fyNJ*P6ED
                      z?l`){omiW$oOX1Zn9W1~_3+=acG&NrtS$k=O{_OsZg%F|&6hr6ZpZYzm<YD
                      zSCbtxIRzUT?)1M};C!92+jBfuoLqPxYK~4*i|iRBT3Bxc%>TFGKgFg@Puz~TPNrx7
                      ziT#gJZE#!Doz~nP|4F$`tPvub|0m!c`rk@$TP%-ZW~cm;A@{k)>o$Hu1GAO3seX@2
                      z?8X-g?vw#xYFl2Y79mYVyDxZ5zXd!lww}+m*=gDG+;lO?lNqByPx4kx)Lo<^COL{}
                      zrDdJ}YPm!@*;jNS9C*mqo2zdOH(lrR{}
                      zy2@5*>UVI~E8^ovg65Q^+AS#{fcw@ef+&H1G0qAna|8F#CH?9QwXCz%kwr<|1b@<3
                      z#IbM3!%Y`=pWlG1R&q7(uer>$GZYdTnsWWa5I<
                      zKc!zf2gqq{Vvb)TZFB~Ek6>GOGQ_vhl=rErJNOCz4M|#bC~MJb(c@D7m-mPb#y&H|xZ-obe0;V4i%i6KsP-SL|E1-6iDFLZDr!geo@mU3YS
                      zjPk85qHll-qiX+d1`1+o4{QCSY`$LiTuFJpBJh*?-puH?aJ+60*dRndqd#6Tqx<4C
                      z=u_9s8}c&C=?UA`Esg52-i+BvJ1YH17!QZ)8ujUSh0n(5Y@AM7`YQr*LAoJ7X3qo=
                      zgSi^zM+Cho8qBXwPpXzImv=_E%Bgx%{KnG08<7-ie72#WZE@C@aob7#cvE}Eb5uK2
                      zpB%N$Qy^r9?-a6WiCBp%=0b=OoT{CJ{WLQ6spKMQjI7P?%(ZU{)ED9XmUbkxS=#wc
                      z0_3NHSXkDT+5AS|8ffzpOIDr^e$8d?-?VRf5=eISbPv>X{${`gaDO}W!0bu5F6X9G
                      zUlB#isC+fVcJMM&u4UiZ7*^8t&h7nK$uw84$uifW6hy6|O`I~D|I$5)KYYHyf5_Rl
                      zKbz9vHJOl|->%Y~ZgfLdw@9<64qV?fDs1V{YvhsN4t2-Qsgd)>oEIoXnPM5fJ1XQ7
                      z|7Mob#@Do@@bw#;8QB?+g=r|-9G?b_tjKoX4+PXlt@@+`?g$r11OT#ETGQs+S_@yJ
                      z!J{OointjTq^Pzgg)uTdsRu%r0u#Z#;T-^6garC92gVJ(YMUHQm!ADRR!2T_fam}%-3AwM$P
                      z!rj@^Jw9To=%neG9y_TAwei|%9(E7*pL2hmT`S+JzyIL#1H>Bp^h_?WJ}alRy~MA=
                      zo_af6e}k4&y6Dj$N?JIyZ6&(0_6oYnGB<
                      z3&%2A{4H#A7R(}Srhj;Qmhg3ZE`^!%f&LbEoK#&WEI)b4RJ-pg=T3Uu`F*bum+}qm
                      zjoh5KvtHtn_@aK#>KE2-a5ymu^MNlwyD`y+eBetP_r~ozdScdn|E$JU(7l*#GUdQJ
                      zy_4y+iKm?RJJCMUZ;G2hxnYm6mM*oR%@=ozBm!VM%p$0?X%}%GBPP{9v-S!Q0-7
                      zHnBZ6HgtrC;NaPC8S_j%SLWw9w&x&e-ev6UAsM!%oYe=&n+`LU-ng05^pgxzc6Ma*
                      zZ)!BPx3PUwiwQyY>i!{Pc9hJ@7IXSe>y9ni1Y5JYGkj7G!o?
                      z?d3+&w*Zk|sjue72*}#)JJKGef381s0Peg$h~Ev<_Cg#~%aQ~=11Z9goTc>?krX9@Vdh0g
                      zcS#pxCu7itoCLWtva)r0^3QI!Ha$PVT0edw=J%8yGaxmOWef5%fg(DqM{t7kO#wTn
                      zH*umUclVE?T^+%Km}!sLY!i5`+;zJ^BLXFmnz5-ayJeN74tIxW7cg|rpJ;)JZf
                      zy}OX3MK1#k1&t4&@yjeP`8wW8Y(7dg1V`+Ix_*f%0?;$pBuG?)7*HZWKsZ&zOjxnE
                      zw;qHE=T6A3U*(^274}
                      z`&imSzq6TQ6FvLE@VQtaTg#ZqIn%(4=;XlMHK78?^$^?(SO&U~OL(s1?$%#zgq%FV
                      z%)QolaSyC_PYj^m9hk_XG{Zo)G;={PMFU8k=KCzCs2u7s6nvWQV*m7Z7Zh|8*9hFl
                      z`Lq5){MFF*wKuy-dh9K4Gl(T$syrZ$=s^Nc%s0rTe2xhN=vqMW2UotKyzvk{whQX8|qCxh!3NbbWibn4sRC
                      zuC;!!mHdY$RTZtIT?%c8#Pz~S(li%tl0FxzZx?NcvdE51Y1rgdB*Bk(MU^qSL#9$x
                      zV#w7cg++DJ3a>NKyY>+N0&2Z%L6YKcre>E6d!rWQjmew4xD;vXG2cuwE>2r^TbU`W
                      zg}Pfan$B6(7fN+u84oM^VPc6=IoE_3`7Dg3D@Q_F%=vgQD?@_~7}~!(DHan{$ThT4
                      z6H|f^HR^NeF|atCG)agxiyGHWJVJDnr1RvVPD|rAD*O5Tahu3XJB^aotZ+8j10Ihw
                      zqGDi+;dvZa*nsEt-=MRJe_{f*i|j>&KM4VB4gGUk90nxTK*BrG`%qdtGfC%GEOvN1Rgb{Cr@
                      zr+MhjE@3&6^;`zxLSg9fX6
                      z?hOQ{`qgaL?=ooO$lmD1kMG&c;4DxmeL`AR0(38FL|yfepc;MNR^b-$KU&;Ihf=hh?xo^TzaEaGEEL5frKhWsvRZ~l(HxdDYP`Yic7_sHbPu5
                      zXI{u)cTGB!xmHP*QL%tk3P)pqmH3!rKDkUzbu<&@D)9|&BH@Bvm6CX0mA8%+Nt=r=IpL(gYmIpzQwi^911xW6b&CR0O88mII3uRvWtI_L;<--2
                      zX8uP}N=v14KPqAxxJCutlzTQOCpfuoNm9&De-LuM2oyVb)<@w3D0=%0P!x3B<4xZB
                      zv_bISk(C*$lZy*W?UO$iI#XC&`i{|VaGhQmR%Xo%4}ytCf|a>H_2mWs)Fz9EdVHLx
                      z<1A60wz{o?X$a^xB5|dFaRj-VU1R`RjJ7U6pu;6EWUEP##WPW+OV{Qmir0q83DRI^
                      zNS0rjWsXC0$A5r8DksWHmtc{_;neugV-nh)M1}=MF0bdorlQy)%s}w#+C^3kRb56v
                      zS}V*^6*8eL)jQ+B(BK_z86u`nO;rLyg)%4BEvY(stcXi)f>v<+J5v<6TQ_i5i8!0m
                      zdz(DOSvMzP1?CmgTx|MO_GFoySP{qScoD~^AWt=8;9i2$$tF=QT=~qZQ=Z{Es}$jf2mk59`N#=6M5>(F%E*H`&2>|mLp-d<
                      z9vaKhA{O`%B$0>|DcOQb%_ZK)NpOzJW?=!UQ47s%d;2
                      zYu>lPTHZVBAIsY<&)v;0)m`>iUzBz?f;vCl%WMzJoBBhWv{#e9RbPE5$m9kzs0>?p
                      zhB?x^dev=N)d}+T{}V9&MPmAx?;xzzZ0e(9*2EM@?{AajHXxp5F>!s28KXxEYY^;0
                      zX9bfdR@NH|Yc0av%6Jdjt_z0SIu`+?bOEHe
                      zGAFNK!G2)zR8V$pGl0Kw4|8pkYwnqZF(c_U#gU;^lNLOkpckG__@saktwf-DYz1V}
                      zX}VE@HOd;gB}!uj#oeUEWNTZ*
                      ztbo6n68V1a(#YO;I4kFOpC;$f8hHvWOCTRfwNQr*!Kqq9v6I?9$!Jk}qrkQu!1`Ic
                      zaVPU@`Le~Vhy9~^&2PrcFKhd|v@8BI6xZt*`(0B0nC`C`!3hs8t2}adXGWTqyKsau
                      zoNGb`q}#sd%gexr?+-w*
                      zQ(s-*af%)%Cq=!CoBJA<&RTUwqg)o-wzdv;qBSK$m(kGLOwc>zY04&>+NQzIY(b;+
                      z6jz%Nt9^uId`-jMd#7Uy(f*}t1HOt@S)`ODO4)zP5So##p%-pRe0d@^>Vmm;$aHgg
                      zJXFlaOn*e4h<2S`(t0_DWLU+j1s;Tj6&Lc4C8r{@%jFb;h)(1A7pmYEx-$tBZPYP+f8Sm%ui+9Q`FSMIz_4bXk$PP~2j%VPGU{dGEmjLHg
                      zrT0dq<6Ca40MEroi!@aMjN9ClV7(>hz60m-C+oF$tB%$k!82`F(%6izeBkZ~JpXC9
                      z<-~~Mp*Vp9^yAtsRLC}=|E@0ad@`?6s_wLtw(^nP%}2{e-&MD}ce6A0h0-Jm!&)y~
                      zq678>*Xj^ms&1b{DSAgvhMYwadh`0?rBoi=iHA8PBJY9k`kV8ogEWkXG`t(oZ6}$%
                      z0i3~iVAfS&Y^*~B3loMds3%*=K#{Uh_%A$<-HEUPWx9!5VtlU=Qa-$!BHk9h?V^`&
                      z&=)N92}eRSS3W-1`}xg@Hq)+bVB2H9UjbvGuL@@n4o93H>{M=&jJW$7EAGhX$dK#c$etGMAI>s6@Ic++O_UcWYquMkyR1795c87}DTQxOkIx-5i7d&Mm>Wiq=
                      zC$HN^^pSJBO@%TNBbJlq!aF$oa`7I
                      zB}d2?Umsd%=bLYEdSJ9aM3Ddh`*C()dLc-~gw%d_-UJI{%+BvgOVUimaB-|h1Uwif|(*+!QcwO)oO%+w4Y5p5Qh*F;F%yn
                      zQPk>sv8l@^g1~WP{iFDmq@gl?L~{C#etWC-fUiN5NM);rA&6*^A$qV~7Q=LR!du5M
                      zt+~>mxbV7wpKqy@D_WQl9Q?suCR(D!jj_v4KOgwKl*jsleet9Imt2VaZt|c1ml0~~puaQCp*M3T6(>w};m?6@tGwcC|@`zzYV<(kn%KLu%F6*i}
                      zS%ld0pq3`X|9tBm&rZFiuXW~be4&-9886YztGm+wW=$Jp=PUc07xDhKAC{f|n`HFB
                      zYA$x4$fn7YItA;;06X48_@jrEK#`06vE+O?RHr7gIhLd^k{U8TPn;$o1v4p(@^v0$M(R(
                      zOS9&ib;crU@Bcm_E9+WAOD*;-)-uFSF8u;k^xWwCr^=rat-Tpp*_F*S|8B6ThLGD`
                      z&0-Kbb@T-YO{i4K6F=vCFklm#?Wy{?DC
                      z9c^2tN)Z6pg0x07=Y9zG^
                      zR){6XCxkzyIdRd!EvMf3k|HDImMZB?&(O)JV`lNM{BdYLlT>4yi(c>t58$AL_y&@=
                      z5n+UHU@bCpg>4if=a7tG(-+ku{jXqBg*u!
                      zsecy-j|PvlWBb1LOWX7}*I4D0iJHgDk))^q)YWtf+eazOL2%kZf_5#*{B>~^!{tp{
                      zubLFH)d8j=(0L$y$OnZi>w?q;t~M0aeVCSmBmu6#j*5yEIMtZ&F?f=;nI$QE*-Y_#BMPZ<0_-597$)ERZHk*6TFy8SY`{7$Y;Jx8qj*`yWIB&KixLd^pg)
                      zi1`!Cq%=XO#frnE43-tw*)bWe?=?tAAb6@ow)Pox+3
                      z?K6aW_J3T4~nd=Uo`85f&g1zdHQmxTo-C?VswGzmcs<)`{Y
                      z)f%O!eWdDz$Ytq}u#$`dqy*5gW+;s~*b91(4vM}zCPt1c=hG&dYqd_EE0^tEyKg3W
                      zm9>10dz`j>ws<)8Tc*c*?0m1pCW7|1J0?IMa&{n(d3z9<>Y&=){qIEiGSeB%Ut#4h
                      zV|F9>z1I4+f1zFv{W!Qm)pD(RM>F!^Dn>ush&G0${SanxfHGW3Y32L_m;U{SH~ohV
                      z)s>ro>1RTkoZ7iXO%!P+uziQwDq};}w(kaMqX9En^W(e&9_pH$o}6ZBpW;``aiOvR
                      zvP@Wb4G5y4qc{u1S<*(E2yUO(h_-lUz&mu6T)RPv-bG$68tJT_>DzWk0_J!Ruo?Ex
                      zSxwqn&6&y|vfVBTMoKi58Rvi@w}_KoAqca5Vt5GXvFadxJj%{&&1P84DjJAZuI;bX
                      zLr1_=GvP!|VQkYYHDM>GF5T$_(qh%l2U;HU`-g7D{bzy7`}FuXaK5&}KZ}6>zaX>!
                      zg#Saz()N&
                      z)W?8E3T(^6b0Ac0C-k{#XO35IzTCLjY4*I@3akfmD;6c@3JJp!4K2Or_hfd8SIcU3
                      z88LVfS_`S{XgWmfhIV^#2|XVO;26V*5Ez?L5JXObwD7xF8{K*qwgp2=P(Y$+cwQ@Nr0l~onCWJ
                      zfItVxb8#)ybJYc8&lq;9&vn0+k*quyGq?C?&Ohu}{|sg;JQT;xZQm^;Zgo;RUSj4#z4BxVWeTGUf8xfLNi;kL?ZeXmTHJgW-@_Uyj0+H%JD-
                      z%zG>!|9+%Gylu-lGD>6*8weMkVEVji@u)yEx
                      zkHBf@+6DdlUq`OP>|9_Ug4I?0uzF29=YW7>bh=*$GCwaTWaVp}FJ8_1^?Y`Ra(u-G
                      zZC{`7(_k|4c_l)`L0|e7A7bt1^nL>y<>d8fKbi<{WzYZdj3wyRH!p4Dndi4)=O?A{
                      z0cC~o>Ms!Q8zCk0BbY4Gj@Q%tggz6Kr@mVx{9g0VAw=&6e79x2wC;6EjV5GWMsuBg
                      z??Pwd6Qsbk4t5>XQXu>q@MR%jD}t4Q%?A-MLe+qrTGtTwvu?K76yH*pY5}elrRuUN8<2
                      z9!&b+`xD!ptLPE%ecV^dMu*5VhCh(;APk0T)ZWUF3JwrL3E<>S&o$}YXXh2
                      z+7qf_3Nr9zE9<*CLVlq(5WX5Ig}CE5j{hD@z7HdTZP_x(Fm
                      zOEFD@nAW$u3-Aj^Lx`SePT&HYkGL}{LK}-7g$nQ*ndP5Mv1|tW4(>6|+$#ea>R%_c
                      ziCHYd7}^YM@q=RghhuTc^<3px&X#cTFix-!NG}A}m>pEEWx~(a;O9wl-L&L|lj1anUDcnK8s0HFTKB(xfA+0ND>j8zN8_cM0^vdZ+YOwa+6W
                      zOXe)Qwml=qz|(3aB-%2qp;Q0FZ*~UM(A!M%ah9=XUEPm=FdXR9i-i1yUkXl#EF3kO
                      zty(YZBIyByyO_vg;_zT8+ckSV^25!gAg3OMn8^-{$^?wptGg;*6QYl|*f%i@cK!tz
                      zh~;%8^6s79CAijew_kSRupHt5bFs6g;TUq?bvZN3yKL;c5I+V7-!eM5&IecEu!z~yG;u_ikXr@yC7pv*LQ?+Oa`$hvqJ+>Mx@0kW&@6}
                      z;ED7MQ@!r$bmRpR^NGqe}^aFk*JjKCiD`^?VDT{>eh@&?lQ=p2*1Z%UYX7S*G
                      zIDTd}HnzmN7rwBs_g6si-S%yMl73P*<0xp*Q)m>Lar^@_CLd+n4^Ud2RLiSzkb6=z
                      z@KBhwFsArsail#CXhs8Fa$i2y6?l6uF8-Jt#X*7d$u7jeu^Y;vOcBoA)l-y1yxrBT
                      zdoAv&yFD(8%4hLu%k2PVi%^Z_8IvzjylcOEwDm_Qu`fz?z{hR+iEVde_MT_aw|~Fm
                      z^R?-i15)D+Dws}g0~Ej9bty4ZEeqBC)l=TG4xqwh52OCG!&HjSt27wbUwe0shGgt@
                      zL$s@1SZ*7!CEbpp|6-dpJUyz@yMA#YY4%me=U#tk-67CzhQsb{dr#W`9DKdcNEYH7
                      zjZ8@Y<>x+ju5}gHe8ri}a&D^;y9~wRv#F(=!;#})`Pb3DKM{SViFn+;hv3bM#lqlK
                      z*0^eob&W#J#_Lig=o4;+{0UfETdjW|f&w8?5K%rzF_rjF`%h5|Xso&VM(p=_pcfRT
                      zwQr%HODaYIjs(B~chOCGLpk8Nb1i^vq;yj$AiFT36g%Lc!>~?wZ~td7HgLmuiC_39
                      z9h$UQN}9_fbMe^2#YgVW_0zi>Var9-X=MZTTX^o3TEWkLkX}Whaykn$bVhASH^}J&
                      zBv&3X|1b$fsf1rhuO^1HYRQ3t@X{eE3DU$Mr`yM43%)-%=yz@fwm{EK^>5vLA+>d@6T2QK%RL3c3{s#!-__Q
                      zSlKVaUOxfuXmNKBTCzY~A%Qx&z;4nbj7gBAA`B>vwdNbF<*7|(w--frawL~@WW>FM
                      zVCk2ltOKl{LHrR6QufJI);?u^C3qYp(*y0vzKxeR`Bf{W-C7KDGlF~Bod_)lF>dnD
                      z^waJpmxUway8XC6h)Vg)xep9A6^TTUkq%s%?*0X@7GuZnyzWAJw=O-d=;jRP<=`4n
                      zE%TDKcQ-1R1^?W5kI(W@AGi&1nM&M9TY;bRKw#TH|M5h*gmtzzMK5?he{S|c|)^!FHhKU64$-0b=vUdAESzBcdj
                      zbPF{bGn2a*dIlFgf{R27eUYfttPN<>Hv8)CGBhDLU5_$gSOuj=y$vti9O=|I~qrC9I#5C
                      z!~5V+rs|S)>SKj3Hc8uIZ}=9F5nk}fUB*}p!ZA4KcLhFifFunol}e$jkCjBR=fd1j
                      z#m4%JSlOd#1~b!
                      zDuUR_GqC(gpYcbfn}=F~&k3&VbZ_2zL99rbGx=yK!D9C7zaWGrsJewnX1?Uj#K|5T
                      zow3wDqg_|ZA7)|jDCLTS!daQ~$oDrWsKYMQ&cDWj2Cbf{hmZ|xcjT^Dzxg0)NFi5#
                      z4l?EJW}P`j3=bU?en9B`>ggcDFEXw18*-A=fLmO5m&f}T+`tV=%Z3Z(a}a-d^#+?8
                      z_W~B$%zB;!e0P=0CKdsg4oXU2Bd3oSB-3>ll*?7#B6Rnj{Efd0dwwPyd#bF@)=yCk
                      zBRstG8uIDj*)o3)*Uk=hL9HJFoC+&vu-x2j*_y8Q7bv8JwL^^|#!qUF%t-vlBq%ld
                      zLEd(PS$q9EDoYyOnV^@%JNj?+k;=5Mi?>=B@1J;oQ@`KSNw18jV~xJ(^5M4{-<3eK
                      zM3riwCo|4OG9Z}FiMxwY-p8{Qj-Zl~)8mF`PiOdE{UT-&?i4*t$pUY++Xc+6E~iv;
                      zW``?JghhU<2Rbc{!r&NF<9H6e
                      z(>R-LI9zoB&#|^Al&rDGu8gCff93Jd3=pO~8AOCHRHAHbStHa6rn5>-IjGb$2
                      zlQOOVIM8{YBbf`5K#ZL7fjP+MT0C7B20^svs9B9y#;`TA83*WX(p{2wVmvroGx2&e
                      zjAp=OBSGqphT!$>zru)os7T`F%V*T;+P5Fj{xrEDS@TT|)b#mxl@dk#S6C#TCr5K%
                      zB{eP*SuTS%5@dC$hk52s3|eoGG#|u@EaoqSM_R@EF~~b}0tF3}Gqu^2a39Yq5ZE2tX
                      ztqAAWc0Nflh(N;aeE?SfnnZ=~(7%G^Cu$sFMyKZPgko(BsdC0llF2k}?;8yWtzZSV
                      z^VoX0;bXq9OjnNSR-!Xz$(-%_66F)H7U%#=#$o^<_fUA03C<$N`-
                      zYteW6EC>$7gZgCIFxVcRL7%=v5US@etBG`CgK5=+d|Pa7I){ZLJOxv}T*Mnf*3Y`M
                      z3Wz-6d6dbFotA{Zk?M}~bNC`nP`{!hAN(*idhG`@GBoi%kOww+A2k(g@#PLBwiP*s
                      zZ|S9b&$vz;`WO!PT=@`g_Ae_?EwH{my)*(X?$U*lD<5bjf(xIB4r@si#n4~*nFz4L
                      zXV0-hBzGCNk$X7K0b!he{J^ijxGE9f2IM3AR2Kg1{RkgI+Co
                      z3D`(Yx+B0RwG`QxAD74L&KJhNz1KOq#QgC3?zr4bTGseQu)W)-v_k#|Ya;Zu1E@EL
                      zqYM-F4ncp)=E?p%SxyZ#S0?rfzgZAxmQ%+vH5M}={zK%xixiNEgmX2XuQ>GkYL
                      z>W-mQWai`jW!10z_&fgydBSEB(|9pp&?PLHCIj3*hyO#y>_%o^@!=y=TK_k&>G&1l
                      zxVB77kXTj{)u0&aifVO3#O1&zQ!GhcgA#agFPp`zkrJ#A{zvy0Z?WZp5b9Hh8I+$2
                      z9Yld|eYnPsAh^Fo-Gzvs0_U3W6(*@9wlzzs$zS*8r83pR{=(AERoK7%-sp*}X_2PU
                      zuSXHPzdgW*$`FZNqU)k(I_Gl!{ZoSRYBjEfWy$^?qh(R%>F@qy8#!~h%`+aQGDDXK
                      zF$}r9w%X+410mTXK$V}@&dc*5*}P^J(x_51aal?G**2;lYhNb8KQ)1Rbq>sG2J!g)
                      z{Epq(bS5(}P!MAShDvvE_Y$AUH1}JmbXuwn#%XmALbA)YsrW%OC^U#ZJPNn{_sCdt
                      z3s6d7Z5jGoFbV1-Ny}?#FK46B@i3QBmQo<@tJhCYI)BWIsI4*4#4qs`{iPv)mChOZ
                      z?9+`C(YV$*S(cV*u)aou{WkqoT>c_;o30KaanQr2k}a$ak_D(_awG6TpC2%vS=!b>
                      zi(8m8)nvOWzpbBuxRVZyc-p{6F9Re|M7O^ga{&EcHYY{$=ZILZUw<~q1T+a@L@tfN
                      zJ>~8tq(VlFcJU>m3Hr;Qrd>HQq+w6#*N&btR
                      zt^WYhzYf<#FkT-W6^epxiMv03WPB=pl&&^%Kp-M;rB+&2ex%%eG;}(jQM8cH6S_7V
                      zvs_($F_@eF8s~OrW^|J8yijdoN}eA**IT^j^${-+7YE$;PzY3b%Xt#Rhybnr`UZS?
                      z2O>eM?*1=o-utVm?~4KiLN!zs>4c)7(nUIiE-2Czr5EYai_{Q82c;LK6N(530)hxA
                      z5URA0fHXm*_ZE5xA<6Ll%$oTJW`3AiE9>R0_14RK_ui9p_Bm(Y9ZF!?E<4W=W3)e{
                      zdrbz$CAb~}de$%|1~K9iNv_HpCZ>(jnUe$#?kILz5DDJPHrF=zA^p(@UzHd6byx&i
                      z=3Q-Fvw(BvnWKdu2xaGz-OO|?y<_{PW``i=gDqn%J{^}^3*|#)(;iV#1c2e>{T
                      zZmHj>DB2Y!@U)GuXP9s6FbXawQrdN^pln(AJ~h8%CvxUpGR3B(h!}rX?{R>k{(CTKSz%>UT34FX(yChhC(mZXOKJT4`g))%Gh{=O|`+Qe`VCK^VPdDy!5MLH>Y
                      zK&E}{a_7>;)&R_5nf1A9^rXVw!I2i2k!h)Bga=-vHxi=LAt>K0xgZ!Sh1Rh_7z|0c
                      zKYDE3)yMntVu1_v2f?VHr*1&4$Y8OJ-645cpN(a%*0s(!SmyqLrqMF(Y%6Z?`Gm&Y
                      zOzXTY1q8fEo}oOrd%(!+_vWK++C4>;duQyugauAp6bzJyTuik7{Qwe+m?y*B?F9ECspb2Nd(1n%>A
                      zFTsCRtSrO}DMZn>F3+c+_NG@z9w&yOe|kr|qQiPAJ%ZlX8yYy{Sb8G!9tUxfnlC6N`y{^yq`J$RdR_Ry{(|_k|qJZ&T5Mx9hh77xZQuQ
                      z*$2PD8M(h(tFU0S?&vL%%6NXha&2mQYIhl5@;Hf*ogFl5!@Rq5oQk=#(x)G@_F!Pj<<@cT
                      zIGyCU$`O^bEoI;)`$i!Z-61Bk-}y*?=8xR7qVz(g$N8<7$vw>DE7~znj8m^(%KXAV
                      zJ>pu7!8oj)Wcg5ccjc?;vl|~3stboUvK7Af?3IuC+bVgh8RAyE<>(o%lho3e3jIg9
                      zP98)`andYvKf=bQRF4?HC557^@@zxq!zDNp!s<&zJo0iv&1D
                      zm?rWr7WBZ+F^$FQmLVhP*d0z!cjyB1zlPIZO;H02AR`mLd|v-z8=#=J%lh6<^Nm)g
                      zfbuVp5B>raCp2^88Z}p|4V#`V8ukQQrt@qaDnWm`TO}gqUg%0=C_XxxJ7OVV3f!cT
                      z&%;YAwF}wuRcPPTn@Rlki(5A=9x=Aa->akf^2htD@ilPj9Urr+aXnZ#hP-7TaVRX7l;oniJlo?#+|GmnW0Cw(f_`F8`K
                      zT{4)?iRK#gm>Ooe32P_PT&#|mTOI<+c2u{ucf{@HBPR42(i^o?&I3D(y&fj`BZ^{Z
                      z_LL#LNH4%|IKGAPAt*95h72psPLmzK{Oig+d`h_MgDHO)JbGS-!IOBW-g>6JDxf=rkP-4S>R^P-LNPY9&FFT$KNyzV#e}wHfa$`)<@|JzhN;0b;
                      zhPe8b@}1@^7S$?VJc&tkx%@%Gj`nv%<*hm!2-(wa$W6S1bUN0~=qb+@1aS-tZZCt1
                      z{2OL}B()4)H=sy^2EXVI|NU3rdDoWj0aL}t0n)>VA?B{j>2CtL#}bgA@t-@uBx47T
                      z{TzA9l8b(bIUVjtT$i``rST){mZ+w^drAUW
                      zspgoljrr*{@Ac~M(;c|2
                      z{^~9DRZ@7sRFWO6dlkDM{E5`))zDv
                      zjLBy2cl2su_dA?(+tY5~ubQb#pcEf5X>pwqP>KuOqG;g>ET-l=olbqc@~{B*K)C*_
                      zl-c6llSh~{jpDJ!+v4q)J2=>W{`biT6%(g(Y!_ZieTkzqu8Usfc%G=0Pkn
                      zuAZ@zflU=Xt3)b;b!abX}WaiJj>tJb*!!fe)O0rSuZ8Wt%
                      z;^JI|uSB6<>DUxI()wxN`A&Dj-ZvV^$3m+dpHB1a2l;W)qSVG6iPNV>1^&v$?(MJc_jb!
                      z3E;sm1)9;K=Vib)U!a{Yk7fkAXT9`I!eq#8Ii{Xs5Wv?!;7@GMZr^3nb+`58M5DFx
                      zE0`p3)p`RTC!^g{v3gcPj~P)(Rk>b}nH0dS%6Y$0XGJp1u8EGLyQR
                      z?p~a5`oDE=T#j}`=W1?@bRH^=
                      z^Qt>iRGg@Hsphfca*yrHjekGhb9^|R9VO7j)T%K&qs)Di^BS)2*wlQ=WEHA6bS!??
                      zYG`2IkH@05cA$uglUY%+1SJ4*iF(=F
                      zd)WF}B5g(MdnLEC3RN;gOL*$Tc-vmUHiAKaUq!W+A#w36fJq&#nxDW+Pt2uR9er9<
                      zY4_}4NZgW>o@ssObYW*ugN9A<85g_7sZC0w`n@Erk9W~+wa=apV4sY2&IItUa(SG!
                      z^`Cca!{da?C?!z&Ma+!!ybfpj&=%&{ZU^i@uPeTP}y?Mtt
                      z2WCcfDan1?985BUgO+*USf9(kO5}TA8v9BqQ;3b0Rp_gd2
                      zayi{lhc6$lO9Vg2-G7JblJn${6eum~+MDEcj!WuTvXUH)1`EDA3%Ck2_OvqoWVdd!
                      zo1_l~+Dn}+rO4Nxv}JsyD0?ReiM-`-vGVY$PbE@}N*(+1i6Jf5R(R{+fwt4=MZ0(F
                      z0vty~_d8L{i~W1ReVa2T{`H+k;7uaEzTaBWjKP-vKbE7VvqkkX16pxVGq=L+RTiyR
                      z%GyVKRow?19YrMHFUZjfM@>FSZ^BP4(B@@&-)4&Inqpc_+q%CmPISgpG2T2dc1KPZ
                      z>io_XX=GPd-Dp~6XkXbiB>L@1@K@H5rtue6<7bcsa7d5aX}Hz(<>_OX$CT1VQ!UH9
                      zwWM*NBMt%Iq1D5|Dc*y6dm&O{}{Olg8^c^0Utv+>@au
                      zkK*RRi!D@BKZTwza9KCT&UtiG%LKFv?IV-+9U-gqLV4V
                      zOw!ntO7Jv~xC0zDF`l>`je;Kgw1<53-E4lwHw1#|X_R$Lpw_%6yQ|{la{+237pt+arv7f?PKnb2O2;0{$lZH;(j(xTTJQMtznESZp8I+IFVq;7
                      z8q!`3XDblUpkND*4%^Sl$j7tINPnHdN$HA@e4ls#!?Xr%jnVIdzCYgcOp!@5U`%x}#5`o~+OdFmCdB=V
                      zJ@D?_O=bWHYWBqc)@QL!r>BTQZN*YYJ;40kZE%G>Sh1~xsq0kNsCj+bx@4^Py1&c$
                      zm_9P$iL%fFd=I!kzWIa}>7HVDOjL}?d0$c`g|7U$311L|Xo+YrE9der>)CYSJo+
                      zs7XpcdQ(@0Ok}2U!A50eQ#X(+UHdtCd(`mW*$%-lahOZd88bIZp?V&8k=RYIY<~hla
                      zhK7NnHhwXQJw5{AP=bu+hcKVPVLdMOpOaisxR9Q~w$2R!xlrFb*CEfJG(*ID$&lr9
                      zu_M3#^#92+cnsg))70c@=l6Qa6gpZm)RQ6NB=yVrZv5xmuDkx}!(#)o7)^bM5ke(RQ`OssUJPpSI;XS_8)eN`Cm;RX+C@u^2Geei_JDi^{f47!Tb
                      zG{ZNMwCK7gBQu3?B|F{vSxUA@IUVrea{F+9Tpe1qXtnBC#M_2TDpP8m?*6u{pG-TedXg_Uz&^
                      zd5kOzMpNm0Iijqtn(NlI&wvQVsKhTZXpvBhx5nTCg!J+F*Z@oa;>?;GZ;>&M^rPqP
                      zr@O02hpqJMkB~KaWt+1a)aDBsm%H!8SbIYb9tHXtw~lj|uYPqXZf%;t?QE#d66hCC
                      zjWoC3U@qlLCop9(Vb+&OB{JJqdjCL}*-Pd|WkFqGO0b;hkE
                      zYBLtn4|#^cV|lz9t#`TUI2P~!tZ=jWK+sYuK4P`Uw6IEEoNir{14heAQ@j(Zm&@wA
                      z4>bq!@axm3o++|-=C$-+c>^)k{%*^wKRKoB6%pExWcHKvyhi{eShiK
                      zDAttJv7B4KWi=oe8p^!RJ`BD?O`ou3A{xmt@afqV_2fJn)=qFYufh6Qy}WJoV)1j@
                      zW`O#lnS;wQgozoLPbD7ER$MfSBw}C4!WB$owCX3mFK=awhN-C92Jc|)p#=tjt~#|L
                      zCDy`@un$HHZ13OQf!UOGvzXuvU5FwC9Irkd$Ze<;s1oeJWDe;Aurb#-wnrJVN6@
                      z?QX()(OOAwGOc~t=94GY4&i;0h2`iFxpf+*Q%oHxwP2+$H54fLtxzEmQtM9bs=hvr
                      zcyBIb&LL+&8h;^sxsQ9!u10itwAR(e5#9Ur=vgS#OYJ_pkfV*ED#AV+&h@B0_aUy$
                      zU5$8Enl%hR%7kC83ajD<|9^05{((fJAM}}%pMexfMs`pC|DuUfZ;RIdKc$HN@BaVM
                      zM5lvpnEoYTE84_DGDokBN<#xEMn`^ic$1XO@QFiG*2`qvL9!h?uR+HgD#i1ZMvqhU
                      z^|e303-Sqn(H!M9-UM+()0-}2&7OG@mqv$^0H^VeinP+^V)w6pwM0FE&fvRF@XMz;M*Se4VdUBN3L?Z%&V
                      zaS!Jtaz6XyiZ_DmaJ;X$hj~y2nL^^u+dei5aTz&a;~=aK;@}g$Kj7bxe5nW4HhPV-X{8e%0q8(R9XB
                      zvtysxwdc{V9BLhb>3(Gn)8wtu#ROtCe5~0h
                      zKYZ8z*mCFo5of8rfi>l)$q0otY4+FfdPZX6XiKV{!8w}(i6)7KG*SQS5O)_0(ocFN
                      z_VMWSo(!&NR`P*cPu?WiubKW-aYDbCeFJl3I>=xZX;H3^-xtHsH+bwVac7EwDKG=+)NoLxjG@rVVE)ldwSW>xWSrut$p%
                      zc3Nmg4Oc^n7}+4r`i}qs_YSS%76l3_2IhhnT+T1Wj&u!#8=8f~dclSVD&5gCXCT<2
                      zYTjwukuAFe?!u(QTL6dt3>2(pq~CsPtV_&(N1aAm6Jx$CXBDvQPz#=(u1^Vwh7xI7
                      znBv@sd+~yH?^F3nmvTT-OkYQk$nRGRAT%dC&5mL~smDWPqv|1nV7EuO^|f8a&T}{8
                      zY9QT+<2)!)lEJypB&TFcGC5bW2yMrJTtCj0wAI&K4CEA;h}zscOgO>=35vAqRpgRY
                      z@by|R+V>4?)8XX)+WtAarVfe<1&^P8A$MDuTf;{2>86ZTWT67*vnzZz0craX=-Mv
                      z)O}tqmgFR++%9gnfD%X@cN2K{me=k#f`uDzNZEf0D3RjD{2=KZ%3HM5bt$MNxsWO{
                      z@UM4aUEEXG+hhB1-lA@CqYt)8LsOOWc-CEL?-Hus5C+6Dx*wh~=P;2oD%;
                      zxgc<&42O0?9z;)6kBL0?c}daH;ptdC40LVB1lDVSUD+U{T`kHuX_aVgcRh;f8H*i5
                      zOfR0}%25bn4HcM%#@|3GhkunVZ{MX9{|%UDk6TngMch#RP4gzcwed#Mq;01eQ6Z^M
                      z|CQKlT0sP_hC&ld-XWdJl1^~unIWan<&BaonD2b!#uiQT7$`mHtQ|=>)Vh}b2qd4}
                      zX1L;l^r9Ec=Jk=;@-pUxw
                      zv6qBQM6}H!<7AizE-1V1oltDS(>AUqr6$_<8E}`Bq-cR9MZ6!xN#*7|Lar;{`^b1x
                      zM*WSGi2TkB3G%mR=9IMnz_WBY%dkC_>f^;2*m(uX+InS5MC
                      z1MD8&7iW0X*Gi6zUf>V?D57CGJ5KW(P;pP)ViR)TSf#C
                      zsJEYZA5Al%_PPo%tB9z%aeyLPnE5sDg2aPC(oF`|Lb?rBkbj55Nz?Ydo#m;RtJyCg
                      z!XEFz(#f4%_KrptnFW9!m9uQXT8ZK&TW=+7*-y?0*_GlfzZUrO4E3)ahqvMw0vd_C|0O>
                      zf8qtqS-G}7K0fWhFrnk>=1DmSwG(iEM2cywON3{PwjlAhacdOJubtJy55_3YacB7358$s0BQy1{wGS2j;9*t(DB2vN-+%
                      zWTvKZXX_IZY4}NlCK_#?l4cQ)(>kcE%2szt?>z^A(tKs3vEMd{ALb8$l>?
                      zqUBAM2u=9*oC}Y#!QnYflNdd|#J-FB+gEYb?&{uw!+PR5W23prmPi&bZC#(zyp;l+3T}cPPG1)0S7+UW5!g
                      z^@;Q-G
                      znpi~qLvV$x^5c@gq{uF?bnegS4Tzvmn-T?$QjhW+)vvRh=SRyVf?gr;pU+=%=PV_8hR=hnw|V0i&~F=j
                      zBFi?oL=wlr)Kw6MFjy)Fyq&k%SwLVTX6S9jb7f)^D5nzI3BSzNV@QfMM=9`u4@?Xx
                      z|B%+Dju6!V_eBx*)&AK-C;MB>!)8n(n=Bh+T&s=LetBJa!!wd!(z9`^mxj(_ezuwO
                      z^|IVcFaxN3;{btMAl1f)E+CrIj`W)XMIG7&DBJ{eyka{guOm`XROXMCeO
                      zp$0L_Pk1)feSIooLS3rKE*u!D;RX|LQvKNxv@cvnU2spP*m?3W)b<4C1#LM=J;X7{
                      zE13ayNx_eww{ThX*es-kL`X*{m=x~Q;ioaoh$$v1RMdG7{MC5%eP=dpP+229xYG=5
                      z(w5dFnaY{gbD5d_ACzeRLt4vZzQ01>Qm8I2ZN!6&BRDhG$oUV-NSCC4*@&p28Vrqi
                      z48Lp6r{(Rb%#EHcVOvEq*sw<|zAch842bnjYa7q!@+H7X
                      zW8MemcjxKsxukM6?u2ZlG^}!~iOG-ebiN{*D!@(=GNuj1rhs*dDP)F_&vbKSV=d2d
                      zL=D}WNXS0K%mva_3i?*d5QTpuD*fu64fY0)(Uj;HyulhbitLb_>LhCBYWhPiRXjOnu^#3+njM6fgL>lY;)rQ?-2q0Y=9(rq{`ft*=|>~
                      zMZV(W!am{Tz|^$J4Dxnj@UUa3c}=62GCTR{+WG{8!@Bu$b
                      z@u+XZVrD^Kif^@*2DM02kKqMbTCaW*#H=_KP0*2KGVA~Om0BLi80aK)PCXSkrByZ2
                      znQcK+^WKwKLtcHQ*R1G0avfDgXf4H0!2B@J0LwMeW?%>$T<;ccZ6Z;lCoxKPX1`7z
                      zs^0XaaD$5R&7?cUwjZd{60kI9$6HKYnf*GHQC>p23Y!7g2)600j{GmQBBb86jrafi
                      zn2nIR^=Ky8tbsAiTfl`3A2VyqIx;C^r<^}TL~CW)@EH}=qS>hTQ#C(^aZ{L53w9Ej
                      z3ig4=_8|6tNVohf&oBNdvYoC!eYy38iuJLf^~p1KO*O2EAP;?2T?u(OuOxy+02%YS
                      zo}7CuVun&BVz{W;i6_Uxu0i%QaGNjBlIv5A@U1a6QEz$|I^*B(LW)(6$r?M;_h*5M
                      z8@Y5C#^~o~jm^9Vx>JB0D#!N3CQ${oK6Aj5!j;V^T-t&L=~YuMQ!ltkTcH@!wefqi
                      zfFA{^W1SxMw*-12!fda$HP?n82jd+n@UNBUKQL(CAq1Wu@wFjvH%d1y_=Y&R%h{?g
                      zlKVAPt}<`dv44feeZ0xfs>^l|YH#$pOupc`$5_Q!tmnATE`^K|2b_4_)usqBBn4!Q
                      zbQ@HAy~bjK42-Ix5=oVgY+4py+hLQ7YK-!afLAeIA%}WugD~KRoLlE!$rWtdpl9#m
                      zP?I={(5)!}v4@R;aV|Q3vp=-257ZC~rf#cFRpZ
                      zoxA0bqPNE=lKf=P;q2eb`(nZzew!;$3NzXgrPYdBt-#RO<9Eb{4LL@2d`q
                      zn#IaY?4O-@A${@(|NfXVx`R9c=4prt$upUNT~yuqJ_zz*{Rbg|`n^E69{IF9CG>!<%mI7RmO_68*cs0ZuX>EJhh|8r>>;aDf_M1RB
                      zZw@k@H)<#*>MC>Z-{;N7fbJSVwgO+?`>Q{2KTH9K&?gQSs>4NhBGcJ8F2kKSWv*{Q
                      zg$s00Z#S)uRBctKF8$+vAw}KPsGDxH%I@f>aOkv`Pd&IHpG~dtZ!w6(g+D+B`50u7
                      z8Yk8Pt1c2Miz$H#d;4UTM_ewEni9n?p8?ioA~P3^&}7-Xqu2MHybr&j7oDf=#Lu(N
                      zW9HM)z)HH4cNuhL!+8Q7?>XzgsMJ6UH&uT0yg%;AHjkF0>1x&EskFNl*2gI+6mluD
                      z1Pi@FXV*wmf^}FiKWF3qJHs5vp<1yW$8KoR^zptjlN&jFSkw&3Aql@5rJw9GqTpi=
                      ztgUI<;w=6(RI`TNyPSvnM=1J~OKhk~xOK`+L>Ty_2B=*c(d1YnCRC~`soVhWcCDs>
                      z&n+Aim%ny>-N7){~e3oZW2`CqJkrGA3bC?ItNf;iof>D6(f&lMGPZkV!XfIZM;@XZmeev&
                      zomEL4n>5>`I{Ns&T`wyhij`SAlME47XC_m}+v|b|kSX3FT&I+zO-E$A-p4s)Jv6=M
                      zUbon`w4;ekW-S~w1eio}>E!
                      zkRon3MrUXZd;0=ylR6}7_PFMEnguh1(c}b0e!#)Ih1Y2_ksRI7r=Sog%H`%bKSrhq
                      zk&Vq<^yFhyL>W)+q&&9yIR^V1k8%5g-coco1GxVU#zS8o;iA@ka%q;2Ii>M(k8;|S
                      zsPv7j|4<%k_`yYFMrjXY8BSaI^Fxe0mt96Jb$>C}Rf$Ui=Qe>@ane)+e?mKN;`YF8
                      zXZEosg=c{Od3FNKm#@Y$+RlnILK4ywa+jC`#os?g%VelN$OtpEAvG=t){_m*t)
                      z;gp{vwdiSEL=EsyY_i?DOebVYJy^Uw+{>Yk1RMl6!yJY5(B&PrI#P=HNG<*+yuOGo#5y
                      z$CaJ@Yp@Z#9BvJ>cMvfI3=}rzDWoaiS7;!4p0yy)KWpnVk9bq~i@OUnr}rav8FKW}
                      zNasg!lG#U1)xE&)5kKQY>{J65gXIW#2d8M}dt7m@A@AmodFzTq%!OvGZpXrQw#nF6
                      z%eUvrDl4K(ipHx|KDq$Qx1e1OkCwL(+4x>8q{#3aBFn6Qqx!_SPfuRLj4iI<`S9e%
                      zjMa?JkQK*IrJG;52yLQ)8M(U?az3encHZBkznsFuVL?E*K%gPO(VOX1&C^l;@;A4e
                      zzFy0n5tixc92rfISHNDjG|LM>ez@9K@vH)%g_gwKjreRijey5DdZ(Hrn&!vJ?jSP3
                      zqlzTKrexE*yB`3unI1$qlyB=KV?EPRFLPxD15R8h-T@3pF7iHMq>TsUGl$A3jD&kzgIWpwbPW%(dYVb<0;jiVU6gF^lgKA=ucoM0JlS>)H!&kn8`*W{C
                      zP7kTB{ZDpH~xp->sY)^5Yr#UXSe-D^1p-GM7u+%WP)%LDEaGtscr8
                      z@M=9$-v5=nCEPL{+PD9AuzvrrQT()=hM9dMB!PT2;Ok(nv#W<#7%FZyaYnMFI1w$4Dr!Sf&1B$;lMd`u#tY-Bp
                      z@x$i}?{FR3HC&0wkTHQ>%~2mky@%3
                      zW?TlmI}zZ{66(sy2HOI7Q?9wcob<+wO+9)XJHLpCpXp^tL=z-@UAhAOsa(yS-&ju<>
                      z(3Gv2=D4`;!F*JpH(W
                      zvJVgMw>){c$mV^^h{hzWuvw_`154uhLSiLX0gv-7LLld|;iJvG=QT0`DK@)WIuZch
                      z;wg;#%IS}D;=eC9TvxVKp;6}=gOsSx>prlOy0VU+K!sx`xKX%grLsnF_6Bg(f_y4&
                      zm%-d1`41Ai|H1v&COK13QCU$6kzzU;@#V~>TkW28zUOGeH4WB8U)6QxvQI=%gu8!
                      zPU}YBKO31ND&t(|S57MT-xXGdmIRTc9;7T*zBu-QLsJb9by(ZiDnqfo
                      zuGYe4?(P!04QZ_u?B(A+Cd$IxB7QBL+D^SS12xp{{06q%K?V-z9KKtfl{~W2#h4mJ
                      zHyQOn+9HmNb8I4vb{wfC9qNDW7VfdA{^gOnV9teopOgMYl-xj=gQ>oc&0w;3C;LC?Z2w1=&d?R;Z0CA2JnU-p71?kVz>SvuevxH
                      zaRYg_k2nez-PQ90ry*8)n|)w=6fU+(P;oUZsYr|DeO4UU^tguR_Efx+K?2;eujoTk
                      z^S6?U(~zr7pHymbv6;YlbBw8W6>a(q@FaiB!f)+Imcu{0B8)ahI)|Vd$sr^5Uns|)
                      zTD9;ypTysrCk`k@ZxIIc%|TN!#h^Kt9);$uzeD}f{pqUipQgx0UdQkn5;7L?OhmaW
                      z<^%?J)Qc;jIw1?WOuC0;yX=r)iVdh$McN{!H(Uy#e&Q`7wwJ;!)9r}rQ@D-Vw%W0T
                      zg-v%`OBS#9Yn9X;<+Jd8mt6vSanJ}odV8wWO^7^Tvk{~QaNc~+0CCI
                      zP1p3Zfz}Bi6IO-K1F;#$i+%{o!yar7Rnax-%`$(T+A0v$sbb$xc=ygzZ>VZV#9Tvv
                      zSsz`yt&S0?tX%m4Q>8wgnAyHlEH;rv&QIR^88bqO^N>rEg;XdLc+OS1a`mhNa{O$l
                      zG>M6@@P3r^Z(ek?sXkJ%T0IYc%GC_vA
                      z)>K;+JJUnf5sa&FoW`ya)L{9!We8W-Tr9>
                      z?|>EGe)3fjG&n9u%u~K!2~_-Hhx6cJ1kuoQ#ka5)01a3BQf_PY1k*ycKI{>iQg!md
                      zp_2Sc8})?qgbdYTuo}x*-~I&^Sqe}jc|X}iOhsvtFj-AxZX~y}lLsh*(*&O446-j=
                      zKmfV#7w*E24|OKUrnID7dhFe<3VF}uCe$xR1Sbj_7o-6vE+`(r@nC!i3A8s|{Q=Tw
                      zzMp;&bxGad9U=-Lzi6b^0>q7R(I4+u@n7nEf?%Hoi-6V6qQxGcLlr>ZK7?Ubjo;Wo
                      zmvPib2<|{9DQU{%mA|d^yiccO>dt?b{`lK5P2%Cd?eyWRtJWr?2<0{O1R%
                      z&jaOGwcFWXVBk;|-ZA+jY8aXor_r9JGLEE@_!WEs%7W}T9W+Us%i-qdRrkn=qnFmJ
                      zVO**Bg!W!9@Ivu){G8c6D-@TK38h>{MWasBu9D(7uy$_v*pUt8>@4l9o-MPu?^!k-
                      zal+Zjn@i{Ci198>@fMbSK0e(*{m#9|+5&jkC&Qdi;;5N3T)OoDfXt-lYwB9L?;O!|
                      z@~+`m%Q3KW99fvXI-gFkTi}d2Z%qF$D*^GF9yWzqn@(->L=)#93-?ci&WMOi>$mZK
                      z!BnqH3U9d!m)4{&I-dOxlV=a$qx5?j{latlReHS`${CNa9tJfm(jvdi0FS^fT{mMe
                      zDQc%9uL@8sUwf|7QCAvBenGQmc}R1!Ol*5Q-Pp~2-i!0((zOD@ofDY*
                      zc8|?7HlbG8L5PRC{-0&i@gFQz0imxZQah|83aw`@?bl&`#$9yDiHhYl!a99%H~O!k
                      zlLt?J+uqhXACCT9bpp5{50s}F+QQ%e<;$CNat;H7yI^raObjX{Q(@=!0|deQ5@NJX
                      zYulg8eCDRsr}s*lDd&-_K!Gp@M6a_N28uC+#vd%zRw~YN7`NJXe*eB&Xb$t%1A9^U
                      zLmW!!;LW2OZwmuf5m}esuCx$ssF~h&SDtOWq7m2k)h-He1|uYCl{xj}^+mj{TrMQJJJ4qYfpD
                      zuX{TfKn}b?gb99CDZwhqY`_*%IgR$o{SeO~j8`V`QbJp_TlwHF>(~A=(gEun)K5%DulGzwXR^b&a(!%eR{5)GC7nN6KylWO4t3P=0B-(bKCi9@
                      zcXN8$=hh&n57b)t2}){z5n|{^U9dwN5DPxQ78zl|Pl<&CEGpG11e-jwx)JPI_%QDQ
                      z+v_U`)n@h0uArl$^xaVVw+HR`4XvY7Mfhs?VW@$La%Uvs6cHS8LwSG09jDwjQXQFq
                      z}DC6jfDZA>A+BCbBU%j|d(J+w0!yOjO{mr-m;Sl+K0!?qk+&GwsN;<&=`aF+%f9cj8QouK7K6fVTvoNxBTtMs+oY8f)6)Y8U4|7>oPOjBX
                      z3^7iP1fo*QkT)t2F^cH9knbWBryc*Ni|9}{sLd>MD0<{h`aY-xtHydGAJ2h2^P0g2
                      zaYdb3_I|RILpBsxuMkuiB+d1k?cjF{^5*wh;VdX7DV2poK1?jgDdShr3SS|5|aO
                      zI7385xK^8t4`pC*2Uf4d=Ix7T`-YL}otf9J{pLqKamKyf&
                      zv5&u~R9!P^i)!_U?I6y8PY+G8q5r9Zyc^L0F5ooM-xpcCNG&fykTPLa6+M@2K;@!4
                      zDEF4_`^Zi2gnA)?^!8PlNa>Q(59%7zR-Y?I&U@o}Lu@=WhJ(P~-kBmX0DG=A;2A~}
                      zVq-b3`C9+TaDRHhVX8~h=6Hw!rdS&ZxY0u@J(!G~jIVbB867L^1tJOyw0d6uH1Zol>;N
                      z0D-ymGB)?)+rJpK=g)aLep*0vEIjh~vNqW%1fJJ`BQ%xO1zVKzzZ&ET{F-z9QsFW;
                      zc74D0!~De<<2EV%C6dguIDCg}!$f#J!e(&2JDv#y4m&?s>iPfdNk2)22wFwy{&bqd
                      zY?6^NPXFJ;%EJ`q|CflBg~{pM_vmAJ5^nhNG4{TdXQo-!;vTTs+6GVmba||XMib5I
                      z+}vD#zGl8oI~rY-o!w<8$xcrl{eOKes$O24?yPN~;jpk}MeOH|W&iRTGN*HF7s+@F
                      z_l_tXcD4O)ZM?$pzsnE8a7SwkXz>mx{!9r|FXu#gg4cO8f&W(YzR2(tK_NRvtUa?m
                      zHNFUZ|0#2NZvj_mZE{qzN@>m6Zc{#7>$2Ad0sFXZREO^Dg4Wy@0$RU$LwNI;La06y
                      z>q4APQ}A$A7!eEE6#Gp$KU~4K2gm)WlmKcew)1XDYY~ftjuP5h*_^6vblIj)L$-@w
                      z3rZO3@SKERCZj)-`WNbK5ybHQYl?V(eW$S_LH#VWv^iW*1^WR1lis-KFKvGR!f5WN
                      zx0obLD}NPj&cb8)Z%}RUM;*3-sx6cK^J3s^!w}E33Fxzn82k`AO}s#|)?C6~I!}?d
                      zV1;dwNaD74<@1+8yWF8Kp=099(GsKJ%J4|#mwtgi)WAdhs#w++g#=t0dU%0@gpp!v
                      z=_76`UkIM=ua*!D)|z9^Q7Lln3_EyKdayyO6cp8cCUy2g-?v|nlv_D`B8Y1(
                      zq3`*17Pp^f$h7sehjwG+!JBT#*X
                      z<(9YyHQgZw!ZuIhMNu5UDan_Zqa
                      zz<=)-fVJ#6YqYTxJVu;+K1qy#J>tJpVX|kP#TJ)XfKtY6GwM#3zO!p|4F*~ow(|4DanVLjw7S9j15e1Xl`mb#rx;93Z%sYyb{vN%-
                      zSeLg#yY_8w!z1CiWJZForEdnpoO4}<^Z1W${@K*wK&CYW+!1Sh{-Fe+mAlNr}?EEG|?X*rAM=*(oLCmB37`)16`q#N1jTi0
                      zDd?ONA?lh`9b0x3GO4J_weFq0Lj4t!)g!8QlHmh}X&ctW_kwZjP1O5V9tUFS1WQR{
                      zlf(C54Y2d3T%Rbj^F(9<^{p?H={XB$_-_-6@;a0wyQK(HuMFKhS;{rXqe@>nX7n$s
                      zM;e-=_o)IYuDmmzEOGTPVCe2B_3U6XIcmHDz;DbQz)!>70dmQ|`W|}>JVWSN#7_8vvs8{jx^L
                      z7E@-KB*6TAR|3=q^NU`q^1LfXh?d_Yv7m?1og#}K6t)-Q@VyVB)c#Q(otY6gkdx65
                      z%bdgxvZkgyX>yHAtyrV8-{gg~mvm{DFP87s;A{47V<+E0x1{PBd#GOu9GQ12-&K63
                      z9vvJwh>1okhRlR94un^k_1^O1bsf*p;JJMa`I6EQNLRHT7jyb89GS@U9Wbvrty`d+
                      zMP1xHI+D+cuCo{ZbqsmT0~LHlUEjG`3^uAcKJaZd?2>Exf97;bc->*hmGQafj=2U2TjxL+wCHN@?#qj7w|9Q9~)a}VkXDx(4HJwjg-
                      z-aYFoE)+%J=eJnqbILnK1O(L`pcaFCO_z@`0;#?A3d2F+Mm6rZ(q3|k3{RrohYNsK
                      zHVq^q+TNb6GZ$9f8S-4}Y5~;6Ia&m;w*)jX1Fr6}@pNhdP^E}n1Fcud=bNbP%ZT!R#{p#}?MXe=uf-IrdeFl?|>m
                      z4Ne1j@W%$QH{8~3r=N$B+(0riUjb|;KY!l@L7eO#EW-uzA3C^GJx*5_bjMjP;hh
                      zp}0xYLt5XWPRW;Jh??ezti|Y68Ymh)*((;WMVXq9R?@iIwzDv}&z
                      zwx4KvS8qT3R?_FV@9ry>c1GvgBizT|K?14pIb!WKy5ODV2LSCu;IIrSP
                      z8u8N@VqJ?5`_Q24ooDTi-OlM6c)^hmI`4sGd}o`QTi*Os3d)w71vBx*y9Z3o1iN{W
                      zFDmy1?M5E7VV_iGl)W}Lq2}7LZ_{?kqr)&cW@W^EW{0s7!knQMHgdkN3IZ7LC=>^puH>W>*T9mzLgl{k$#1
                      zgp?T62M&$-2LXfc2lI%K;(&^vtco>9CWG%Yi&&rg-gU4;P;^-q3_v6H*trS_UP7E5ia6(6iNsbPsWDI
                      zVGQh=o7A39h86q4CF>)G;6bzRKzabjWM
                      z-lQJz1ovo3NJ-6KKo#yZf@AQl{M#Y+(d+-OJi@XgK#}cKwfr~DD(lmVK!g5*-at-EI@GG2y
                      z1WpDNYGqrf$+Kozjhq#Dk?UcSxdiS5AY37_fIw+k5c)leZO72wV>v^g8TwfOjlM&U
                      z=`zHYW(1yXek@adB6eCLbcOrSpYl0XmkHq{A=Q;wPd0rih$#l{`h)&K&3}yC-+W?0
                      zFtIJVXGqLT_zBwq6!Pm!iM`ZE+wKNg^CMqbgav(Tq&{*Be#5j{fkIC8y8;yfA1l(>8aJRiS`ue1UMn=m1~|>k
                      zaa#?-JiqYY7Xn6u_*D8V=5Y`jR6DF%;s+n=xFlMkQj0(F;Q@8AQfav2Zwp@I7N!>N
                      zBlH`kV>fxZ^0G-G)0Xnd*3=9r1VT}g$h0i>r{B;l`QfYvzc)~rD4t#14=KNq7|S_g
                      zwCCb2Wf|^MVUTXVs}oxEqLUwAzY^=1G4+kZvCmkRh8*Dw>e+4#c+n9?;?wL~E>)y(
                      z-rLTo78yfB^1q0JRQwbX=_iwan#Z~CU~Vui
                      zhUE4ZlOoG(hCQLSc(ylLm^__OPeJm>r3+83$Fm*IV1n;n1X!!pEPbS9hN)T|vm@VE
                      zNkIR}jleAHDhn@j7i1+4UONH$+iLGga!I5(fOxiivQ%lt@iAfDs
                      zQox9&kA^*Om(87(4>Z>T0pn$Sie8+JFl
                      zgBiOM*aah_5#haP-l)lNn#FMB+f}K5T2y*{@bTwNw9ipFxj)PQFU5V|{l7g@Fn)ft8FfLbxMRGx_>V2%OBf6%Y6_DLseq${ij7-
                      zYk&hX3Wtc)1k`JfI3l9cCWeHo+Xg{|zxiT;V7S3o>SSE7sZspAjx@<%NR?IBRv`L=
                      zj=*u2PMf1GV3NUs{_8R};13t^X35kbYJ*h5rFXzZpZUt=c&@gNeivPZkzgZr!wr*)
                      zhl7MkV3g~lJD&Z;_ej^fP%?cJAzUUAlFuyL0(#ZSn?4vD+y^mk$y#@2kY)bLJio3(
                      zpvoP?Yv`(c=9H%acLhH)MLIck0baf-A+&s#z-5YfdfcMHB-TQ%-OKzWbEpj{l-UZy
                      zIh$r8r##?Ty?x~2ieu7F=Qe7T+>AH{9oE<#dPAs1PIPpix47ylNdFPJ;*v-N*X*af
                      zS&pZB1~fg|1l$apl!caQy8m*{4$#c=^c8EnxQuBli2|nG$&ts>N(uvp_eI5?Y@5sc
                      z_gqF?Rv}W8EWeZUfTbXPjth5Gq~SK_S94|=7xAiNhV@vHH0^s8wUEkhs7)0tp(Lci
                      zMIA^~D$OS|14WGXsLNfbaDx%_
                      zCEg7wZEZM4(PvSIbJMt$nv?dFbL~{v8O>0THuO!`vFd%Q{tZk8Wh#P_XKAKoOmfX>*>Wiy8|Jld&YynNbf$d*Fb!}{@t01yHi?H=EK9M%f$273yC
                      z>!$M&jG#{6>->41i+kc&={)>g#jL_{CRRIRA}APsF;zlH0zs)3=ZIow%#SW=I`@d4
                      zL~g3D4LDlwlmH^}MOh`qb?Vx3x-Kt_z8EoW9X0k!RWbg?HWDwD=3OP&wXi9^j8JAJO`rHs
                      zb1-4?+GgTY=?F}j9G$>rhyp$GpwBBfccxdAY9cS8=hK!*%*v(HGp}a>hI1P{7jObE
                      z@N)BP)m61w2gJo*C%V)+z%JuSgUuT^0gO9b4g@w{?RiL_wC-3J5B|jMSw~xSWY_oA
                      zC;HuOv!?nHvC0DzU7^bo&)M~r#vni)Yu7n~KRsIO#&WHvMMB1g)~GZxmYd!ip?;G_
                      zS1`VEQ({6#d$D!&6zG5E<-{h2is!hWVZ#qbtVLNOZDkEcl`_(zyb?9F7u&Y7#`7gg
                      zLR4OnxH-sZ8zE*mZQwrSIkLH(akk;dKZ`o>czMdx`B=4k@a-V~CV|IAS_*X=*srK?
                      zuwDx{zB(D+;tyxyo^U-0Y1uUNfw0T
                      zgnrp5v=H}eo|}z>q3<#Ok=XZ4*RV1|mhQsY6$fx|VIzk*Jy67t?22Lhsa_8ndyxP~
                      zLRBh0(X;nD3mM_8=8A-2a3_dL|4#k3Ah@)!n(#>#B?4rED)dYa1
                      zYOK7VX%l&E_&KF2y}RT*y}`5ZBuAsWREw$jEQelJ-l(Yd9R9CzI&~RiHN`R3oMB4_
                      zJ`&ohlHe9fCYZpVhO@gEe|owCo;vXPfT!QR0+@{#EvACM01mRU_tr@(TZw;|m4F!A
                      z%>q9od+>q#fxj%w1&mQMZrvFo+*C*-VtJtw!HjI=KjtcWJfb5$!>t)U_I6Y}_e4E{
                      zQ2{zZepjcg1)N4x$5*1Ji9N`SmtF+-ucalQBDQ#l=KSNhbstldx`{`3kbQ*3fC)?!
                      z^R=UID91zI|KlU2=0L{jy~g;`Z^~#VA_-RMX1bFC0?PssX{=g4Bk_!PXGku!M@m?7
                      zyzc-53-e?-9@PTJO}1xkkIq6&b%hS3SxcVe6a+Nr!_q7Rx&;+FAYuq2P2dD08IXdS
                      zZDgrKnD$jPaF7`TWY`15JuD-g!DSD`jkHk%c3ypVhR+Q6;S9I}qt|6I(hsn%(Bri2
                      z!wQkvJ-~;6m#2m*Y)4p}U62bJK+yvUnk!h*XRHhc%trjlilt#n9^EJna)7h$#a%&lNiF(h*kT-*j8$Yl{1iD9%=xeEIvxj9Q{r+e`P}&lw*M<{?nr@Q61XnfC?SNrZWJm1nyZ
                      zBn6oO?o!@2Hgb}I=)X~SW~<*H-WYE^17a3ObXtfpPFqq3S$QBX*L;D!G3Jtr?K#Cb
                      z7aaLYwNdIke4CODhz>I~F~4q>#-UJUpY)hdFPcwv)%ZJtqV~D+
                      z&vy@1#&2fze(^U(#?)*;#@Y&toD{ejkB6pD0iBlzLt9SSvXv$7=m{fyeM>*hgon=GY-1+#bkwbn;~oRTH$
                      zLavF@)Ftq?4&8z0OjIfVGLqDQwNi7S+
                      zL;h#_=ueE)sAFRd1MsE#P|XywYr$YpC56MS3KJny7pW{TDD@^LjEYx*&&hO~;64N@
                      zyk8!@?)Q6fN>9xjA~SOPNkw7Y4~zTj@3d+PRdS7Q5*;)9WiIgP
                      z6>>fO!m%iTw8(qcbU@q&f&I2X=tCGIH^~K@Wfw*#`f`RQ&XSrupHXQIN;C1ftytnV
                      zSA*XQG}wVlR|o_GoS=2nBD;^`^);dRqs@0h?|qbrxM*G^DjZz!xDsW~kF@!E4LVnH
                      zoME^yL<1SVgIAzr*`2vt8+C{UXNU3<{YyS5;c7v@FmG1w2*bc
                      zRE2NxVc8o4TBMaJDO{l)ZO{ou1te9Zan|QF9H3g3N_{mGi`(lSz?N$XXGV%+^w
                      z2lCxRnf{%RQW;h!JyS#BZfPfxZg~w)Y!Ics>TT6d1A7|1UHKb2M+=9j9VSZ|v^VAN
                      z7kyeXSMzkTI09#iLD8{VQD=JblOhQMW__h&9@1Z3w2mF@p@yjX9Kyt3E
                      z=5S40sw(fkqQY=31%5;AVMB~%;LMcS+VqZmk{Y(Nr2Uk*{0f}{?D%;yhn2H}xv=9@2T1=|P%Q`!Z@Q
                      zIcA>oyB9f2M|bVuCeOz-AY@4m@uE5~U@U015N(!Op4;O<_)%IxBnXU+EhBYg68HhU
                      zy@;;?xS;W2Ix?Yuo?4V?TeMz1ynS%1K7wux#!BSv>C_zrcK`X
                      zcG;ub6@j8dvAxRDhMNXzQY2EuMdC=Kpu=T_=;*
                      z8}%8lSY<1#MHtWj7vk9cFCorA&zqNaTi4lbEZ(-Uc&lph*1vCptDirAGjvG!w9$CM
                      z&bI}RwI%KNukSsBPZ%LWse-hq$FucWfFDBaN?ukYE@pq74Yo$O)Td@-7Tp;rIfk4s
                      zyr%+###U8MIVT1gSmRP6G2bLsBuSK#AdMM?K2$C{P7dR;_8b91Si$fiMzn0%9m5bF
                      z0(esZG%UY^qEoxa3LHcLe2~O4L^8DDS4@mqOoAs|7%f7$hczhiJ0S;4MY0m
                      z1{s$k;eIcIywk6UiLRV+@dfAQhb
                      z@1x_%cdbsX-F0>C+MjX`mr7onq+VU~YIE?uqu*~RwyWg$pBTJ*p`)b+H@~Pff#{Kc
                      zsW*`&Nfe7wRAWYTmlPGsv6X)n{l~J0iDI{BbVNYQi2-koOKV$@^TZModf(U54Qu2d
                      zZu-8IW)K3i=n9I%=I7UJzyI)w+rc+V>}-YeCp;IX1atlvWu{IU@_2Sh82s2r*
                      zKd2`2>DGsn&fe;HSakeqN4Jv@_`^f#*^XaX%I9u5CL~`|m~xAZbt@2^yZ-0c2j#x?
                      z9jAq;E$>|Pu^!hxSn0O3=6dJk8hO1w*pzw6@x#i)qzc=PA3x+rTiYSe(;pgYaCY7F
                      z9P9LKb__s>e9}#hrIPY^jrr@1?dH6PTXtmQ1Af~yYAzgV1`zy9UWkHH9R1#bB{XiIVufirbubJb{|fuSMg^8Fhghe8vhFM5RneSi3q
                      z^r~}9C@i0ezhYPip3K!DsU43a^ZlwSzS<8h&A$Qf3DV`KM%;nOm2KL&8&#eAc{I>h
                      zz#gp(vvYR73I_9U2sFMGHtzi7R}AhzOg}ZD2abnS-zh))mEc&H;Z3Z+N6At
                      zB=Kbjy|*M->&hYLh0|-xtFPQ`{lHegFdjvWiHX^7;96L`tdqVn^>S)TqW*dOiP5T8
                      z5CBFeCx2lDv6%6d;Vlm~RXFcBS3vT9-F*MgNZ)YRb*tC?V&^-9Q9cioBhJ3x%4uop
                      zHtcRIOtkR3l%-X_XC(0K@wAO`jn9d+NBgZXgX%l0?8qva&okeKPmK%-njfDIf9UwI
                      zM+vzd80eV<9wi^UI(3v{;cP~R`C
                      z##_A%%7}QJdNoG8!=>(F$)JBvz}u+Kt6Bb(Q)&m0j`#Q5r-__{8Z)&=90zO8w#$>$GHrsw;9J|>rT=`{@bme2cq^iQPO$h%06#pRp5a)mv+A?44p*Bnk
                      Date: Wed, 3 Jul 2002 21:55:25 +0000
                      Subject: [PATCH 047/342] added bat and sh files to start up LogFactor5 GUI
                       independent of a running application
                      
                      git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309609 13f79535-47bb-0310-9956-ffa450edef68
                      ---
                       bin/StartLogFactor5.sh         | 20 ++++++++++++++++++++
                       bin/StartLogFactor5Console.bat | 24 ++++++++++++++++++++++++
                       bin/lcp.bat                    |  2 ++
                       3 files changed, 46 insertions(+)
                       create mode 100644 bin/StartLogFactor5.sh
                       create mode 100644 bin/StartLogFactor5Console.bat
                       create mode 100644 bin/lcp.bat
                      
                      diff --git a/bin/StartLogFactor5.sh b/bin/StartLogFactor5.sh
                      new file mode 100644
                      index 0000000000..80e296c739
                      --- /dev/null
                      +++ b/bin/StartLogFactor5.sh
                      @@ -0,0 +1,20 @@
                      +#! /bin/sh
                      +
                      +if [ -z "$LOG4J_HOME" ] ; then
                      +    LOG4J_HOME=..
                      +fi
                      +
                      +JAVACMD=$JAVA_HOME/bin/java
                      +
                      +# add in the dependency .jar files
                      +DIRLIBS=${LOG4J_HOME}/dist/lib/*.jar
                      +for i in ${DIRLIBS}
                      +do
                      +
                      +    if [ "$i" != "${DIRLIBS}" ] ; then
                      +        LOCALCLASSPATH=$LOCALCLASSPATH:"$i"
                      +    fi
                      +
                      +done
                      +
                      +$JAVACMD -classpath "$LOCALCLASSPATH" org.apache.log4j.lf5.StartLogFactor5
                      \ No newline at end of file
                      diff --git a/bin/StartLogFactor5Console.bat b/bin/StartLogFactor5Console.bat
                      new file mode 100644
                      index 0000000000..42cb1eaf9f
                      --- /dev/null
                      +++ b/bin/StartLogFactor5Console.bat
                      @@ -0,0 +1,24 @@
                      +@echo off
                      +
                      +if not "%LOG4J_HOME%" == "" goto start
                      +
                      +SET LOG4J_HOME=..
                      +
                      +:start
                      +
                      +java -fullversion
                      +set LOCALCLASSPATH=
                      +for %%i in ("%LOG4J_HOME%\dist\lib\*.jar") do call "%LOG4J_HOME%\bin\lcp.bat" "%%i"
                      +
                      +echo using classpath %LOCALCLASSPATH%
                      +
                      +java -classpath %LOCALCLASSPATH% org.apache.log4j.lf5.StartLogFactor5
                      +
                      +exit
                      +
                      +:usage
                      +echo usage: lf5 (target)
                      +
                      +:eof
                      +pause
                      +
                      diff --git a/bin/lcp.bat b/bin/lcp.bat
                      new file mode 100644
                      index 0000000000..4f267130b6
                      --- /dev/null
                      +++ b/bin/lcp.bat
                      @@ -0,0 +1,2 @@
                      +set LOCALCLASSPATH=%1;%LOCALCLASSPATH%
                      +
                      
                      From 3e88738cf88dd0b9c434fa7905e1b574b6401418 Mon Sep 17 00:00:00 2001
                      From: Ceki Gulcu 
                      Date: Thu, 4 Jul 2002 13:03:13 +0000
                      Subject: [PATCH 048/342] Indentation changes only.
                      
                      PR:
                      Obtained from:
                      Submitted by:
                      Reviewed by:
                      
                      
                      git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309610 13f79535-47bb-0310-9956-ffa450edef68
                      ---
                       src/java/org/apache/log4j/AsyncAppender.java | 96 ++++++++------------
                       1 file changed, 39 insertions(+), 57 deletions(-)
                      
                      diff --git a/src/java/org/apache/log4j/AsyncAppender.java b/src/java/org/apache/log4j/AsyncAppender.java
                      index f99bd862dc..d70ff85b82 100644
                      --- a/src/java/org/apache/log4j/AsyncAppender.java
                      +++ b/src/java/org/apache/log4j/AsyncAppender.java
                      @@ -33,9 +33,7 @@
                       
                          

                      Important note: The AsyncAppender can only be script configured using the {@link - org.apache.log4j.xml.DOMConfigurator}. Refer to example configuration - files sample4.xml - and sample5.xml. + org.apache.log4j.xml.DOMConfigurator}. @author Ceki Gülcü @since 0.9.1 */ @@ -55,8 +53,7 @@ public class AsyncAppender extends AppenderSkeleton boolean interruptedWarningMessage = false; - public - AsyncAppender() { + public yncAppender() { // Note: The dispatcher code assumes that the aai is set once and // for all. aai = new AppenderAttachableImpl(); @@ -65,15 +62,13 @@ public class AsyncAppender extends AppenderSkeleton } - public - void addAppender(Appender newAppender) { + public void addAppender(Appender newAppender) { synchronized(aai) { aai.addAppender(newAppender); } } - public - void append(LoggingEvent event) { + public void append(LoggingEvent event) { // Set the NDC and thread name for the calling thread as these // LoggingEvent fields were not set at event creation time. event.getNDC(); @@ -112,8 +107,7 @@ void append(LoggingEvent event) { dispatcher thread which will process all pending events before exiting. */ - public - void close() { + public void close() { synchronized(this) { // avoid multiple close, otherwise one gets NullPointerException if(closed) { @@ -137,15 +131,13 @@ void close() { bf = null; } - public - Enumeration getAllAppenders() { + public Enumeration getAllAppenders() { synchronized(aai) { return aai.getAllAppenders(); } } - public - Appender getAppender(String name) { + public Appender getAppender(String name) { synchronized(aai) { return aai.getAppender(name); } @@ -154,89 +146,80 @@ Appender getAppender(String name) { /** Returns the current value of the LocationInfo option. */ - public - boolean getLocationInfo() { + public boolean getLocationInfo() { return locationInfo; } /** Is the appender passed as parameter attached to this category? */ - public - boolean isAttached(Appender appender) { + public boolean isAttached(Appender appender) { return aai.isAttached(appender); } /** The AsyncAppender does not require a layout. Hence, - this method always returns false. */ - public - boolean requiresLayout() { + this method always returns false. + */ + public boolean requiresLayout() { return false; } - public - void removeAllAppenders() { + public void removeAllAppenders() { synchronized(aai) { aai.removeAllAppenders(); } } - public - void removeAppender(Appender appender) { + public void removeAppender(Appender appender) { synchronized(aai) { aai.removeAppender(appender); } } - public - void removeAppender(String name) { + public void removeAppender(String name) { synchronized(aai) { aai.removeAppender(name); } } /** - The LocationInfo option takes a boolean value. By - default, it is set to false which means there will be no effort - to extract the location information related to the event. As a - result, the event that will be ultimately logged will likely to - contain the wrong location information (if present in the log - format). - -

                      Location information extraction is comparatively very slow and - should be avoided unless performance is not a concern. - */ - public - void setLocationInfo(boolean flag) { + * The LocationInfo option takes a boolean value. By default, + * it is set to false which means there will be no effort to extract + * the location information related to the event. As a result, the + * event that will be ultimately logged will likely to contain the + * wrong location information (if present in the log format). + * + *

                      Location information extraction is comparatively very slow and + * should be avoided unless performance is not a concern. + * */ + public void setLocationInfo(boolean flag) { locationInfo = flag; } /** - The BufferSize option takes a non-negative integer - value. This integer value determines the maximum size of the - bounded buffer. Increasing the size of the buffer is always - safe. However, if an existing buffer holds unwritten elements, - then decreasing the buffer size will result in event - loss. Nevertheless, while script configuring the - AsyncAppender, it is safe to set a buffer size smaller than the - {@link #DEFAULT_BUFFER_SIZE default buffer size} because - configurators guarantee that an appender cannot be used before - being completely configured. - */ - public - void setBufferSize(int size) { + * The BufferSize option takes a non-negative integer value. + * This integer value determines the maximum size of the bounded + * buffer. Increasing the size of the buffer is always + * safe. However, if an existing buffer holds unwritten elements, + * then decreasing the buffer size will result in event + * loss. Nevertheless, while script configuring the + * AsyncAppender, it is safe to set a buffer size smaller than the + * {@link #DEFAULT_BUFFER_SIZE default buffer size} because + * configurators guarantee that an appender cannot be used before + * being completely configured. + * */ + public void setBufferSize(int size) { bf.resize(size); } /** Returns the current value of the BufferSize option. */ - public - int getBufferSize() { + public int getBufferSize() { return bf.getMaxSize(); } @@ -291,8 +274,7 @@ the monitor (variable bf) so that new events can be placed in the

                      Other approaches might yield better results. */ - public - void run() { + public void run() { //Category cat = Category.getInstance(Dispatcher.class.getName()); From e9ceff30f2dce14a450e677ea8f10360e8b031a2 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 5 Jul 2002 08:44:20 +0000 Subject: [PATCH 049/342] - Added the isClosed method. - Indentation changes. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309611 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/log4j/VectorAppender.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/tests/src/java/org/apache/log4j/VectorAppender.java b/tests/src/java/org/apache/log4j/VectorAppender.java index 6621bc7430..e52ec7d7f3 100644 --- a/tests/src/java/org/apache/log4j/VectorAppender.java +++ b/tests/src/java/org/apache/log4j/VectorAppender.java @@ -24,16 +24,14 @@ public class VectorAppender extends AppenderSkeleton { public Vector vector; - public - VectorAppender() { + public VectorAppender() { vector = new Vector(); } /** Does nothing. */ - public - void activateOptions() { + public void activateOptions() { } @@ -42,19 +40,16 @@ void activateOptions() { method. */ - public - void append(LoggingEvent event) { + public void append(LoggingEvent event) { System.out.println("---Vector appender called with message ["+event.getRenderedMessage()+"]."); vector.addElement(event); } - public - Vector getVector() { + public Vector getVector() { return vector; } - public - synchronized + public synchronized void close() { if(this.closed) return; @@ -62,8 +57,11 @@ void close() { } - public - boolean requiresLayout() { + public boolean isClosed() { + return this.closed; + } + + public boolean requiresLayout() { return false; } } From 5d9383f7351a816195730283769e97498fba8d9c Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 5 Jul 2002 11:08:19 +0000 Subject: [PATCH 050/342] Only cosmetic (indentation) changes to SocketAppender.java PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309612 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/net/SocketAppender.java | 96 ++++++++----------- 1 file changed, 38 insertions(+), 58 deletions(-) diff --git a/src/java/org/apache/log4j/net/SocketAppender.java b/src/java/org/apache/log4j/net/SocketAppender.java index 6b91beaa25..fcdb27b386 100644 --- a/src/java/org/apache/log4j/net/SocketAppender.java +++ b/src/java/org/apache/log4j/net/SocketAppender.java @@ -128,8 +128,7 @@ public SocketAppender() { /** Connects to remote server at address and port. */ - public - SocketAppender(InetAddress address, int port) { + public SocketAppender(InetAddress address, int port) { this.address = address; this.remoteHost = address.getHostName(); this.port = port; @@ -139,8 +138,7 @@ public SocketAppender() { /** Connects to remote server at host and port. */ - public - SocketAppender(String host, int port) { + public SocketAppender(String host, int port) { this.port = port; this.address = getAddressByName(host); this.remoteHost = host; @@ -150,19 +148,17 @@ public SocketAppender() { /** Connect to the specified RemoteHost and Port. */ - public - void activateOptions() { + public void activateOptions() { connect(address, port); } /** - Close this appender. -

                      This will mark the appender as closed and - call then {@link #cleanUp} method. - */ - synchronized - public - void close() { + * Close this appender. + * + *

                      This will mark the appender as closed and call then {@link + * #cleanUp} method. + * */ + synchronized public void close() { if(closed) return; @@ -171,16 +167,14 @@ void close() { } /** - Drop the connection to the remote host and release the underlying - connector thread if it has been created - */ - public - void cleanUp() { + * Drop the connection to the remote host and release the underlying + * connector thread if it has been created + * */ + public void cleanUp() { if(oos != null) { try { oos.close(); - } - catch(IOException e) { + } catch(IOException e) { LogLog.error("Could not close oos.", e); } oos = null; @@ -199,8 +193,7 @@ void connect(InetAddress address, int port) { // First, close the previous connection if any. cleanUp(); oos = new ObjectOutputStream(new Socket(address, port).getOutputStream()); - } - catch(IOException e) { + } catch(IOException e) { LogLog.error("Could not connect to remote log4j server at [" +address.getHostName()+"]. We will try again later.", e); fireConnector(); @@ -208,8 +201,7 @@ void connect(InetAddress address, int port) { } - public - void append(LoggingEvent event) { + public void append(LoggingEvent event) { if(event == null) return; @@ -234,8 +226,7 @@ void append(LoggingEvent event) { //System.err.println("Doing oos.reset()"); oos.reset(); } - } - catch(IOException e) { + } catch(IOException e) { oos = null; LogLog.warn("Detected problem with connection: "+e); if(reconnectionDelay > 0) { @@ -259,28 +250,26 @@ void fireConnector() { InetAddress getAddressByName(String host) { try { return InetAddress.getByName(host); - } - catch(Exception e) { + } catch(Exception e) { LogLog.error("Could not find address of ["+host+"].", e); return null; } } /** - The SocketAppender does not use a layout. Hence, this method returns - false. - */ - public - boolean requiresLayout() { + * The SocketAppender does not use a layout. Hence, this method + * returns false. + * */ + public boolean requiresLayout() { return false; } /** - The RemoteHost option takes a string value which should be - the host name of the server where a {@link SocketNode} is running. - */ - public - void setRemoteHost(String host) { + * The RemoteHost option takes a string value which should be + * the host name of the server where a {@link SocketNode} is + * running. + * */ + public void setRemoteHost(String host) { address = getAddressByName(host); remoteHost = host; } @@ -288,8 +277,7 @@ void setRemoteHost(String host) { /** Returns value of the RemoteHost option. */ - public - String getRemoteHost() { + public String getRemoteHost() { return remoteHost; } @@ -297,16 +285,14 @@ String getRemoteHost() { The Port option takes a positive integer representing the port where the server is waiting for connections. */ - public - void setPort(int port) { + public void setPort(int port) { this.port = port; } /** Returns value of the Port option. */ - public - int getPort() { + public int getPort() { return port; } @@ -315,16 +301,14 @@ int getPort() { the information sent to the remote host will include location information. By default no location information is sent to the server. */ - public - void setLocationInfo(boolean locationInfo) { + public void setLocationInfo(boolean locationInfo) { this.locationInfo = locationInfo; } /** Returns value of the LocationInfo option. */ - public - boolean getLocationInfo() { + public boolean getLocationInfo() { return locationInfo; } @@ -337,16 +321,14 @@ boolean getLocationInfo() {

                      Setting this option to zero turns off reconnection capability. */ - public - void setReconnectionDelay(int delay) { + public void setReconnectionDelay(int delay) { this.reconnectionDelay = delay; } /** Returns value of the ReconnectionDelay option. */ - public - int getReconnectionDelay() { + public int getReconnectionDelay() { return reconnectionDelay; } @@ -377,18 +359,16 @@ void run() { synchronized(this) { oos = new ObjectOutputStream(socket.getOutputStream()); connector = null; + LogLog.debug("Connection established. Exiting connector thread."); break; } - } - catch(InterruptedException e) { + } catch(InterruptedException e) { LogLog.debug("Connector interrupted. Leaving loop."); return; - } - catch(java.net.ConnectException e) { + } catch(java.net.ConnectException e) { LogLog.debug("Remote host "+address.getHostName() +" refused connection."); - } - catch(IOException e) { + } catch(IOException e) { LogLog.debug("Could not connect to " + address.getHostName()+ ". Exception is " + e); } From f425f87d7e698b9509226690286c44d3e94d1ef5 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 5 Jul 2002 11:11:43 +0000 Subject: [PATCH 051/342] - AyncAppener now closes its embedded appenders when AsyncAppender.close() is called. - New test cases in AsyncAppenderTestCase.java PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309613 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/AsyncAppender.java | 7 ++- .../apache/log4j/AsyncAppenderTestCase.java | 52 ++++++++++++++++++- .../java/org/apache/log4j/VectorAppender.java | 10 ++-- 3 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/log4j/AsyncAppender.java b/src/java/org/apache/log4j/AsyncAppender.java index d70ff85b82..33bc061257 100644 --- a/src/java/org/apache/log4j/AsyncAppender.java +++ b/src/java/org/apache/log4j/AsyncAppender.java @@ -53,7 +53,7 @@ public class AsyncAppender extends AppenderSkeleton boolean interruptedWarningMessage = false; - public yncAppender() { + public AsyncAppender() { // Note: The dispatcher code assumes that the aai is set once and // for all. aai = new AppenderAttachableImpl(); @@ -286,7 +286,7 @@ public void run() { // Exit loop if interrupted but only if the the buffer is empty. if(interrupted) { //cat.info("Exiting."); - return; + break; } try { //LogLog.debug("Waiting for new event to dispatch."); @@ -311,5 +311,8 @@ public void run() { } } } // while + + // close and remove all appenders + aai.removeAllAppenders(); } } diff --git a/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java b/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java index 7d42aca8ab..7dafc0d9bf 100644 --- a/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java +++ b/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java @@ -28,14 +28,17 @@ public AsyncAppenderTestCase(String name) { public void setUp() { } - public void tearDown() { + public void tearDown() { + LogManager.shutdown(); } + // this test checks whether it is possible to write to a closed AsyncAppender public void closeTest() throws Exception { Logger root = Logger.getRootLogger(); Layout layout = new SimpleLayout(); VectorAppender vectorAppender = new VectorAppender(); AsyncAppender asyncAppender = new AsyncAppender(); + asyncAppender.setName("async-CloseTest"); asyncAppender.addAppender(vectorAppender); root.addAppender(asyncAppender); @@ -45,13 +48,60 @@ public void closeTest() throws Exception { Vector v = vectorAppender.getVector(); assertEquals(v.size(), 1); + } + + // this test checks whether appenders embedded within an AsyncAppender are also + // closed + public void test2() { + Logger root = Logger.getRootLogger(); + Layout layout = new SimpleLayout(); + VectorAppender vectorAppender = new VectorAppender(); + AsyncAppender asyncAppender = new AsyncAppender(); + asyncAppender.setName("async-test2"); + asyncAppender.addAppender(vectorAppender); + root.addAppender(asyncAppender); + + root.debug("m1"); + asyncAppender.close(); + root.debug("m2"); + Vector v = vectorAppender.getVector(); + assertEquals(v.size(), 1); + assertTrue(vectorAppender.isClosed()); + } + + // this test checks whether appenders embedded within an AsyncAppender are also + // closed + public void test3() { + int LEN = 200; + Logger root = Logger.getRootLogger(); + Layout layout = new SimpleLayout(); + VectorAppender vectorAppender = new VectorAppender(); + AsyncAppender asyncAppender = new AsyncAppender(); + asyncAppender.setName("async-test3"); + asyncAppender.addAppender(vectorAppender); + root.addAppender(asyncAppender); + for(int i = 0; i < LEN; i++) { + root.debug("message"+i); + } + + System.out.println("Done loop."); + System.out.flush(); + asyncAppender.close(); + root.debug("m2"); + + Vector v = vectorAppender.getVector(); + assertEquals(v.size(), LEN); + assertTrue(vectorAppender.isClosed()); } + public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(new AsyncAppenderTestCase("closeTest")); + suite.addTest(new AsyncAppenderTestCase("test2")); + suite.addTest(new AsyncAppenderTestCase("test3")); return suite; } diff --git a/tests/src/java/org/apache/log4j/VectorAppender.java b/tests/src/java/org/apache/log4j/VectorAppender.java index e52ec7d7f3..c70b6e3f3c 100644 --- a/tests/src/java/org/apache/log4j/VectorAppender.java +++ b/tests/src/java/org/apache/log4j/VectorAppender.java @@ -42,6 +42,11 @@ public void activateOptions() { */ public void append(LoggingEvent event) { System.out.println("---Vector appender called with message ["+event.getRenderedMessage()+"]."); + System.out.flush(); + try { + Thread.currentThread().sleep(100); + } catch(Exception e) { + } vector.addElement(event); } @@ -49,8 +54,7 @@ public Vector getVector() { return vector; } - public synchronized - void close() { + public synchronized void close() { if(this.closed) return; this.closed = true; @@ -58,7 +62,7 @@ void close() { public boolean isClosed() { - return this.closed; + return closed; } public boolean requiresLayout() { From 23f90c57a5dd3bcf53270776f8bce3995108e392 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 5 Jul 2002 11:22:29 +0000 Subject: [PATCH 052/342] Minor documentation changes. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309614 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java b/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java index ec01c769e7..d3d2680c2f 100644 --- a/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java +++ b/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java @@ -121,8 +121,8 @@ boolean isAttached(Appender appender) { /** - Remove all previously attached appenders. - */ + * Remove and close all previously attached appenders. + * */ public void removeAllAppenders() { if(appenderList != null) { From 52417cbbf096d1d95fa64a67a8a621338cb0ab77 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 5 Jul 2002 11:23:49 +0000 Subject: [PATCH 053/342] - Added link to log4j book - Updated the history file PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309615 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY | 10 ++++++++++ src/xdocs/documentation.xml | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/docs/HISTORY b/docs/HISTORY index 2bfe454cd6..3c6b76d014 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -5,6 +5,16 @@ client code. [***] Changes requiring important modifications to existing client code. + July 5th, 2002, + + - Release of version 1.2.5 + + - Minor changes and bug fixes in LF5. [*] + + - Calling an AsyncAppender close method also closes the embedded + appender instances. This resolves bug #10185 submitted by Paul + Voutier. [*] + June 12th, 2002, - Release of version 1.2.4 diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index 21addad732..569ad4f88b 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -15,9 +15,15 @@

                        +

                      • short manual,
                      • + +

                        +

                      • complete manual (commercial), +
                      • +

                      • From 762562b898c995dca6a18489db2b701ee05096dc Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Sun, 7 Jul 2002 06:45:46 +0000 Subject: [PATCH 054/342] Fix for bug #10528. Hashtable does not support null value for key (unlike HashMap), so check for null key value before getting value. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309616 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/MDC.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/log4j/MDC.java b/src/java/org/apache/log4j/MDC.java index 002b3994de..4e9271687d 100644 --- a/src/java/org/apache/log4j/MDC.java +++ b/src/java/org/apache/log4j/MDC.java @@ -104,8 +104,8 @@ void put0(String key, Object o) { } else { Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get(); if(ht == null) { - ht = new Hashtable(HT_SIZE); - ((ThreadLocalMap)tlm).set(ht); + ht = new Hashtable(HT_SIZE); + ((ThreadLocalMap)tlm).set(ht); } ht.put(key, o); } @@ -117,10 +117,10 @@ Object get0(String key) { return null; } else { Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get(); - if(ht != null) { - return ht.get(key); + if(ht != null && key != null) { + return ht.get(key); } else { - return null; + return null; } } } @@ -130,7 +130,7 @@ void remove0(String key) { if(!java1) { Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get(); if(ht != null) { - ht.remove(key); + ht.remove(key); } } } From 24f13df921fdc96bf4be53145fbb35d3e6fd54b0 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Sun, 7 Jul 2002 06:47:43 +0000 Subject: [PATCH 055/342] PatternParserTestCase which tests mdc conversion pattern. Tests fix for bug #10528. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309617 13f79535-47bb-0310-9956-ffa450edef68 --- tests/build.xml | 12 +- .../log4j/helpers/PatternParserTestCase.java | 121 ++++++++++++++++++ tests/witness/PatternParser_mdc | 12 ++ 3 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java create mode 100644 tests/witness/PatternParser_mdc diff --git a/tests/build.xml b/tests/build.xml index 0e0b0754cb..e309f5fd03 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -99,8 +99,8 @@ HierarchyThreshold, SocketServer, XMLLayout, AsyncAppender, OptionConverter, BoundedFIFO, - CyclicBuffer, OR, LevelMatchFilter, - DRFA"/> + CyclicBuffer, PatternParser, OR, + LevelMatchFilter, DRFA"/> @@ -242,6 +242,14 @@ + + + + + + + + diff --git a/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java b/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java new file mode 100644 index 0000000000..f4f305877d --- /dev/null +++ b/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ + +package org.apache.log4j.helpers; + +import junit.framework.TestCase; +import junit.framework.TestSuite; +import junit.framework.Test; + +import org.apache.log4j.Logger; +import org.apache.log4j.Level; +import org.apache.log4j.Appender; +import org.apache.log4j.FileAppender; +import org.apache.log4j.PatternLayout; +import org.apache.log4j.MDC; + +import org.apache.log4j.util.Compare; + +/** + Test case for helpers/PatternParser.java. Tests the various + conversion patterns supported by PatternParser. This test + class tests PatternParser via the PatternLayout class which + uses it. + */ +public class PatternParserTestCase extends TestCase { + + static String OUTPUT_FILE = "output/PatternParser"; + static String WITNESS_FILE = "witness/PatternParser"; + + static String msgPattern = "%m%n"; + + Logger root; + Logger logger; + + public PatternParserTestCase(String name) { + super(name); + } + + public void setUp() { + root = Logger.getRootLogger(); + root.removeAllAppenders(); + } + + public void tearDown() { + root.getLoggerRepository().resetConfiguration(); + } + + /** + Test case for MDC conversion pattern. */ + public void mdcPattern() throws Exception { + + String mdcMsgPattern1 = "%m : %X%n"; + String mdcMsgPattern2 = "%m : %X{key1}%n"; + String mdcMsgPattern3 = "%m : %X{key2}%n"; + String mdcMsgPattern4 = "%m : %X{key3}%n"; + String mdcMsgPattern5 = "%m : %X{key1},%X{key2},%X{key3}%n"; + + // set up appender + PatternLayout layout = new PatternLayout(msgPattern); + Appender appender = new FileAppender(layout, OUTPUT_FILE+"_mdc", false); + + // set appender on root and set level to debug + root.addAppender(appender); + root.setLevel(Level.DEBUG); + + // output starting message + root.debug("starting mdc pattern test"); + + layout.setConversionPattern(mdcMsgPattern1); + root.debug("empty mdc, no key specified in pattern"); + + layout.setConversionPattern(mdcMsgPattern2); + root.debug("empty mdc, key1 in pattern"); + + layout.setConversionPattern(mdcMsgPattern3); + root.debug("empty mdc, key2 in pattern"); + + layout.setConversionPattern(mdcMsgPattern4); + root.debug("empty mdc, key3 in pattern"); + + layout.setConversionPattern(mdcMsgPattern5); + root.debug("empty mdc, key1, key2, and key3 in pattern"); + + MDC.put("key1", "value1"); + MDC.put("key2", "value2"); + + layout.setConversionPattern(mdcMsgPattern1); + root.debug("filled mdc, no key specified in pattern"); + + layout.setConversionPattern(mdcMsgPattern2); + root.debug("filled mdc, key1 in pattern"); + + layout.setConversionPattern(mdcMsgPattern3); + root.debug("filled mdc, key2 in pattern"); + + layout.setConversionPattern(mdcMsgPattern4); + root.debug("filled mdc, key3 in pattern"); + + layout.setConversionPattern(mdcMsgPattern5); + root.debug("filled mdc, key1, key2, and key3 in pattern"); + + MDC.remove("key1"); + MDC.remove("key2"); + + layout.setConversionPattern(msgPattern); + root.debug("finished mdc pattern test"); + + assertTrue(Compare.compare(OUTPUT_FILE+"_mdc", WITNESS_FILE+"_mdc")); + } + + public static Test suite() { + TestSuite suite = new TestSuite(); + suite.addTest(new PatternParserTestCase("mdcPattern")); + return suite; + } + +} diff --git a/tests/witness/PatternParser_mdc b/tests/witness/PatternParser_mdc new file mode 100644 index 0000000000..6960248522 --- /dev/null +++ b/tests/witness/PatternParser_mdc @@ -0,0 +1,12 @@ +starting mdc pattern test +empty mdc, no key specified in pattern : +empty mdc, key1 in pattern : +empty mdc, key2 in pattern : +empty mdc, key3 in pattern : +empty mdc, key1, key2, and key3 in pattern : ,, +filled mdc, no key specified in pattern : +filled mdc, key1 in pattern : value1 +filled mdc, key2 in pattern : value2 +filled mdc, key3 in pattern : +filled mdc, key1, key2, and key3 in pattern : value1,value2, +finished mdc pattern test From 814e59eb6b0d8a1244e4e6cf86bf5d30ad4e49bf Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 11 Jul 2002 08:51:26 +0000 Subject: [PATCH 056/342] Minor changes that were not committed when 1.2.5 was released. - Change of refenreces to 1.2.5 instead of 1.2.4 in src/xdocs/download.xml - Minor change in tests/src/java/org/apache/log4j/VectorAppender.java PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309618 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/download.xml | 12 ++++++------ tests/src/java/org/apache/log4j/VectorAppender.java | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index d3012a1537..8710b6f170 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -9,15 +9,15 @@ -
                        -

                        log4j 1.2.4 is available in TAR.GZ format - or in ZIP +

                        +

                        log4j 1.2.5 is available in TAR.GZ format + or in ZIP format.

                        -

                        Release 1.2.4 fixes several relatively minor bugs. See the - HISTORY file for the exact details. +

                        Release 1.2.5 fixes minor bugs. See the HISTORY file for the exact details.

                        In addition to many performance improvements, bug fixes, and diff --git a/tests/src/java/org/apache/log4j/VectorAppender.java b/tests/src/java/org/apache/log4j/VectorAppender.java index c70b6e3f3c..146b8cfa33 100644 --- a/tests/src/java/org/apache/log4j/VectorAppender.java +++ b/tests/src/java/org/apache/log4j/VectorAppender.java @@ -41,8 +41,8 @@ public void activateOptions() { */ public void append(LoggingEvent event) { - System.out.println("---Vector appender called with message ["+event.getRenderedMessage()+"]."); - System.out.flush(); + //System.out.println("---Vector appender called with message ["+event.getRenderedMessage()+"]."); + //System.out.flush(); try { Thread.currentThread().sleep(100); } catch(Exception e) { From 628113b614693b3ca90548cf12ddd7f117272cc1 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 11 Jul 2002 08:55:55 +0000 Subject: [PATCH 057/342] New reference to Log::Log4Perl log4j port in src/xdocs/download.xml PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309619 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/download.xml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 8710b6f170..a9ca926bf4 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -203,14 +203,24 @@ - +

                        Log::Log4perl
                        + +
                        Log::Log4perl is a Perl port of log4j by Kevin Goess and + Mike Schilli. The authors made sure that their port was as + close as possible to the original implementation. Even the + configuration files are similar! The project is still being + enhanced, however the current release is stable and has been + released to CPAN. +
                        +
                        log4net
                        The .NET implementation of the popular log4j Java API providing flexible and arbitrarily granular control over log management and configuration.
                        - +
                        log4py
                        From c2a2b09bd2c8141e72bfe900e4bff0dc9fb9e5ec Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 11 Jul 2002 09:12:22 +0000 Subject: [PATCH 058/342] Small change to the text in src/xdocs/download.xml PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309620 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/download.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index a9ca926bf4..7f6991d19a 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -47,7 +47,7 @@

                        We also maintain a list of earlier versions of log4j for download, intended for the curious - paleontologist. + paleontologist -- there seems to be thousands of them!

                        From 0e76e49d43230c348669ce9301661998293e97d2 Mon Sep 17 00:00:00 2001 From: bradm Date: Fri, 12 Jul 2002 18:39:13 +0000 Subject: [PATCH 059/342] changed examples to work with Logger rather than Category git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309621 13f79535-47bb-0310-9956-ffa450edef68 --- .../InitUsingDefaultConfigurator.java | 189 +++++++++--------- .../InitUsingLog4JProperties.java | 153 +++++++------- .../InitUsingMultipleAppenders.java | 161 ++++++++------- .../InitUsingPropertiesFile.java | 161 ++++++++------- .../InitUsingXMLPropertiesFile.java | 160 +++++++-------- .../CustomizedLogLevels.java | 137 +++++++------ .../UsingLogMonitorAdapter.java | 12 +- .../UsingSocketAppenders.java | 182 ++++++++--------- 8 files changed, 573 insertions(+), 582 deletions(-) diff --git a/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java b/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java index fe2fec0528..e08906940b 100644 --- a/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java +++ b/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java @@ -7,11 +7,9 @@ */ package examples.lf5.InitUsingDefaultConfigurator; -import org.apache.log4j.lf5.DefaultLF5Configurator; -import org.apache.log4j.lf5.LogLevel; -import org.apache.log4j.lf5.util.LogMonitorAdapter; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.NDC; +import org.apache.log4j.lf5.DefaultLF5Configurator; import java.io.IOException; @@ -20,109 +18,106 @@ * logging window using the DefaultLF5Configurator. * * The DefaultLF5Configurator uses a default configuration file stored - * in the lf5.jar in order to provide a default configuration for + * in the log4j.jar in order to provide a default configuration for * the LF5Appender. * - * To make this example work, ensure that the lf5.jar and lf5-license.jar - * files are in your classpath, and then run the example at the command line. - * * @author Brent Sprecher */ // Contributed by ThoughtWorks Inc. public class InitUsingDefaultConfigurator { - //-------------------------------------------------------------------------- - // Constants: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Protected Variables: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Variables: - //-------------------------------------------------------------------------- - private static Category cat = - Category.getInstance(InitUsingDefaultConfigurator.class); - - //-------------------------------------------------------------------------- - // Constructors: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Public Methods: - //-------------------------------------------------------------------------- - - public static void main(String[] args) throws IOException { - // Configure the LF5Appender using the DefaultLF5Configurator. This - // will add the LF5Appender to the root of the Category tree. - DefaultLF5Configurator.configure(); - - // Add an NDC to demonstrate how NDC information is output. - NDC.push("#23856"); - // Log some information. - for (int i = 0; i < 10; i++) { - cat.debug("Hello, my name is Homer Simpson."); - cat.info("Mmmmmm .... Chocolate."); - cat.warn("Mmm...forbidden donut."); + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + private static Logger logger = + Logger.getLogger(InitUsingDefaultConfigurator.class); + + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String[] args) throws IOException { + // Configure the LF5Appender using the DefaultLF5Configurator. This + // will add the LF5Appender to the root of the Category tree. + DefaultLF5Configurator.configure(); + + // Add an NDC to demonstrate how NDC information is output. + NDC.push("#23856"); + // Log some information. + for (int i = 0; i < 10; i++) { + logger.debug("Hello, my name is Homer Simpson."); + logger.info("Mmmmmm .... Chocolate."); + logger.warn("Mmm...forbidden donut."); + } + // Clean up NDC + NDC.pop(); + NDC.remove(); + + NDC.push("Another NDC"); + // Log some information. + logger.fatal("Hello, my name is Bart Simpson."); + logger.error("Hi diddly ho good neighbour."); + // Clean up NDC + NDC.pop(); + NDC.remove(); + + // Call methods on both classes. + InitUsingDefaultConfigurator.foo(); + InnerInitUsingDefaultConfigurator.foo(); + + logger.info("Exiting InitUsingDefaultConfigurator."); + + } + + public static void foo() { + logger.debug("Entered foo in InitUsingDefaultConfigurator class"); + + NDC.push("#123456"); + logger.debug("Hello, my name is Marge Simpson."); + logger.info("D'oh!! A deer! A female deer."); + // Clean up NDC + NDC.pop(); + NDC.remove(); } - // Clean up NDC - NDC.pop(); - NDC.remove(); - - NDC.push("Another NDC"); - // Log some information. - cat.fatal("Hello, my name is Bart Simpson."); - cat.error("Hi diddly ho good neighbour."); - // Clean up NDC - NDC.pop(); - NDC.remove(); - - // Call methods on both classes. - InitUsingDefaultConfigurator.foo(); - InnerInitUsingDefaultConfigurator.foo(); - - cat.info("Exiting InitUsingDefaultConfigurator."); - - } - - public static void foo() { - cat.debug("Entered foo in InitUsingDefaultConfigurator class"); - - NDC.push("#123456"); - cat.debug("Hello, my name is Marge Simpson."); - cat.info("D'oh!! A deer! A female deer."); - // Clean up NDC - NDC.pop(); - NDC.remove(); - } - - //-------------------------------------------------------------------------- - // Protected Methods: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Methods: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Nested Top-Level Classes or Interfaces: - //-------------------------------------------------------------------------- - - public static class InnerInitUsingDefaultConfigurator { - static Category cat = - Category.getInstance(InnerInitUsingDefaultConfigurator.class.getName()); - - static void foo() throws IOException { - // Configure the LF5Appender again. You can call - // DefaultLF5Configurator.configure() as often as you want - // without unexpected behavior. - DefaultLF5Configurator.configure(); - - cat.info("Entered foo in InnerInitUsingDefaultConfigurator class."); + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- + + public static class InnerInitUsingDefaultConfigurator { + static Logger logger = + Logger.getLogger(InnerInitUsingDefaultConfigurator.class.getName()); + + static void foo() throws IOException { + // Configure the LF5Appender again. You can call + // DefaultLF5Configurator.configure() as often as you want + // without unexpected behavior. + DefaultLF5Configurator.configure(); + + logger.info("Entered foo in InnerInitUsingDefaultConfigurator class."); + } } - } } diff --git a/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java b/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java index e834c81901..2679d6de55 100644 --- a/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java +++ b/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java @@ -7,7 +7,7 @@ */ package examples.lf5.InitUsingLog4JProperties; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import java.io.IOException; @@ -26,10 +26,9 @@ * will load the file during class initialization. The LF5Appender will be * added to the root category of the Category tree. * - * To make this example work, ensure that the lf5.jar and lf5-license.jar - * files are in your classpath. Next, create a log4j.properties file and - * add this line to it, or add this line to your existing log4j.properties - * file. Run the example at the command line and explore the results! + * Create a log4j.properties file and add this line to it, or add this line + * to your existing log4j.properties file. Run the example at the command line + * and explore the results! * * @author Brent Sprecher */ @@ -37,77 +36,77 @@ // Contributed by ThoughtWorks Inc. public class InitUsingLog4JProperties { - //-------------------------------------------------------------------------- - // Constants: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Protected Variables: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Variables: - //-------------------------------------------------------------------------- - - private static Category cat = - Category.getInstance(InitUsingLog4JProperties.class); - - //-------------------------------------------------------------------------- - // Constructors: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Public Methods: - //-------------------------------------------------------------------------- - - public static void main(String argv[]) { - // Add a bunch of logging statements ... - cat.debug("Hello, my name is Homer Simpson."); - cat.debug("Hello, my name is Lisa Simpson."); - cat.debug("Hello, my name is Marge Simpson."); - cat.debug("Hello, my name is Bart Simpson."); - cat.debug("Hello, my name is Maggie Simpson."); - - cat.info("We are the Simpsons!"); - cat.info("Mmmmmm .... Chocolate."); - cat.info("Homer likes chocolate"); - cat.info("Doh!"); - cat.info("We are the Simpsons!"); - - cat.warn("Bart: I am through with working! Working is for chumps!" + - "Homer: Son, I'm proud of you. I was twice your age before " + - "I figured that out."); - cat.warn("Mmm...forbidden donut."); - cat.warn("D'oh! A deer! A female deer!"); - cat.warn("Truly, yours is a butt that won't quit." + - "- Bart, writing as Woodrow to Ms. Krabappel."); - - cat.error("Dear Baby, Welcome to Dumpsville. Population: you."); - cat.error("Dear Baby, Welcome to Dumpsville. Population: you.", - new IOException("Dumpsville, USA")); - cat.error("Mr. Hutz, are you aware you're not wearing pants?"); - cat.error("Mr. Hutz, are you aware you're not wearing pants?", - new IllegalStateException("Error !!")); - - - cat.fatal("Eep."); - cat.fatal("Mmm...forbidden donut.", - new SecurityException("Fatal Exception")); - cat.fatal("D'oh! A deer! A female deer!"); - cat.fatal("Mmmmmm .... Chocolate.", - new SecurityException("Fatal Exception")); - } - - //-------------------------------------------------------------------------- - // Protected Methods: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Methods: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Nested Top-Level Classes or Interfaces: - //-------------------------------------------------------------------------- + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + + private static Logger logger = + Logger.getLogger(InitUsingLog4JProperties.class); + + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String argv[]) { + // Add a bunch of logging statements ... + logger.debug("Hello, my name is Homer Simpson."); + logger.debug("Hello, my name is Lisa Simpson."); + logger.debug("Hello, my name is Marge Simpson."); + logger.debug("Hello, my name is Bart Simpson."); + logger.debug("Hello, my name is Maggie Simpson."); + + logger.info("We are the Simpsons!"); + logger.info("Mmmmmm .... Chocolate."); + logger.info("Homer likes chocolate"); + logger.info("Doh!"); + logger.info("We are the Simpsons!"); + + logger.warn("Bart: I am through with working! Working is for chumps!" + + "Homer: Son, I'm proud of you. I was twice your age before " + + "I figured that out."); + logger.warn("Mmm...forbidden donut."); + logger.warn("D'oh! A deer! A female deer!"); + logger.warn("Truly, yours is a butt that won't quit." + + "- Bart, writing as Woodrow to Ms. Krabappel."); + + logger.error("Dear Baby, Welcome to Dumpsville. Population: you."); + logger.error("Dear Baby, Welcome to Dumpsville. Population: you.", + new IOException("Dumpsville, USA")); + logger.error("Mr. Hutz, are you aware you're not wearing pants?"); + logger.error("Mr. Hutz, are you aware you're not wearing pants?", + new IllegalStateException("Error !!")); + + + logger.fatal("Eep."); + logger.fatal("Mmm...forbidden donut.", + new SecurityException("Fatal Exception")); + logger.fatal("D'oh! A deer! A female deer!"); + logger.fatal("Mmmmmm .... Chocolate.", + new SecurityException("Fatal Exception")); + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- } diff --git a/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java b/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java index 8147e41756..c3d7a31742 100644 --- a/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java +++ b/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java @@ -7,8 +7,7 @@ */ package examples.lf5.InitUsingMultipleAppenders; -import org.apache.log4j.lf5.LogLevel; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import java.io.IOException; @@ -55,84 +54,84 @@ public class InitUsingMultipleAppenders { - //-------------------------------------------------------------------------- - // Constants: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Protected Variables: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Variables: - //-------------------------------------------------------------------------- - - private static Category cat = - Category.getInstance(InitUsingMultipleAppenders.class); - - //-------------------------------------------------------------------------- - // Constructors: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Public Methods: - //-------------------------------------------------------------------------- - - public static void main(String argv[]) { - // Use a PropertyConfigurator to initialize from a property file. - String resource = - "/examples/lf5/InitUsingMultipleAppenders/example.properties"; - URL configFileResource = - InitUsingMultipleAppenders.class.getResource(resource); - PropertyConfigurator.configure(configFileResource); - - // Add a bunch of logging statements ... - cat.debug("Hello, my name is Homer Simpson."); - cat.debug("Hello, my name is Lisa Simpson."); - cat.debug("Hello, my name is Marge Simpson."); - cat.debug("Hello, my name is Bart Simpson."); - cat.debug("Hello, my name is Maggie Simpson."); - - cat.info("We are the Simpsons!"); - cat.info("Mmmmmm .... Chocolate."); - cat.info("Homer likes chocolate"); - cat.info("Doh!"); - cat.info("We are the Simpsons!"); - - cat.warn("Bart: I am through with working! Working is for chumps!" + - "Homer: Son, I'm proud of you. I was twice your age before " + - "I figured that out."); - cat.warn("Mmm...forbidden donut."); - cat.warn("D'oh! A deer! A female deer!"); - cat.warn("Truly, yours is a butt that won't quit." + - "- Bart, writing as Woodrow to Ms. Krabappel."); - - cat.error("Dear Baby, Welcome to Dumpsville. Population: you."); - cat.error("Dear Baby, Welcome to Dumpsville. Population: you.", - new IOException("Dumpsville, USA")); - cat.error("Mr. Hutz, are you aware you're not wearing pants?"); - cat.error("Mr. Hutz, are you aware you're not wearing pants?", - new IllegalStateException("Error !!")); - - - cat.fatal("Eep."); - cat.fatal("Mmm...forbidden donut.", - new SecurityException("Fatal Exception")); - cat.fatal("D'oh! A deer! A female deer!"); - cat.fatal("Mmmmmm .... Chocolate.", - new SecurityException("Fatal Exception")); - } - - //-------------------------------------------------------------------------- - // Protected Methods: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Methods: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Nested Top-Level Classes or Interfaces: - //-------------------------------------------------------------------------- + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + + private static Logger logger = + Logger.getLogger(InitUsingMultipleAppenders.class); + + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String argv[]) { + // Use a PropertyConfigurator to initialize from a property file. + String resource = + "/examples/lf5/InitUsingMultipleAppenders/example.properties"; + URL configFileResource = + InitUsingMultipleAppenders.class.getResource(resource); + PropertyConfigurator.configure(configFileResource); + + // Add a bunch of logging statements ... + logger.debug("Hello, my name is Homer Simpson."); + logger.debug("Hello, my name is Lisa Simpson."); + logger.debug("Hello, my name is Marge Simpson."); + logger.debug("Hello, my name is Bart Simpson."); + logger.debug("Hello, my name is Maggie Simpson."); + + logger.info("We are the Simpsons!"); + logger.info("Mmmmmm .... Chocolate."); + logger.info("Homer likes chocolate"); + logger.info("Doh!"); + logger.info("We are the Simpsons!"); + + logger.warn("Bart: I am through with working! Working is for chumps!" + + "Homer: Son, I'm proud of you. I was twice your age before " + + "I figured that out."); + logger.warn("Mmm...forbidden donut."); + logger.warn("D'oh! A deer! A female deer!"); + logger.warn("Truly, yours is a butt that won't quit." + + "- Bart, writing as Woodrow to Ms. Krabappel."); + + logger.error("Dear Baby, Welcome to Dumpsville. Population: you."); + logger.error("Dear Baby, Welcome to Dumpsville. Population: you.", + new IOException("Dumpsville, USA")); + logger.error("Mr. Hutz, are you aware you're not wearing pants?"); + logger.error("Mr. Hutz, are you aware you're not wearing pants?", + new IllegalStateException("Error !!")); + + + logger.fatal("Eep."); + logger.fatal("Mmm...forbidden donut.", + new SecurityException("Fatal Exception")); + logger.fatal("D'oh! A deer! A female deer!"); + logger.fatal("Mmmmmm .... Chocolate.", + new SecurityException("Fatal Exception")); + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- } diff --git a/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java b/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java index ab8cd2d85f..71abb94747 100644 --- a/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java +++ b/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java @@ -7,8 +7,7 @@ */ package examples.lf5.InitUsingPropertiesFile; -import org.apache.log4j.lf5.LogLevel; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import java.io.IOException; @@ -34,84 +33,84 @@ // Contributed by ThoughtWorks Inc. public class InitUsingPropertiesFile { - //-------------------------------------------------------------------------- - // Constants: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Protected Variables: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Variables: - //-------------------------------------------------------------------------- - - private static Category cat = - Category.getInstance(InitUsingPropertiesFile.class); - - //-------------------------------------------------------------------------- - // Constructors: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Public Methods: - //-------------------------------------------------------------------------- - - public static void main(String argv[]) { - // Use a PropertyConfigurator to initialize from a property file. - String resource = - "/examples/lf5/InitUsingPropertiesFile/example.properties"; - URL configFileResource = - InitUsingPropertiesFile.class.getResource(resource); - PropertyConfigurator.configure(configFileResource); - - // Add a bunch of logging statements ... - cat.debug("Hello, my name is Homer Simpson."); - cat.debug("Hello, my name is Lisa Simpson."); - cat.debug("Hello, my name is Marge Simpson."); - cat.debug("Hello, my name is Bart Simpson."); - cat.debug("Hello, my name is Maggie Simpson."); - - cat.info("We are the Simpsons!"); - cat.info("Mmmmmm .... Chocolate."); - cat.info("Homer likes chocolate"); - cat.info("Doh!"); - cat.info("We are the Simpsons!"); - - cat.warn("Bart: I am through with working! Working is for chumps!" + - "Homer: Son, I'm proud of you. I was twice your age before " + - "I figured that out."); - cat.warn("Mmm...forbidden donut."); - cat.warn("D'oh! A deer! A female deer!"); - cat.warn("Truly, yours is a butt that won't quit." + - "- Bart, writing as Woodrow to Ms. Krabappel."); - - cat.error("Dear Baby, Welcome to Dumpsville. Population: you."); - cat.error("Dear Baby, Welcome to Dumpsville. Population: you.", - new IOException("Dumpsville, USA")); - cat.error("Mr. Hutz, are you aware you're not wearing pants?"); - cat.error("Mr. Hutz, are you aware you're not wearing pants?", - new IllegalStateException("Error !!")); - - - cat.fatal("Eep."); - cat.fatal("Mmm...forbidden donut.", - new SecurityException("Fatal Exception")); - cat.fatal("D'oh! A deer! A female deer!"); - cat.fatal("Mmmmmm .... Chocolate.", - new SecurityException("Fatal Exception")); - } - - //-------------------------------------------------------------------------- - // Protected Methods: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Methods: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Nested Top-Level Classes or Interfaces: - //-------------------------------------------------------------------------- + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + + private static Logger logger = + Logger.getLogger(InitUsingPropertiesFile.class); + + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String argv[]) { + // Use a PropertyConfigurator to initialize from a property file. + String resource = + "/examples/lf5/InitUsingPropertiesFile/example.properties"; + URL configFileResource = + InitUsingPropertiesFile.class.getResource(resource); + PropertyConfigurator.configure(configFileResource); + + // Add a bunch of logging statements ... + logger.debug("Hello, my name is Homer Simpson."); + logger.debug("Hello, my name is Lisa Simpson."); + logger.debug("Hello, my name is Marge Simpson."); + logger.debug("Hello, my name is Bart Simpson."); + logger.debug("Hello, my name is Maggie Simpson."); + + logger.info("We are the Simpsons!"); + logger.info("Mmmmmm .... Chocolate."); + logger.info("Homer likes chocolate"); + logger.info("Doh!"); + logger.info("We are the Simpsons!"); + + logger.warn("Bart: I am through with working! Working is for chumps!" + + "Homer: Son, I'm proud of you. I was twice your age before " + + "I figured that out."); + logger.warn("Mmm...forbidden donut."); + logger.warn("D'oh! A deer! A female deer!"); + logger.warn("Truly, yours is a butt that won't quit." + + "- Bart, writing as Woodrow to Ms. Krabappel."); + + logger.error("Dear Baby, Welcome to Dumpsville. Population: you."); + logger.error("Dear Baby, Welcome to Dumpsville. Population: you.", + new IOException("Dumpsville, USA")); + logger.error("Mr. Hutz, are you aware you're not wearing pants?"); + logger.error("Mr. Hutz, are you aware you're not wearing pants?", + new IllegalStateException("Error !!")); + + + logger.fatal("Eep."); + logger.fatal("Mmm...forbidden donut.", + new SecurityException("Fatal Exception")); + logger.fatal("D'oh! A deer! A female deer!"); + logger.fatal("Mmmmmm .... Chocolate.", + new SecurityException("Fatal Exception")); + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- } diff --git a/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java b/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java index 13e76d55f9..8b21c98e3f 100644 --- a/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java +++ b/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java @@ -7,7 +7,7 @@ */ package examples.lf5.InitUsingXMLPropertiesFile; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; import java.io.IOException; @@ -27,84 +27,84 @@ // Contributed by ThoughtWorks Inc. public class InitUsingXMLPropertiesFile { - //-------------------------------------------------------------------------- - // Constants: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Protected Variables: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Variables: - //-------------------------------------------------------------------------- - - private static Category cat = - Category.getInstance(InitUsingXMLPropertiesFile.class); - - //-------------------------------------------------------------------------- - // Constructors: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Public Methods: - //-------------------------------------------------------------------------- - - public static void main(String argv[]) { - // Use a PropertyConfigurator to initialize from a property file. - String resource = - "/examples/lf5/InitUsingXMLPropertiesFile/example.xml"; - URL configFileResource = - InitUsingXMLPropertiesFile.class.getResource(resource); - DOMConfigurator.configure(configFileResource.getFile()); - - // Add a bunch of logging statements ... - cat.debug("Hello, my name is Homer Simpson."); - cat.debug("Hello, my name is Lisa Simpson."); - cat.debug("Hello, my name is Marge Simpson."); - cat.debug("Hello, my name is Bart Simpson."); - cat.debug("Hello, my name is Maggie Simpson."); - - cat.info("We are the Simpsons!"); - cat.info("Mmmmmm .... Chocolate."); - cat.info("Homer likes chocolate"); - cat.info("Doh!"); - cat.info("We are the Simpsons!"); - - cat.warn("Bart: I am through with working! Working is for chumps!" + - "Homer: Son, I'm proud of you. I was twice your age before " + - "I figured that out."); - cat.warn("Mmm...forbidden donut."); - cat.warn("D'oh! A deer! A female deer!"); - cat.warn("Truly, yours is a butt that won't quit." + - "- Bart, writing as Woodrow to Ms. Krabappel."); - - cat.error("Dear Baby, Welcome to Dumpsville. Population: you."); - cat.error("Dear Baby, Welcome to Dumpsville. Population: you.", - new IOException("Dumpsville, USA")); - cat.error("Mr. Hutz, are you aware you're not wearing pants?"); - cat.error("Mr. Hutz, are you aware you're not wearing pants?", - new IllegalStateException("Error !!")); - - - cat.fatal("Eep."); - cat.fatal("Mmm...forbidden donut.", - new SecurityException("Fatal Exception")); - cat.fatal("D'oh! A deer! A female deer!"); - cat.fatal("Mmmmmm .... Chocolate.", - new SecurityException("Fatal Exception")); - } - - //-------------------------------------------------------------------------- - // Protected Methods: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Methods: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Nested Top-Level Classes or Interfaces: - //-------------------------------------------------------------------------- + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + + private static Logger logger = + Logger.getLogger(InitUsingXMLPropertiesFile.class); + + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String argv[]) { + // Use a PropertyConfigurator to initialize from a property file. + String resource = + "/examples/lf5/InitUsingXMLPropertiesFile/example.xml"; + URL configFileResource = + InitUsingXMLPropertiesFile.class.getResource(resource); + DOMConfigurator.configure(configFileResource.getFile()); + + // Add a bunch of logging statements ... + logger.debug("Hello, my name is Homer Simpson."); + logger.debug("Hello, my name is Lisa Simpson."); + logger.debug("Hello, my name is Marge Simpson."); + logger.debug("Hello, my name is Bart Simpson."); + logger.debug("Hello, my name is Maggie Simpson."); + + logger.info("We are the Simpsons!"); + logger.info("Mmmmmm .... Chocolate."); + logger.info("Homer likes chocolate"); + logger.info("Doh!"); + logger.info("We are the Simpsons!"); + + logger.warn("Bart: I am through with working! Working is for chumps!" + + "Homer: Son, I'm proud of you. I was twice your age before " + + "I figured that out."); + logger.warn("Mmm...forbidden donut."); + logger.warn("D'oh! A deer! A female deer!"); + logger.warn("Truly, yours is a butt that won't quit." + + "- Bart, writing as Woodrow to Ms. Krabappel."); + + logger.error("Dear Baby, Welcome to Dumpsville. Population: you."); + logger.error("Dear Baby, Welcome to Dumpsville. Population: you.", + new IOException("Dumpsville, USA")); + logger.error("Mr. Hutz, are you aware you're not wearing pants?"); + logger.error("Mr. Hutz, are you aware you're not wearing pants?", + new IllegalStateException("Error !!")); + + + logger.fatal("Eep."); + logger.fatal("Mmm...forbidden donut.", + new SecurityException("Fatal Exception")); + logger.fatal("D'oh! A deer! A female deer!"); + logger.fatal("Mmmmmm .... Chocolate.", + new SecurityException("Fatal Exception")); + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- } diff --git a/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java b/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java index cd3b28d142..832ed95842 100644 --- a/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java +++ b/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java @@ -9,7 +9,6 @@ package examples.lf5.UsingLogMonitorAdapter; import org.apache.log4j.lf5.LogLevel; -import org.apache.log4j.lf5.util.AdapterLogRecord; import org.apache.log4j.lf5.util.LogMonitorAdapter; /** @@ -26,74 +25,74 @@ // Contributed by ThoughtWorks Inc. public class CustomizedLogLevels { - //-------------------------------------------------------------------------- - // Constants: - //-------------------------------------------------------------------------- - public final static LogLevel LEVEL_ONE = new LogLevel("LEVEL 1", 1); - public final static LogLevel LEVEL_TWO = new LogLevel("LEVEL 2", 2); - public final static LogLevel LEVEL_THREE = new LogLevel("LEVEL 3", 3); - public final static LogLevel LEVEL_FOUR = new LogLevel("LEVEL 4", 4); - public final static LogLevel DEFAULT = new LogLevel("DEFAULT", 0); - - //-------------------------------------------------------------------------- - // Protected Variables: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Variables: - //-------------------------------------------------------------------------- - private static LogMonitorAdapter _adapter; - - static { - // The first LogLevel in the Array will be used as the default LogLevel. - _adapter = LogMonitorAdapter.newInstance(new LogLevel[]{DEFAULT, LEVEL_ONE, - LEVEL_TWO, LEVEL_THREE, LEVEL_FOUR, LogLevel.FATAL}); - // if a different log level is to be used it can be specified as such - // _adapter.setDefaultLevel(LEVEL_THREE); - } - //-------------------------------------------------------------------------- - // Constructors: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Public Methods: - //-------------------------------------------------------------------------- - - public static void main(String[] args) { - CustomizedLogLevels test = new CustomizedLogLevels(); - test.doMyBidding(); - } - - public void doMyBidding() { - // tell the LogMonitorAdapter which LogLevel is the severe Level if necessary - _adapter.setSevereLevel(LEVEL_ONE); - - String levels = this.getClass().getName(); - - // will used the default Level - _adapter.log(levels, "Using the customized LogLevels"); - - _adapter.log(levels, LEVEL_FOUR, "This is a test"); - _adapter.log(levels, LEVEL_THREE, "Hmmm fobidden doughnut"); - _adapter.log(levels, LEVEL_ONE, "Danger Danger Will Robinson", - new RuntimeException("DANGER"), "32"); - _adapter.log(levels, LEVEL_TWO, "Exit stage right->"); - _adapter.log(levels, LEVEL_FOUR, "What's up Doc?", - new NullPointerException("Unfortunate exception")); - - } - - //-------------------------------------------------------------------------- - // Protected Methods: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Methods: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Nested Top-Level Classes or Interfaces: - //-------------------------------------------------------------------------- + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + public final static LogLevel LEVEL_ONE = new LogLevel("LEVEL 1", 1); + public final static LogLevel LEVEL_TWO = new LogLevel("LEVEL 2", 2); + public final static LogLevel LEVEL_THREE = new LogLevel("LEVEL 3", 3); + public final static LogLevel LEVEL_FOUR = new LogLevel("LEVEL 4", 4); + public final static LogLevel DEFAULT = new LogLevel("DEFAULT", 0); + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + private static LogMonitorAdapter _adapter; + + static { + // The first LogLevel in the Array will be used as the default LogLevel. + _adapter = LogMonitorAdapter.newInstance(new LogLevel[]{DEFAULT, LEVEL_ONE, + LEVEL_TWO, LEVEL_THREE, LEVEL_FOUR, LogLevel.FATAL}); + // if a different log level is to be used it can be specified as such + // _adapter.setDefaultLevel(LEVEL_THREE); + } + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String[] args) { + CustomizedLogLevels test = new CustomizedLogLevels(); + test.doMyBidding(); + } + + public void doMyBidding() { + // tell the LogMonitorAdapter which LogLevel is the severe Level if necessary + _adapter.setSevereLevel(LEVEL_ONE); + + String levels = this.getClass().getName(); + + // will used the default Level + _adapter.log(levels, "Using the customized LogLevels"); + + _adapter.log(levels, LEVEL_FOUR, "This is a test"); + _adapter.log(levels, LEVEL_THREE, "Hmmm fobidden doughnut"); + _adapter.log(levels, LEVEL_ONE, "Danger Danger Will Robinson", + new RuntimeException("DANGER"), "32"); + _adapter.log(levels, LEVEL_TWO, "Exit stage right->"); + _adapter.log(levels, LEVEL_FOUR, "What's up Doc?", + new NullPointerException("Unfortunate exception")); + + } + + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- } diff --git a/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java b/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java index 6943a31207..04848592a0 100644 --- a/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java +++ b/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java @@ -54,16 +54,16 @@ public static void main(String[] args) { } public void doMyBidding() { - String category = this.getClass().getName(); + String logger = this.getClass().getName(); // will default to debug log level - _adapter.log(category, "Doh this is a debugging"); + _adapter.log(logger, "Doh this is a debugging"); - _adapter.log(category, LogLevel.INFO, "Hmmm fobidden doughnut"); - _adapter.log(category, LogLevel.WARN, "Danger Danger Will Robinson", + _adapter.log(logger, LogLevel.INFO, "Hmmm fobidden doughnut"); + _adapter.log(logger, LogLevel.WARN, "Danger Danger Will Robinson", new RuntimeException("DANGER"), "32"); - _adapter.log(category, LogLevel.ERROR, "Exit stage right->"); - _adapter.log(category, LogLevel.FATAL, "What's up Doc?", + _adapter.log(logger, LogLevel.ERROR, "Exit stage right->"); + _adapter.log(logger, LogLevel.FATAL, "What's up Doc?", new NullPointerException("Unfortunate exception")); } diff --git a/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java b/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java index a40cfddc21..427489013e 100644 --- a/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java +++ b/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java @@ -8,7 +8,7 @@ package examples.lf5.UsingSocketAppenders; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import java.io.IOException; @@ -34,99 +34,99 @@ // Contributed by ThoughtWorks Inc. public class UsingSocketAppenders { - //-------------------------------------------------------------------------- - // Constants: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Protected Variables: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Private Variables: - //-------------------------------------------------------------------------- - - private static Category cat1 = - Category.getInstance(UsingSocketAppenders.class); - private static Category cat2 = - Category.getInstance("TestClass.Subclass"); - private static Category cat3 = - Category.getInstance("TestClass.Subclass.Subclass"); - //-------------------------------------------------------------------------- - // Constructors: - //-------------------------------------------------------------------------- - - //-------------------------------------------------------------------------- - // Public Methods: - //-------------------------------------------------------------------------- - - public static void main(String argv[]) { - // Use a PropertyConfigurator to initialize from a property file. - String resource = - "/examples/lf5/UsingSocketAppenders/socketclient.properties"; - URL configFileResource = - UsingSocketAppenders.class.getResource(resource); - PropertyConfigurator.configure(configFileResource); - - // Add a bunch of logging statements ... - cat1.debug("Hello, my name is Homer Simpson."); - cat1.debug("Hello, my name is Lisa Simpson."); - cat2.debug("Hello, my name is Marge Simpson."); - cat2.debug("Hello, my name is Bart Simpson."); - cat3.debug("Hello, my name is Maggie Simpson."); - - cat2.info("We are the Simpsons!"); - cat2.info("Mmmmmm .... Chocolate."); - cat3.info("Homer likes chocolate"); - cat3.info("Doh!"); - cat3.info("We are the Simpsons!"); - - cat1.warn("Bart: I am through with working! Working is for chumps!" + - "Homer: Son, I'm proud of you. I was twice your age before " + - "I figured that out."); - cat1.warn("Mmm...forbidden donut."); - cat1.warn("D'oh! A deer! A female deer!"); - cat1.warn("Truly, yours is a butt that won't quit." + - "- Bart, writing as Woodrow to Ms. Krabappel."); - - cat2.error("Dear Baby, Welcome to Dumpsville. Population: you."); - cat2.error("Dear Baby, Welcome to Dumpsville. Population: you.", - new IOException("Dumpsville, USA")); - cat3.error("Mr. Hutz, are you aware you're not wearing pants?"); - cat3.error("Mr. Hutz, are you aware you're not wearing pants?", - new IllegalStateException("Error !!")); - - - cat3.fatal("Eep."); - - cat3.fatal("Mmm...forbidden donut.", - new SecurityException("Fatal Exception ... ")); - - cat3.fatal("D'oh! A deer! A female deer!"); - cat2.fatal("Mmmmmm .... Chocolate.", - new SecurityException("Fatal Exception")); - - // Put the main thread is put to sleep for 5 seconds to allow the - // SocketServer to process all incoming messages before the Socket is - // closed. This is done to overcome some basic limitations with the - // way the SocketServer and SocketAppender classes manage sockets. - try { - Thread.currentThread().sleep(5000); - } catch (InterruptedException ie) { - } + //-------------------------------------------------------------------------- + // Constants: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Protected Variables: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Private Variables: + //-------------------------------------------------------------------------- + + private static Logger logger1 = + Logger.getLogger(UsingSocketAppenders.class); + private static Logger logger2 = + Logger.getLogger("TestClass.Subclass"); + private static Logger logger3 = + Logger.getLogger("TestClass.Subclass.Subclass"); + //-------------------------------------------------------------------------- + // Constructors: + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Public Methods: + //-------------------------------------------------------------------------- + + public static void main(String argv[]) { + // Use a PropertyConfigurator to initialize from a property file. + String resource = + "/examples/lf5/UsingSocketAppenders/socketclient.properties"; + URL configFileResource = + UsingSocketAppenders.class.getResource(resource); + PropertyConfigurator.configure(configFileResource); + + // Add a bunch of logging statements ... + logger1.debug("Hello, my name is Homer Simpson."); + logger1.debug("Hello, my name is Lisa Simpson."); + logger2.debug("Hello, my name is Marge Simpson."); + logger2.debug("Hello, my name is Bart Simpson."); + logger3.debug("Hello, my name is Maggie Simpson."); + + logger2.info("We are the Simpsons!"); + logger2.info("Mmmmmm .... Chocolate."); + logger3.info("Homer likes chocolate"); + logger3.info("Doh!"); + logger3.info("We are the Simpsons!"); + + logger1.warn("Bart: I am through with working! Working is for chumps!" + + "Homer: Son, I'm proud of you. I was twice your age before " + + "I figured that out."); + logger1.warn("Mmm...forbidden donut."); + logger1.warn("D'oh! A deer! A female deer!"); + logger1.warn("Truly, yours is a butt that won't quit." + + "- Bart, writing as Woodrow to Ms. Krabappel."); + + logger2.error("Dear Baby, Welcome to Dumpsville. Population: you."); + logger2.error("Dear Baby, Welcome to Dumpsville. Population: you.", + new IOException("Dumpsville, USA")); + logger3.error("Mr. Hutz, are you aware you're not wearing pants?"); + logger3.error("Mr. Hutz, are you aware you're not wearing pants?", + new IllegalStateException("Error !!")); + + + logger3.fatal("Eep."); + + logger3.fatal("Mmm...forbidden donut.", + new SecurityException("Fatal Exception ... ")); + + logger3.fatal("D'oh! A deer! A female deer!"); + logger2.fatal("Mmmmmm .... Chocolate.", + new SecurityException("Fatal Exception")); + + // Put the main thread is put to sleep for 5 seconds to allow the + // SocketServer to process all incoming messages before the Socket is + // closed. This is done to overcome some basic limitations with the + // way the SocketServer and SocketAppender classes manage sockets. + try { + Thread.currentThread().sleep(5000); + } catch (InterruptedException ie) { + } - } + } - //-------------------------------------------------------------------------- - // Protected Methods: - //-------------------------------------------------------------------------- + //-------------------------------------------------------------------------- + // Protected Methods: + //-------------------------------------------------------------------------- - //-------------------------------------------------------------------------- - // Private Methods: - //-------------------------------------------------------------------------- + //-------------------------------------------------------------------------- + // Private Methods: + //-------------------------------------------------------------------------- - //-------------------------------------------------------------------------- - // Nested Top-Level Classes or Interfaces: - //-------------------------------------------------------------------------- + //-------------------------------------------------------------------------- + // Nested Top-Level Classes or Interfaces: + //-------------------------------------------------------------------------- } From c9426ff1cce9548673f3040a18defc7c7b6e9174 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 26 Jul 2002 18:23:34 +0000 Subject: [PATCH 060/342] Added test cases for MDC transmission over the wire and its handling by the receiver. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309622 13f79535-47bb-0310-9956-ffa450edef68 --- tests/build.xml | 2 +- tests/input/socketServer6.properties | 8 ++ .../apache/log4j/net/ShortSocketServer.java | 3 + .../log4j/net/SocketServerTestCase.java | 93 ++++++++++++++++++- tests/witness/socketServer.6 | 35 +++++++ tests/witness/socketServer.7 | 35 +++++++ tests/witness/socketServer.8 | 35 +++++++ 7 files changed, 205 insertions(+), 6 deletions(-) create mode 100644 tests/input/socketServer6.properties create mode 100644 tests/witness/socketServer.6 create mode 100644 tests/witness/socketServer.7 create mode 100644 tests/witness/socketServer.8 diff --git a/tests/build.xml b/tests/build.xml index e309f5fd03..8ea45c8b67 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -170,7 +170,7 @@ - + diff --git a/tests/input/socketServer6.properties b/tests/input/socketServer6.properties new file mode 100644 index 0000000000..5c0742a922 --- /dev/null +++ b/tests/input/socketServer6.properties @@ -0,0 +1,8 @@ +log4j.rootLogger=DEBUG, A +log4j.Logger.org.apache.log4j.test.ShortSocketServer=WARN +log4j.Logger.org.apache.log4j.net.SocketNode=WARN +log4j.appender.A=org.apache.log4j.FileAppender +log4j.appender.A.file=output/temp +log4j.appender.A.Append=false +log4j.appender.A.layout=org.apache.log4j.PatternLayout +log4j.appender.A.layout.ConversionPattern=%5p %x %X{hostID} %X{key6} [%t] %c{1} - %m%n diff --git a/tests/src/java/org/apache/log4j/net/ShortSocketServer.java b/tests/src/java/org/apache/log4j/net/ShortSocketServer.java index 4da0259ed9..33e0d56337 100644 --- a/tests/src/java/org/apache/log4j/net/ShortSocketServer.java +++ b/tests/src/java/org/apache/log4j/net/ShortSocketServer.java @@ -15,6 +15,7 @@ import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.apache.log4j.PropertyConfigurator; +import org.apache.log4j.MDC; import org.apache.log4j.helpers.LogLog; import org.apache.log4j.net.SocketNode; import org.apache.log4j.net.SocketServer; @@ -51,6 +52,8 @@ void main(String args[]) throws Exception { LogLog.debug("Listening on port " + SocketServerTestCase.PORT); ServerSocket serverSocket = new ServerSocket(SocketServerTestCase.PORT); + MDC.put("hostID", "shortSocketServer"); + for(int i = 1; i <= totalTests; i++) { PropertyConfigurator.configure(prefix+i+".properties"); LogLog.debug("Waiting to accept a new client."); diff --git a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java index defbbd4973..d4c67cfb08 100644 --- a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java +++ b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java @@ -58,6 +58,17 @@ public class SocketServerTestCase extends TestCase { static String PAT5 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some5 T5 MDC-TEST5 \\[main]\\" + " (root|SocketServerTestCase) - Message \\d{1,2}"; + static String PAT6 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some6 T6 client-test6 MDC-TEST6" + + " \\[main]\\ (root|SocketServerTestCase) - Message \\d{1,2}"; + + static String PAT7 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some7 T7 client-test7 MDC-TEST7" + + " \\[main]\\ (root|SocketServerTestCase) - Message \\d{1,2}"; + + // DEBUG some8 T8 shortSocketServer MDC-TEST7 [main] SocketServerTestCase - Message 1 + static String PAT8 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some8 T8 shortSocketServer" + + " MDC-TEST8 \\[main]\\ (root|SocketServerTestCase) - Message \\d{1,2}"; + + static String EXCEPTION1 = "java.lang.Exception: Just testing"; static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; @@ -163,11 +174,11 @@ public void test4() throws Exception { } /** - * The pattern on the server side: %5p %x %X{key1}%X{key5} [%t] %c{1} - %m%n + * The pattern on the server side: %5p %x %X{key1}%X{key5} [%t] %c{1} - %m%n * - * The test case uses wraps an AsyncAppender around the - * SocketAppender. This tests was written specifically for bug - * report #9155. + * The test case uses wraps an AsyncAppender around the + * SocketAppender. This tests was written specifically for bug + * report #9155. * Prior to the bug fix the output on the server did not contain the * MDC-TEST5 string because the MDC clone operation (in getMDCCopy @@ -192,10 +203,79 @@ public void test5() throws Exception { EXCEPTION2, EXCEPTION3}); Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); - assertTrue(Compare.compare(FILTERED, "witness/socketServer.5")); } + /** + * The pattern on the server side: %5p %x %X{hostID}${key6} [%t] %c{1} - %m%n + * + * This test checks whether client-side MDC overrides the server side. + * It uses an AsyncAppender encapsulating a SocketAppender + */ + public void test6() throws Exception { + socketAppender = new SocketAppender("localhost", PORT); + socketAppender.setLocationInfo(true); + AsyncAppender asyncAppender = new AsyncAppender(); + asyncAppender.setLocationInfo(true); + asyncAppender.addAppender(socketAppender); + rootLogger.addAppender(asyncAppender); + + NDC.push("some6"); + MDC.put("hostID", "client-test6"); + common("T6", "key6", "MDC-TEST6"); + NDC.pop(); + MDC.remove("hostID"); + delay(2); + ControlFilter cf = new ControlFilter(new String[]{PAT6, EXCEPTION1, + EXCEPTION2, EXCEPTION3}); + + Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); + assertTrue(Compare.compare(FILTERED, "witness/socketServer.6")); + } + + /** + * The pattern on the server side: %5p %x %X{hostID}${key7} [%t] %c{1} - %m%n + * + * This test checks whether client-side MDC overrides the server side. + */ + public void test7() throws Exception { + socketAppender = new SocketAppender("localhost", PORT); + socketAppender.setLocationInfo(true); + rootLogger.addAppender(socketAppender); + + NDC.push("some7"); + MDC.put("hostID", "client-test7"); + common("T7", "key7", "MDC-TEST7"); + NDC.pop(); + MDC.remove("hostID"); + delay(2); + ControlFilter cf = new ControlFilter(new String[]{PAT7, EXCEPTION1, + EXCEPTION2, EXCEPTION3}); + + Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); + assertTrue(Compare.compare(FILTERED, "witness/socketServer.7")); + } + + /** + * The pattern on the server side: %5p %x %X{hostID}${key7} [%t] %c{1} - %m%n + * + * This test checks whether server side MDC works. + */ + public void test8() throws Exception { + socketAppender = new SocketAppender("localhost", PORT); + socketAppender.setLocationInfo(true); + rootLogger.addAppender(socketAppender); + + NDC.push("some8"); + common("T8", "key8", "MDC-TEST8"); + NDC.pop(); + delay(2); + ControlFilter cf = new ControlFilter(new String[]{PAT8, EXCEPTION1, + EXCEPTION2, EXCEPTION3}); + + Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); + assertTrue(Compare.compare(FILTERED, "witness/socketServer.8")); + } static void common(String dc, String key, Object o) { @@ -230,6 +310,9 @@ public static Test suite() { suite.addTest(new SocketServerTestCase("test3")); suite.addTest(new SocketServerTestCase("test4")); suite.addTest(new SocketServerTestCase("test5")); + suite.addTest(new SocketServerTestCase("test6")); + suite.addTest(new SocketServerTestCase("test7")); + suite.addTest(new SocketServerTestCase("test8")); return suite; } } diff --git a/tests/witness/socketServer.6 b/tests/witness/socketServer.6 new file mode 100644 index 0000000000..056383ce08 --- /dev/null +++ b/tests/witness/socketServer.6 @@ -0,0 +1,35 @@ +DEBUG some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 1 +DEBUG some6 T6 client-test6 MDC-TEST6 [main] root - Message 2 + INFO some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 3 + WARN some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 4 +LETHAL some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 5 +DEBUG some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 6 +java.lang.Exception: Just testing + at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) + at org.apache.log4j.net.SocketServerTestCase.test6(SocketServerTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) +ERROR some6 T6 client-test6 MDC-TEST6 [main] root - Message 7 +java.lang.Exception: Just testing + at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) + at org.apache.log4j.net.SocketServerTestCase.test6(SocketServerTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.7 b/tests/witness/socketServer.7 new file mode 100644 index 0000000000..119757865c --- /dev/null +++ b/tests/witness/socketServer.7 @@ -0,0 +1,35 @@ +DEBUG some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 1 +DEBUG some7 T7 client-test7 MDC-TEST7 [main] root - Message 2 + INFO some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 3 + WARN some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 4 +LETHAL some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 5 +DEBUG some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 6 +java.lang.Exception: Just testing + at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) + at org.apache.log4j.net.SocketServerTestCase.test7(SocketServerTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) +ERROR some7 T7 client-test7 MDC-TEST7 [main] root - Message 7 +java.lang.Exception: Just testing + at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) + at org.apache.log4j.net.SocketServerTestCase.test7(SocketServerTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.8 b/tests/witness/socketServer.8 new file mode 100644 index 0000000000..a3964faf50 --- /dev/null +++ b/tests/witness/socketServer.8 @@ -0,0 +1,35 @@ +DEBUG some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 1 +DEBUG some8 T8 shortSocketServer MDC-TEST8 [main] root - Message 2 + INFO some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 3 + WARN some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 4 +LETHAL some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 5 +DEBUG some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 6 +java.lang.Exception: Just testing + at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) + at org.apache.log4j.net.SocketServerTestCase.test8(SocketServerTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) +ERROR some8 T8 shortSocketServer MDC-TEST8 [main] root - Message 7 +java.lang.Exception: Just testing + at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) + at org.apache.log4j.net.SocketServerTestCase.test8(SocketServerTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) From 7f780e868518f6ffabffb494ad0c9b2accdeeddf Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 31 Jul 2002 09:25:14 +0000 Subject: [PATCH 061/342] - Addition of new options in JMSAppender and new command line arguments in JMSSink. [*] - Added new method getLoggerName() in LoggingEvent class. The getLoggerName is the preferred way for accessing the logger name. The public access categoryName field should not be accessed directly. Similarly, added the getLevel method which is now the preferred way of accessing the event's level. The public access level field should not be accessd directly. The javadocs now mark the categoryName and level fields as deprecated. Modified existing appenders to comply with these new directives. [*] - Log4j now will check if a system property called "log4j.ignoreTCL" is set. If it is it will ignore the Thread Context ClassLoader when loading classes. This solves the irrating "appender is not appender" messages observed when log4j.jar is loaded by multiple class loaders. [*] PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309623 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 7 +- docs/HISTORY | 30 +- .../org/apache/log4j/AppenderSkeleton.java | 2 +- src/java/org/apache/log4j/HTMLLayout.java | 14 +- src/java/org/apache/log4j/SimpleLayout.java | 2 +- src/java/org/apache/log4j/TTCCLayout.java | 4 +- .../apache/log4j/chainsaw/EventDetails.java | 4 +- src/java/org/apache/log4j/helpers/Loader.java | 66 +++-- .../apache/log4j/helpers/OptionConverter.java | 4 + .../apache/log4j/helpers/PatternParser.java | 4 +- .../org/apache/log4j/lf5/LF5Appender.java | 6 +- .../org/apache/log4j/net/JMSAppender.java | 262 +++++++++++++++--- src/java/org/apache/log4j/net/JMSSink.java | 100 ++++--- src/java/org/apache/log4j/net/SocketNode.java | 6 +- .../org/apache/log4j/net/SyslogAppender.java | 4 +- .../apache/log4j/nt/NTEventLogAppender.java | 2 +- .../org/apache/log4j/spi/LoggingEvent.java | 54 +++- .../apache/log4j/varia/LevelMatchFilter.java | 2 +- .../apache/log4j/varia/LevelRangeFilter.java | 4 +- src/java/org/apache/log4j/xml/XMLLayout.java | 4 +- 20 files changed, 431 insertions(+), 150 deletions(-) diff --git a/build.xml b/build.xml index 7061549023..e534741c90 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + @@ -383,9 +383,8 @@ header="<b>Log4j ${version}</b>" bottom="Copyright 2000-2002 Apache Software Foundation."> - + + diff --git a/docs/HISTORY b/docs/HISTORY index 3c6b76d014..b8e9d64a79 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -5,7 +5,31 @@ client code. [***] Changes requiring important modifications to existing client code. - July 5th, 2002, + + July 31st, 2002 + + - Release of version 1.2.6 + + - Addition of new options in JMSAppender and new command line arguments in + JMSSink. [*] + + - Added new method getLoggerName() in LoggingEvent class. The + getLoggerName is the preferred way for accessing the logger + name. The public access categoryName field should not be accessed + directly. Similarly, added the getLevel method which is now the + preferred way of accessing the event's level. The public access + level field should not be accessd directly. The javadocs now mark + the categoryName and level fields as deprecated. + + Modified existing appenders to comply with these new directives. [*] + + - Log4j now will check if a system property called "log4j.ignoreTCL" + is set. If it is it will ignore the Thread Context ClassLoader when + loading classes. This solves the irrating "appender is not + appender" messages observed when log4j.jar is loaded by multiple + class loaders. [*] + + July 5th, 2002 - Release of version 1.2.5 @@ -15,7 +39,7 @@ appender instances. This resolves bug #10185 submitted by Paul Voutier. [*] - June 12th, 2002, + June 12th, 2002 - Release of version 1.2.4 @@ -41,7 +65,7 @@ - Added missing LevelRangeFilter file. [*] - May 24th, 2002, + May 24th, 2002 - Release of version 1.2.3 diff --git a/src/java/org/apache/log4j/AppenderSkeleton.java b/src/java/org/apache/log4j/AppenderSkeleton.java index 0309b050d8..d815fcdb69 100644 --- a/src/java/org/apache/log4j/AppenderSkeleton.java +++ b/src/java/org/apache/log4j/AppenderSkeleton.java @@ -203,7 +203,7 @@ void doAppend(LoggingEvent event) { return; } - if(!isAsSevereAsThreshold(event.level)) { + if(!isAsSevereAsThreshold(event.getLevel())) { return; } diff --git a/src/java/org/apache/log4j/HTMLLayout.java b/src/java/org/apache/log4j/HTMLLayout.java index 013b7c59e4..961c301770 100644 --- a/src/java/org/apache/log4j/HTMLLayout.java +++ b/src/java/org/apache/log4j/HTMLLayout.java @@ -130,22 +130,22 @@ String format(LoggingEvent event) { sbuf.append("
      "); - if (event.level.equals(Level.DEBUG)) { + if (event.getLevel().equals(Level.DEBUG)) { sbuf.append(""); - sbuf.append(event.level); + sbuf.append(event.getLevel()); sbuf.append(""); } - else if(event.level.isGreaterOrEqual(Level.WARN)) { + else if(event.getLevel().isGreaterOrEqual(Level.WARN)) { sbuf.append(""); - sbuf.append(event.level); + sbuf.append(event.getLevel()); sbuf.append(""); } else { - sbuf.append(event.level); + sbuf.append(event.getLevel()); } sbuf.append(""); - sbuf.append(Transform.escapeTags(event.categoryName)); + sbuf.append(""); + sbuf.append(Transform.escapeTags(event.getLoggerName())); sbuf.append("" + t); t = (int)setLen(len, second); From ec6497483f31b98bf8f9aff43ba14a4f4f758698 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 9 Oct 2002 20:07:37 +0000 Subject: [PATCH 071/342] Added explnation on the null value of the threshold attribute. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309637 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/xml/log4j.dtd | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/log4j/xml/log4j.dtd b/src/java/org/apache/log4j/xml/log4j.dtd index 2a87e0cadc..da0d81472d 100644 --- a/src/java/org/apache/log4j/xml/log4j.dtd +++ b/src/java/org/apache/log4j/xml/log4j.dtd @@ -15,12 +15,15 @@ element. --> - - - - - - + + + + + + + + + - + diff --git a/docs/HISTORY b/docs/HISTORY index cbd2fd5679..0330702a08 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -6,6 +6,13 @@ [***] Changes requiring important modifications to existing client code. + October 9th, 2002 + + - Release of version 1.2.7 + + - Log4j now searches for the file log4j.xml as well as the file + log4j.properties during log4j initialization. [*] + July 31st, 2002 - Release of version 1.2.6 diff --git a/src/java/org/apache/log4j/MDC.java b/src/java/org/apache/log4j/MDC.java index 4e9271687d..9fd93ffd8b 100644 --- a/src/java/org/apache/log4j/MDC.java +++ b/src/java/org/apache/log4j/MDC.java @@ -88,11 +88,10 @@ void remove(String key) { /** - Get the current thread's MDC as a hashtable. - */ - public - static - Hashtable getContext() { + * Get the current thread's MDC as a hashtable. This method is + * intended to be used internally. + * */ + public static Hashtable getContext() { return mdc.getContext0(); } diff --git a/src/java/org/apache/log4j/PropertyConfigurator.java b/src/java/org/apache/log4j/PropertyConfigurator.java index 27f84468f6..348d273640 100644 --- a/src/java/org/apache/log4j/PropertyConfigurator.java +++ b/src/java/org/apache/log4j/PropertyConfigurator.java @@ -33,8 +33,8 @@ import java.util.Hashtable; /** - Extends {@link BasicConfigurator} to provide configuration from an - external file. See {@link #doConfigure(String, LoggerRepository)} for the + Allows the configuration of log4j from an external file. See + {@link #doConfigure(String, LoggerRepository)} for the expected format.

      It is sometimes useful to see how log4j is reading configuration @@ -100,7 +100,7 @@ public class PropertyConfigurator implements Configurator { /** Read configuration from a file. The existing configuration is not cleared nor reset. If you require a different behavior, - then call {@link BasicConfigurator#resetConfiguration + then call {@link LogManager#resetConfiguration resetConfiguration} method before calling doConfigure. diff --git a/src/java/org/apache/log4j/helpers/Loader.java b/src/java/org/apache/log4j/helpers/Loader.java index 6376ecf42d..4698ca602a 100644 --- a/src/java/org/apache/log4j/helpers/Loader.java +++ b/src/java/org/apache/log4j/helpers/Loader.java @@ -46,9 +46,6 @@ public class Loader { } } - /* A cache for - private static Method GET_TCL_METHOD; - /** This method will search for resource in different places. The rearch order is as follows: @@ -67,7 +64,6 @@ using the system class loader in JDK 1.2 and virtual machine's built-in class loader in JDK 1.1. - */ static public URL getResource(String resource) { ClassLoader classLoader = null; diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index a61259eae6..75f975cfa3 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -733,9 +733,9 @@ void parse(Element element) { // "debug" attribute is returned as the empty string. if(!debugAttrib.equals("") && !debugAttrib.equals("null")) { LogLog.setInternalDebugging(OptionConverter.toBoolean(debugAttrib, true)); - } - else + } else { LogLog.debug("Ignoring " + INTERNAL_DEBUG_ATTR + " attribute."); + } String confDebug = subst(element.getAttribute(CONFIG_DEBUG_ATTR)); diff --git a/src/java/org/apache/log4j/xml/log4j.dtd b/src/java/org/apache/log4j/xml/log4j.dtd index da0d81472d..d92a6e7bc6 100644 --- a/src/java/org/apache/log4j/xml/log4j.dtd +++ b/src/java/org/apache/log4j/xml/log4j.dtd @@ -23,7 +23,7 @@ element. --> - OpenSymphony Logging Primer

      +

    21. + log4j FAQ at jGuru +
    22. +

    23. Think Again by Ceki Gülcü diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 079ddd57cf..bc574c1975 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -9,15 +9,17 @@ -
      -

      log4j 1.2.6 is available in TAR.GZ format - or in ZIP +

      +

      log4j 1.2.7 is available in TAR.GZ format + or in ZIP format.

      -

      Release 1.2.6 fixes minor bugs. See the HISTORY file for the exact details. +

      As of release 1.2.7 log4j now searches for the file log4j.xml + as well as the file log4j.properties during + initialization. See the HISTORY file for + the firther details.

      In addition to many performance improvements, bug fixes, and From af6549a3724e3886785fcb9ea25a18a9efa2ca36 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 22 Oct 2002 17:44:54 +0000 Subject: [PATCH 073/342] An apparently successful attempt at solving the log4j.jar locking problem. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309654 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/xml/DOMConfigurator.java | 11 +--- .../apache/log4j/xml/Log4jEntityResolver.java | 59 +++++++++++++++++++ 2 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 src/java/org/apache/log4j/xml/Log4jEntityResolver.java diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index 75f975cfa3..77ff534a70 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -659,16 +659,7 @@ void doConfigure(InputSource inputSource, LoggerRepository repository) DocumentBuilder docBuilder = dbf.newDocumentBuilder(); docBuilder.setErrorHandler(new SAXErrorHandler()); - Class clazz = this.getClass(); - URL dtdURL = clazz.getResource("/org/apache/log4j/xml/log4j.dtd"); - if(dtdURL == null) { - LogLog.error("Could not find [log4j.dtd]. Used ["+clazz.getClassLoader()+ - "] class loader in the search."); - } - else { - LogLog.debug("URL to log4j.dtd is [" + dtdURL.toString()+"]."); - inputSource.setSystemId(dtdURL.toString()); - } + docBuilder.setEntityResolver(new Log4jEntityResolver()); Document doc = docBuilder.parse(inputSource); parse(doc.getDocumentElement()); } catch (Exception e) { diff --git a/src/java/org/apache/log4j/xml/Log4jEntityResolver.java b/src/java/org/apache/log4j/xml/Log4jEntityResolver.java new file mode 100644 index 0000000000..0ca96f3b67 --- /dev/null +++ b/src/java/org/apache/log4j/xml/Log4jEntityResolver.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ + +package org.apache.log4j.xml; + +import java.io.InputStream; +import java.io.ByteArrayOutputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; + +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; + +import org.apache.log4j.helpers.LogLog; + +/** + * An {@link EntityResolver} specifically designed to return + * log4j.dtd which is embedded within the log4j jar + * file. + * + * @author Paul Austin + * @auhtor Ceki Gülcü + * */ +public class Log4jEntityResolver implements EntityResolver { + + public InputSource resolveEntity (String publicId, String systemId) { + if (systemId.endsWith("log4j.dtd")) { + Class clazz = getClass(); + InputStream in = clazz.getResourceAsStream("/org/apache/log4j/xml/log4j.dtd"); + if (in == null) { + LogLog.error("Could not find [log4j.dtd]. Used [" + clazz.getClassLoader() + + "] class loader in the search."); + return null; + } + + // Return a copy of log4j.dtd. This solves problems with not + // being able to remove the log4j.jar file on Windows systems. + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int i; + while((i = in.read(buf)) != -1) { + bos.write(buf, 0, i); + } + in.close(); + return new InputSource(new ByteArrayInputStream(bos.toByteArray())); + } catch(IOException e) { + LogLog.error("Could not read log4j.dtd.", e); + return null; + } + } else { + return null; + } + } +} From e601c220cb579389a22a76f9d240121a89fac6cf Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 23 Oct 2002 07:30:53 +0000 Subject: [PATCH 074/342] Further simplified Log4jEntityResolver such that InputStream returned by clazz.getResourceAsStream("/org/apache/log4j/xml/log4j.dtd") is simply handed to InputSource() constructor instead of copying the InputStream to a ByteArrayInputStream and then passing that to the constructor. The previous code was inspired from bug report #3058. See http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3058 for details. The current code is just what Paul Austin supplied. I also removed my name from the authors list since my contribution is now nil. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309659 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/log4j/xml/Log4jEntityResolver.java | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/src/java/org/apache/log4j/xml/Log4jEntityResolver.java b/src/java/org/apache/log4j/xml/Log4jEntityResolver.java index 0ca96f3b67..79707cbf83 100644 --- a/src/java/org/apache/log4j/xml/Log4jEntityResolver.java +++ b/src/java/org/apache/log4j/xml/Log4jEntityResolver.java @@ -23,7 +23,6 @@ * file. * * @author Paul Austin - * @auhtor Ceki Gülcü * */ public class Log4jEntityResolver implements EntityResolver { @@ -35,22 +34,8 @@ public InputSource resolveEntity (String publicId, String systemId) { LogLog.error("Could not find [log4j.dtd]. Used [" + clazz.getClassLoader() + "] class loader in the search."); return null; - } - - // Return a copy of log4j.dtd. This solves problems with not - // being able to remove the log4j.jar file on Windows systems. - try { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] buf = new byte[1024]; - int i; - while((i = in.read(buf)) != -1) { - bos.write(buf, 0, i); - } - in.close(); - return new InputSource(new ByteArrayInputStream(bos.toByteArray())); - } catch(IOException e) { - LogLog.error("Could not read log4j.dtd.", e); - return null; + } else { + return new InputSource(in); } } else { return null; From 680d100f2796942ce90262035bf757a9fc6421df Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 18 Feb 2003 16:39:01 +0000 Subject: [PATCH 075/342] Added test case in response to bug 11570. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309737 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/log4j/xml/XMLLayoutTestCase.java | 15 ++++++++++- tests/witness/xmlLayout.null | 26 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 tests/witness/xmlLayout.null diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java index 5941c66cc4..a028587a23 100644 --- a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java @@ -71,6 +71,18 @@ public void testCDATA() throws Exception { assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.3")); } + public void testNull() throws Exception { + XMLLayout xmlLayout = new XMLLayout(); + root.addAppender(new FileAppender(xmlLayout, TEMP, false)); + logger.debug("hi"); + logger.debug(null); + Exception e = new Exception(null); + logger.debug("hi", e); + Transformer.transform(TEMP, FILTERED, new Filter[] {new LineNumberFilter(), + new XMLTimestampFilter()}); + assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.null")); + } + void common() { int i = -1; @@ -84,7 +96,7 @@ void common() { logger.warn ("Message " + ++i); root.warn("Message " + i); - + logger.error("Message " + ++i); root.error("Message " + i); @@ -104,6 +116,7 @@ public static Test suite() { suite.addTest(new XMLLayoutTestCase("basic")); suite.addTest(new XMLLayoutTestCase("locationInfo")); suite.addTest(new XMLLayoutTestCase("testCDATA")); + suite.addTest(new XMLLayoutTestCase("testNull")); return suite; } diff --git a/tests/witness/xmlLayout.null b/tests/witness/xmlLayout.null new file mode 100644 index 0000000000..a6b1c7fa94 --- /dev/null +++ b/tests/witness/xmlLayout.null @@ -0,0 +1,26 @@ + + + + + + + + + + + + + From e87c632e10235c397fcc485cca3b94b8d9fed593 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 18 Feb 2003 16:50:13 +0000 Subject: [PATCH 076/342] - Fixed bug #11570 whereby XMLAppender would throw a NullPointerException if the input message was null. Many thanks to David Vandegrift for reporting the bug and to Hendrik Brummermann for supplying the patch. [*] - Fixed bug #12366 whereby various versions of Xerces would not parse log4j configuration scripts expressed in XML format. [*] - Fixed bug #15599. SocketAppender now honors ReconnectionDelay of 0. Many thanks to Scott Schram for reporting the bug and providing the fix. [*] PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309738 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/HISTORY | 17 +++++++ docs/manual.html | 11 +++-- .../org/apache/log4j/helpers/Transform.java | 6 ++- .../org/apache/log4j/net/SocketAppender.java | 11 +++-- src/xdocs/documentation.xml | 31 +++++++++--- src/xdocs/download.xml | 48 ++++++++----------- 7 files changed, 83 insertions(+), 43 deletions(-) diff --git a/build.xml b/build.xml index 98653e620d..7ddc86b541 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY b/docs/HISTORY index 0330702a08..524ea9d394 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -5,6 +5,23 @@ client code. [***] Changes requiring important modifications to existing client code. + - February 18th, 2003 + +http://nagoya.apache.org/bugzilla/show_bug.cgi?id=11570 + + +XML Appender throws NullPointerException when logging null + + - Fixed bug #11570 whereby XMLAppender would throw a + NullPointerException if the input message was null. Many thanks to + David Vandegrift for reporting the bug and to Hendrik Brummermann for + supplying the patch. [*] + + - Fixed bug #12366 whereby various versions of Xerces would not parse + log4j configuration scripts expressed in XML format. [*] + + - Fixed bug #15599. SocketAppender now honors ReconnectionDelay of 0. + Many thanks to Scott Schram for reporting the bug and providing the fix. [*] October 9th, 2002 diff --git a/docs/manual.html b/docs/manual.html index 69e8eedce7..e946f9d9ab 100644 --- a/docs/manual.html +++ b/docs/manual.html @@ -22,11 +22,12 @@

      Short introduction to log4j

      distribution. This document is based on the article "Log4j delivers control over logging" published in November 2000 - edition of JavaWorld. However, the - present article contains more detailed and up to date - information. The short manual also borrows some text from the - book "log4j: the Manual" by the same author (yours truly). + edition of JavaWorld. However, the present article contains more + detailed and up to date information. The present short manual + also borrows some text from + "The complete log4j manual" by the same author + (yours truly).

      Abstract

      diff --git a/src/java/org/apache/log4j/helpers/Transform.java b/src/java/org/apache/log4j/helpers/Transform.java index fe2ef9d54f..d02b63ed75 100644 --- a/src/java/org/apache/log4j/helpers/Transform.java +++ b/src/java/org/apache/log4j/helpers/Transform.java @@ -71,8 +71,12 @@ static public String escapeTags(String input) { * @param str The String that is inserted into an existing CDATA Section within buf. * */ static public void appendEscapingCDATA(StringBuffer buf, String str) { - int end = str.indexOf(CDATA_END); + if(str == null) { + buf.append(""); + return; + } + int end = str.indexOf(CDATA_END); if (end < 0) { buf.append(str); return; diff --git a/src/java/org/apache/log4j/net/SocketAppender.java b/src/java/org/apache/log4j/net/SocketAppender.java index fcdb27b386..ddb4145e61 100644 --- a/src/java/org/apache/log4j/net/SocketAppender.java +++ b/src/java/org/apache/log4j/net/SocketAppender.java @@ -194,9 +194,14 @@ void connect(InetAddress address, int port) { cleanUp(); oos = new ObjectOutputStream(new Socket(address, port).getOutputStream()); } catch(IOException e) { - LogLog.error("Could not connect to remote log4j server at [" - +address.getHostName()+"]. We will try again later.", e); - fireConnector(); + + String msg = "Could not connect to remote log4j server at [" + +address.getHostName()+"]."; + if(reconnectionDelay > 0) { + msg += " We will try again later."; + fireConnector(); // fire the connector thread + } + LogLog.error(msg, e); } } diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index 2cecc63b8b..293419bd71 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -10,18 +10,22 @@
      -

      The following documentation is included with the standard log4j - distribution and also browsable online:

      +

      With the exception of the complete manual, the following + documentation is included with the standard log4j distribution + and also browsable online: +

      +

    24. Supporting the + log4j RepositorySelector by Ceki + Gülcü +
    25. + +

    26. Log4j class + diagrams, courtesy of David Tonhofer +
    27. +

      + +

    28. Advanced + Log4j Louisville JUG presentation by Jonathan Cowherd
    29. +

      If you would like your log4j-relateed article to be listed here, then please send a note to the -

      -

      log4j 1.2.7 is available in TAR.GZ format - or in ZIP +

      +

      log4j 1.2.8 is available in TAR.GZ format + or in ZIP format.

      -

      As of release 1.2.7 log4j now searches for the file log4j.xml +

      As of release 1.2.8 log4j now searches for the file log4j.xml as well as the file log4j.properties during initialization. See the HISTORY file for the firther details. @@ -42,14 +42,15 @@ renaming of the CategoryFactory class to LoggerFactory class such that subclasses of Category class must be modified and - recompiled. By the way, we strongly discourage casual users - from subclassing the Category or - Logger classes. + recompiled. The recommended pattern for extending the + Logger class is wrapping. Moreover, we strongly + discourage casual users from subclassing the + Category or Logger classes.

      We also maintain a list of earlier versions of log4j for download, intended for the curious - paleontologist -- there seems to be thousands of them! + paleontologist -- there seems to be quite a few of them!

      @@ -76,33 +77,26 @@ -
      configLog4j
      +
      JDBCAppender + href="http://www.mannhaupt.com/danko/projects/">JDBCAppender +
      -
      A JDBCAppender by Thomas Fenner. Note - that log4j 1.2 ships with another JDBCAppender - written by Kevin Steppe. +
      A powerful JDBCAppender by Danko Mannhaupt + who continues the work of Thomas Fenner. You might find + this JDBCAppender more suitable then the one that ships with + log4j 1.2.
      -
      JINI - logging service (registration required)
      - -
      A log4j wrapper for JINI by Jerome Bernard.
      - - -
      log4jME
      Log4jME, or log4j MiniEdition, is based on the @@ -139,9 +133,9 @@
      Another full-featured graphical log viewer. After a merger - with a service-orinted company and a change in - business-orientation, the owners of LogFactor5 have decided - to donate their product to the log4j project. + and the subsequent change in business-orientation, the + owners of LogFactor5 have decided to donate their product to + the log4j project.
      From 0c28463a82a6fc494dc7048fee02d12ff17af6ab Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 18 Feb 2003 16:59:25 +0000 Subject: [PATCH 077/342] Removed unintentional crap from the HISTORY file. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309739 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/HISTORY b/docs/HISTORY index 524ea9d394..84d5d41ee0 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -7,11 +7,6 @@ - February 18th, 2003 -http://nagoya.apache.org/bugzilla/show_bug.cgi?id=11570 - - -XML Appender throws NullPointerException when logging null - - Fixed bug #11570 whereby XMLAppender would throw a NullPointerException if the input message was null. Many thanks to David Vandegrift for reporting the bug and to Hendrik Brummermann for From f52c922aacf84d2ca71c830a341a4a8548d38405 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 18 Feb 2003 17:00:02 +0000 Subject: [PATCH 078/342] More editing on the HISTORY file. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309740 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/HISTORY b/docs/HISTORY index 84d5d41ee0..5e29c44b7d 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -5,7 +5,9 @@ client code. [***] Changes requiring important modifications to existing client code. - - February 18th, 2003 + February 18th, 2003 + + - Release of version 1.2.8 - Fixed bug #11570 whereby XMLAppender would throw a NullPointerException if the input message was null. Many thanks to From 6befaf8d23047739506076aa870d1eef137b8ebf Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 18 Feb 2003 17:15:17 +0000 Subject: [PATCH 079/342] Small editing changes PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309741 13f79535-47bb-0310-9956-ffa450edef68 --- docs/manual.html | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/manual.html b/docs/manual.html index e946f9d9ab..bbd4988c60 100644 --- a/docs/manual.html +++ b/docs/manual.html @@ -25,10 +25,9 @@

      Short introduction to log4j

      edition of JavaWorld. However, the present article contains more detailed and up to date information. The present short manual also borrows some text from - "The complete log4j manual" by the same author - (yours truly). - + href="https://www.qos.ch/shop/products/clm_t.jsp">"The + complete log4j manual" by the same author (yours + truly).

      Abstract

      @@ -54,8 +53,8 @@

      Introduction

      latest log4j version, including full-source code, class files and documentation can be found at http://jakarta.apache.org/log4j/. -By the way, log4j has been ported to the C, C++, C#, Python, Ruby, and -Eiffel languages. +By the way, log4j has been ported to the C, C++, C#, Perl, Python, +Ruby, and Eiffel languages.

      Inserting log statements into code is a low-tech method for debugging it. It may also be the only way because debuggers are not @@ -71,7 +70,7 @@

      Introduction

      development cycle, a sufficiently rich logging package can also be viewed as an auditing tool. -

      As Brian W. Kernigan and Rob Pike put it in their truly excellent +

      As Brian W. Kernighan and Rob Pike put it in their truly excellent book "The Practice of Programming"

         As personal choice, we tend not to use debuggers beyond getting a
      @@ -821,7 +820,7 @@ 

      Configuration

    30. Set the resource string variable to the value of the log4j.configuration system property. The preferred - way to specify the default initialization file is thourough the + way to specify the default initialization file is through the log4j.configuration system property. In case the system property log4j.configuration is not defined, then set the string variable resource to its default value From d289a222fe812d7f65cd3fb3eae6daeafda6e30a Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Wed, 19 Feb 2003 04:55:56 +0000 Subject: [PATCH 080/342] Fix for #14827, memory leak related to the "removes" buffer. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309743 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/jdbc/JDBCAppender.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/java/org/apache/log4j/jdbc/JDBCAppender.java b/src/java/org/apache/log4j/jdbc/JDBCAppender.java index 5660b188af..9d9dbb159a 100644 --- a/src/java/org/apache/log4j/jdbc/JDBCAppender.java +++ b/src/java/org/apache/log4j/jdbc/JDBCAppender.java @@ -240,7 +240,13 @@ public void flushBuffer() { ErrorCode.FLUSH_FAILURE); } } + + // remove from the buffer any events that were reported buffer.removeAll(removes); + + // clear the buffer of reported events + removes.clear(); + //buffer.clear(); } From 196dfb68a8f6b05c7f9958b0efe48f27b95985ad Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Wed, 19 Feb 2003 05:04:48 +0000 Subject: [PATCH 081/342] Mention of fix for #14827. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309744 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/HISTORY b/docs/HISTORY index 5e29c44b7d..3f393a39b6 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -5,7 +5,7 @@ client code. [***] Changes requiring important modifications to existing client code. - February 18th, 2003 + February 19th, 2003 - Release of version 1.2.8 @@ -16,6 +16,10 @@ - Fixed bug #12366 whereby various versions of Xerces would not parse log4j configuration scripts expressed in XML format. [*] + + - Fixed bug #14827. The "removes" buffer used in the flushBuffer() method + of JDBCAppender is now cleared, solving the memory leak. Thanks to John + Landers for reporting the bug and suggesting the fix. [*] - Fixed bug #15599. SocketAppender now honors ReconnectionDelay of 0. Many thanks to Scott Schram for reporting the bug and providing the fix. [*] From 071ddd08b90bff27b63e56e51074c226c0bd0837 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 19 Feb 2003 13:37:36 +0000 Subject: [PATCH 082/342] Minor changes to bring the 1.2 in sync with main brach PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309747 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/stylesheets/project.xml | 2 ++ tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/xdocs/stylesheets/project.xml b/src/xdocs/stylesheets/project.xml index c5640aa79e..84432aacce 100644 --- a/src/xdocs/stylesheets/project.xml +++ b/src/xdocs/stylesheets/project.xml @@ -12,6 +12,7 @@ + @@ -26,6 +27,7 @@ + diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java index a028587a23..4bcfcd7f64 100644 --- a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java @@ -76,7 +76,7 @@ public void testNull() throws Exception { root.addAppender(new FileAppender(xmlLayout, TEMP, false)); logger.debug("hi"); logger.debug(null); - Exception e = new Exception(null); + Exception e = new Exception((String) null); logger.debug("hi", e); Transformer.transform(TEMP, FILTERED, new Filter[] {new LineNumberFilter(), new XMLTimestampFilter()}); From c1dc32abb6759969e1f845d29e32dd7796031499 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 19 Feb 2003 14:24:06 +0000 Subject: [PATCH 083/342] *** empty log message *** git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309748 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/jdbc/JDBCAppender.java | 2 -- .../org/apache/log4j/xml/DOMConfigurator.java | 30 +++++++++---------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/java/org/apache/log4j/jdbc/JDBCAppender.java b/src/java/org/apache/log4j/jdbc/JDBCAppender.java index 9d9dbb159a..c60bdcb463 100644 --- a/src/java/org/apache/log4j/jdbc/JDBCAppender.java +++ b/src/java/org/apache/log4j/jdbc/JDBCAppender.java @@ -246,8 +246,6 @@ public void flushBuffer() { // clear the buffer of reported events removes.clear(); - - //buffer.clear(); } diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index 77ff534a70..05ebacf489 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -651,16 +651,16 @@ void doConfigure(InputSource inputSource, LoggerRepository repository) } try { - // This makes ID/IDREF attributes to have a meaning. Don't ask - // me why. dbf.setValidating(true); - //dbf.setNamespaceAware(true); - DocumentBuilder docBuilder = dbf.newDocumentBuilder(); - docBuilder.setErrorHandler(new SAXErrorHandler()); - - docBuilder.setEntityResolver(new Log4jEntityResolver()); - Document doc = docBuilder.parse(inputSource); + docBuilder.setErrorHandler(new SAXErrorHandler()); + docBuilder.setEntityResolver(new Log4jEntityResolver()); + // we change the system ID to a valid URI so that Crimson won't + // complain. Indeed, "log4j.dtd" alone is not a valid URI which + // causes Crimson to barf. The Log4jEntityResolver only cares + // about the "log4j.dtd" ending. + inputSource.setSystemId("dummy://log4j.dtd"); + Document doc = docBuilder.parse(inputSource); parse(doc.getDocumentElement()); } catch (Exception e) { // I know this is miserable... @@ -668,13 +668,13 @@ void doConfigure(InputSource inputSource, LoggerRepository repository) } } - /** - Configure by taking in an DOM element. - */ - public void doConfigure(Element element, LoggerRepository repository) { - this.repository = repository; - parse(element); - } + /** + Configure by taking in an DOM element. + */ + public void doConfigure(Element element, LoggerRepository repository) { + this.repository = repository; + parse(element); + } /** From b6097c7313a766dd13b99c82a519e59c541b4450 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 19 Feb 2003 14:29:40 +0000 Subject: [PATCH 084/342] Forgot to include comments in the previous commit. Artifically changing the system id from "log4j.dtd" to "dummy://log4j.dtd" and setting an entity resolver seems to satisfy all parsers. Thus, there is no need to worry about changing the format of config files. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@309749 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/xml/DOMConfigurator.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index 05ebacf489..60ef03fd56 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -652,7 +652,9 @@ void doConfigure(InputSource inputSource, LoggerRepository repository) try { dbf.setValidating(true); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + docBuilder.setErrorHandler(new SAXErrorHandler()); docBuilder.setEntityResolver(new Log4jEntityResolver()); // we change the system ID to a valid URI so that Crimson won't From 40f2c00542221c644d7ed8e0d0f12dbff2c3af2d Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 29 Oct 2004 15:43:01 +0000 Subject: [PATCH 085/342] NOTE: 1.2 BRANCH COMMIT - Removed references for the 'enum' keyword in prevision of JDK 1.5 - Replaced deprecated method calls with their replacement. This leads to a compile with far fewer deprecation warnings while the logic remains the same. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310820 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 3 +++ src/java/org/apache/log4j/Category.java | 8 ++++---- src/java/org/apache/log4j/NDC.java | 6 +++--- .../org/apache/log4j/PropertyConfigurator.java | 6 +++--- .../apache/log4j/chainsaw/XMLFileHandler.java | 10 +++++----- .../org/apache/log4j/config/PropertyPrinter.java | 2 +- .../org/apache/log4j/jmx/LoggerDynamicMBean.java | 6 +++--- .../categoryexplorer/CategoryNodeEditor.java | 6 +++--- src/java/org/apache/log4j/net/test/SMTPMin.java | 2 +- .../org/apache/log4j/performance/Logging.java | 3 ++- .../org/apache/log4j/performance/NotLogging.java | 3 ++- src/java/org/apache/log4j/spi/LoggingEvent.java | 2 +- .../org/apache/log4j/test/AsyncAppenderTest.java | 3 ++- .../log4j/test/ConfigurationFileParsing.java | 3 ++- src/java/org/apache/log4j/test/Finalize.java | 6 +++--- src/java/org/apache/log4j/test/PatternTest.java | 3 ++- src/java/org/apache/log4j/test/Shallow.java | 16 +++++++++------- .../org/apache/log4j/test/ShortSocketServer.java | 3 ++- .../java/org/apache/log4j/LoggerTestCase.java | 10 +++++----- 19 files changed, 56 insertions(+), 45 deletions(-) diff --git a/build.xml b/build.xml index 7ddc86b541..c2c4fe1e13 100644 --- a/build.xml +++ b/build.xml @@ -22,6 +22,9 @@ + + + diff --git a/src/java/org/apache/log4j/Category.java b/src/java/org/apache/log4j/Category.java index 97f43bb53b..4435986aa4 100644 --- a/src/java/org/apache/log4j/Category.java +++ b/src/java/org/apache/log4j/Category.java @@ -204,10 +204,10 @@ void callAppenders(LoggingEvent event) { */ synchronized void closeNestedAppenders() { - Enumeration enum = this.getAllAppenders(); - if(enum != null) { - while(enum.hasMoreElements()) { - Appender a = (Appender) enum.nextElement(); + Enumeration enumeration = this.getAllAppenders(); + if(enumeration != null) { + while(enumeration.hasMoreElements()) { + Appender a = (Appender) enumeration.nextElement(); if(a instanceof AppenderAttachable) { a.close(); } diff --git a/src/java/org/apache/log4j/NDC.java b/src/java/org/apache/log4j/NDC.java index b0327446bb..450262947f 100644 --- a/src/java/org/apache/log4j/NDC.java +++ b/src/java/org/apache/log4j/NDC.java @@ -240,13 +240,13 @@ void lazyRemove() { int misses = 0; v = new Vector(); - Enumeration enum = ht.keys(); + Enumeration enumeration = ht.keys(); // We give up after 4 straigt missses. That is 4 consecutive // inspected threads in 'ht' that turn out to be alive. // The higher the proportion on dead threads in ht, the higher the // chances of removal. - while(enum.hasMoreElements() && (misses <= 4)) { - Thread t = (Thread) enum.nextElement(); + while(enumeration.hasMoreElements() && (misses <= 4)) { + Thread t = (Thread) enumeration.nextElement(); if(t.isAlive()) { misses++; } else { diff --git a/src/java/org/apache/log4j/PropertyConfigurator.java b/src/java/org/apache/log4j/PropertyConfigurator.java index 348d273640..b6b99b6ac0 100644 --- a/src/java/org/apache/log4j/PropertyConfigurator.java +++ b/src/java/org/apache/log4j/PropertyConfigurator.java @@ -508,9 +508,9 @@ void configureRootCategory(Properties props, LoggerRepository hierarchy) { */ protected void parseCatsAndRenderers(Properties props, LoggerRepository hierarchy) { - Enumeration enum = props.propertyNames(); - while(enum.hasMoreElements()) { - String key = (String) enum.nextElement(); + Enumeration enumeration = props.propertyNames(); + while(enumeration.hasMoreElements()) { + String key = (String) enumeration.nextElement(); if(key.startsWith(CATEGORY_PREFIX) || key.startsWith(LOGGER_PREFIX)) { String loggerName = null; if(key.startsWith(CATEGORY_PREFIX)) { diff --git a/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java b/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java index a5e7d4f3b7..5944da3b1e 100644 --- a/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java +++ b/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java @@ -7,7 +7,7 @@ package org.apache.log4j.chainsaw; import java.util.StringTokenizer; -import org.apache.log4j.Priority; +import org.apache.log4j.Level; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; @@ -41,7 +41,7 @@ class XMLFileHandler /** the time of the event **/ private long mTimeStamp; /** the priority (level) of the event **/ - private Priority mPriority; + private Level mLevel; /** the category of the event **/ private String mCategoryName; /** the NDC for the event **/ @@ -115,7 +115,7 @@ public void startElement(String aNamespaceURI, mThreadName = aAtts.getValue("thread"); mTimeStamp = Long.parseLong(aAtts.getValue("timestamp")); mCategoryName = aAtts.getValue("logger"); - mPriority = Priority.toPriority(aAtts.getValue("level")); + mLevel = Level.toLevel(aAtts.getValue("level")); } else if (TAG_LOCATION_INFO.equals(aQName)) { mLocationDetails = aAtts.getValue("class") + "." + aAtts.getValue("method") @@ -136,7 +136,7 @@ int getNumEvents() { /** Add an event to the model **/ private void addEvent() { mModel.addEvent(new EventDetails(mTimeStamp, - mPriority, + mLevel, mCategoryName, mNDC, mThreadName, @@ -149,7 +149,7 @@ private void addEvent() { /** Reset the data for an event **/ private void resetData() { mTimeStamp = 0; - mPriority = null; + mLevel = null; mCategoryName = null; mNDC = null; mThreadName = null; diff --git a/src/java/org/apache/log4j/config/PropertyPrinter.java b/src/java/org/apache/log4j/config/PropertyPrinter.java index 8f1e4d491f..896a941fa3 100644 --- a/src/java/org/apache/log4j/config/PropertyPrinter.java +++ b/src/java/org/apache/log4j/config/PropertyPrinter.java @@ -69,7 +69,7 @@ boolean isGenAppName(String name) { void print(PrintWriter out) { printOptions(out, Category.getRoot()); - Enumeration cats = Category.getCurrentCategories(); + Enumeration cats = LogManager.getCurrentLoggers(); while (cats.hasMoreElements()) { printOptions(out, (Category) cats.nextElement()); } diff --git a/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java b/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java index 086f99c0b2..89ebce548f 100644 --- a/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java @@ -228,9 +228,9 @@ void setAttribute(Attribute attribute) throws AttributeNotFoundException, } void appenderMBeanRegistration() { - Enumeration enum = logger.getAllAppenders(); - while(enum.hasMoreElements()) { - Appender appender = (Appender) enum.nextElement(); + Enumeration enumeration = logger.getAllAppenders(); + while(enumeration.hasMoreElements()) { + Appender appender = (Appender) enumeration.nextElement(); registerAppenderMBean(appender); } } diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java index fbb6a9bfb6..369032e0b5 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java @@ -241,9 +241,9 @@ protected void collapseDescendants(CategoryNode node) { protected int removeUnusedNodes() { int count = 0; CategoryNode root = _categoryModel.getRootCategoryNode(); - Enumeration enum = root.depthFirstEnumeration(); - while (enum.hasMoreElements()) { - CategoryNode node = (CategoryNode) enum.nextElement(); + Enumeration enumeration = root.depthFirstEnumeration(); + while (enumeration.hasMoreElements()) { + CategoryNode node = (CategoryNode) enumeration.nextElement(); if (node.isLeaf() && node.getNumberOfContainedRecords() == 0 && node.getParent() != null) { _categoryModel.removeNodeFromParent(node); diff --git a/src/java/org/apache/log4j/net/test/SMTPMin.java b/src/java/org/apache/log4j/net/test/SMTPMin.java index 51e86e62ed..9bb921261c 100644 --- a/src/java/org/apache/log4j/net/test/SMTPMin.java +++ b/src/java/org/apache/log4j/net/test/SMTPMin.java @@ -48,7 +48,7 @@ void test() { cat.warn( "Message " + i++); cat.error( "Message " + i++); cat.log(Priority.FATAL, "Message " + i++); - Category.shutdown(); + LogManager.shutdown(); Thread.currentThread().getThreadGroup().list(); } diff --git a/src/java/org/apache/log4j/performance/Logging.java b/src/java/org/apache/log4j/performance/Logging.java index 8bf504daee..a512209bfe 100644 --- a/src/java/org/apache/log4j/performance/Logging.java +++ b/src/java/org/apache/log4j/performance/Logging.java @@ -7,6 +7,7 @@ package org.apache.log4j.performance; +import org.apache.log4j.LogManager; import org.apache.log4j.Category; import org.apache.log4j.xml.DOMConfigurator; @@ -232,7 +233,7 @@ else if( argv.length == 4) System.out.print((int)delta); - Category.shutdown(); + LogManager.shutdown(); } diff --git a/src/java/org/apache/log4j/performance/NotLogging.java b/src/java/org/apache/log4j/performance/NotLogging.java index 783655a022..fdae912e70 100644 --- a/src/java/org/apache/log4j/performance/NotLogging.java +++ b/src/java/org/apache/log4j/performance/NotLogging.java @@ -5,6 +5,7 @@ import org.apache.log4j.Category; +import org.apache.log4j.LogManager; import org.apache.log4j.SimpleLayout; import org.apache.log4j.ConsoleAppender; @@ -126,7 +127,7 @@ void ProgramInit(String[] args) { // nothing to do } else if ("true".equals(args[0])) { System.out.println("Flagging as shipped code."); - Category.getDefaultHierarchy().setThreshold((Level) Level.WARN); + LogManager.getLoggerRepository().setThreshold((Level) Level.WARN); } else Usage(); diff --git a/src/java/org/apache/log4j/spi/LoggingEvent.java b/src/java/org/apache/log4j/spi/LoggingEvent.java index fb78c7b42f..4e3bdfab15 100644 --- a/src/java/org/apache/log4j/spi/LoggingEvent.java +++ b/src/java/org/apache/log4j/spi/LoggingEvent.java @@ -281,7 +281,7 @@ String getRenderedMessage() { if(message instanceof String) renderedMessage = (String) message; else { - LoggerRepository repository = logger.getHierarchy(); + LoggerRepository repository = logger.getLoggerRepository(); if(repository instanceof RendererSupport) { RendererSupport rs = (RendererSupport) repository; diff --git a/src/java/org/apache/log4j/test/AsyncAppenderTest.java b/src/java/org/apache/log4j/test/AsyncAppenderTest.java index 17060f196e..697ec19f15 100644 --- a/src/java/org/apache/log4j/test/AsyncAppenderTest.java +++ b/src/java/org/apache/log4j/test/AsyncAppenderTest.java @@ -7,6 +7,7 @@ package org.apache.log4j.test; import org.apache.log4j.Category; +import org.apache.log4j.LogManager; import org.apache.log4j.xml.DOMConfigurator; /** @@ -59,7 +60,7 @@ void test() { } try{Thread.currentThread().sleep(delayBeforeClose);}catch(Exception e){} - Category.shutdown(); + LogManager.shutdown(); } diff --git a/src/java/org/apache/log4j/test/ConfigurationFileParsing.java b/src/java/org/apache/log4j/test/ConfigurationFileParsing.java index d6b0a52ae0..b7d5ed9fe4 100644 --- a/src/java/org/apache/log4j/test/ConfigurationFileParsing.java +++ b/src/java/org/apache/log4j/test/ConfigurationFileParsing.java @@ -9,6 +9,7 @@ import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.Category; +import org.apache.log4j.LogManager; import org.apache.log4j.NDC; public class ConfigurationFileParsing { @@ -24,7 +25,7 @@ void main(String argv[]) { root.debug("Message 1"); root.debug("Message 2"); NDC.pop(); - Category.shutdown(); + LogManager.shutdown(); } else { Usage("Wrong number of arguments."); diff --git a/src/java/org/apache/log4j/test/Finalize.java b/src/java/org/apache/log4j/test/Finalize.java index 3c9c8bab50..61fa03304b 100644 --- a/src/java/org/apache/log4j/test/Finalize.java +++ b/src/java/org/apache/log4j/test/Finalize.java @@ -69,9 +69,9 @@ else if(i == 'q') static void foo(Category cat) { - Enumeration enum = cat.getAllAppenders(); - while(enum != null && enum.hasMoreElements()) { - ((org.apache.log4j.Appender) enum.nextElement()).close(); + Enumeration enumaration = cat.getAllAppenders(); + while(enumaration != null && enumaration.hasMoreElements()) { + ((org.apache.log4j.Appender) enumaration.nextElement()).close(); } } diff --git a/src/java/org/apache/log4j/test/PatternTest.java b/src/java/org/apache/log4j/test/PatternTest.java index b7feaed044..1439a0aab3 100644 --- a/src/java/org/apache/log4j/test/PatternTest.java +++ b/src/java/org/apache/log4j/test/PatternTest.java @@ -3,6 +3,7 @@ import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.Category; +import org.apache.log4j.LogManager; import org.apache.log4j.Priority; /** This class is a test of the PatternLayout class. @@ -73,6 +74,6 @@ void test() { CAT.log(Priority.FATAL, "Message " + ++i, e); root.log(Priority.FATAL, "Message " + i, e); - Category.shutdown(); + LogManager.shutdown(); } } diff --git a/src/java/org/apache/log4j/test/Shallow.java b/src/java/org/apache/log4j/test/Shallow.java index 2a202d0384..c5cf1e5bea 100644 --- a/src/java/org/apache/log4j/test/Shallow.java +++ b/src/java/org/apache/log4j/test/Shallow.java @@ -9,8 +9,10 @@ import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.xml.DOMConfigurator; import org.apache.log4j.Category; +import org.apache.log4j.Logger; +import org.apache.log4j.LogManager; import org.apache.log4j.NDC; -import org.apache.log4j.Priority; +import org.apache.log4j.Level; /** This class is a shallow test of the various appenders and layouts. It also tests their reading of the configuration file. @@ -62,8 +64,8 @@ void test() { cat.error("Message " + ++i); root.error("Message " + i); - cat.log(Priority.FATAL, "Message " + ++i); - root.log(Priority.FATAL, "Message " + i); + cat.log(Level.FATAL, "Message " + ++i); + root.log(Level.FATAL, "Message " + i); Exception e = new Exception("Just testing"); cat.debug("Message " + ++i, e); @@ -78,14 +80,14 @@ void test() { cat.error("Message " + ++i, e); root.error("Message " + i, e); - cat.log(Priority.FATAL, "Message " + ++i, e); - root.log(Priority.FATAL, "Message " + i, e); + cat.log(Level.FATAL, "Message " + ++i, e); + root.log(Level.FATAL, "Message " + i, e); - root.setPriority(Priority.FATAL); + root.setLevel(Level.FATAL); // It is always a good idea to call this method when exiting an // application. - Category.shutdown(); + LogManager.shutdown(); } diff --git a/src/java/org/apache/log4j/test/ShortSocketServer.java b/src/java/org/apache/log4j/test/ShortSocketServer.java index e1ba36bc35..6f01dc1e52 100644 --- a/src/java/org/apache/log4j/test/ShortSocketServer.java +++ b/src/java/org/apache/log4j/test/ShortSocketServer.java @@ -6,6 +6,7 @@ import java.net.ServerSocket; import org.apache.log4j.Category; +import org.apache.log4j.LogManager; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.helpers.LogLog; import org.apache.log4j.net.SocketNode; @@ -35,7 +36,7 @@ void main(String argv[]) { Socket socket = serverSocket.accept(); LogLog.debug("Connected to client at " + socket.getInetAddress()); LogLog.debug("Starting new socket node."); - SocketNode sn = new SocketNode(socket, Category.getDefaultHierarchy()); + SocketNode sn = new SocketNode(socket, LogManager.getLoggerRepository()); Thread t = new Thread(sn); t.start(); t.join(); diff --git a/tests/src/java/org/apache/log4j/LoggerTestCase.java b/tests/src/java/org/apache/log4j/LoggerTestCase.java index d5f4274c8a..1f844bcdaf 100644 --- a/tests/src/java/org/apache/log4j/LoggerTestCase.java +++ b/tests/src/java/org/apache/log4j/LoggerTestCase.java @@ -73,8 +73,8 @@ void testAppender1() { a1.setName("testAppender1"); logger.addAppender(a1); - Enumeration enum = logger.getAllAppenders(); - Appender aHat = (Appender) enum.nextElement(); + Enumeration enumeration = logger.getAllAppenders(); + Appender aHat = (Appender) enumeration.nextElement(); assertEquals(a1, aHat); } @@ -93,10 +93,10 @@ void testAppender2() { logger.addAppender(a1); logger.addAppender(a2); logger.removeAppender("testAppender2.1"); - Enumeration enum = logger.getAllAppenders(); - Appender aHat = (Appender) enum.nextElement(); + Enumeration enumeration = logger.getAllAppenders(); + Appender aHat = (Appender) enumeration.nextElement(); assertEquals(a2, aHat); - assertTrue(!enum.hasMoreElements()); + assertTrue(!enumeration.hasMoreElements()); } /** From 3e5850f0f0e11944b02a53a0cbd04a12260bdf9d Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 29 Oct 2004 16:33:24 +0000 Subject: [PATCH 086/342] NOTE: 1.2.x BRANCH More cleaning up, less deprecation warnings. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310821 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java | 2 +- src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java | 2 +- src/java/org/apache/log4j/xml/test/DOMTest.java | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java b/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java index 361409b90a..95097fd1e2 100644 --- a/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java @@ -93,7 +93,7 @@ void buildDynamicMBeanInfo() { public ObjectName addLoggerMBean(String name) { - Logger cat = Logger.exists(name); + Logger cat = LogManager.exists(name); if(cat != null) { return addLoggerMBean(cat); diff --git a/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java b/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java index 89ebce548f..ea3afd8398 100644 --- a/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java @@ -218,7 +218,7 @@ void setAttribute(Attribute attribute) throws AttributeNotFoundException, } else { p = OptionConverter.toLevel(s, p); } - logger.setPriority(p); + logger.setLevel(p); } } else { throw(new AttributeNotFoundException("Attribute " + name + diff --git a/src/java/org/apache/log4j/xml/test/DOMTest.java b/src/java/org/apache/log4j/xml/test/DOMTest.java index 225cfb68e3..95719b1025 100644 --- a/src/java/org/apache/log4j/xml/test/DOMTest.java +++ b/src/java/org/apache/log4j/xml/test/DOMTest.java @@ -9,6 +9,7 @@ import org.apache.log4j.xml.DOMConfigurator; import org.apache.log4j.Category; +import org.apache.log4j.LogManager; import org.apache.log4j.Priority; //import org.apache.log4j.xml.examples.ReportParserError; //import org.apache.xerces.parsers.DOMParser; @@ -74,6 +75,6 @@ void test() { cat.error("Message " + ++i, e); root.error("Message " + i, e); - Category.shutdown(); + LogManager.shutdown(); } } From 12ac41f2913e80db40f000959f16c5451284b3d2 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 29 Oct 2004 16:37:16 +0000 Subject: [PATCH 087/342] NOTE: 1.2.x BRANCH More cleaning up, less deprecation warnings. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310822 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/net/SMTPAppender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/net/SMTPAppender.java b/src/java/org/apache/log4j/net/SMTPAppender.java index 3e4929d673..803824f7a5 100644 --- a/src/java/org/apache/log4j/net/SMTPAppender.java +++ b/src/java/org/apache/log4j/net/SMTPAppender.java @@ -386,6 +386,6 @@ class DefaultEvaluator implements TriggeringEventEvaluator { false. */ public boolean isTriggeringEvent(LoggingEvent event) { - return event.level.isGreaterOrEqual(Level.ERROR); + return event.getLevel().isGreaterOrEqual(Level.ERROR); } } From 42a1d9c06ded8d1bbb40f12c7f9f70252d5be299 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 29 Oct 2004 18:37:22 +0000 Subject: [PATCH 088/342] NOTE: 1.2.x BRANCH - Tagged the following methods as deprecated: public static Category Category.getRoot(); public static Category Category.getInstance(String); public static Category Category.getInstance(Class); - Cleaning up of javadoc comments. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310823 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/overview.html | 1 + src/java/org/apache/log4j/Appender.java | 2 +- src/java/org/apache/log4j/Category.java | 111 ++++++++---------- src/java/org/apache/log4j/FileAppender.java | 19 +-- src/java/org/apache/log4j/Logger.java | 27 ++++- src/java/org/apache/log4j/NDC.java | 10 +- src/java/org/apache/log4j/Priority.java | 2 +- src/java/org/apache/log4j/TTCCLayout.java | 4 +- .../apache/log4j/config/PropertyPrinter.java | 4 +- .../org/apache/log4j/helpers/BoundedFIFO.java | 4 +- .../org/apache/log4j/jdbc/JDBCAppender.java | 10 +- src/java/org/apache/log4j/lf5/LogRecord.java | 2 +- .../org/apache/log4j/performance/Logging.java | 20 ++-- .../org/apache/log4j/spi/Configurator.java | 2 +- src/java/org/apache/log4j/spi/Filter.java | 2 +- .../apache/log4j/spi/LoggerRepository.java | 7 +- .../org/apache/log4j/spi/LoggingEvent.java | 12 +- 18 files changed, 122 insertions(+), 119 deletions(-) diff --git a/build.xml b/build.xml index c2c4fe1e13..2544749854 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/overview.html b/docs/overview.html index 40efccd27e..1dbe3ee17e 100644 --- a/docs/overview.html +++ b/docs/overview.html @@ -7,5 +7,6 @@

      Make sure to read the user manual in addition to this javadoc documentation. +

      diff --git a/src/java/org/apache/log4j/Appender.java b/src/java/org/apache/log4j/Appender.java index 36428113da..aa8a3105df 100644 --- a/src/java/org/apache/log4j/Appender.java +++ b/src/java/org/apache/log4j/Appender.java @@ -73,7 +73,7 @@ public interface Appender { /** Set the {@link ErrorHandler} for this appender. - @ since 0.9.0 + @since 0.9.0 */ public void setErrorHandler(ErrorHandler errorHandler); diff --git a/src/java/org/apache/log4j/Category.java b/src/java/org/apache/log4j/Category.java index 4435986aa4..1b7433217c 100644 --- a/src/java/org/apache/log4j/Category.java +++ b/src/java/org/apache/log4j/Category.java @@ -33,40 +33,48 @@ /** - This class has been deprecated and - replaced by the {@link Logger} subclass. It - will be kept around to preserve backward compatibility until mid - 2003. - -

      Logger is a subclass of Category, i.e. it extends - Category. In other words, a logger is a category. Thus, - all operations that can be performed on a category can be performed - on a logger. Whenever log4j is asked to produce a Category object, - it will instead produce a Logger object. However, methods that - previously accepted category objects still continue to accept - category objects. - -

      For example, the following are all legal and will work as expected. - + * This class has been deprecated and + * replaced by the {@link Logger} subclass. It + * will be kept around to preserve backward compatibility until mid + * 2003. + * + *

      Logger is a subclass of Category, i.e. it extends + * Category. In other words, a logger is a category. Thus, + * all operations that can be performed on a category can be + * performed on a logger. Internally, whenever log4j is asked to + * produce a Category object, it will instead produce a Logger + * object. Log4j 1.2 will never produce Category objects but + * only Logger instances. In order to preserve backward + * compatibility, methods that previously accepted category objects + * still continue to accept category objects. + * + *

      For example, the following are all legal and will work as + * expected. + *

      -      // Deprecated form:
      -      Category cat = Category.getInstance("foo.bar")
      -
      -      // Preferred form for retrieving loggers:
      -      Logger logger = Logger.getLogger("foo.bar")
      +       // Deprecated form:
      +       Category cat = Category.getInstance("foo.bar")
      +   
      +       // Preferred form for retrieving loggers:
      +       Logger logger = Logger.getLogger("foo.bar")
          
      - -

      The first form is deprecated and should be avoided. - -

      There is absolutely no need for new client code to use or - refer to the Category class. Whenever possible, - please avoid referring to it or using it. - -

      See the short manual for an - introduction on this class. - - @author Ceki Gülcü - @author Anders Kristensen */ + + *

      The first form is deprecated and should be avoided. + * + *

      There is absolutely no need for new client code to use or + * refer to the Category class. Whenever possible, + * please avoid referring to it or using it. + * + *

      See the short manual for an + * introduction on this class. + * + *

      See the document entitled the replacement + * of Logger by Category for a deeper discussion. + * + * @author Ceki Gülcü + * @author Anders Kristensen + */ public class Category implements AppenderAttachable { /** @@ -312,7 +320,7 @@ If the named category exists (in the default hierarchy) then it @deprecated Please use {@link LogManager#exists} instead. - @version 0.8.5 */ + @since 0.8.5 */ public static Logger exists(String name) { @@ -495,19 +503,8 @@ LoggerRepository getLoggerRepository() { /** - Retrieve a category with named as the name - parameter. If the named category already exists, then the - existing instance will be reutrned. Otherwise, a new instance is - created. - - By default, categories do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4j. - - Deprecated Please use {@link Logger#getLogger(String)} - instead. - - @param name The name of the category to retrieve. */ + * @deprecated Make sure to use {@link Logger#getLogger(String)} instead. + */ public static Category getInstance(String name) { @@ -515,15 +512,8 @@ Category getInstance(String name) { } /** - Shorthand for getInstance(clazz.getName()). - - @param clazz The name of clazz will be used as the - name of the category to retrieve. See {@link - #getInstance(String)} for more detailed information. - - Deprecated Please use {@link Logger#getLogger(Class)} instead. - - @since 1.0 */ + * @deprecated Please make sure to use {@link Logger#getLogger(Class)} instead. + */ public static Category getInstance(Class clazz) { @@ -577,16 +567,7 @@ Level getPriority() { /** - Return the root of the default category hierrachy. - -

      The root category is always instantiated and available. It's - name is "root". - -

      Nevertheless, calling {@link #getInstance - Category.getInstance("root")} does not retrieve the root category - but a category just under root named "root". - - Deprecated Use {@link Logger#getRootLogger()} instead. + * @deprecated Please use {@link Logger#getRootLogger()} instead. */ final public diff --git a/src/java/org/apache/log4j/FileAppender.java b/src/java/org/apache/log4j/FileAppender.java index 49715775da..c1de794029 100644 --- a/src/java/org/apache/log4j/FileAppender.java +++ b/src/java/org/apache/log4j/FileAppender.java @@ -30,14 +30,14 @@ * */ public class FileAppender extends WriterAppender { - /** Append to or truncate the file? The default value for this - variable is true, meaning that by default a - FileAppender will append to an existing file and - not truncate it. - -

      This option is meaningful only if the FileAppender opens the - file. - */ + /** Controls file truncatation. The default value for this variable + * is true, meaning that by default a + * FileAppender will append to an existing file and not + * truncate it. + * + *

      This option is meaningful only if the FileAppender opens the + * file. + */ protected boolean fileAppend = true; /** @@ -49,7 +49,8 @@ public class FileAppender extends WriterAppender { protected boolean bufferedIO = false; /** - How big should the IO buffer be? Default is 8K. */ + * Determines the size of IO buffer be. Default is 8K. + */ protected int bufferSize = 8*1024; diff --git a/src/java/org/apache/log4j/Logger.java b/src/java/org/apache/log4j/Logger.java index aab789ddad..61a36e318d 100644 --- a/src/java/org/apache/log4j/Logger.java +++ b/src/java/org/apache/log4j/Logger.java @@ -77,7 +77,16 @@ public class Logger extends Category { //} /** - Retrieve a logger by name. + * Retrieve a logger named according to the value of the + * name parameter. If the named logger already exists, + * then the existing instance will be returned. Otherwise, a new + * instance is created. + * + *

      By default, loggers do not have a set level but inherit it + * from their neareast ancestor with a set level. This is one of the + * central features of log4j. + * + * @param name The name of the logger to retrieve. */ static public @@ -86,7 +95,11 @@ Logger getLogger(String name) { } /** - Same as calling getLogger(clazz.getName()). + * Shorthand for getLogger(clazz.getName()). + * + * @param clazz The name of clazz will be used as the + * name of the logger to retrieve. See {@link #getLogger(String)} + * for more detailed information. */ static public @@ -96,7 +109,15 @@ Logger getLogger(Class clazz) { /** - Retrieve the root logger. + * Return the root logger for the current logger repository. + *

      + * The {@link #getName Logger.getName()} method for the root logger always returns + * stirng value: "root". However, calling + * Logger.getLogger("root") does not retrieve the root + * logger but a logger just under root named "root". + *

      + * In other words, calling this method is the only way to retrieve the + * root logger. */ public static diff --git a/src/java/org/apache/log4j/NDC.java b/src/java/org/apache/log4j/NDC.java index 450262947f..ee34b21091 100644 --- a/src/java/org/apache/log4j/NDC.java +++ b/src/java/org/apache/log4j/NDC.java @@ -193,7 +193,7 @@ void inherit(Stack stack) { /** Never use this method directly, use the {@link - org.apache.log4j.spi.LoggingEvent#getNDC} method instead. + org.apache.log4j.spi.LoggingEvent#getNDC} method instead. */ static public @@ -206,10 +206,10 @@ String get() { } /** - Get the current nesting depth of this diagnostic context. - - @see #setMaxDepth - @since 0.7.5 + * Get the current nesting depth of this diagnostic context. + * + * @see #setMaxDepth + * @since 0.7.5 */ public static diff --git a/src/java/org/apache/log4j/Priority.java b/src/java/org/apache/log4j/Priority.java index fd2fe9858c..c8cc634ca0 100644 --- a/src/java/org/apache/log4j/Priority.java +++ b/src/java/org/apache/log4j/Priority.java @@ -12,7 +12,7 @@ /** Refrain from using this class directly, use - the {@link Level} class instead. + the {@link Level} class instead. @author Ceki Gülcü */ public class Priority { diff --git a/src/java/org/apache/log4j/TTCCLayout.java b/src/java/org/apache/log4j/TTCCLayout.java index ae3b7d7422..ceb526ac2c 100644 --- a/src/java/org/apache/log4j/TTCCLayout.java +++ b/src/java/org/apache/log4j/TTCCLayout.java @@ -157,9 +157,7 @@ boolean getContextPrinting() {

      Time, thread, category and diagnostic context are printed depending on options. - @param category - @param level - @param message + @param event The event to format */ public diff --git a/src/java/org/apache/log4j/config/PropertyPrinter.java b/src/java/org/apache/log4j/config/PropertyPrinter.java index 896a941fa3..94160e1a23 100644 --- a/src/java/org/apache/log4j/config/PropertyPrinter.java +++ b/src/java/org/apache/log4j/config/PropertyPrinter.java @@ -46,8 +46,8 @@ String genAppName() { } /** - Returns true if the specified appender name is considered to have - been generated, i.e. if it is of the form A[0-9]+. + * Returns true if the specified appender name is considered to have + * been generated, that is, if it is of the form A[0-9]+. */ protected boolean isGenAppName(String name) { diff --git a/src/java/org/apache/log4j/helpers/BoundedFIFO.java b/src/java/org/apache/log4j/helpers/BoundedFIFO.java index 2a1796654a..4ef8e4a3c2 100644 --- a/src/java/org/apache/log4j/helpers/BoundedFIFO.java +++ b/src/java/org/apache/log4j/helpers/BoundedFIFO.java @@ -82,8 +82,8 @@ int getMaxSize() { } /** - Return true if the buffer is full, i.e. of the - number of elements in the buffer equals the buffer size. */ + Return true if the buffer is full, that is, whether + the number of elements in the buffer equals the buffer size. */ public boolean isFull() { return numElements == maxSize; diff --git a/src/java/org/apache/log4j/jdbc/JDBCAppender.java b/src/java/org/apache/log4j/jdbc/JDBCAppender.java index c60bdcb463..c2ccaed6a8 100644 --- a/src/java/org/apache/log4j/jdbc/JDBCAppender.java +++ b/src/java/org/apache/log4j/jdbc/JDBCAppender.java @@ -14,9 +14,9 @@ /** -

      WARNING: This version of JDBCAppender - is very likely to be completely replaced in the future. Moreoever, - it does not log exceptions.

      +

      WARNING: This version of JDBCAppender + is very likely to be completely replaced in the future. Moreoever, + it does not log exceptions. The JDBCAppender provides for sending log events to a database. @@ -58,7 +58,7 @@ - @author: Kevin Steppe (ksteppe@pacbell.net) + @author Kevin Steppe (ksteppe@pacbell.net) */ public class JDBCAppender extends org.apache.log4j.AppenderSkeleton @@ -91,7 +91,7 @@ public class JDBCAppender extends org.apache.log4j.AppenderSkeleton /** * Stores the string given to the pattern layout for conversion into a SQL * statement, eg: insert into LogTable (Thread, Class, Message) values - * ("%t", "%c", "%m") + * ("%t", "%c", "%m"). * * Be careful of quotes in your messages! * diff --git a/src/java/org/apache/log4j/lf5/LogRecord.java b/src/java/org/apache/log4j/lf5/LogRecord.java index 8d1cfa4a7a..b8ab25a199 100644 --- a/src/java/org/apache/log4j/lf5/LogRecord.java +++ b/src/java/org/apache/log4j/lf5/LogRecord.java @@ -350,7 +350,7 @@ public String getLocation() { /** * Set the location in code where this LogRecord originated. * - * @param ndc A string containing location information. + * @param location A string containing location information. */ public void setLocation(String location) { _location = location; diff --git a/src/java/org/apache/log4j/performance/Logging.java b/src/java/org/apache/log4j/performance/Logging.java index a512209bfe..1bc35a0bd1 100644 --- a/src/java/org/apache/log4j/performance/Logging.java +++ b/src/java/org/apache/log4j/performance/Logging.java @@ -201,16 +201,16 @@ void Usage(String msg) { } /** - Usage: java org.apache.log4j.performance.Logging confFile runLength [delay] [burstLen] - -

      confFile is an XML configuration file and - runLength (integer) is the length of test loop, - delay is the time in millisecs to sleep every - bustLen log requests. - -

      This application just prints the average time it took to log. - - + * The main method. + * + * Usage: java org.apache.log4j.performance.Logging confFile runLength [delay] [burstLen] + * + *

      confFile is an XML configuration file and + * runLength (integer) is the length of test loop, + * delay is the time in millisecs to sleep every + * bustLen log requests. + * + *

      This application just prints the average time it took to log. */ public static void main(String argv[]) { diff --git a/src/java/org/apache/log4j/spi/Configurator.java b/src/java/org/apache/log4j/spi/Configurator.java index 28de2964c5..d862a0e17e 100644 --- a/src/java/org/apache/log4j/spi/Configurator.java +++ b/src/java/org/apache/log4j/spi/Configurator.java @@ -39,7 +39,7 @@ public interface Configurator { parameter. @param url The URL to parse - @param hierarchy The hierarchy to operation upon. + @param repository The hierarchy to operation upon. */ void doConfigure(URL url, LoggerRepository repository); } diff --git a/src/java/org/apache/log4j/spi/Filter.java b/src/java/org/apache/log4j/spi/Filter.java index 3f12dbd699..ffa564d38d 100644 --- a/src/java/org/apache/log4j/spi/Filter.java +++ b/src/java/org/apache/log4j/spi/Filter.java @@ -91,7 +91,7 @@ void activateOptions() { the chain. @param event The LoggingEvent to decide upon. - @param decision The decision of the filter. */ + @return decision The decision of the filter. */ abstract public int decide(LoggingEvent event); diff --git a/src/java/org/apache/log4j/spi/LoggerRepository.java b/src/java/org/apache/log4j/spi/LoggerRepository.java index 22ce2b32fc..11e468ff3a 100644 --- a/src/java/org/apache/log4j/spi/LoggerRepository.java +++ b/src/java/org/apache/log4j/spi/LoggerRepository.java @@ -31,9 +31,10 @@ public interface LoggerRepository { void addHierarchyEventListener(HierarchyEventListener listener); /** - Is the repository disabled for a given level? The answer depends - on the repository threshold and the level - parameter. See also {@link #setThreshold} method. */ + Returns whether this repository is disabled for a given + level. The answer depends on the repository threshold and the + level parameter. See also {@link #setThreshold} + method. */ boolean isDisabled(int level); /** diff --git a/src/java/org/apache/log4j/spi/LoggingEvent.java b/src/java/org/apache/log4j/spi/LoggingEvent.java index 4e3bdfab15..9170c3a8e6 100644 --- a/src/java/org/apache/log4j/spi/LoggingEvent.java +++ b/src/java/org/apache/log4j/spi/LoggingEvent.java @@ -130,16 +130,16 @@ public class LoggingEvent implements java.io.Serializable {

      Except {@link #timeStamp} all the other fields of LoggingEvent are filled when actually needed.

      - @param category The category of this event. + @param logger The logger generating this event. @param level The level of this event. @param message The message of this event. @param throwable The throwable of this event. */ public LoggingEvent(String fqnOfCategoryClass, Category logger, - Priority priority, Object message, Throwable throwable) { + Priority level, Object message, Throwable throwable) { this.fqnOfCategoryClass = fqnOfCategoryClass; this.logger = logger; this.categoryName = logger.getName(); - this.level = priority; + this.level = level; this.message = message; if(throwable != null) { this.throwableInfo = new ThrowableInformation(throwable); @@ -153,18 +153,18 @@ public LoggingEvent(String fqnOfCategoryClass, Category logger,

      Except {@link #timeStamp} all the other fields of LoggingEvent are filled when actually needed.

      - @param category The category of this event. + @param logger The logger generating this event. @param timeStamp the timestamp of this logging event @param level The level of this event. @param message The message of this event. @param throwable The throwable of this event. */ public LoggingEvent(String fqnOfCategoryClass, Category logger, - long timeStamp, Priority priority, Object message, + long timeStamp, Priority level, Object message, Throwable throwable) { this.fqnOfCategoryClass = fqnOfCategoryClass; this.logger = logger; this.categoryName = logger.getName(); - this.level = priority; + this.level = level; this.message = message; if(throwable != null) { this.throwableInfo = new ThrowableInformation(throwable); From 88e4401d9979dde23d614fa70c04af678442c4d5 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Mon, 1 Nov 2004 16:11:58 +0000 Subject: [PATCH 089/342] - Cleaned up all the warning messages resulting from the deprecation of the Category.getInstance() and Category.getRoot() methods. - Removed files with ambiguous copyrights. Moreover, they were mostly unnecessary. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310826 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/LogManager.java | 4 +- .../apache/log4j/chainsaw/ControlPanel.java | 8 +- .../apache/log4j/chainsaw/DetailPanel.java | 8 +- .../org/apache/log4j/chainsaw/ExitAction.java | 4 +- .../apache/log4j/chainsaw/LoadXMLAction.java | 5 +- src/java/org/apache/log4j/chainsaw/Main.java | 6 +- .../apache/log4j/chainsaw/MyTableModel.java | 5 +- .../apache/log4j/config/PropertyPrinter.java | 12 +- .../apache/log4j/net/SimpleSocketServer.java | 4 +- .../org/apache/log4j/net/SocketServer.java | 6 +- src/java/org/apache/log4j/net/test/Loop.java | 4 +- .../org/apache/log4j/net/test/SMTPMin.java | 2 +- .../org/apache/log4j/net/test/SocketMin.java | 8 +- .../org/apache/log4j/net/test/SyslogMin.java | 4 +- src/java/org/apache/log4j/nt/test/NTMin.java | 4 +- .../log4j/performance/ConcatVsArray.java | 66 ---- .../org/apache/log4j/performance/Logging.java | 288 ------------------ .../apache/log4j/performance/NotLogging.java | 169 ---------- .../org/apache/log4j/spi/RootCategory.java | 11 +- .../apache/log4j/test/AsyncAppenderTest.java | 6 +- src/java/org/apache/log4j/test/Base64.java | 105 ------- .../apache/log4j/test/CategoryWrapper.java | 6 +- .../log4j/test/ConfigurationFileParsing.java | 4 +- src/java/org/apache/log4j/test/DRFATest.java | 4 +- .../org/apache/log4j/test/DefaultInit.java | 4 +- .../org/apache/log4j/test/DelayedLoop.java | 4 +- src/java/org/apache/log4j/test/FQCNTest.java | 4 +- src/java/org/apache/log4j/test/Finalize.java | 8 +- src/java/org/apache/log4j/test/Hello.java | 4 +- src/java/org/apache/log4j/test/L7D.java | 79 ----- src/java/org/apache/log4j/test/MDCStress.java | 4 +- .../apache/log4j/test/MultipleAppenders.java | 4 +- .../org/apache/log4j/test/PatternTest.java | 6 +- src/java/org/apache/log4j/test/ROFile.java | 4 +- src/java/org/apache/log4j/test/Shallow.java | 6 +- .../apache/log4j/test/ShortSocketServer.java | 4 +- .../log4j/test/StressAsyncAppender.java | 4 +- src/java/org/apache/log4j/test/StressNDC.java | 175 ----------- .../apache/log4j/test/SysoutConfigurator.java | 4 +- src/java/org/apache/log4j/varia/Roller.java | 4 +- .../org/apache/log4j/varia/test/Loop.java | 4 +- 41 files changed, 86 insertions(+), 979 deletions(-) delete mode 100644 src/java/org/apache/log4j/performance/ConcatVsArray.java delete mode 100644 src/java/org/apache/log4j/performance/Logging.java delete mode 100644 src/java/org/apache/log4j/performance/NotLogging.java delete mode 100644 src/java/org/apache/log4j/test/Base64.java delete mode 100644 src/java/org/apache/log4j/test/L7D.java delete mode 100644 src/java/org/apache/log4j/test/StressNDC.java diff --git a/src/java/org/apache/log4j/LogManager.java b/src/java/org/apache/log4j/LogManager.java index 522b0ec937..d01b99e1f2 100644 --- a/src/java/org/apache/log4j/LogManager.java +++ b/src/java/org/apache/log4j/LogManager.java @@ -11,7 +11,7 @@ import org.apache.log4j.spi.LoggerFactory; import org.apache.log4j.spi.RepositorySelector; import org.apache.log4j.spi.DefaultRepositorySelector; -import org.apache.log4j.spi.RootCategory; +import org.apache.log4j.spi.RootLogger; import org.apache.log4j.helpers.Loader; import org.apache.log4j.helpers.OptionConverter; import org.apache.log4j.helpers.LogLog; @@ -66,7 +66,7 @@ public class LogManager { static { // By default we use a DefaultRepositorySelector which always returns 'h'. - Hierarchy h = new Hierarchy(new RootCategory((Level) Level.DEBUG)); + Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG)); repositorySelector = new DefaultRepositorySelector(h); /** Search for the properties file log4j.properties in the CLASSPATH. */ diff --git a/src/java/org/apache/log4j/chainsaw/ControlPanel.java b/src/java/org/apache/log4j/chainsaw/ControlPanel.java index 741edecad9..d9169e7100 100644 --- a/src/java/org/apache/log4j/chainsaw/ControlPanel.java +++ b/src/java/org/apache/log4j/chainsaw/ControlPanel.java @@ -18,7 +18,7 @@ import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.Priority; /** @@ -28,8 +28,8 @@ */ class ControlPanel extends JPanel { /** use the log messages **/ - private static final Category LOG = - Category.getInstance(ControlPanel.class); + private static final Logger LOG = + Logger.getLogger(ControlPanel.class); /** * Creates a new ControlPanel instance. @@ -61,7 +61,7 @@ class ControlPanel extends JPanel { add(label); c.gridy++; - label = new JLabel("Filter Category:"); + label = new JLabel("Filter Logger:"); gridbag.setConstraints(label, c); add(label); diff --git a/src/java/org/apache/log4j/chainsaw/DetailPanel.java b/src/java/org/apache/log4j/chainsaw/DetailPanel.java index c05198780f..9b28748776 100644 --- a/src/java/org/apache/log4j/chainsaw/DetailPanel.java +++ b/src/java/org/apache/log4j/chainsaw/DetailPanel.java @@ -17,7 +17,7 @@ import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; /** * A panel for showing a stack trace. @@ -29,8 +29,8 @@ class DetailPanel implements ListSelectionListener { /** used to log events **/ - private static final Category LOG = - Category.getInstance(DetailPanel.class); + private static final Logger LOG = + Logger.getLogger(DetailPanel.class); /** used to format the logging event **/ private static final MessageFormat FORMATTER = new MessageFormat( @@ -38,7 +38,7 @@ class DetailPanel "  Priority: {1}" + "  Thread: {2}" + "  NDC: {3}" + - "
      Category: {4}" + + "
      Logger: {4}" + "
      Location: {5}" + "
      Message:" + "

      {6}
      " + diff --git a/src/java/org/apache/log4j/chainsaw/ExitAction.java b/src/java/org/apache/log4j/chainsaw/ExitAction.java index 8fb0ce8c9b..c8eda2a880 100644 --- a/src/java/org/apache/log4j/chainsaw/ExitAction.java +++ b/src/java/org/apache/log4j/chainsaw/ExitAction.java @@ -8,7 +8,7 @@ import java.awt.event.ActionEvent; import javax.swing.AbstractAction; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; /** * Encapsulates the action to exit. @@ -20,7 +20,7 @@ class ExitAction extends AbstractAction { /** use to log messages **/ - private static final Category LOG = Category.getInstance(ExitAction.class); + private static final Logger LOG = Logger.getLogger(ExitAction.class); /** The instance to share **/ public static final ExitAction INSTANCE = new ExitAction(); diff --git a/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java b/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java index 9912e7db52..cc91139ae1 100644 --- a/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java +++ b/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java @@ -16,7 +16,7 @@ import javax.swing.JOptionPane; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; @@ -31,8 +31,7 @@ class LoadXMLAction extends AbstractAction { /** use to log messages **/ - private static final Category LOG = - Category.getInstance(LoadXMLAction.class); + private static final Logger LOG = Logger.getLogger(LoadXMLAction.class); /** the parent frame **/ private final JFrame mParent; diff --git a/src/java/org/apache/log4j/chainsaw/Main.java b/src/java/org/apache/log4j/chainsaw/Main.java index b67a9ae476..9dacd2868f 100644 --- a/src/java/org/apache/log4j/chainsaw/Main.java +++ b/src/java/org/apache/log4j/chainsaw/Main.java @@ -23,7 +23,7 @@ import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; /** @@ -41,7 +41,7 @@ public class Main public static final String PORT_PROP_NAME = "chainsaw.port"; /** use to log messages **/ - private static final Category LOG = Category.getInstance(Main.class); + private static final Logger LOG = Logger.getLogger(Main.class); /** @@ -162,7 +162,7 @@ private void setupReceiver(MyTableModel aModel) { /** initialise log4j **/ private static void initLog4J() { final Properties props = new Properties(); - props.setProperty("log4j.rootCategory", "DEBUG, A1"); + props.setProperty("log4j.rootLogger", "DEBUG, A1"); props.setProperty("log4j.appender.A1", "org.apache.log4j.ConsoleAppender"); props.setProperty("log4j.appender.A1.layout", diff --git a/src/java/org/apache/log4j/chainsaw/MyTableModel.java b/src/java/org/apache/log4j/chainsaw/MyTableModel.java index d1af076317..b0d8898aaf 100644 --- a/src/java/org/apache/log4j/chainsaw/MyTableModel.java +++ b/src/java/org/apache/log4j/chainsaw/MyTableModel.java @@ -16,7 +16,7 @@ import java.util.TreeSet; import javax.swing.table.AbstractTableModel; import org.apache.log4j.Priority; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; /** * Represents a list of EventDetails objects that are sorted on @@ -29,8 +29,7 @@ class MyTableModel { /** used to log messages **/ - private static final Category LOG = - Category.getInstance(MyTableModel.class); + private static final Logger LOG = Logger.getLogger(MyTableModel.class); /** use the compare logging events **/ private static final Comparator MY_COMP = new Comparator() diff --git a/src/java/org/apache/log4j/config/PropertyPrinter.java b/src/java/org/apache/log4j/config/PropertyPrinter.java index 94160e1a23..77cdb5b626 100644 --- a/src/java/org/apache/log4j/config/PropertyPrinter.java +++ b/src/java/org/apache/log4j/config/PropertyPrinter.java @@ -67,16 +67,16 @@ boolean isGenAppName(String name) { */ public void print(PrintWriter out) { - printOptions(out, Category.getRoot()); + printOptions(out, Logger.getRootLogger()); Enumeration cats = LogManager.getCurrentLoggers(); while (cats.hasMoreElements()) { - printOptions(out, (Category) cats.nextElement()); + printOptions(out, (Logger) cats.nextElement()); } } protected - void printOptions(PrintWriter out, Category cat) { + void printOptions(PrintWriter out, Logger cat) { Enumeration appenders = cat.getAllAppenders(); Level prio = cat.getLevel(); String appenderString = (prio == null ? "" : prio.toString()); @@ -100,9 +100,9 @@ void printOptions(PrintWriter out, Category cat) { } appenderString += ", " + name; } - String catKey = (cat == Category.getRoot()) - ? "log4j.rootCategory" - : "log4j.category." + cat.getName(); + String catKey = (cat == Logger.getRootLogger()) + ? "log4j.rootLogger" + : "log4j.logger." + cat.getName(); if (appenderString != "") { out.println(catKey + "=" + appenderString); } diff --git a/src/java/org/apache/log4j/net/SimpleSocketServer.java b/src/java/org/apache/log4j/net/SimpleSocketServer.java index 8467d891d9..2fddf06782 100644 --- a/src/java/org/apache/log4j/net/SimpleSocketServer.java +++ b/src/java/org/apache/log4j/net/SimpleSocketServer.java @@ -10,7 +10,7 @@ import java.net.Socket; import java.net.ServerSocket; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.xml.DOMConfigurator; @@ -33,7 +33,7 @@ * */ public class SimpleSocketServer { - static Category cat = Category.getInstance(SimpleSocketServer.class.getName()); + static Logger cat = Logger.getLogger(SimpleSocketServer.class); static int port; diff --git a/src/java/org/apache/log4j/net/SocketServer.java b/src/java/org/apache/log4j/net/SocketServer.java index 41272588df..b3f4d756a4 100644 --- a/src/java/org/apache/log4j/net/SocketServer.java +++ b/src/java/org/apache/log4j/net/SocketServer.java @@ -75,7 +75,7 @@ public class SocketServer { static String GENERIC = "generic"; static String CONFIG_FILE_EXT = ".lcf"; - static Category cat = Category.getInstance(SocketServer.class); + static Logger cat = Logger.getLogger(SocketServer.class); static SocketServer server; static int port; @@ -167,7 +167,7 @@ LoggerRepository configureHierarchy(InetAddress inetAddress) { File configFile = new File(dir, key+CONFIG_FILE_EXT); if(configFile.exists()) { - Hierarchy h = new Hierarchy(new RootCategory((Level) Priority.DEBUG)); + Hierarchy h = new Hierarchy(new RootLogger((Level) Priority.DEBUG)); hierarchyMap.put(inetAddress, h); new PropertyConfigurator().doConfigure(configFile.getAbsolutePath(), h); @@ -184,7 +184,7 @@ LoggerRepository genericHierarchy() { if(genericHierarchy == null) { File f = new File(dir, GENERIC+CONFIG_FILE_EXT); if(f.exists()) { - genericHierarchy = new Hierarchy(new RootCategory((Level) Priority.DEBUG)); + genericHierarchy = new Hierarchy(new RootLogger((Level) Priority.DEBUG)); new PropertyConfigurator().doConfigure(f.getAbsolutePath(), genericHierarchy); } else { cat.warn("Could not find config file ["+f+ diff --git a/src/java/org/apache/log4j/net/test/Loop.java b/src/java/org/apache/log4j/net/test/Loop.java index 40643b6d97..a784f85976 100644 --- a/src/java/org/apache/log4j/net/test/Loop.java +++ b/src/java/org/apache/log4j/net/test/Loop.java @@ -15,8 +15,8 @@ public class Loop { public static void main(String[] args) { - Category root = Category.getRoot(); - Category cat = Category.getInstance(Loop.class.getName()); + Logger root = Logger.getRootLogger(); + Logger cat = Logger.getLogger(Loop.class.getName()); if(args.length != 2) usage("Wrong number of arguments."); diff --git a/src/java/org/apache/log4j/net/test/SMTPMin.java b/src/java/org/apache/log4j/net/test/SMTPMin.java index 9bb921261c..0975ff000e 100644 --- a/src/java/org/apache/log4j/net/test/SMTPMin.java +++ b/src/java/org/apache/log4j/net/test/SMTPMin.java @@ -11,7 +11,7 @@ public class SMTPMin { - static Category cat = Category.getInstance(SMTPMin.class); + static Logger cat = Logger.getLogger(SMTPMin.class); public static diff --git a/src/java/org/apache/log4j/net/test/SocketMin.java b/src/java/org/apache/log4j/net/test/SocketMin.java index cf317ba82e..334afa66b1 100644 --- a/src/java/org/apache/log4j/net/test/SocketMin.java +++ b/src/java/org/apache/log4j/net/test/SocketMin.java @@ -7,7 +7,7 @@ package org.apache.log4j.net.test; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.net.SocketAppender; import org.apache.log4j.Priority; @@ -16,7 +16,7 @@ public class SocketMin { - static Category cat = Category.getInstance(SyslogMin.class.getName()); + static Logger cat = Logger.getLogger(SyslogMin.class.getName()); static SocketAppender s; public @@ -46,7 +46,7 @@ void usage(String msg) { static void init(String host, String portStr) { - Category root = Category.getRoot(); + Logger root = Logger.getRootLogger(); BasicConfigurator.configure(); try { int port = Integer.parseInt(portStr); @@ -68,7 +68,7 @@ void init(String host, String portStr) { static void loop() { - Category root = Category.getRoot(); + Logger root = Logger.getRootLogger(); InputStreamReader in = new InputStreamReader(System.in); System.out.println("Type 'q' to quit"); int i; diff --git a/src/java/org/apache/log4j/net/test/SyslogMin.java b/src/java/org/apache/log4j/net/test/SyslogMin.java index 6cacc7371c..5bca2feb12 100644 --- a/src/java/org/apache/log4j/net/test/SyslogMin.java +++ b/src/java/org/apache/log4j/net/test/SyslogMin.java @@ -8,7 +8,7 @@ package org.apache.log4j.net.test; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.Priority; import org.apache.log4j.NDC; @@ -16,7 +16,7 @@ public class SyslogMin { - static Category CAT = Category.getInstance(SyslogMin.class.getName()); + static Logger CAT = Logger.getLogger(SyslogMin.class); public static diff --git a/src/java/org/apache/log4j/nt/test/NTMin.java b/src/java/org/apache/log4j/nt/test/NTMin.java index 49fc20a95a..6a463877a9 100644 --- a/src/java/org/apache/log4j/nt/test/NTMin.java +++ b/src/java/org/apache/log4j/nt/test/NTMin.java @@ -8,7 +8,7 @@ package org.apache.log4j.nt.test; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.nt.NTEventLogAppender; import org.apache.log4j.Priority; @@ -17,7 +17,7 @@ public class NTMin { - static Category cat = Category.getInstance(NTMin.class.getName()); + static Logger cat = Logger.getLogger(NTMin.class.getName()); public static diff --git a/src/java/org/apache/log4j/performance/ConcatVsArray.java b/src/java/org/apache/log4j/performance/ConcatVsArray.java deleted file mode 100644 index a3f6aca97f..0000000000 --- a/src/java/org/apache/log4j/performance/ConcatVsArray.java +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 1996-1999, International Business Machines -// Corporation. All Rights Reserved. - -package org.apache.log4j.performance; - -import java.util.Date; - -/** - Measure difference in performance of string concatenation versus - creating an anonymous string array. - -

      You should be able to see that anonymous string array - construction is significatnly faster than string concatenation. The - difference increases proportionally with the length of the strings - to be concatanated. - - @author Ceki Gülcü - */ -public class ConcatVsArray { - - - static - void Usage() { - System.err.println("Usage: java org.apache.log4j.performance.ConcatVsArray " + - "string1 string2 runLength\n" + - " where runLength is an integer."); - System.exit(1); - } - - public static void main(String args[]) { - - if(args.length != 3) { - Usage(); - } - - String s1 = args[0]; - String s2 = args[1]; - int runLength = 0; - try { - runLength = Integer.parseInt(args[2]); - } - catch(java.lang.NumberFormatException e) { - System.err.println(e); - Usage(); - } - - double micros; - - String[] sa; - long before = new Date().getTime(); - for(int i = 0; i < runLength; i++) { - sa = new String[]{s1, s2}; - } - micros = (new Date().getTime() - before)*1000.0/runLength; - System.out.println("The anonymous array loop took around " + micros + " microseconds."); - - String s; - before = new Date().getTime(); - for(int i = 0; i < runLength; i++) { - s = s1 + s2; - } - micros = (new Date().getTime() - before)*1000.0/runLength; - System.out.println("The append loop took around " + micros + " microseconds."); - - } -} diff --git a/src/java/org/apache/log4j/performance/Logging.java b/src/java/org/apache/log4j/performance/Logging.java deleted file mode 100644 index 1bc35a0bd1..0000000000 --- a/src/java/org/apache/log4j/performance/Logging.java +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright 1996-1999, International Business Machines -// Corporation. All Rights Reserved. - -// Copyright 2000, Ceki Gulcu. All Rights Reserved. - -// See the LICENCE file for the terms of distribution. - -package org.apache.log4j.performance; - -import org.apache.log4j.LogManager; -import org.apache.log4j.Category; -import org.apache.log4j.xml.DOMConfigurator; - -import org.apache.log4j.NDC; -import org.apache.log4j.performance.NOPWriter; - - -/** - Measure the performance of logging. - -

      Experimental results are listed below in units of - micro-seconds. Measurements were done on a AMD Duron clocked - at 800Mhz running Windows 2000 and Sun's 1.3 JDK. - -

      - - - - - - - - - - - - - - - -
      Layout -NullAppender -FileAppender -FileAppender (no flush) -AsyncAppender (no flush) - -
      SimpleLayout -4 -21 -16 -33 - -
      PatternLayout "%p - %m%n" -4 -21 -16 -32 - -
      PatternLayout "%-5p - %m%n" -4 -NA -NA -NA - -
      TTCCLayout/RELATIVE -10 -37 -31 -45 - -
      PatternLayout "%r [%t] %-5p %c{2} %x - %m%n" -11 -NA -NA -NA - -
      PatternLayout "%r [%t] %-5p %.10c %x - %m%n" -11 -NA -NA -NA - -
      PatternLayout "%r [%t] %-5p %.20c %x - %m%n" -11 -NA -NA -NA - -
      PatternLayout "%r [%t] %-5p %c - %m%n" -9 -36 -29 -45 - -
      TTCCLayout/ISO8601 -25 -58 -51 -71 - -
      PatternLayout "%d{ISO8601} [%t] %-5p %c %x - %m%n" -28 -62 -55 -76 - -
      PatternLayout "%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n" -46 -82 -72 -94 - -
      PatternLayout "%l - %m%n" - 241 - 317 - 299 - 251 - -
      PatternLayout "%C.%M.%L - %m%n" -267 -NA -NA -NA - -
      - -

      The results of the measurements (should) show that: - -

        - -
      1. The PatternLayout perforance is very close to the performance of - a dedicated layout of equivalent format. - -

      2. Format specifiers in conversion patterns have almost no impact - on performance. - -

      3. Formating time and date information is costly. Using relative - time has the least impact on performance. It is recommended that to - use log4j specific date formatters such as the {@link - org.apache.log4j.helpers.ISO8601DateFormat} instead of the standard {@link - java.text.SimpleDateFormat} because of its poor performance. See - the %d conversion character in {@link - org.apache.log4j.PatternLayout}. - -

      4. Avoiding the flush operation at the end of each append - results in a performance gain of 10 to 20 percent. However, there - is safety tradeoff invloved in skipping flushing. Indeed, when - flushing is skipped, then it is likely that the last few log events - will not be recorded on disk when the application exits. This is a - high price to pay even for a 20% performance gain. - -

      5. The AsyncAppender does not automatically - increase performance. On the contrary, it significantly degrades - performance. The performance tests done here very quickly fill up - the bounded buffer of the AsyncAppender and there is - cosiderable overhead in managing this bounded buffer. - -

        On the other hand, had we interleaved logging operations with - long blocking and non CPU-intensive operations, such as I/O, - network access, sleeping threads, then the - AsyncAppender would have tremendously reduced the cost - of logging in terms of overall application runtime. - -

        In a variant of this test, we have inserted a short sleep - operation between every 10 log operations. When the total slept - time is substracted, logging with the AsyncLogger - takes no time at all. In other words, logging is done for "free". - -

      6. Extracting location information is comparatively slow. It - implies at least a ten fold increase in logging time! It should be - avoided unless performace is not a concern. It has been reported - from a trusted source that logging with location information on AIX - machines will kill your application's performance. - -
      - - @author Ceki Gülcü - - */ -public class Logging { - - static int runLength; - static int delay = -1; - /** - A delay is applied after every burstLen log - requests. The default value of this constant is 100. */ - static int burstLen = 100; - static int DELAY_MULT = 1000/burstLen; - - static Category cat = Category.getInstance("A0123456789.B0123456789.C0123456789"); - - static - void Usage(String msg) { - System.err.println(msg); - System.err.println( - "Usage: java "+Logging.class.getName()+" confFile runLength [delay] [burstLen]\n"+ - " confFile is an XML configuration file and\n"+ - " runLength (integer) is the length of test loop.\n"+ - " delay is the time in millisecs to wait every bustLen log requests."); - System.exit(1); - } - - /** - * The main method. - * - * Usage: java org.apache.log4j.performance.Logging confFile runLength [delay] [burstLen] - * - *

      confFile is an XML configuration file and - * runLength (integer) is the length of test loop, - * delay is the time in millisecs to sleep every - * bustLen log requests. - * - *

      This application just prints the average time it took to log. - */ - public static void main(String argv[]) { - - if(argv.length == 2) - init(argv[0], argv[1], null, null); - else if( argv.length == 4) - init(argv[0], argv[1], argv[2], argv[3]); - else - Usage("Wrong number of arguments."); - - - NDC.push("some context"); - - double delta; - String msg = "ABCDEGHIJKLMNOPQRSTUVWXYZabcdeghijklmnopqrstuvwxyz1234567890"; - if(delay <= 0) - delta = NoDelayLoop(cat, msg); - else - delta = DelayedLoop(cat, msg); - - System.out.print((int)delta); - - LogManager.shutdown(); - - } - - /** - Program wide initialization method. - */ - static - void init(String configFile, String runLengthStr, String delayStr, - String burstLenStr) { - try { - runLength = Integer.parseInt(runLengthStr); - if(delayStr != null) { - delay = Integer.parseInt(delayStr); - } - if(delayStr != null) { - burstLen = Integer.parseInt(burstLenStr); - DELAY_MULT = 1000/burstLen; - } - } - catch(java.lang.NumberFormatException e) { - e.printStackTrace(); - } - DOMConfigurator.configure(configFile); - } - - static - double NoDelayLoop(Category category, String msg) { - long before = System.currentTimeMillis(); - for(int i = 0; i < runLength; i++) { - category.info(msg); - } - return ((System.currentTimeMillis() - before)*1000.0)/runLength; - } - - static - double DelayedLoop(Category category, String msg) { - long before = System.currentTimeMillis(); - int j = 0; - Thread currentThread = Thread.currentThread(); - for(int i = 0; i < runLength; i++) { - category.info(msg); - if(j++ == burstLen) { - j = 0; - try{currentThread.sleep(delay);}catch(Exception e){} - } - - } - double actualTime = ((System.currentTimeMillis()-before)*1000.0/runLength); - System.out.println("actual time: "+actualTime); - return (actualTime - delay*DELAY_MULT); - } -} diff --git a/src/java/org/apache/log4j/performance/NotLogging.java b/src/java/org/apache/log4j/performance/NotLogging.java deleted file mode 100644 index fdae912e70..0000000000 --- a/src/java/org/apache/log4j/performance/NotLogging.java +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 1996-2000, International Business Machines -// Corporation. All Rights Reserved. - -package org.apache.log4j.performance; - - -import org.apache.log4j.Category; -import org.apache.log4j.LogManager; -import org.apache.log4j.SimpleLayout; -import org.apache.log4j.ConsoleAppender; - -import org.apache.log4j.Level; - -/** - Measure the performance of evaluating whether to log or not to log, - but not actually logging. - -

      This program takes two arguments, a string which should be - "true" for testing shipped code performance and "false" for testing - debug-enabled performance the second argument is the run length of - the measurement loops. - -

      The results of the measurement (should) show that - -

        - -

        -

      • Category evaluation is independent of the length of the category name. - -

        -

      • As expected, using the {@link Category#isDebugEnabled - isDebugEnabled} and {@link Category#isInfoEnabled isInfoEnabled} - methods eliminates the overhead of message argument construction. - -

      • Message argument construction can be an important slowing - factor while evaluating whether to log or not. - -
      - - @author Ceki Gülcü - -*/ -public class NotLogging { - - static int runLength; - - final static int INITIAL_HASH_SIZE = 101; - - static String SHORT_MSG = "Hello World"; - - static Category SHORT_CAT = Category.getInstance("A0123456789"); - static Category MEDIUM_CAT= Category.getInstance("A0123456789.B0123456789"); - static Category LONG_CAT = - Category.getInstance("A0123456789.B0123456789.C0123456789"); - - static Category INEXISTENT_SHORT_CAT = Category.getInstance("I0123456789"); - static Category INEXISTENT_MEDIUM_CAT= - Category.getInstance("I0123456789.B0123456789"); - static Category INEXISTENT_LONG_CAT= - Category.getInstance("I0123456789.B0123456789.C0123456789"); - - - static Category[] CAT_ARRAY = new Category[] {SHORT_CAT, MEDIUM_CAT, - LONG_CAT, INEXISTENT_SHORT_CAT, - INEXISTENT_MEDIUM_CAT, - INEXISTENT_LONG_CAT}; - - static - void Usage() { - System.err.println( - "Usage: java org.apache.log4j.test.NotLogging true|false runLength\n" + - "true indicates shipped code, false indicates code in development" + - " where runLength is an int representing the run length of loops\n"+ - "We suggest that runLength be at least 100'000."); - System.exit(1); - } - - public static void main(String argv[]) { - - if(argv.length != 2) { - Usage(); - } - ProgramInit(argv); - double delta; - - - System.out.println(); - for(int i = 0; i < CAT_ARRAY.length; i++) { - delta = SimpleMessage(CAT_ARRAY[i], SHORT_MSG, runLength); - System.out.println("Simple argument, " + delta - + " micros. Cat: " + CAT_ARRAY[i].getName()); - } - - System.out.println(); - for(int i = 0; i < CAT_ARRAY.length; i++) { - delta = FullyOptimizedComplexMessage(CAT_ARRAY[i], runLength); - System.out.println("Fully optimized complex, " + delta + - " micros. Cat: " + CAT_ARRAY[i].getName()); - } - - System.out.println(); - for(int i = 0; i < CAT_ARRAY.length; i++) { - delta = ComplexMessage(CAT_ARRAY[i], runLength); - System.out.println("Complex message argument, " + delta + - " micros. Cat: " + CAT_ARRAY[i].getName()); - } - - } - - /** - Program wide initialization method. */ - static - void ProgramInit(String[] args) { - - try { - runLength = Integer.parseInt(args[1]); - } - catch(java.lang.NumberFormatException e) { - System.err.println(e); - Usage(); - } - - - ConsoleAppender appender = new ConsoleAppender(new SimpleLayout()); - - if("false".equals(args[0])) { - // nothing to do - } else if ("true".equals(args[0])) { - System.out.println("Flagging as shipped code."); - LogManager.getLoggerRepository().setThreshold((Level) Level.WARN); - } else - Usage(); - - SHORT_CAT.setLevel((Level) Level.INFO); - Category.getRoot().setLevel((Level) Level.INFO); - - } - - - static - double SimpleMessage(Category category, String msg, long runLength) { - long before = System.currentTimeMillis(); - for(int i = 0; i < runLength; i++) { - category.debug(msg); - } - return (System.currentTimeMillis() - before)*1000.0/runLength; - } - - static - double FullyOptimizedComplexMessage(Category category, long runLength) { - long before = System.currentTimeMillis(); - for(int i = 0; i < runLength; i++) { - if(category.isDebugEnabled()) - category.debug("Message" + i + - " bottles of beer standing on the wall."); - } - return (System.currentTimeMillis() - before)*1000.0/runLength; - } - - static - double ComplexMessage(Category category, long runLength) { - long before = System.currentTimeMillis(); - for(int i = 0; i < runLength; i++) { - category.debug("Message" + i + - " bottles of beer standing on the wall."); - } - return (System.currentTimeMillis() - before)*1000.0/runLength; - } -} diff --git a/src/java/org/apache/log4j/spi/RootCategory.java b/src/java/org/apache/log4j/spi/RootCategory.java index 7ec80b4170..f83e0ec128 100644 --- a/src/java/org/apache/log4j/spi/RootCategory.java +++ b/src/java/org/apache/log4j/spi/RootCategory.java @@ -13,16 +13,7 @@ // Contibutors: Mathias Bogaert /** - RootCategory sits at the top of the category hierachy. It is a - regular category except that it provides several guarantees. - -

      First, it cannot be assigned a null - priority. Second, since root category cannot have a parent, the - {@link #getChainedLevel} method always returns the value of the - level field without walking the hierarchy. - - @author Ceki Gülcü - + * @deprecated Replaced by {@link RootLogger}. */ final public class RootCategory extends Logger { diff --git a/src/java/org/apache/log4j/test/AsyncAppenderTest.java b/src/java/org/apache/log4j/test/AsyncAppenderTest.java index 697ec19f15..b9a7107e90 100644 --- a/src/java/org/apache/log4j/test/AsyncAppenderTest.java +++ b/src/java/org/apache/log4j/test/AsyncAppenderTest.java @@ -6,7 +6,7 @@ package org.apache.log4j.test; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.apache.log4j.xml.DOMConfigurator; @@ -16,7 +16,7 @@ */ public class AsyncAppenderTest { - static Category cat = Category.getInstance(AsyncAppenderTest.class); + static Logger cat = Logger.getLogger(AsyncAppenderTest.class); static int delayBeforeClose; @@ -54,7 +54,7 @@ void init(String configFile, String delayBeforeCloseStr) { static void test() { - Category root = Category.getRoot(); + Logger root = Logger.getRootLogger(); for(int i = 0; i < 100; i++) { root.debug("Message " + i); } diff --git a/src/java/org/apache/log4j/test/Base64.java b/src/java/org/apache/log4j/test/Base64.java deleted file mode 100644 index a3b1fc2c94..0000000000 --- a/src/java/org/apache/log4j/test/Base64.java +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 1996-1999, International Business Machines -// Corporation. All Rights Reserved. - - -package org.apache.log4j.test; - -class Base64 { - - final static int MAX_LINE = 76; - - static byte[] asciiEncoding = - //A B C D E F G H I J K L M N O P Q - {65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - //R S ... Z a b c d e f g - 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, - //h i j k l m n o p q r s t u - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - //v w x y z 0 1 2 3 4 5 6 7 8 9 + / - 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47}; - - static char[] charEnc = new char[64]; - - static { - for(int i = 0; i < 26; i ++) { - charEnc[i] = (char) ('A' + i); - charEnc[i+26] = (char) ('a' + i); - } - for(int i = 0; i < 10; i ++) { - charEnc[i+52] = (char) ('0' + i); - } - charEnc[62] = '+'; - charEnc[63] = '/'; - } - - - - static - String toString(byte[] inbuf) { - return toString(inbuf, 0, inbuf.length); - } - /** - - */ - static - String toString(byte[] inbuf, int offset, int length) { - - StringBuffer output = new StringBuffer((length)*4/3 + 1); - - int in; - char[] out = new char[4]; - - int i = offset; - boolean ended = false; - int last = offset + length; - int j; - int bitsRead; - - while(!ended) { - in = 0; - bitsRead = 0; - for(j = 0; j < 3; j++) { - if(i == last) { - ended = true; - break; - } - in = (in << 8) | (inbuf[i++] & 0xFF); - bitsRead += 8; - } - - while(bitsRead >= 6) { - bitsRead -= 6; - output.append(charEnc[(in >>> bitsRead) & 0x3F]); - } - - if(bitsRead == 4) { - output.append(charEnc[(in & 0x0F) << 2]); - output.append("="); - } - else if (bitsRead == 2) { - output.append(charEnc[(in & 0x03) << 4]); - output.append("=="); - } - } - return output.toString(); - } - - - public static void main(String[] args) { - - byte[] inbuf = new byte[MAX_LINE]; - - while(true) { - try { - int read = System.in.read(inbuf, 0, MAX_LINE); - if(read == -1) break; - System.out.println("Read " + read + " chars."); - System.out.println(Base64.toString(inbuf, 0, read)); - } - catch (Exception e) { - System.out.println("Exception " + e); - } - - } - } -} diff --git a/src/java/org/apache/log4j/test/CategoryWrapper.java b/src/java/org/apache/log4j/test/CategoryWrapper.java index fd5928d679..947a2ca7a9 100644 --- a/src/java/org/apache/log4j/test/CategoryWrapper.java +++ b/src/java/org/apache/log4j/test/CategoryWrapper.java @@ -12,11 +12,11 @@ public class CategoryWrapper { - Category c; + Logger c; static String FQCN = CategoryWrapper.class.getName(); CategoryWrapper(String name) { - c = Category.getInstance(name); + c = Logger.getLogger(name); } public @@ -39,7 +39,7 @@ void addAppender(Appender appender) { void print(String msg) { // You have to supply the fully qualified named of the wrapper - // class to the specially tailored category.log method for + // class to the specially tailored logger.log method for // PatternLayout's %C conversion pattern to work. // We have to add the ".print" string because the invocation of diff --git a/src/java/org/apache/log4j/test/ConfigurationFileParsing.java b/src/java/org/apache/log4j/test/ConfigurationFileParsing.java index b7d5ed9fe4..8a0725f778 100644 --- a/src/java/org/apache/log4j/test/ConfigurationFileParsing.java +++ b/src/java/org/apache/log4j/test/ConfigurationFileParsing.java @@ -8,7 +8,7 @@ package org.apache.log4j.test; import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.apache.log4j.NDC; @@ -21,7 +21,7 @@ void main(String argv[]) { if(argv.length == 1) { NDC.push("testing"); PropertyConfigurator.configure(argv[0]); - Category root = Category.getRoot(); + Logger root = Logger.getRootLogger(); root.debug("Message 1"); root.debug("Message 2"); NDC.pop(); diff --git a/src/java/org/apache/log4j/test/DRFATest.java b/src/java/org/apache/log4j/test/DRFATest.java index 07b0968e17..640845750e 100644 --- a/src/java/org/apache/log4j/test/DRFATest.java +++ b/src/java/org/apache/log4j/test/DRFATest.java @@ -7,7 +7,7 @@ package org.apache.log4j.test; import org.apache.log4j.BasicConfigurator; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.Layout; import org.apache.log4j.PatternLayout; import org.apache.log4j.Appender; @@ -20,7 +20,7 @@ */ public class DRFATest { - static Category cat = Category.getInstance(DRFATest.class); + static Logger cat = Logger.getLogger(DRFATest.class); static int limit; diff --git a/src/java/org/apache/log4j/test/DefaultInit.java b/src/java/org/apache/log4j/test/DefaultInit.java index 8c3616d996..3f14f77dfa 100644 --- a/src/java/org/apache/log4j/test/DefaultInit.java +++ b/src/java/org/apache/log4j/test/DefaultInit.java @@ -1,11 +1,11 @@ package org.apache.log4j.test; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; public class DefaultInit { - static Category cat = Category.getInstance(DefaultInit.class); + static Logger cat = Logger.getLogger(DefaultInit.class); public static void main( String[] argv) { cat.debug("Hello world"); diff --git a/src/java/org/apache/log4j/test/DelayedLoop.java b/src/java/org/apache/log4j/test/DelayedLoop.java index 3af6a48e8b..581235e513 100644 --- a/src/java/org/apache/log4j/test/DelayedLoop.java +++ b/src/java/org/apache/log4j/test/DelayedLoop.java @@ -7,7 +7,7 @@ package org.apache.log4j.test; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.xml.DOMConfigurator; @@ -20,7 +20,7 @@ @author Ceki Gülcü */ public class DelayedLoop { - static Category cat = Category.getInstance(DelayedLoop.class); + static Logger cat = Logger.getLogger(DelayedLoop.class); static int loopLength; public diff --git a/src/java/org/apache/log4j/test/FQCNTest.java b/src/java/org/apache/log4j/test/FQCNTest.java index 5d6a3377ef..5b92ff328a 100644 --- a/src/java/org/apache/log4j/test/FQCNTest.java +++ b/src/java/org/apache/log4j/test/FQCNTest.java @@ -18,7 +18,7 @@ */ public class FQCNTest { - //static Logger cat = Logger.getLoggerInstance("dddd"); + //static Logger cat = Logger.getLogger("dddd"); public static @@ -42,7 +42,7 @@ void init(String file) throws Exception { Layout layout = new PatternLayout("%p %c (%C{2}#%M) - %m%n"); FileAppender appender = new FileAppender(layout, file, false); appender.setLayout(layout); - Category root = Category.getRoot(); + Logger root = Logger.getRootLogger(); root.addAppender(appender); } diff --git a/src/java/org/apache/log4j/test/Finalize.java b/src/java/org/apache/log4j/test/Finalize.java index 61fa03304b..9e0f17c482 100644 --- a/src/java/org/apache/log4j/test/Finalize.java +++ b/src/java/org/apache/log4j/test/Finalize.java @@ -3,13 +3,13 @@ package org.apache.log4j.test; import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import java.io.InputStreamReader; import java.util.Enumeration; public class Finalize { - static Category CAT = Category.getInstance(Finalize.class.getName()); + static Logger CAT = Logger.getLogger(Finalize.class.getName()); public static @@ -42,7 +42,7 @@ void test() { int i = -1; InputStreamReader in = new InputStreamReader(System.in); - Category root = Category.getRoot(); + Logger root = Logger.getRootLogger(); System.out.println("Type 'q' to quit"); int j = 0; @@ -68,7 +68,7 @@ else if(i == 'q') } static - void foo(Category cat) { + void foo(Logger cat) { Enumeration enumaration = cat.getAllAppenders(); while(enumaration != null && enumaration.hasMoreElements()) { ((org.apache.log4j.Appender) enumaration.nextElement()).close(); diff --git a/src/java/org/apache/log4j/test/Hello.java b/src/java/org/apache/log4j/test/Hello.java index ac663f3237..02746a5b29 100644 --- a/src/java/org/apache/log4j/test/Hello.java +++ b/src/java/org/apache/log4j/test/Hello.java @@ -7,7 +7,7 @@ package org.apache.log4j.test; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; /** @@ -17,7 +17,7 @@ */ public class Hello { - static Category cat = Category.getInstance(Hello.class); + static Logger cat = Logger.getLogger(Hello.class); public static diff --git a/src/java/org/apache/log4j/test/L7D.java b/src/java/org/apache/log4j/test/L7D.java deleted file mode 100644 index edc663b546..0000000000 --- a/src/java/org/apache/log4j/test/L7D.java +++ /dev/null @@ -1,79 +0,0 @@ - - -// Copyright 1996-2000, International Business Machines -// Corporation. All Rights Reserved. -// -// See the LICENCE file for the terms of distribution. - -package org.apache.log4j.test; - -import org.apache.log4j.*; -import java.util.*; -import java.text.*; - -/** - This class is a simple test of the localization routines in - Category class. - - @author Ceki Gülcü, IBM Zurich Research Laboratory */ -public class L7D { - static ResourceBundle[] bundles; - - - public - static - void main(String args[]) { - if(args.length == 3) - init(args[0], args[1], args[2]); - else - Usage("Wrong number of arguments."); - - test(); - } - - static - void Usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java " + L7D.class.getName() + - "configFile ISO639LanguageCode ISO2166CountryCode"); - System.exit(1); - } - - static - void init(String configFile, String lanCode, String countryCode) { - PropertyConfigurator.configure(configFile); - bundles = new ResourceBundle[3]; - - try { - bundles[0] = ResourceBundle.getBundle("L7D", new Locale("en", "US")); - bundles[1] = ResourceBundle.getBundle("L7D", new Locale("fr", "FR")); - bundles[2] = ResourceBundle.getBundle("L7D", new Locale("fr", "CH")); - - } - catch(MissingResourceException e) { - e.printStackTrace(); - } - } - - static - void test() { - Category root = Category.getRoot(); - - for(int i = 0; i < bundles.length; i++) { - root.setResourceBundle(bundles[i]); - - root.l7dlog(Priority.DEBUG, "bogus1", null); - root.l7dlog(Priority.INFO, "test", null); - root.l7dlog(Priority.WARN, "hello_world", null); - root.l7dlog(Priority.DEBUG, "msg1", - new Object[] {new Integer(i+1), "log4j"}, null); - root.l7dlog(Priority.ERROR, "bogusMsg", - new Object[] {new Integer(i+1), "log4j"}, null); - root.l7dlog(Priority.ERROR, "msg1", - new Object[] {new Integer(i+1), "log4j"}, null); - root.l7dlog(Priority.INFO, "bogus2", null); - } - - } - -} diff --git a/src/java/org/apache/log4j/test/MDCStress.java b/src/java/org/apache/log4j/test/MDCStress.java index 9e7b97cd24..315d0183ee 100644 --- a/src/java/org/apache/log4j/test/MDCStress.java +++ b/src/java/org/apache/log4j/test/MDCStress.java @@ -8,8 +8,8 @@ public class MDCStress extends Thread { - static Category root = Category.getRoot(); - static Category log = Category.getInstance(MDCStress.class); + static Logger root = Logger.getRootLogger(); + static Logger log = Logger.getLogger(MDCStress.class); static Random random = new Random(17); diff --git a/src/java/org/apache/log4j/test/MultipleAppenders.java b/src/java/org/apache/log4j/test/MultipleAppenders.java index 3ffd335e62..505f368bf5 100644 --- a/src/java/org/apache/log4j/test/MultipleAppenders.java +++ b/src/java/org/apache/log4j/test/MultipleAppenders.java @@ -2,7 +2,7 @@ package org.apache.log4j.test; import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.Appender; import java.util.Enumeration; import java.util.Vector; @@ -16,7 +16,7 @@ void main(String argv[]) { // A1 and A2 should be added to root by reading the config file PropertyConfigurator.configure(argv[0]); - Category root = Category.getRoot(); + Logger root = Logger.getRootLogger(); Enumeration e1 = root.getAllAppenders(); Vector v = new Vector(1); diff --git a/src/java/org/apache/log4j/test/PatternTest.java b/src/java/org/apache/log4j/test/PatternTest.java index 1439a0aab3..b6da2e6fb7 100644 --- a/src/java/org/apache/log4j/test/PatternTest.java +++ b/src/java/org/apache/log4j/test/PatternTest.java @@ -2,7 +2,7 @@ package org.apache.log4j.test; import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.apache.log4j.Priority; /** @@ -11,7 +11,7 @@ @author Ceki Gülcü */ public class PatternTest { - static Category CAT = Category.getInstance(PatternTest.class); + static Logger CAT = Logger.getLogger(PatternTest.class); public @@ -41,7 +41,7 @@ void init(String configFile) { static void test() { int i = -1; - Category root = Category.getRoot(); + Logger root = Logger.getRootLogger(); CAT.debug("Message " + ++i); root.debug("Message " + i); diff --git a/src/java/org/apache/log4j/test/ROFile.java b/src/java/org/apache/log4j/test/ROFile.java index 4f36a0fb32..c6eeefddee 100644 --- a/src/java/org/apache/log4j/test/ROFile.java +++ b/src/java/org/apache/log4j/test/ROFile.java @@ -1,11 +1,11 @@ package org.apache.log4j.test; import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; public class ROFile { - static Category cat = Category.getInstance(ROFile.class.getName()); + static Logger cat = Logger.getLogger(ROFile.class); public static diff --git a/src/java/org/apache/log4j/test/Shallow.java b/src/java/org/apache/log4j/test/Shallow.java index c5cf1e5bea..fc4bb33950 100644 --- a/src/java/org/apache/log4j/test/Shallow.java +++ b/src/java/org/apache/log4j/test/Shallow.java @@ -8,7 +8,7 @@ package org.apache.log4j.test; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.xml.DOMConfigurator; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.apache.log4j.NDC; @@ -20,7 +20,7 @@ */ public class Shallow { - static Category cat = Category.getInstance(Shallow.class); + static Logger cat = Logger.getLogger(Shallow.class); public static @@ -51,7 +51,7 @@ void init(String configFile) { void test() { int i = -1; NDC.push("NDC"); - Category root = Category.getRoot(); + Logger root = Logger.getRootLogger(); cat.debug("Message " + ++i); root.debug("Message " + i); diff --git a/src/java/org/apache/log4j/test/ShortSocketServer.java b/src/java/org/apache/log4j/test/ShortSocketServer.java index 6f01dc1e52..5eb02cc2eb 100644 --- a/src/java/org/apache/log4j/test/ShortSocketServer.java +++ b/src/java/org/apache/log4j/test/ShortSocketServer.java @@ -5,7 +5,7 @@ import java.net.Socket; import java.net.ServerSocket; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.helpers.LogLog; @@ -16,7 +16,7 @@ public class ShortSocketServer { - static Category cat = Category.getInstance(ShortSocketServer.class.getName()); + static Logger cat = Logger.getLogger(ShortSocketServer.class.getName()); static int port; diff --git a/src/java/org/apache/log4j/test/StressAsyncAppender.java b/src/java/org/apache/log4j/test/StressAsyncAppender.java index 549f60929c..4f32ccbeab 100644 --- a/src/java/org/apache/log4j/test/StressAsyncAppender.java +++ b/src/java/org/apache/log4j/test/StressAsyncAppender.java @@ -4,7 +4,7 @@ package org.apache.log4j.test; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; @@ -16,7 +16,7 @@ */ public class StressAsyncAppender extends Thread { - static Category root = Category.getRoot(); + static Logger root = Logger.getRootLogger(); static Random random = new Random(101); diff --git a/src/java/org/apache/log4j/test/StressNDC.java b/src/java/org/apache/log4j/test/StressNDC.java deleted file mode 100644 index 7d9377460e..0000000000 --- a/src/java/org/apache/log4j/test/StressNDC.java +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 1996-1999, International Business Machines -// Corporation and others. All Rights Reserved. - -package org.apache.log4j.test; - - -import org.apache.log4j.Category; -import org.apache.log4j.BasicConfigurator; -import org.apache.log4j.NDC; - - -import java.util.Random; -import java.util.Stack; - -/** - Stress test {@link NDC}. - - */ -public class StressNDC extends Thread { - - static Category root = Category.getRoot(); - - static Random random = new Random(101); - - static final int LOOP_LENGTH = 24; - static final int PUSH_MISS = LOOP_LENGTH/2; - static final int POP_MISS = PUSH_MISS*2; - - static final int BRANCHING_FACTOR = 4 + 1; // add 1 to the number you want - - static int maxThreads; - static int msgCounter = 0; - static int threadCounter = 0; - - static double LOG_2 = Math.log(2); - - static Object lock = new Object(); - - - public - static - void main(String args[]) { - BasicConfigurator.configure(); - - if(args.length != 1) { - usage(); - } - - try { - maxThreads = Integer.parseInt(args[0]); - } - catch(java.lang.NumberFormatException e) { - System.err.println(e); - usage(); - } - - root.debug( "push(IP=127.0.0.1)"); - - NDC.push("IP=127.0.0.1"); - - while(true) { - synchronized(lock) { - // Adding 1 to ensure that at least 1 child is created. - createChildren(randomInt(BRANCHING_FACTOR) + 1); - - // wait until all threads are finished - try { - root.debug( "About to wait for notification."); - lock.wait(); - root.debug( "Got a notification."); - } - catch(InterruptedException e) { - root.warn("Unpextected InterruptedException received.", e); - } - } - } - } - - static - void usage() { - System.err.println( "Usage: java org.apache.log4j.test.StressNDC " + - "MAX_THREADS"); - System.exit(1); - } - - - Stack parentDC; - - public - StressNDC(Stack parentDC) { - this.setName(randomID()); - this.parentDC = parentDC; - } - - public - void run() { - NDC.inherit(parentDC); - - int loopLength = StressNDC.randomInt(LOOP_LENGTH); - root.debug("In run loop.debug( loopLength = "+loopLength); - - int createIndex = loopLength/2; - - for(int i = 0; i <= loopLength; i++) { - - if(i == createIndex) - createChildren(randomInt(BRANCHING_FACTOR)); - - if(randomInt(PUSH_MISS) == 0) { - String id = randomID(); - root.debug( "push("+id+")"); - NDC.push(id); - } - root.debug( "Message number " + StressNDC.msgCounter++); - if(randomInt(POP_MISS) == 0) { - root.debug( "pop()"); - NDC.pop(); - } - } - - synchronized(lock) { - StressNDC.threadCounter--; - root.debug( "Exiting run loop. " + threadCounter); - if(StressNDC.threadCounter <= 0) { - root.debug( "Notifying [main] thread."); - lock.notify(); // wake up the main thread - } - } - - // We sometimes forget to remove references - if((loopLength % 2) == 0) { - root.debug("Removing NDC for this thread."); - NDC.remove(); - } - } - - public - static - void createChildren(int n) { - if (n <= 0) - return; - - synchronized(lock) { - n = maxThreadsConstained(n); - root.debug("Creating " + n+ " child StressNDC threads."); - for(int i = 0; i < n; i++) { - root.debug("New StressNDC, threadCounter = " + (++threadCounter)); - new StressNDC(NDC.cloneStack()).start(); - } - } - } - - static - public - int maxThreadsConstained(int a) { - int maxAllowed = StressNDC.maxThreads - StressNDC.threadCounter; - return a <= maxAllowed ? a : maxAllowed; - } - - /** - Return a random value in the range - */ - public - static - int randomInt(int n) { - int r = random.nextInt() % n; - return r >= 0 ? r : -r; - } - - public - static - String randomID() { - return Integer.toString(random.nextInt()& 0xFFFFFF); - } -} diff --git a/src/java/org/apache/log4j/test/SysoutConfigurator.java b/src/java/org/apache/log4j/test/SysoutConfigurator.java index aa87c853c7..2007ce95e9 100644 --- a/src/java/org/apache/log4j/test/SysoutConfigurator.java +++ b/src/java/org/apache/log4j/test/SysoutConfigurator.java @@ -5,14 +5,14 @@ /** * This configurator simply always adds a FileAppender writing to - * System.out to the root Category and ignores whatever is in the + * System.out to the root Logger and ignores whatever is in the * properties file. */ public class SysoutConfigurator implements Configurator { public void doConfigure(java.net.URL url, LoggerRepository hierarchy) { - Category.getRoot().addAppender( + Logger.getRootLogger().addAppender( new ConsoleAppender( new SimpleLayout(), ConsoleAppender.SYSTEM_OUT)); } diff --git a/src/java/org/apache/log4j/varia/Roller.java b/src/java/org/apache/log4j/varia/Roller.java index d416896a40..8e96317f51 100644 --- a/src/java/org/apache/log4j/varia/Roller.java +++ b/src/java/org/apache/log4j/varia/Roller.java @@ -8,7 +8,7 @@ package org.apache.log4j.varia; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; import java.io.IOException; @@ -29,7 +29,7 @@ @since version 0.9.0 */ public class Roller { - static Category cat = Category.getInstance(Roller.class.getName()); + static Logger cat = Logger.getLogger(Roller.class); static String host; diff --git a/src/java/org/apache/log4j/varia/test/Loop.java b/src/java/org/apache/log4j/varia/test/Loop.java index ae60aa2397..a43fdf5ab3 100644 --- a/src/java/org/apache/log4j/varia/test/Loop.java +++ b/src/java/org/apache/log4j/varia/test/Loop.java @@ -1,7 +1,7 @@ package org.apache.log4j.varia.test; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; /** @@ -12,7 +12,7 @@ @author Ceki Gülcü */ public class Loop { - static Category cat = Category.getInstance(Loop.class.getName()); + static Logger cat = Logger.getLogger(Loop.class); static int loopLength; public From 6617d7c416eafed20a87f8a15a004b183825f2eb Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Mon, 1 Nov 2004 16:31:11 +0000 Subject: [PATCH 090/342] - Cleaned up all the warning messages resulting from the deprecation of the Category.getInstance() and Category.getRoot() methods. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310827 13f79535-47bb-0310-9956-ffa450edef68 --- examples/MyPatternLayout.java | 8 ++++---- examples/NumberCruncherServer.java | 17 ++++++++--------- examples/SortAlgo.java | 14 +++++++------- examples/Trivial.java | 14 +++++++------- src/java/org/apache/log4j/jmx/Agent.java | 4 ++-- .../apache/log4j/xml/examples/XMLSample.java | 6 +++--- src/java/org/apache/log4j/xml/test/DOMTest.java | 6 +++--- .../java/org/apache/log4j/LoggerTestCase.java | 4 ++-- .../java/org/apache/log4j/MyPatternLayout.java | 8 ++++---- .../java/org/apache/log4j/StressCategory.java | 14 +++++++------- .../log4j/helpers/BoundedFIFOTestCase.java | 4 ++-- .../log4j/helpers/CyclicBufferTestCase.java | 4 ++-- 12 files changed, 51 insertions(+), 52 deletions(-) diff --git a/examples/MyPatternLayout.java b/examples/MyPatternLayout.java index eba1787c66..9116864f68 100644 --- a/examples/MyPatternLayout.java +++ b/examples/MyPatternLayout.java @@ -46,9 +46,9 @@ PatternParser createPatternParser(String pattern) { public static void main(String[] args) { Layout layout = new MyPatternLayout("[counter=%.10#] - %m%n"); - Category cat = Category.getInstance("some.cat"); - cat.addAppender(new ConsoleAppender(layout, ConsoleAppender.SYSTEM_OUT)); - cat.debug("Hello, log"); - cat.info("Hello again..."); + Logger logger = Logger.getLogger("some.cat"); + logger.addAppender(new ConsoleAppender(layout, ConsoleAppender.SYSTEM_OUT)); + logger.debug("Hello, log"); + logger.info("Hello again..."); } } diff --git a/examples/NumberCruncherServer.java b/examples/NumberCruncherServer.java index d2eec74ee9..a5dde22737 100644 --- a/examples/NumberCruncherServer.java +++ b/examples/NumberCruncherServer.java @@ -14,7 +14,7 @@ import java.util.Vector; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.NDC; import org.apache.log4j.PropertyConfigurator; @@ -54,8 +54,7 @@ public class NumberCruncherServer extends UnicastRemoteObject implements NumberCruncher { - static Category cat = Category.getInstance( - NumberCruncherServer.class.getName()); + static Logger logger = Logger.getLogger(NumberCruncherServer.class); public NumberCruncherServer() throws RemoteException { @@ -79,7 +78,7 @@ int[] factor(int number) throws RemoteException { // contained in cookies. NDC.push(String.valueOf(number)); - cat.info("Beginning to factor."); + logger.info("Beginning to factor."); if(number <= 0) { throw new IllegalArgumentException(number+" is not a positive integer."); } @@ -93,10 +92,10 @@ else if(number == 1) // It is bad practice to place log requests within tight loops. // It is done here to show interleaved log output from // different requests. - cat.debug("Trying to see if " + i + " is a factor."); + logger.debug("Trying to see if " + i + " is a factor."); if((n % i) == 0) { - cat.info("Found factor "+i); + logger.info("Found factor "+i); factors.addElement(new Integer(i)); do { n /= i; @@ -108,7 +107,7 @@ else if(number == 1) } if(n != 1) { - cat.info("Found factor "+n); + logger.info("Found factor "+n); factors.addElement(new Integer(n)); } @@ -153,10 +152,10 @@ public static void main(String[] args) { try { ncs = new NumberCruncherServer(); Naming.rebind("Factor", ncs); - cat.info("NumberCruncherServer bound and ready to serve."); + logger.info("NumberCruncherServer bound and ready to serve."); } catch(Exception e) { - cat.error("Could not bind NumberCruncherServer.", e); + logger.error("Could not bind NumberCruncherServer.", e); return; } NumberCruncherClient.loop(ncs); diff --git a/examples/SortAlgo.java b/examples/SortAlgo.java index a5a3f53e2f..98a4b04402 100644 --- a/examples/SortAlgo.java +++ b/examples/SortAlgo.java @@ -1,7 +1,7 @@ package examples; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.NDC; /** @@ -16,11 +16,11 @@ public class SortAlgo { final static String className = SortAlgo.class.getName(); - final static Category CAT = Category.getInstance(className); - final static Category OUTER = Category.getInstance(className + ".OUTER"); - final static Category INNER = Category.getInstance(className + ".INNER"); - final static Category DUMP = Category.getInstance(className + ".DUMP"); - final static Category SWAP = Category.getInstance(className + ".SWAP"); + final static Logger LOG = Logger.getLogger(className); + final static Logger OUTER = Logger.getLogger(className + ".OUTER"); + final static Logger INNER = Logger.getLogger(className + ".INNER"); + final static Logger DUMP = Logger.getLogger(className + ".DUMP"); + final static Logger SWAP = Logger.getLogger(className + ".SWAP"); int[] intArray; @@ -29,7 +29,7 @@ public class SortAlgo { } void bubbleSort() { - CAT.info( "Entered the sort method."); + LOG.info( "Entered the sort method."); for(int i = intArray.length -1; i >= 0 ; i--) { NDC.push("i=" + i); diff --git a/examples/Trivial.java b/examples/Trivial.java index 0f97056295..9be452defb 100644 --- a/examples/Trivial.java +++ b/examples/Trivial.java @@ -2,7 +2,7 @@ package examples; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.NDC; @@ -33,31 +33,31 @@ */ public class Trivial { - static Category cat = Category.getInstance(Trivial.class.getName()); + static Logger logger = Logger.getLogger(Trivial.class); public static void main(String[] args) { BasicConfigurator.configure(); NDC.push("Client #45890"); - cat.info("Awake awake. Put on thy strength."); + logger.info("Awake awake. Put on thy strength."); Trivial.foo(); InnerTrivial.foo(); - cat.info("Exiting Trivial."); + logger.info("Exiting Trivial."); } static void foo() { NDC.push("DB"); - cat.debug("Now king David was old."); + logger.debug("Now king David was old."); NDC.pop(); } static class InnerTrivial { - static Category cat = Category.getInstance(InnerTrivial.class.getName()); + static Logger logger = Logger.getLogger(InnerTrivial.class); static void foo() { - cat.info("Entered foo."); + logger.info("Entered foo."); } } } diff --git a/src/java/org/apache/log4j/jmx/Agent.java b/src/java/org/apache/log4j/jmx/Agent.java index 3049a91792..68de333c47 100644 --- a/src/java/org/apache/log4j/jmx/Agent.java +++ b/src/java/org/apache/log4j/jmx/Agent.java @@ -6,12 +6,12 @@ import javax.management.MBeanServerFactory; import com.sun.jdmk.comm.HtmlAdaptorServer; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; public class Agent { - static Category log = Category.getInstance(Agent.class); + static Logger log = Logger.getLogger(Agent.class); public Agent() { } diff --git a/src/java/org/apache/log4j/xml/examples/XMLSample.java b/src/java/org/apache/log4j/xml/examples/XMLSample.java index d3ee98cf7a..91c4882aaa 100644 --- a/src/java/org/apache/log4j/xml/examples/XMLSample.java +++ b/src/java/org/apache/log4j/xml/examples/XMLSample.java @@ -2,7 +2,7 @@ package org.apache.log4j.xml.examples; import org.apache.log4j.xml.DOMConfigurator; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import java.net.*; /** @@ -22,7 +22,7 @@ */ public class XMLSample { - static Category cat = Category.getInstance(XMLSample.class.getName()); + static Logger cat = Logger.getLogger(XMLSample.class); public static @@ -51,7 +51,7 @@ void init(String configFile) { static void sample() { int i = -1; - Category root = Category.getRoot(); + Logger root = Logger.getRootLogger(); cat.debug("Message " + ++i); cat.warn ("Message " + ++i); cat.error("Message " + ++i); diff --git a/src/java/org/apache/log4j/xml/test/DOMTest.java b/src/java/org/apache/log4j/xml/test/DOMTest.java index 95719b1025..22e1c4eee3 100644 --- a/src/java/org/apache/log4j/xml/test/DOMTest.java +++ b/src/java/org/apache/log4j/xml/test/DOMTest.java @@ -8,7 +8,7 @@ package org.apache.log4j.xml.test; import org.apache.log4j.xml.DOMConfigurator; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.apache.log4j.Priority; //import org.apache.log4j.xml.examples.ReportParserError; @@ -20,7 +20,7 @@ @author Ceki Gülcü */ public class DOMTest { - static Category cat = Category.getInstance(DOMTest.class.getName()); + static Logger cat = Logger.getLogger(DOMTest.class.getName()); public @@ -51,7 +51,7 @@ void init(String configFile) { static void test() { int i = -1; - Category root = Category.getRoot(); + Logger root = Logger.getRootLogger(); cat.debug("Message " + ++i); root.debug("Message " + i); diff --git a/tests/src/java/org/apache/log4j/LoggerTestCase.java b/tests/src/java/org/apache/log4j/LoggerTestCase.java index 1f844bcdaf..6ffaf4ffe8 100644 --- a/tests/src/java/org/apache/log4j/LoggerTestCase.java +++ b/tests/src/java/org/apache/log4j/LoggerTestCase.java @@ -204,7 +204,7 @@ void testDisable1() { Logger root = Logger.getRootLogger(); root.addAppender(caRoot); - LoggerRepository h = Category.getDefaultHierarchy(); + LoggerRepository h = LogManager.getLoggerRepository(); //h.disableDebug(); h.setThreshold((Level) Level.INFO); assertEquals(caRoot.counter, 0); @@ -309,7 +309,7 @@ void testExists() { public void testHierarchy1() { - Hierarchy h = new Hierarchy(new RootCategory((Level) Level.ERROR)); + Hierarchy h = new Hierarchy(new RootLogger((Level) Level.ERROR)); Logger a0 = h.getLogger("a"); assertEquals("a", a0.getName()); assertNull(a0.getLevel()); diff --git a/tests/src/java/org/apache/log4j/MyPatternLayout.java b/tests/src/java/org/apache/log4j/MyPatternLayout.java index ae8b90336e..c4cd9265b9 100644 --- a/tests/src/java/org/apache/log4j/MyPatternLayout.java +++ b/tests/src/java/org/apache/log4j/MyPatternLayout.java @@ -44,9 +44,9 @@ PatternParser createPatternParser(String pattern) { public static void main(String[] args) { Layout layout = new MyPatternLayout("[counter=%.10#] - %m%n"); - Category cat = Category.getInstance("some.cat"); - cat.addAppender(new ConsoleAppender(layout, ConsoleAppender.SYSTEM_OUT)); - cat.debug("Hello, log"); - cat.info("Hello again..."); + Logger logger = Logger.getLogger("some.cat"); + logger.addAppender(new ConsoleAppender(layout, ConsoleAppender.SYSTEM_OUT)); + logger.debug("Hello, log"); + logger.info("Hello again..."); } } diff --git a/tests/src/java/org/apache/log4j/StressCategory.java b/tests/src/java/org/apache/log4j/StressCategory.java index dbce0a06bb..05a6389eda 100644 --- a/tests/src/java/org/apache/log4j/StressCategory.java +++ b/tests/src/java/org/apache/log4j/StressCategory.java @@ -9,11 +9,11 @@ import org.apache.log4j.Level; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import java.util.Random; /* - Stress test the Category class. + Stress test the Logger class. */ @@ -25,11 +25,11 @@ class StressCategory { Level.ERROR, Level.FATAL}; - static Level defaultLevel = Category.getRoot().getLevel(); + static Level defaultLevel = Logger.getRootLogger().getLevel(); static int LENGTH; static String[] names; - static Category[] cat; + static Logger[] cat; static CT[] ct; static Random random = new Random(10); @@ -53,7 +53,7 @@ public static void main(String[] args) { for(int i=0; i < LENGTH; i++) { names[i] = args[i]; } - cat = new Category[LENGTH]; + cat = new Logger[LENGTH]; ct = new CT[LENGTH]; @@ -105,7 +105,7 @@ void createLoop(int n) { if(ct[i] == null) cat[i] = null; else { - cat[i] = Category.getInstance(ct[i].catstr); + cat[i] = Logger.getLogger(ct[i].catstr); cat[i].setLevel(ct[i].level); } } @@ -183,7 +183,7 @@ void catDump() { boolean checkCorrectness(int i) { CT localCT = ct[i]; - // Can't perform test if category is not instantiated + // Can't perform test if logger is not instantiated if(localCT == null) return true; diff --git a/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java b/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java index 2baa672ec0..85ea8bcfdd 100644 --- a/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java @@ -15,7 +15,7 @@ package org.apache.log4j.helpers; import org.apache.log4j.spi.LoggingEvent; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.Priority; import org.apache.log4j.helpers.BoundedFIFO; @@ -33,7 +33,7 @@ @author Ceki Gülcü @since 0.9.1 */ public class BoundedFIFOTestCase extends TestCase { - static Category cat = Category.getInstance("x"); + static Logger cat = Logger.getLogger("x"); static int MAX = 1000; diff --git a/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java b/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java index 221e86f201..77569dd93d 100644 --- a/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java @@ -15,7 +15,7 @@ package org.apache.log4j.helpers; import org.apache.log4j.spi.LoggingEvent; -import org.apache.log4j.Category; +import org.apache.log4j.Logger; import org.apache.log4j.Priority; import org.apache.log4j.helpers.CyclicBuffer; @@ -32,7 +32,7 @@ */ public class CyclicBufferTestCase extends TestCase { - static Category cat = Category.getInstance("x"); + static Logger cat = Logger.getLogger("x"); static int MAX = 1000; From 2a88d8f9c6ef5fa2f286af3d44c7cbe39784a5e9 Mon Sep 17 00:00:00 2001 From: No Author Date: Mon, 1 Nov 2004 16:45:50 +0000 Subject: [PATCH 091/342] This commit was manufactured by cvs2svn to create branch 'v1_2-branch'. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310828 13f79535-47bb-0310-9956-ffa450edef68 --- docs/images/ceki-72x101.gif | Bin 0 -> 7712 bytes docs/images/chainsaw-fullscreen-small.jpg | Bin 0 -> 55917 bytes docs/images/chainsaw-fullscreen.jpg | Bin 0 -> 208947 bytes docs/images/coverSmall.png | Bin 0 -> 57875 bytes docs/images/mark-72x99.gif | Bin 0 -> 2206 bytes docs/images/psmith.jpg | Bin 0 -> 8052 bytes docs/images/yshapira.bmp | Bin 0 -> 31514 bytes src/java/org/apache/log4j/spi/RootLogger.java | 69 ++++++++++++++++++ .../log4j/util/JunitTestRunnerFilter.java | 46 ++++++++++++ .../apache/log4j/util/SunReflectFilter.java | 39 ++++++++++ 10 files changed, 154 insertions(+) create mode 100644 docs/images/ceki-72x101.gif create mode 100644 docs/images/chainsaw-fullscreen-small.jpg create mode 100644 docs/images/chainsaw-fullscreen.jpg create mode 100644 docs/images/coverSmall.png create mode 100644 docs/images/mark-72x99.gif create mode 100644 docs/images/psmith.jpg create mode 100644 docs/images/yshapira.bmp create mode 100644 src/java/org/apache/log4j/spi/RootLogger.java create mode 100644 tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java create mode 100644 tests/src/java/org/apache/log4j/util/SunReflectFilter.java diff --git a/docs/images/ceki-72x101.gif b/docs/images/ceki-72x101.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c7f002cfeef27261534e033850193edf33765c3 GIT binary patch literal 7712 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 BGbaE5 literal 0 HcmV?d00001 diff --git a/docs/images/chainsaw-fullscreen-small.jpg b/docs/images/chainsaw-fullscreen-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4de51fcdbf592647637cd1cd4a601c52dd64aeb GIT binary patch literal 55917 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 literal 0 HcmV?d00001 diff --git a/docs/images/chainsaw-fullscreen.jpg b/docs/images/chainsaw-fullscreen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14835d1fd621e8a4279e12033285df6561fda850 GIT binary patch literal 208947 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

      f@#jyzSNehxvTsS^m@;P4Q(r|b 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≥T(HVmab8fZ!eIem=%Y(g-!B_j8?u_^YPf2%dm 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

      7RqZ_Qe9c(KP<-f3NncWcf1ngO}@=0 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 literal 0 HcmV?d00001 diff --git a/docs/images/mark-72x99.gif b/docs/images/mark-72x99.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d507305f12ed3a3654c06993d569d7fc6e0ab57 GIT binary patch literal 2206 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 literal 0 HcmV?d00001 diff --git a/docs/images/psmith.jpg b/docs/images/psmith.jpg new file mode 100644 index 0000000000000000000000000000000000000000..edde7adfe44adeaf4943df56ffdf97f302e865df GIT binary patch literal 8052 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 literal 0 HcmV?d00001 diff --git a/docs/images/yshapira.bmp b/docs/images/yshapira.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c2f2bddde3b49466fdbd562e10f3686a9952104c GIT binary patch literal 31514 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�lZU4J;y;9n9f|azzw@i~+M{g7v#v@Z8ix`CvN4H>`R{aGx_FI6PPh zFCRc|H0L`g40|#`34kg=OET<3UHrK|5cHT|ERYRelk}G({dwYnOl&A!Hkb`#W_^2g zOjCDi-_z8(2Nw&6D_bA-jl6jG5B}`U$FjPP=o6O}hByIcU~}YLu7XJs^XM3G03do% zgFVP0o)jR1ONODLJXU@r0twgibSka}W6EHrN(K71<)wMK_U1y6uBUC zu!5CfG*}FPpodKWgg#gdJMb+K12l~D0lo8JE;f)O>doP|6>wVeSZ!BX9m(8ovv-aA zL3CqR$$h-#0iITQC%a;>wf7!y@aAv4xVlBAKN>>VJlj!e94h>?^LpfZk zKtLCYSVEZy)v1&a2x^mFVbF^eiXb9m&n`E;@`w~Q`35kzdHA9i5{-4)aO43Z4v!g} z0ID1?7i@)fT=K@PA14MXB6H!?VlJg15TJ~Jk8sX303)SrNjDs#!A$vJ zp1P;R&{`E!-&QdCu6*c2!qw)uvn6${qc1=VpnLoqPs%J~Bf3MLq1*O&Y~AX*eA$*| zi#IM`vT4=QEvuJpUAtn(*7XNm_WOqTGr>Qiv~hZAgj{4m_-Z;u?Bhd)$UfxacfiHZ z)icO1fJ!8B=nN4DUhHQhT(*$Q;=qe}N{vdcQOUF_K7x99`>+3ND@^T097#Yh`H;V# z^kl3y|Gc{TvZDU7sxevLmIhEarD&Q{4ejZ04V&7QEAVj~a1EQrj*PIbENT5ERZFV2 zJ&iyhX2m$4lCIU0maBr96{oq4m&la~pf3S=alz@wLoS>+-q2EY=S@!ISiixM0P zr-o4gR1(P(YKdgg!NbApwj5lta`XDF2bQkhY`=K*;#C{gZr!tW_kk_D_HWv;*ULWu zUd4c8XSG2G(#RF?4jwwNas4_rokk&tFjy2aH*}xh!L@FiHv8|~PCK+u=(UaGx`DPI zu!ZHko$I!deqdF|j-7mWXIY@Pp6Y9)`0maeDKuVH$Hoh z_uqP)SzKd?In5I5LYeYlsx*)+@$l!ldb183rtWni?LHK;*CoW=j|JyXpSu8q010CW z^`SJ>-H&m=EokQ<@4q(haay_2cF_u(#VZ%BTKnh5t()K_MrXHR8jS-lB`6gJlgSij zWHG7x_iW#|e#OE4+XDhz`9dm%>HpW3rN3Bz_p9A^bC&#U^_SJ$_4BPZ+5qNlu>Sq8 zx&Qw2mv0yU@U_!-Kd<}^zWQUG6>N^@XIjh+pr*w}srt}S!3_rM#*P;l!j4Bh(C6!;l{T{*rny1I_@V?PU z8HKgl$deR~$}dFZ>CfG~!)M)Q_f_kh0c$q8Y}w%j{t*x&B++2r4DTE27+hrtN$BoF zb9E;kau3?)?7jPt*FG1oeQrJn+`RU?dwT^CLugDgo6QyqP`L~^097D`2JP6oVbg|{ zE0!nzK+j_!J;%E zfbHxOxO2DL*6oM3?{q%s>=O`7V{#BSA7OBWOsN6#DW+_!3hj{bzp$c)=g`- zZeFut{qjwl{#>_liKEk;?|-rU6*yQiZ^3FS>y>}ZU;T&mnz?gV{Py#rAHH|^`X{IF z|M>IQ-}ySms#vxIDP-J4N@Ba%K5b3p`@Cw_$!sNuuF*cRNVQ(vgR9O&+$7iKR)|} zzxo@0@e#lCYgf;x&J+*tlieJ{LD%AO8^lAQHU17fNAJnJf;ECy`6d=~1in^Yz@k zVa>KJe*p*U*DqbWVe#T+^Z&5Vj!MW@in(e`s1#e_X_{MSD!ui`A=IwS` z5wzt`(hi59Z4=haB`lr0Q^d*}ym_I#<#J(rLP~Y)h2oQGRY`@-tv8^D#$Q1!yvJdL z@bW$W`UC##1%Bu5$BvE%g?ViW$FdCS(@JT)L>z;OqNSopxzGeB?eOM}Or(SJc8xS# zg&E{9B9fa>fea4XC`4Ll5Sbi8VbeLN2vIAQP$)wjs1$M@o9^bk4+L@3#uaP-S^^xb zTeoP%YI`u{x4E-z9Di7_+%N_uR5)|Ef(}7Ovaqux-bZE!!8b z-{`RP&pC^i{`%*tdFwXVZ`inC-Aae`e>$#OYD*x@S@tW4s?%o21=}1Qb~!EgTI*}1 z1|Jo#=X%XpyI`-Fb8YNFYE4&W)nHP7$JxyK3%QLK3!9oo9*sVG^WgRSXYcSA@9|e3 z@OK~a*KhF`&+&)%@b2~pd6~_pk7Y+_PAkPnm(5x#0c-{L3gY|bUKN_ zpfJCTszNndsYWN)X{0LnQ9u=@(5o~$r7AK!48i~ra!Dcn2lnpRuy|*TT|wS^;opu~F$V<2=`ZW8?(0|W|8xEp8{2)0{vz+A zC#W4gc6w{1ZO`6RU4N8YHj)ckMjM6BBG{Oi!y@iG8QG*sUz_F_q)9WxT z(4dAo5Rt*C$V>nF zb<@zxn(n6+?eG@ny~dj_N5Ji$zkm4h0}ycg{;L}|p53_d;@+JP&mZEip5Qn8UR=v- zzYw1psXU=aVgN>Ij7bs+1Q@U|9irEY;qhuUVvQEn00&xBr9l-y06>c=p;Is_RVI}x zLZ?ue%?-AGnA2-1@tw>tS*8X!FgN58#O54gTyE ze*f{i;TumnI!0TXM!H(Z2D%>J?0?pDt^ewof_TH(2t|Cj^oR+IHlX3qESS(R1ESXh z0YZ%i#$sl`k8f%8s7i+_0D6hsC{u@g0dE5H^7%;6TLp z5DGoSV({KNYpC&p1$q5|E~Y` z-`zJpR=3|Ts2#2wdh*}{{_+F<81qh+FC1wxdIL%?GA2&@1H zaPeQy0JjiuJW-K15P+gS1j3T_c2-}l^j*FNyNy7g{p(9V`2G7IZ;ieg?0?);Gn}7Zn{+DonCU!t zK%Dkuyfz_TcRXGb7o&)bl!isf!cEdJ17unEF2) z7^N7>qJ?<7AK0~d^Trh*2FsV*IXV5YVdG*F$&JnOX3;#P;$SdNz%oZRL_a1Bgm+ft zC=ph;2LF(Vf>1#K06zW~QY26+_Lqo#q=+wYu*tz{*{`%}qbOs2BRUV0!N5sg(qvhe_92g}gGYy#D42ce4l}WN+ljNn+20Kj+uaQ zi^n+tZs0309rnk$QDC7;2?_Sc`A{N3Dp8JpXJ3Gk7vH~?(Gjh9QJ+Qw|~Fy{lkww`rcM= z`fopd=j}VkFW)(Q{^9l49$tIp!O_FJ?YlSXX8_>5+B>WDj;g&!004t7tYW!)Q0>#< zUiYxxIc)6rso4hrbXc#SHS5h>D(32I1K!s1^5X0qeS$_Co0}s71CLALbIH99F&KU? z--iJ!D*%tYt6XqbiXM!Z7jw>Z!VFWHOWUgG<0$*^4(5QTmG|!FJk5*?{sH64^cs=5 zGqbclwYEc6nAm#1TwvqPu<68A>O7D2=7%5s?hk(ahd=u1+wcFu(e*bw*Is@4^^d>) z@gINpdq4i>H-GT@s~Ou-OJ3K^7npwfb2L^^|15Vp0k?TPt(( zj43L0oJJ!oFeiDurAWw-3>gza-9aVPtA_WBUZ??Zz#}GrEIbm2M^C^XAaDR4LNxHO zRSE1DeC?dCmGOWNmd9q+h_o%zB5QVTvp?=gR<>oUb1VjVd3I)*esJ^V2fy`u-~OG? zzWJRW#Y?x2Zol`!S3Z6DtDnC8^?&!=i@*8s;kRzxdiRAFKDvGLo%^@myLtA;?c>+( zpS*Iv_u`%QgS)MJ_gc4Z*RGuw4^FD5ht(5U$lm8(0(j!E+-DBZajkc@cX-}Byxuyx z);u_>wz|bC`VmusfKDc3Z>%oNk!NSdfI(jzsG}C0u$B)ra)DObcT$O8uOvEYPdo3~ zFS^?$Pp9m~h#gSVN4-~`y8Z5r!J&ExX^QK{7{*4z2=ez6ku`eZ!bB7;hunWRyPz<^A?y0l2LTV&OI zsG9MYVy<>J*vrM52`_lNQSda2UJxeryc@Kab5&p})Ank{@rW=lr);2H#0&sRIq<>A z+|U?vgs?b9TpAyyUAaoRG&VOxm>(OV4Uf{sh|FoV%l6>)H}Adr)ptJr!?(WmN5{{6 zsBrI_Lr1B~eSh>Yp1mGPoxSwxCkIEbb$hS0+b^8-UheGO?^bSKYu>-rx_??eJ{AYIQXhjp48?Xk-$Ww0Tc{rt8$DP^*vVqGkpg%%V`N&C$rjkx9bf zIN|cx#O3knD{Se8+A6X5v^s}eWsw*iO0!F=v&sy1h2AFDTBI7YL~Rmd#2n8t{(>I; zNM#gh4FbDWY%vMcYSzF2d7A>7Va-mg62}&X5kg^{SQ#g+P0nu3(pd95N}fBPGRKmx z{9gSg;>Vx7^;>@yYdsSw-_pCP!3@HD(*TxKvIy4J>BMo; z_|W*s#fz678=kntSesE=#VV&nW)}%9e6dZea4TdExzH$(n59yaL~Ia=^g^LdfDvDg*6&b>1@b96R?#-_qZPA-qZPQpygv1XP8a~sl?9mTdjU`DOL z5{m{(4PUWy{?hy3__zP*!B;;ydg>it=E#%k)lXh|;qC7o-F+uqxGpgyWZIa)mbJR_ z4reytE2iRm=~y-9&mo_V{%sT*(9B**p>w+i0II1#uscnD)KWsuSlpLR1#_859`~c5j!?;z zi>Z7rl1gCpHm6CYmU4N#b;R~FvxL#H!6%0<{@U2c6LU^=`6r=nM{L*y z9uhNB(0qweDADt!27y#BdNksrSSt`|xm@`!Ps!pdIRZ6XsOAYZ9E>6jN1VYqwmnfEXCYIeLar%@Fx7ro3MpDtreyh~#Ry)^T{>pE> z_2KtF`J=zO|K)E!{l>R{@RvXP%}@XHcR%~-umA2}y!PQA^zOVVwSa7WYjtgbLZwVh5J#>; z751gziC;#}M=ah9M@^ZcClJ#4!nz;=#iS(^GyB5^jLEDk80miu$83>=6(i<>aQ~++ zuh#9?c>H=_Nbe7s0udvgWAp_ynVc(G^5WiE<+e_#)see?2{k<^-Ev-?mHj-;IqH_*>^tsZ%8pE z8n^Gh{LQnc-`2ac6SQr@%=+lm;>D5KiD~8}kxnAgW=ZqQ^Xt2tJRw)yC$>Ps6LWWV zSLPO|q-oF`WtKvk8Xvkka`h5{Ff=ms#OTNqJnnL_7(D3UD5$-f@5e*+qPJZM9MmF5 zdr?qtFS=h1cABAfJ>0DM_V+>u`w@(Y3*Zrb9v!%9C0DZ=z&qV$w9|-mTCr9;UT#GO z2CQmU)UDjhx{vCS(?FWpF7$ zu6}a+g%3XY;X5CF`qgiL`q8I9e*e2adiDM9-FW_M*2rG%_?i1JeQc);X&fi6~gE+Y~2i%Ory=vDdgG7F~T%)f;=%fJ2gq4A%sZ zV`wF`wWz8bQtTzohn3K2Bi*ZH5YT7C;bzU;@!i)N zC(q(kQ?hzy3zq}w#=-fs`TB|6;1b9U%*9P6b9H_muKyB)&YYd05D60_BO}D|anj_( z%ruEKMZoGuhc1DJN1hy;xFQg4$K&p5DN@b(t7&IFWv|Cg&8VRrG4x`l(}eX#%5^>I zJc(GkLET}>a+I~4iM=9Gu!qQ1v_EY9|+H#Py9~PV#F>fVJc-TxBLEWsamv`VfCZMyD7cewS zZrp>BHDTjViVjdWXW361IvIU8YiOr6jkux|78gR&y|f-tNV^Y zZ1H(KiC6-sl6%$WdA4%0*S&lF-Wz6jMy&Rr5NmcP+`*hLlGmEtGNq9(lCN#D=<`c6 z6e@X^GE1e>7>s%59F0z$rA$vv69B;MEON$7shAxK*m4PP1?Ra^o?6n`%s4w)S2ttt zrYr|(D+tS~g>{v%4$RTY+8f}KlpU{OyINV-UeZ>LTQGv~u#tA)BgW%e_*yf5Rtw)K z`>$66P=Nyjhb8M-)p1sHH`B&?Qoonfw$i$G*3igkN-;^&$4hv*m6WDcaYK6Ajrc)3 z-))y$^-8yO;C2L^j*!CG+sq{YPDo>?#N0Swk#V3>~IehWP zHhW=tow2Yux45*jwzjdg#p3L)tgp_^gAt}_jG48~1+7jRi+D=uP$A~2Bs|?x$kFCtH-iv<<&uo_w9RwdZ3Mh@z6jHQ$_6*A`IwieEn$8EKo zHy5+|Y|^k>g(s&Sv=2saRl~Qd!SgyWIH~)fFe`CwCZtLSmD#Ymm_S>!zL?a+{X)N; z6>#ikQ5TrZJpL?Xp5SGc*gyS%!_TwI)6n5WM(=9lI+w^zk7u39fKT2;Z2 zqgaT^1eoKxZ0YyEBB$+i5P*_a68ugY|vzO!E8DOAHwDKYqe&#H)?Z)#B!5VX<=~{>ua1j#wwGsy1vd@Tiv8l>GN<;IlJ4e zb-hU`Q2+pOIN^+?J&Bw*o^tbeD5gK@acfJ(a5!MB6hlF;TBq7Es#uATzLxhiE5UNs zrB`n4tdV4b#eCWs4eAjKW8$<+ceW^guR0bnCFAf;`@tk~@j~HpB4Ml7WA$33Q;Qz8 zQ`J520e&eFF_nvclx--CVK`RsvvRn$BWm;qG)v1wlaUjR=#hVdYXQdt9?0oI@(}j5 zo9rHD4i0mzHcqp~D&;7Gqjs~DOX2_%?)mWh0}&KZEq1>rn9>+sN`+A&)k#HasaPqK zDiv}iZVS?Al~%h^Ym{xXm*pBRS_(o5do1G&#H?)IGKoBFw#hwygV(E%M(uvTUMk(R zTcokDB^^hq*tu8m`yFUVSdj6TkX8Z)shFjZaUt6%;4N6qLQD`TyO4MbXr=NEkz_TN zu$HT#V$okJ_!_N5z7E@%$+)6XbD`wt3YVs7SFKK&%csVRk(fCWHE!=vtQLM8DciKI zRS<!M(EkxD)SVupi&=B-)+SemjY4D$p&{ZsgElnu_6elYk$$y#RiTRjSh3JVA#i z=<`MVz7VcK5(&j}x!mJ*(qz;OUcso>vNzYsBEb?cK-$3J zkU3m(foK`~42Qc|4ipN$N-5B8r;E)P`qGMM4n(QjxXqm>Og|}6Y{pXdVAzmMJ6vu# zhdXDt36lwPK4Wjxf?$Gj-hQ|r?X{!8px{pDu^6dAs6^Zp6-J*$G8~9Fm)2;PhaO+qr0FeEZ~!_Lt!~vc zb!3)KM147$aHi8pp&gJlDReB@Bu$iqLDwYO5s8m9Yy=bSC`5c32&XukNgsLqPb?CyCFRX4;x+kS@ z+>*|^1j5C|C4${1N+v9iFhKZ#~_vdgb~i5;ntQ#KHBgMYByCj(ea7Y4cN0UU`fl#cv!5(0fWn>;c^#ucjuwnpx4TIFV+hFM=r>$VWWUr%(@Rd89W3w zh=7FrMU#Pdc#s3zgAe4&t>x7zB&5OLm0Gx34FiL{y=bNy92js#je)d%gF81tx%&9U ze>J}{+303$E;*tspau+VR`7uZDQWNl^0N7q6#)nIBbE*hXgB)Qt;aiiu~sEo$Kivp zEfsghBF;#}!53`J(1@Gt6_J8#uqZVK=?-Ugnle5~9^Tkl(3|C+fJLblu5Qka5TBqi zC-{<0ompabD0jF^jD_h@;-$GIQl=PkdbE%Tfp8UNMxR@gO}WEBh+M!Xu@1eMDH1VP_Q!eYQ?}d?~&m=8~&458`FS1{ccIwgg zUZhVW+r`BLmY;jkRI8y5P!I<6dQUeAk7p;yL3>s6ZzSgr@L{JG(j!+5l zfF9<+=TbN$cT#b$$PulWm6EFJrn+af$?c2sk$_WJ& z&w4gEOv(b$9qel*Z@>WZ2X(ugIlZ0><@nDq_}oS$d+ij=ORtsa0FP>DzY>OjQp5cn zVME_8B`o-x3+q!d4a*%dc*BN7&aJmfW*DQi1)|NPPUQo@AYBMz?;kM%3?o(?Nq9=N zlt8{aMjFIV0hK>w1|^bCVBl~lG8s=U<4Pq^Ec3!GNCXYloEORf+7NnTuZ#?h%WULB z>p>qpO0;J49+yW6tpJ^vD|l@jxXlZcxoGHSV&6RsuFQ zrxG%x(d@#eX43Xj(OWC|^Jzz;8iF9eMRqlAii{swlGd#BnV{d_!A&s#4J*5BVoMFS;Xq2NpC#ucX$kItc4-s zMX831Lrs9e9WdrgA(vZiv&pK}C^$Kja^zAD@Bua+Owenm0SP8Zc*LV-hfNX=>bvbU ztWzvz!G4-7Lfl~qeE?a2CIAM|jQJ|~0J#ak3ckfoP?!^3$z~+&iKbo9&vMl+gGt1# zm+`nYowOGVo@&vDEJnQ&>`Os2-fblgfkZ3Og+$cCecHpl4lZdss+ z;q-+q;Ez5AUaefQ69^a}=-BMOAo#TqfsjuFh5#hs11N@Q*of>oFu-frz*Ncsa{vG= zHZd@OU4WYe{{XU3+=G8mD@TzgGMOY(vqMDcFm++l9Wvt&!d=SGELC#J4C1d{{uL5!6bW&BnRv#V z%6i>C9cy=9Cf|nNmxpPHnBWpZ^pPcZ+oiAwU;?m0D4_FxUPQnM06>9|9spSFl3(xv zBn8%?+<<@3Y^1XppGw6ckOzUm80oUzrw0Zg`aEHRbcrum@%iDVnX_3pu!9srC@N(? z0BAL%7@K<`)G|@#gyqB}pK}F6x?ot3e4ob5n_r)r-y}=)>=1+tTaLa$#whTHt~A*d zaE^h&1bGldoW8QSO7(~BE}sd?02o{vyMS-Smu>qa)@aI&j3M}7bBngU!*Dv~kY=bn z=zm}UGw5;1;$b74L|6xCBRqsk05%b5#)t`iq8;v^M+x^2KGGxG2tLSFU>k99St8*Q zN;b!*uZ~V%y*&Pe-l2B*4L|~4>dMe#z}@MBr)GdhSKU~h$@HDCbNeB=i}{lQcM1E*CC>VpCA;d5Xx z!JBrw6dVARkjgmwOt2SuWEUEZcx@kc!RXc*Tw0EdHAN=?0K)7DOSH)rtwT977N@>+ z=?hD%WYqV(K3y{9f=U2iK_w(pHmLnr$_R=k4biwUo;0V@_FUc#C2V)8Ob)rpsp2bH zlx5Nsb8?BjsL)DGRt<;0#ayOP8Kl+Cd4x)OvjXZ5%mDzv3NQ_7gAhKFNV!X4PT|X- zu*6gBpgM+98UV1kl+e`pK2CQ(41!jGP++tBN)SN-mTMMzopLN4ECOI$4jCLIBZR^x z#`|!P;2gj%z#<@Y{6`ElHYH$?8zqcY3V4sYMBd`BZSt3a{uX!XD&Ycsc}imvf(c_u zC#)>YEi`Q$Ej=Z7s_aY`U5T7Mk+vo?;0YH3PB@rmn@nq!7+flmhCjbON8e(wq%0YZ zb$HDZjc{#unYqqj3%4vTy}_Y|-Z827Q&yg#0b<&TsISH-xLRE7Pm|#Vyf_ zRL_G)iKsT3v_Y-J(~fA)87_Q2W^KWw$sad>VEt4^j!3<|D_P$bt*!D_7Iv4GxvOj9 zEsmDY(+g1!TNAEtO14n<1MsN*h_&2p;p!S|ew(+9Faa=N1Q%i-Ryhlsf)!MWcnUVS zb6312QS%Howb`x#1IblFsf?>s36XcwA*xn#CCXh8TneQ@2$E@e0@W^8jsnldu5=SM zC#^$a4H)|5(Yox4fLCYr>jnn!zd`|^VR)Ojy0SfwKLrL}=PdyMwqj>Ru)Kv#RgZojXKwkWM@;nvmxEt zR_wC19F}@_Q@VjNrUZte=#5G)9!ThPt|@dhR+hjA4<006Ja^dfvi zzMLag@&rSGsdap03nY>)xtxVLq)Bc>{g5X!@SzW& zrllG_Hd~<)BKA`2q~HL#g0EIfbvgw;%2a&3AXoRtKIw!w5`lHe4Pr1Ha(Qa2LhsZV zeFl5b;t5*rz&SOQKY5A#Z~<^}m!_AkzrJ;R-EJqZeSg zAWW1Ru1LDY=dTI`YgoEMu`88s3x(@a$rj`o6;=dWAWWp{U74DLFiWKo2t->F*{)Q^ z5sP+&f-Q-dg(S2{yeo#vQQ$6jzCy(l%h@8lqvT=}pltfs=!8H8oPiD3*;TO8UY9z8 zNF;6>7zoBafrK}h^f~+vcgPL$L|ma%AXP#wuFyGa!d-_`3;PO-kcgZ69dT|2dV>xLW&SSB7T_V}QM`TG59pi~Y$$}zN=-7Iz2xb;VQz&KBN|8)CI4B(-*G^6vhiGbR zmwMewuiKxrTZLY)e0J8jcCC4OTE{zwC$;0VdI!y5C$*z%4N&iNuXn9+daHBi{?S{n zKX~`;=iYkng@J+VcTcX}JvqI7eEsf?TTk6Sxp8`Uet7G_t-B9z-+S)PORqmXJZ%=r zk$Bt==LeoB(wKV%??EHlYef#4;m)3~QF7KYmU7ZqNtvo?b3JP>rOdgg5%H|sB2`JY zxvZt#?KwVcLC9GYahEU(*!{TxbKbICvWesfi#5mQEb#ct7~uxO8AR@nCt60p8;x7w z*kDX1?MPf+yH>w_WB<<0_Vu&+wUfQ`)B4TR1}1R&TR2kREuJ0M@bUDhdURMh?3L^F z6dHrO-69a`9+nS|Do3Y#=jW}bZg=nA>fC+mXkcJ&nKHLZXRa|Rb9Cm)5}8IJk|(Hh zlxfP;*yPYGeIlF3!Q5o0l|f*3c2s822hZPYzw)5-(*6DCZ`YnW%ilVPo$rT0 zsCPa%&EGrD-Dsz38MjL>eD0T8OgFMKj3@=be<|xCA*&zldbK?sO6SI^d zIOUVmmnUYfjFT=7Ok?V2eM|c4|5B(nwo3V{Bp~yWTM$BitcmY%_A#NNdUM5bD zl4zu%@loXdre?_m(qtb4^5n?a;4Fn0jks={ciw#M!5gpKedqNDAAk7T#~*z8-7nwy z;44r4`Wv_3d-?2*XSy%n-h1wP;o*56<8$YwXHE*|xZo*hRP$DrW=3cegA3@ao4iZ| z2DH)TdE&wxfleP~FvjMYMCQ^Iq9~lsB7RO|ltIu0ZFr73Mx1zjWpxq)h`b#-bJ3#i zw2BZMA~LLGJ%ywrpRiYQZe*A11wS%480%R-Dk^)q0LEg%g@j|+qwPD;kv?+eoF8Fd zwGc!ZqF#=G5Qd{SZ~I=>CS`0^sQFp)jLfTZ{iNA zbc?n)JqQd|>66rnLE7}y8Pb&*@>M!*j7}fNiL5@+#}KK)A)cU*j?+d)=_63v^#(Q9>;G8s$JgS(Ano zSWz8nm3;eUKN?m+-Ey!~3ZPdJHQFk29>}nGR53r!H5hVn3w{L<;{WMW(GLt774X3< zl{7I;q@xjXo&l9W1I<(Em@+8y^x1j(%mQO}eTBhct@1b<0iW%|58nRy&;Q{c{{F9j z{>W!SMhVIOy zHR)3&1Db5aPy%2X2YOigo&89sp}tU0cKUpPGAC(vin%-w7(k2#I?A8SdD{FObzzRm zWKh^U8)y^VT3=pRppnQ#l*ZnE@2&syv%mYhpZ?izf9v&kUcdX5S8w9@`P(m@cPjzL zR_5Oxb+7BJxQki%B0g{kDx+06_mL&}t(20j?_g4_cXS4H*1ClY7sM literal 0 HcmV?d00001 diff --git a/src/java/org/apache/log4j/spi/RootLogger.java b/src/java/org/apache/log4j/spi/RootLogger.java new file mode 100644 index 0000000000..35b10d9c3e --- /dev/null +++ b/src/java/org/apache/log4j/spi/RootLogger.java @@ -0,0 +1,69 @@ +/* + * Copyright 1999,2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.spi; + +import org.apache.log4j.*; +import org.apache.log4j.helpers.LogLog; + + +// Contibutors: Mathias Bogaert + +/** + RootLogger sits at the top of the category hierachy. It is a + regular logger except that it provides several guarantees. + +

      First, it cannot be assigned a null + level. Second, since root logger cannot have a parent, the + {@link #getChainedLevel} method always returns the value of the + level field without walking the hierarchy. + + @author Ceki Gülcü + + */ +public final class RootLogger extends Logger { + /** + The root category names itself as "root". However, the root + category cannot be retrieved by name. + */ + public RootLogger(Level level) { + super("root"); + setLevel(level); + } + + /** + Return the assigned level value without walking the category + hierarchy. + */ + public final Level getChainedLevel() { + return level; + } + + /** + Setting a null value to the level of the root logger may have catastrophic + results. We prevent this here. + + @since 0.8.3 */ + public final void setLevel(Level level) { + if (level == null) { + LogLog.error( + "You have tried to set a null level to root.", new Throwable()); + } else { + this.level = level; + } + } + +} diff --git a/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java b/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java new file mode 100644 index 0000000000..6f8dc6c122 --- /dev/null +++ b/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java @@ -0,0 +1,46 @@ +/* + * Copyright 1999,2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.util; + +import org.apache.oro.text.perl.Perl5Util; + + +public class JunitTestRunnerFilter implements Filter { + Perl5Util util = new Perl5Util(); + + /** + * Filter out stack trace lines coming from the various JUnit TestRunners. + */ + public String filter(String in) { + if (in == null) { + return null; + } + + if ( + util.match( + "/at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner/", in)) { + return null; + } else if ( + util.match( + "/at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner/", + in)) { + return null; + } else { + return in; + } + } +} diff --git a/tests/src/java/org/apache/log4j/util/SunReflectFilter.java b/tests/src/java/org/apache/log4j/util/SunReflectFilter.java new file mode 100644 index 0000000000..141f5a7926 --- /dev/null +++ b/tests/src/java/org/apache/log4j/util/SunReflectFilter.java @@ -0,0 +1,39 @@ +/* + * Copyright 1999,2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.util; + +import org.apache.oro.text.perl.Perl5Util; + +/** + * The sun.reflect.* lines are not present in all JDKs. + * + * @author Ceki Gulcu + */ +public class SunReflectFilter implements Filter { + Perl5Util util = new Perl5Util(); + + public String filter(String in) { + if(in == null) { + return null; + } + if (util.match("/at sun.reflect/", in)) { + return null; + } else { + return in; + } + } +} From 55636a1f74d2551dda6e91d0741126744b04fe0c Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Mon, 1 Nov 2004 16:45:50 +0000 Subject: [PATCH 092/342] Adding RootLogger which replaces RootCategory git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310829 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/Priority.java | 3 +-- src/java/org/apache/log4j/spi/RootLogger.java | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/log4j/Priority.java b/src/java/org/apache/log4j/Priority.java index c8cc634ca0..6e55eef3aa 100644 --- a/src/java/org/apache/log4j/Priority.java +++ b/src/java/org/apache/log4j/Priority.java @@ -31,8 +31,7 @@ public class Priority { public final static int ALL_INT = Integer.MIN_VALUE; /** - The FATAL level designates very severe error - events that will presumably lead the application to abort. + @deprecated Use {link Level.FATAL} instead. */ final static public Priority FATAL = new Level(FATAL_INT, "FATAL", 0); diff --git a/src/java/org/apache/log4j/spi/RootLogger.java b/src/java/org/apache/log4j/spi/RootLogger.java index 35b10d9c3e..5e2dbae2a0 100644 --- a/src/java/org/apache/log4j/spi/RootLogger.java +++ b/src/java/org/apache/log4j/spi/RootLogger.java @@ -23,7 +23,7 @@ // Contibutors: Mathias Bogaert /** - RootLogger sits at the top of the category hierachy. It is a + RootLogger sits at the top of the logger hierachy. It is a regular logger except that it provides several guarantees.

      First, it cannot be assigned a null @@ -36,8 +36,8 @@ */ public final class RootLogger extends Logger { /** - The root category names itself as "root". However, the root - category cannot be retrieved by name. + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. */ public RootLogger(Level level) { super("root"); @@ -45,7 +45,7 @@ public RootLogger(Level level) { } /** - Return the assigned level value without walking the category + Return the assigned level value without walking the logger hierarchy. */ public final Level getChainedLevel() { From d6006d1e474ef2b28176899f7099f9fe3f843e88 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Mon, 1 Nov 2004 17:08:03 +0000 Subject: [PATCH 093/342] - Deprecated Priority.getPriority(,...) methods. They have Level.getLevel(...) quivalents. - Deprecated Priority.FATAL as it was replaced by Logger.FATAL. - Deprecated Priority.ERROR as it was replaced by Logger.ERROR. - Deprecated Priority.WARN as it was replaced by Logger.WARN. - Deprecated Priority.INFO as it was replaced by Logger. - Deprecated Priority.DEBUG as it was replaced by Logger.DEBUG. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310830 13f79535-47bb-0310-9956-ffa450edef68 --- examples/subclass/MyLogger.java | 10 ----- examples/subclass/MyLoggerTest.java | 2 +- src/java/org/apache/log4j/Priority.java | 44 +++++++------------ .../org/apache/log4j/xml/test/DOMTest.java | 6 +-- .../log4j/helpers/BoundedFIFOTestCase.java | 4 +- .../log4j/helpers/CyclicBufferTestCase.java | 4 +- 6 files changed, 24 insertions(+), 46 deletions(-) diff --git a/examples/subclass/MyLogger.java b/examples/subclass/MyLogger.java index e91c46f46d..521dea5500 100644 --- a/examples/subclass/MyLogger.java +++ b/examples/subclass/MyLogger.java @@ -49,16 +49,6 @@ void debug(Object message) { super.log(FQCN, Level.DEBUG, message + " world.", null); } - /** - This method overrides {@link Logger#getInstance} by supplying - its own factory type as a parameter. - */ - public - static - Category getInstance(String name) { - return Logger.getLogger(name, myFactory); - } - /** This method overrides {@link Logger#getLogger} by supplying its own factory type as a parameter. diff --git a/examples/subclass/MyLoggerTest.java b/examples/subclass/MyLoggerTest.java index 4f1ffa18a4..5c69dea3de 100644 --- a/examples/subclass/MyLoggerTest.java +++ b/examples/subclass/MyLoggerTest.java @@ -58,7 +58,7 @@ else if(args.length == 1) { usage("Incorrect number of parameters."); } try { - MyLogger c = (MyLogger) MyLogger.getInstance("some.cat"); + MyLogger c = (MyLogger) MyLogger.getLogger("some.cat"); c.trace("Hello"); c.debug("Hello"); } catch(ClassCastException e) { diff --git a/src/java/org/apache/log4j/Priority.java b/src/java/org/apache/log4j/Priority.java index 6e55eef3aa..61e82a4453 100644 --- a/src/java/org/apache/log4j/Priority.java +++ b/src/java/org/apache/log4j/Priority.java @@ -9,7 +9,7 @@ // Contributors: Kitching Simon package org.apache.log4j; - + /** Refrain from using this class directly, use the {@link Level} class instead. @@ -31,30 +31,28 @@ public class Priority { public final static int ALL_INT = Integer.MIN_VALUE; /** - @deprecated Use {link Level.FATAL} instead. + * @deprecated Use {@link Level#FATAL} instead. */ final static public Priority FATAL = new Level(FATAL_INT, "FATAL", 0); /** - The ERROR level designates error events that - might still allow the application to continue running. */ + * @deprecated Use {@link Level#ERROR} instead. + */ final static public Priority ERROR = new Level(ERROR_INT, "ERROR", 3); /** - The WARN level designates potentially harmful situations. - */ + * @deprecated Use {@link Level#WARN} instead. + */ final static public Priority WARN = new Level(WARN_INT, "WARN", 4); /** - The INFO level designates informational messages - that highlight the progress of the application at coarse-grained - level. */ + * @deprecated Use {@link Level#INFO} instead. + */ final static public Priority INFO = new Level(INFO_INT, "INFO", 6); /** - The DEBUG priority designates fine-grained - informational events that are most useful to debug an - application. */ + * @deprecated Use {@link Level#DEBUG} instead. + */ final static public Priority DEBUG = new Level(DEBUG_INT, "DEBUG", 7); @@ -140,12 +138,7 @@ int toInt() { } /** - Convert the string passed as argument to a priority. If the - conversion fails, then this method returns {@link #DEBUG}. - - @deprecated Please use the {@link Level#toLevel(String)} method instead.} - - + * @deprecated Please use the {@link Level#toLevel(String)} method instead. */ public static @@ -154,10 +147,8 @@ Priority toPriority(String sArg) { } /** - Convert an integer passed as argument to a priority. If the - conversion fails, then this method returns {@link #DEBUG}. - - */ + * @deprecated Please use the {@link Level#toLevel(int)} method instead. + */ public static Priority toPriority(int val) { @@ -165,8 +156,7 @@ Priority toPriority(int val) { } /** - Convert an integer passed as argument to a priority. If the - conversion fails, then this method returns the specified default. + * @deprecated Please use the {@link Level#toLevel(int, Level)} method instead. */ public static @@ -175,10 +165,8 @@ Priority toPriority(int val, Priority defaultPriority) { } /** - Convert the string passed as argument to a priority. If the - conversion fails, then this method returns the value of - defaultPriority. - */ + * @deprecated Please use the {@link Level#toLevel(String, Level)} method instead. + */ public static Priority toPriority(String sArg, Priority defaultPriority) { diff --git a/src/java/org/apache/log4j/xml/test/DOMTest.java b/src/java/org/apache/log4j/xml/test/DOMTest.java index 22e1c4eee3..b6c303ce19 100644 --- a/src/java/org/apache/log4j/xml/test/DOMTest.java +++ b/src/java/org/apache/log4j/xml/test/DOMTest.java @@ -10,7 +10,7 @@ import org.apache.log4j.xml.DOMConfigurator; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; -import org.apache.log4j.Priority; +import org.apache.log4j.Level; //import org.apache.log4j.xml.examples.ReportParserError; //import org.apache.xerces.parsers.DOMParser; //import java.io.FileInputStream; @@ -65,8 +65,8 @@ void test() { cat.error("Message " + ++i); root.error("Message " + i); - cat.log(Priority.FATAL, "Message " + ++i); - root.log(Priority.FATAL, "Message " + i); + cat.log(Level.FATAL, "Message " + ++i); + root.log(Level.FATAL, "Message " + i); Exception e = new Exception("Just testing"); cat.debug("Message " + ++i, e); diff --git a/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java b/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java index 85ea8bcfdd..64a044026a 100644 --- a/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java @@ -16,7 +16,7 @@ import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.Logger; -import org.apache.log4j.Priority; +import org.apache.log4j.Level; import org.apache.log4j.helpers.BoundedFIFO; @@ -41,7 +41,7 @@ public class BoundedFIFOTestCase extends TestCase { { for (int i = 0; i < MAX; i++) { - e[i] = new LoggingEvent("", cat, Priority.DEBUG, "e"+i, null); + e[i] = new LoggingEvent("", cat, Level.DEBUG, "e"+i, null); } } diff --git a/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java b/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java index 77569dd93d..76caa57473 100644 --- a/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java @@ -16,7 +16,7 @@ import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.Logger; -import org.apache.log4j.Priority; +import org.apache.log4j.Level; import org.apache.log4j.helpers.CyclicBuffer; import junit.framework.TestCase; @@ -40,7 +40,7 @@ public class CyclicBufferTestCase extends TestCase { { for (int i = 0; i < MAX; i++) { - e[i] = new LoggingEvent("", cat, Priority.DEBUG, "e"+i, null); + e[i] = new LoggingEvent("", cat, Level.DEBUG, "e"+i, null); } } From 246dd0b921c60657d8d3d9f263cb4b34f13f305b Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Mon, 1 Nov 2004 19:34:27 +0000 Subject: [PATCH 094/342] added missing image files git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310831 13f79535-47bb-0310-9956-ffa450edef68 From b5d180f879c6094c400e81d25a00f05e7c92139c Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 3 Nov 2004 18:32:58 +0000 Subject: [PATCH 095/342] Added logging-site property git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310840 13f79535-47bb-0310-9956-ffa450edef68 --- build.properties.sample | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.properties.sample b/build.properties.sample index 78029a9b06..c5555f688f 100644 --- a/build.properties.sample +++ b/build.properties.sample @@ -27,3 +27,8 @@ jakarta-site2=../jakarta-site2 # Required to run Checkstyle. Available from http://checkstyle.sf.net checkstyle.jar=/java/checkstyle-2.2/checkstyle-all-2.2.jar + + +# The templates for the creation of the web-pages are inherited +# from the parent project. +logging-site=../logging-site \ No newline at end of file From 49c646db620944aa6c2f7ddd0b992980d1c0812e Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 3 Nov 2004 18:34:10 +0000 Subject: [PATCH 096/342] 12 BRANCH, updated links git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310841 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/Category.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/log4j/Category.java b/src/java/org/apache/log4j/Category.java index 1b7433217c..d9d8f1f351 100644 --- a/src/java/org/apache/log4j/Category.java +++ b/src/java/org/apache/log4j/Category.java @@ -67,10 +67,9 @@ * *

      See the short manual for an * introduction on this class. - * - *

      See the document entitled the replacement - * of Logger by Category for a deeper discussion. + *

      + * See the document entitled preparing + * for log4j 1.3 for a more detailed discussion. * * @author Ceki Gülcü * @author Anders Kristensen From 154af465175110d6379d08f25c496dea0e88ff22 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Wed, 3 Nov 2004 18:39:09 +0000 Subject: [PATCH 097/342] NOTE: 1.2 BRANCH - 1.2 site build now depends on logging-site as does log4j on CVS HEAD. - Small doc corrections. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@310842 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 71 +- docs/FAQ.html | 1563 +++++++++++++++++--------- docs/HISTORY | 18 + docs/manual.html | 4 +- src/java/org/apache/log4j/jmx/T.java | 22 - 5 files changed, 1071 insertions(+), 607 deletions(-) delete mode 100644 src/java/org/apache/log4j/jmx/T.java diff --git a/build.xml b/build.xml index 2544749854..e49b3f18f5 100644 --- a/build.xml +++ b/build.xml @@ -81,14 +81,13 @@ - - - + + + - @@ -395,51 +394,47 @@ - + + + + - + - - + + - AnakiaTask is not present! Please check to make sure that + AnakiaTask is not present! Please check to make sure that velocity.jar is in your classpath. - - + + - + - + + + + + templatePath="${logging-site}/src/xdocs/stylesheets"> - - - - + - + @@ -477,9 +472,9 @@ - + - + - - - + includes="logging-log4j-${version}/**" /> - + - + includes="logging-log4j-${version}/**" /> diff --git a/docs/FAQ.html b/docs/FAQ.html index 8adfa3e38b..a1fa59f90d 100644 --- a/docs/FAQ.html +++ b/docs/FAQ.html @@ -1,212 +1,398 @@ - - -log4j FAQ - - - -

      -

      Frequently Asked Questions about log4j

      - -Ceki Gülcü and Chris Taylor -

      May 2002

      -
      - - -
      -

      What is log4j?

      - -log4j is a tool to help the programmer output log statements to a -variety of output targets. - -

      In case of problems with an application, it is helpful to enable -logging so that the problem can be located. With log4j it is possible -to enable logging at runtime without modifying the application binary. -The log4j package is designed so that log statements can remain in -shipped code without incurring a high performance cost. It -follows that the speed of logging (or rather not logging) is capital. - -

      At the same time, log output can be so voluminous that it quickly -becomes overwhelming. One of the distinctive features of log4j is the -notion of hierarchical loggers. Using loggers it is -possible to selectively control which log statements are output at -arbitrary granularity. - -

      log4j is designed with two distinct goals in mind: speed and -flexibility. There is a tight balance between these two -requirements. I believe that log4j strikes the right balance. - -

      Is log4j a reliable logging system?

      - -No. log4j is not reliable. It is a best-effort and fail-stop -logging system. - -

      By fail-stop, we mean that log4j will not throw unexpected -exceptions at run-time potentially causing your application to -crash. If for any reason, log4j throws an uncaught exception, -please send an email to the log4j-user@jakarta.apache.org -mailing list. Uncaught exceptions are handled as serious bugs -requiring immediate attention. - - -

      Moreover, log4j will not revert to System.out or System.err -when its designated output stream is not opened, is not writable or -becomes full. This avoids corrupting an otherwise working program by -flooding the user's terminal because logging fails. However, log4j -will output a single message to System.err indicating that logging can -not be performed. - -

      What are the prerequisites for log4j?

      - - - -

      Is log4j thread-safe?

      - -Yes, log4j is thread-safe. - -

      What does log output look like?

      +
      + +

      Make sure to read the short + manual. It is also recommended to you read The complete + log4j manual. Both documents were written by Ceki + Gülcü. +

      + + + +

      Yes, log4j is thread-safe. Log4j components are designed to + be used in heavily multithreaded systems.

      + + + -The log output can be customized in many ways. Moreover, one can completely -override the output format by implementing one's own Layout. +

      The log output can be customized in many ways. Moreover, + one can completely override the output format by implementing + one's own Layout. +

      -

      Here is an example output using PatternLayout with -the conversion pattern "%r [%t] %-5p %c{2} %x - %m%n" +

      Here is an example output using PatternLayout with + the conversion pattern "%r [%t] %-5p %c{2} %x - %m%n" +

      -
      +	
       176 [main] INFO  examples.Sort - Populating an array of 2 elements in reverse order.
       225 [main] INFO  examples.SortAlgo - Entered the sort method.
       262 [main] DEBUG SortAlgo.OUTER i=1 - Outer loop.
      @@ -220,393 +406,680 @@ 

      May 2002

      at org.log4j.examples.SortAlgo.dump(SortAlgo.java:58) at org.log4j.examples.Sort.main(Sort.java:64) 467 [main] INFO examples.Sort - Exiting main method. -
      - -

      The first field is the number of milliseconds elapsed since the -start of the program. The second field is the thread outputting the -log statement. The third field is the level of the log -statement. The fourth field is the rightmost two components of the -logger making the log request. The fifth field (just before the '-') -is the nested diagnostic context (NDC). Note the nested diagnostic -context may be empty as in the first two statements. The text after -the '-' is the message of the statement. - -

      What are Loggers?

      - -Lggers lie at the heart of log4j. Loggers define a hierarchy and give -the programmer run-time control on which statements are -printed or not. - -

      Loggers are assigned levels. A log statement is printed -depending on its level and its logger. - -

      Make sure to read the log4j manual -for more information. - -

      How can I change log behavior at runtime?

      - -

      Log behavior can be set using configuration files which are parsed -at runtime. Using configuration files the programmer can define -loggers and set their levels. - -

      The PropertyConfigurator defines a particular format -of a configuration file. See also the examples/Sort.java -example and associated configuration files. - -

      Configuration files can be specified in XML. See -log4j.dtd and -org.log4j.xml.DOMConfigurator for more details. - -

      See the various Layout and Appender components for specific -configuration options. - -

      In addition to configuration files, the user may disable all -messages belonging to a set of levels. See next item. - -

      What is the fastest way of (not) logging?

      - -

      For some logger l, writing,

      -  l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
      -
      - -

      incurs the cost of constructing the message parameter, that is -converting both integer i and entry[i] to a -String, and concatenating intermediate strings. This, regardless of -whether the message will be logged or not. +

      + +

      The first field is the number of milliseconds elapsed since + the start of the program. The second field is the thread + outputting the log statement. The third field is the level of + the log statement. The fourth field is the rightmost two + components of the logger making the log request. The fifth + field (just before the '-') is the nested diagnostic + context (NDC). Note the nested diagnostic context may be + empty as in the first two statements. The text after the '-' + is the message of the statement. +

      + +
      + Section 2. Using log4j +
      + +

      This section contains answers to questions encountered while + using log4j.

      + + + +

      Lggers lie at the heart of log4j. Loggers define a hierarchy and give + the programmer run-time control on which statements are + printed or not. +

      + +

      Loggers are assigned levels. A log statement is printed + depending on its level and its logger. +

      + +

      Make sure to read the log4j manual + for more information. +

      + + + +

      Log behavior can be set using configuration files which are parsed + at runtime. Using configuration files the programmer can define + loggers and set their levels. +

      + +

      The PropertyConfigurator defines a particular format + of a configuration file. See also the examples/Sort.java + example and associated configuration files. +

      + +

      Configuration files can be specified in XML. See + log4j.dtd and + org.log4j.xml.DOMConfigurator for more details. +

      + +

      See the various Layout and Appender components for specific + configuration options. +

      + +

      In addition to configuration files, the user may disable all + messages belonging to a set of levels. See next item. +

      + + + -

      If you are worried about speed, then write -

      +	

      For some logger l, writing, +

      + +
      + l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
      +	
      + +

      incurs the cost of constructing the message parameter, that is + converting both integer i and entry[i] to a + String, and concatenating intermediate strings. This, regardless of + whether the message will be logged or not. +

      + +

      If you are worried about speed, then write

      +
          if(l.isDebugEnabled()) {
            l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
          }
      -
      - -

      This way you will not incur the cost of parameter construction if -debugging is disabled for logger l. On the other -hand, if the logger is debug enabled, you will incur the cost of -evaluating whether the logger is enabled or not, twice: once in -debugEnabled and once in debug. This is an -insignificant overhead since evaluating a logger takes less than 1% -of the time it takes to actually log a statement. - -

      Are there any suggested ways for naming -loggers?

      - -

      Yes, there are. - -

      You can name loggers by locality. It turns out -that instantiating a logger in each class, with the logger name -equal to the fully-qualified name of the class, is a useful and -straightforward approach of defining loggers. This approach has -many benefits: - -

        -
      • It is very simple to implement. - -
      • It is very simple to explain to new developers. - -
      • It automatically mirrors your application's own modular design. +
      + +

      This way you will not incur the cost of parameter + construction if debugging is disabled for logger + l. On the other hand, if the logger is debug + enabled, you will incur the cost of evaluating whether the + logger is enabled or not, twice: once in + debugEnabled and once in debug. + This is an insignificant overhead since evaluating a logger + takes less than 1% of the time it takes to actually log a + statement. +

      + + + + + -
    31. It can be further refined at will. +

      Yes, there are.

      -
    32. Printing the logger automatically gives information on the locality - of the log statement. +

      You can name loggers by locality. It turns out + that instantiating a logger in each class, with the logger name + equal to the fully-qualified name of the class, is a useful and + straightforward approach of defining loggers. This approach has + many benefits: +

      + +
        +
      • It is very simple to implement.
      • + +
      • It is very simple to explain to new developers.
      • + +
      • It automatically mirrors your application's own modular design. +
      • +
      • It can be further refined at will.
      • + +
      • Printing the logger automatically gives information on the locality + of the log statement.
      • +
      + +

      However, this is not the only way for naming loggers. A + common alternative is to name loggers by functional + areas. For example, the "database" logger, "RMI" + logger, "security" logger, or the "XML" logger. +

      + +

      You may choose to name loggers by functionality and + subcategorize by locality, as in "DATABASE.com.foo.some.package.someClass" or + "DATABASE.com.foo.some.other.package.someOtherClass". +

      + +

      You are totally free in choosing the names of your + loggers. The log4j package merely allows you to manage your + names in a hierarchy. However, it is your responsibility to define + this hierarchy. +

      + +

      Note by naming loggers by locality one tends to name things by + functionality, since in most cases the locality relates closely to + functionality. +

      - + + + +

      You can easily retrieve the fully-qualified name of a class in a + static block for class X, with the statement + X.class.getName(). Note that X is the class + name and not an instance. The X.class statement does + not create a new instance of class X. +

      + +

      Here is the suggested usage template:

      +
      +package a.b.c;
       
      -

      However, this is not the only way for naming loggers. A common -alternative is to name loggers by functional -areas. For example, the "database" logger, "RMI" logger, -"security" logger, or the "XML" logger. +public class Foo { + final static Logger logger = Logger.getLogger(Foo.class); + ... other code -

      You may choose to name loggers by functionality and -subcategorize by locality, as in "DATABASE.com.foo.some.package.someClass" or -"DATABASE.com.foo.some.other.package.someOtherClass". +} +

      + + + +

      Yes, you can extend the Layout class to create + you own customized log format. Appenders can be parameterized + to use the layout of your choice. +

      + + + +

      Log4j uses JavaBeans style configuration.

      + +

      Thus, any setter method in FooBarAppender + corresponds to a configurable option. For example, in RollingFileAppender + the setMaxBackupIndex(int + maxBackups) method corresponds to the + maxBackupIndex option. The first letter of the + option can be upper case, i.e. MaxBackupIndex + and maxBackupIndex are equivalent but not + MAXBACKUPIndex nor mAXBackupIndex. +

      + +

      Layouts options are also defined by their setter methods. The same goes + for most other log4j components. +

      + + + + +

      We suggest to just use global file search/replace. You should be able + to replace all the "java.util.Logger" references with + "org.apache.log4j.Logger", and you should be on your way. +

      + +

      If you're on a Win32 platform, we recommend Textpad. You can use the + CTRL+SHIFT+O to open all *.java files from a directory including all + its sub-directories, and then use the search/replace function to + replace in all files, and then CTRL+SHIFT+S to save all. Should take + about 60 seconds! :) +

      + + + +

      Yes it is. Setting the Threshold option of any appender + extending AppenderSkeleton, + (most log4j appenders extend AppenderSkeleton) to filter out all log + events with lower level than the value of the threshold + option. +

      + +

      For example, setting the threshold of an appender to DEBUG + also allow INFO, WARN, ERROR and FATAL messages to log along + with DEBUG messages. This is usually acceptable as there is + little use for DEBUG messages without the surrounding INFO, + WARN, ERROR and FATAL messages. Similarly, setting the + threshold of an appender to ERROR will filter out DEBUG, INFO + and WARN messages but not ERROR or FATAL messages. +

      + +

      This policy usually best encapsulates what the user + actually wants to do, as opposed to her mind-projected + solution. +

      +

      See examples/sort4.lcf for an example threshold + configuration.

      + +

      If you must filter events by exact level match, then you can + attach a LevelMatchFilter + to any appender to filter out logging events by exact level match. +

      -

      You are totally free in choosing the names of your -loggers. The log4j package merely allows you to manage your -names in a hierarchy. However, it is your responsibility to define -this hierarchy. + +

      + +

      The NT Event Viewer relies on message resource DLLs + to properly view an event message. The NTEventLogAppender.dll + contains these message resources, but that DLL must be copied + to %SYSTEMROOT%\SYSTEM32 for it to work properly. +

      + + + + +

      Unfotunately, the logger names are hardcoded within the + message resource DLL (see previous question about + NTEventLogAppender), so there isn't any easy way to override + those dynamically... in fact, I don't think it's possible to + do it, as you'd have to modify the DLL resources for every + application. Since most native applications don't use the + Logger column anyway... +

      + + + +

      + The suggested approach depends on your design requirements. If you or + your organization has no constraints on the use of Java in JSP pages, + simply use log4j normally in <% ... %> statements + as indicated in the Short Manual and the rest of the documentation. +

      +

      + However, if your design calls for a minimum amount of Java in your JSP + pages, consider using the + Log Taglib + from the Jakarta Taglibs project. It provides logging JSP tags that invoke + log4j. +

      + +
      + Section 3. Advanced questions +
      + +

      This section contains answers to more advanced questions about log4j.

      + + + + +

      Many developers are confronted with the problem of + distinguishing the log output originating from the same class + but different client requests. They come up with ingenious + mechanisms to fan out the log output to different files. In + most cases, this is not the right approach. +

      + +

      It is simpler to use a nested diagnostic context + (NDC). Typically, one would NDC.push() client + specific information, such as the client's hostname, ID or any + other distinguishing information when starting to handle the + client's request. Thereafter, log output will automatically + include the nested diagnostic context so that you can + distinguish logs from different client requests even if they + are output to the same file. +

      + +

      See the NDC and the PatternLayout + classes for more information. The NumberCruncher + example shows how the NDC can be used to distinguish the log + output from multiple clients even if they share the same log + file. +

      + +

      For select applications, such as virtual hosting + web-servers, the NDC solution is not sufficient. As of version + 0.9.0, log4j supports multiple hierarchy trees. Thus, it is + possible to log to different targets from the same logger + depending on the current context. +

      -

      Note by naming loggers by locality one tends to name things by -functionality, since in most cases the locality relates closely to -functionality. + +

      + +

      It is quite nontrivial to define the semantics of a + "removed" logger escecially if it is still referenced by the + user. Future releases may include a remove method in + the Logger class.

      + + + +

      You may have each process log to a + SocketAppender. + The receiving + SocketServer + (or + SimpleSocketServer) + can receive all the events and send them to a single + log file. +

      + + + + +

      The timestamp is created when the logging event is created. + That is so say, when the debug, + info, warn, error or + fatal method is invoked. Thus, the timestamp is + unaffected by the time at which event arrive at a remote + socket server. +

      + +

      Timestamps are stored in UTC format inside the + event. Consequently, when displayed or written to a log file, + timestamps appear in the same timezone as the host displaying + or creating the logfile. Note that because the clocks of + various machines may not be synchronized, there may be + timestamp inconsistencies between events generated on + different hosts. +

      + + + + +

      The short answer: the log4j classes and the properties file + are not within the scope of the same classloader. +

      + +

      The long answer (and what to do about it): J2EE or Servlet + containers utilize Java's class loading system. Sun changed + the way classloading works with the release of Java 2. In + Java 2, classloaders are arranged in a hierarchial + parent-child relationship. When a child classloader needs to + find a class or a resource, it first delegates the request to + the parent. +

      + +

      Log4j only uses the default Class.forName() + mechanism for loading classes. Resources are handled + similarly. See the documentation for + java.lang.ClassLoader for more details. +

      + +

      So, if you're having problems, try loading the class or + resource yourself. If you can't find it, neither will + log4j. ;) +

      -

      How do I get the fully-qualified name of a class -in a static block?

      + + + +

      Yes. Both the DOMConfigurator and the PropertyConfigurator support + automatic reloading through the configureAndWatch method. + See the API documentation for more details. +

      + + +

      Because the configureAndWatch launches a + separate wathdog thread, and because there is no way to stop + this thread in log4j 1.2, the configureAndWatch + method is unsafe for use in J2EE envrironments where + applications are recycled. +

      + + +
      + Section 4. Contributing to the project +
      + +

      This section includes questions about contributing to the + project

      + + + +

      Contrary to the GNU Public License (GPL) the Apache + Software License does not make any claims over your + extensions. By extensions, we mean totally new code that + invokes existing log4j classes. You are free to do + whatever you wish with your proprietary log4j extensions. + In particular, you may choose to never release your extensions + to the wider public. +

      + +

      We are very careful not to change the log4j client API so + that newer log4j releases are backward compatible with + previous versions. We are a lot less scrupulous with the + internal log4j API. Thus, if your extension is designed to + work with log4j version n, then when log4j + release version n+1 comes out, you will probably + need to adapt your proprietary extensions to the new release. +

      + +

      Thus, you will be forced to spend precious resources in + order to keep up with log4j changes. This is commonly referred + to as the "stupid-tax." By donating the code and making it + part of the standard distribution, you save yourself the + unnecessary maintenance work. +

      + +

      If your extensions are useful then someone will eventually + write an extension providing the same or very similar + functionality. Your development effort will be wasted. Unless + the proprietary log4j extension is business critical, there is + little reason for not donating your extensions back to the + project. +

      + + + +
        + +
      1. +

        Write a test case for your contribution.

        + +

        There is nothing more irritating than finding the bugs + in debugging (i.e. logging) code. Writing a test case + takes some effort but is crucial for a widely used library + such as log4j. Writing a test case will go a long way in + earning you the respect of fellow developers. See the + tests/ directory for exiting test cases. +

        +
      2. + + +
      3. +

        Stick to the existing indentation style even if you hate it.

        + +

        Alternating between indentation styles makes it hard to + understand the source code. Make it a little harder on + yourself but easier on others. +

        + +

        Log4j has adopted a rather conservative approach by + following the Code Conventions + for the JavaTM Programming Language. We use 2 (two) + spaces for indentation and no tabs. +

        +
      4. + +
      5. +

        Please do not both modify the code and change the + indentation in a single commit.

        + +

        If you change the code and reformat it at the same time + and then commit, the commit notification message will be + hard to read. It will contain many diffs associated with + the reformatting in addition to logical changes. +

        + +

        If you must reformat and change the code, then perform + each step separately. For example, reformat the code and + commit. Following that, you can change the logic and + commit. The two steps can be performed in the reverse + order just as well. You can first change the logic and + commit and only later reformat and commit. +

        + +
      6. +
      7. +

        Make every effort to stick to the JDK 1.1 API.

        + +

        One of the important advantages of log4j is its + compatibility with JDK 1.1.x. +

        +
      8. + +
      9. +

        Always keep it simple, small and fast when + possible.

        + +

        It's all about the application not about logging.

        +
      10. + +
      11. +

        Identify yourself as a contributor at the top of the + relevant file. +

        +
      12. +
      13. +

        Take responsibility for your code.

        + +

        Authoring software is very much like running a marathon. It + takes time and endurance. +

        +
      14. +
      15. +

        Did we mention sticking with the indentation style?

        +
      16. +
      17. Did we mention writing test cases?

        +
      18. + +
      + + + +

      Log4j uses velocity-anakia + to generate its web-site, including this FAQ. We have devised + special macros to help us automatically generate labeled + question/answer pairs. +

      + +

      If you are not a commiter, you can simply submit your new + question/answer pair to the log4j-dev@logging.apache.org + mailing list. The committers will take it from there. +

      + +

      If you are a committer, then you must edit the + /src/xdocs/faq.xml file. The format of the file + should be self-evident. After you have made your changes, run + the command +

      +
      ant site
      + +

      After the appropriate transformation, your changes should + appear in the file /docs/faq.html. +

      + + + + + +
      + Copyright © 1999-2004, Apache Software Foundation +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      + -

      You can easily retrieve the fully-qualified name of a class in a -static block for class X, with the statement -X.class.getName(). Note that X is the class -name and not an instance. The X.class statement does -not create a new instance of class X. + + + -

      Here is the suggested usage template: -

      -package a.b.c;
       
      -public class Foo {
      -  static Logger logger = Logger.getLogger(Foo.class);
      -  ... other code
       
      -}
      -
      - -

      Can the log output format be customized?

      - -

      Yes. Since release 0.7.0, you can extend the Layout -class to create you own customized log format. Appenders can be -parameterized to use the layout of your choice. - -

      Can the outputs of multiple client request go to -different log files?

      - -Many developers are confronted with the problem of distinguishing the -log output originating from the same class but different client -requests. They come up with ingenious mechanisms to fan out the log -output to different files. In most cases, this is not the right -approach. - -

      It is simpler to use a nested diagnostic context (NDC). Typically, -one would NDC.push() client specific information, such as the -client's hostname, ID or any other distinguishing information when -starting to handle the client's request. Thereafter, log output will -automatically include the nested diagnostic context so that you can -distinguish logs from different client requests even if they are -output to the same file. - -

      See the NDC and the PatternLayout classes -for more information. The NumberCruncher example shows -how the NDC can be used to distinguish the log output from multiple -clients even if they share the same log file. - -

      For select applications, such as virtual hosting web-servers, the -NDC solution is not sufficient. As of version 0.9.0, log4j supports -multiple hierarchy trees. Thus, it is possible to log to different -targets from the same logger depending on the current context. - -

      What are the configurable options for -FooBarAppender?

      - -Log4j uses JavaBeans style configuration. - -

      Thus, any setter method in FooBarAppender corresponds -to a configurable option. For example, in RollingFileAppender -the setMaxBackupIndex(int -maxBackups) method corresponds to the maxBackupIndex -option. The first letter of the option can be upper case, i.e. -MaxBackupIndex and maxBackupIndex are -equivalent but not MAXBACKUPIndex nor -mAXBackupIndex. - -

      Layouts options are also defined by their setter methods. Same goes -for most other log4j components. - - - -

      Logger instances seem to be create only. Why isn't -there a method to remove logger instances?

      - -It is quite nontrivial to define the semantics of a "removed" logger -which is still referenced by the user. Future releases may -include a remove method in the Logger class. - -

      Is it possible to direct log output to -different appenders by level?

      - -

      Yes it is. Setting the Threshold option of any appender -extending AppenderSkeleton, -(most log4j appenders extend AppenderSkeleton) to filter out all log -events with lower level than the value of the threshold -option. - -

      For example, setting the threshold of an appender to DEBUG also -allow INFO, WARN, ERROR and FATAL messages to log along with DEBUG -messages. This is usually acceptable as there is little use for DEBUG -messages without the surrounding INFO, WARN, ERROR and FATAL -messages. Similarly, setting the threshold of an appender to ERROR -will filter out DEBUG, INFO and WARN messages but not ERROR or FATAL -messages. - -

      This policy usually best encapsulates what the user actually wants -to do, as opposed to her mind-projected solution. - -

      See examples/sort4.lcf for an example threshold -configuration. - -

      If you must filter events by exact level match, then you can -attach a LevelMatchFilter -to any appender to filter out logging events by exact level match. - - -

      How do I get multiple process to log to the same file?

      - -

      You may have each process log to a -SocketAppender. -The receiving -SocketServer -(or -SimpleSocketServer) -can receive all the events and send them to a single -log file. - -

      If I have many processes across multiple hosts -(possibly across multiple timezones) logging to the same file using the -method above, what happens to timestamps?

      - -

      The timestamp is created when the logging event is created. That is -so say, when the debug, info, warn, -error or fatal method is invoked. -This is unaffected by the time at which they may arrive at a remote -socket server. Since the timestamps are stored in UTC format inside -the event, they all appear in the same timezone as the host creating the -logfile. Since the clocks of various machines may not be synchronized, -this may account for time interval inconsistencies between events generated -on different hosts. - -

      While this is the intended behavior, it only recently became so due to -a bug discovery between version 1.0.4 and 1.1b1. Versions 1.0.4 and before -had their timestamp regenerated in the converter. In this case the timestamps -seen in the log file would all appear in order, generated at the time they -arrived at the log server host according to its local clock. - -

      Why can't log4j find my properties file in a J2EE -or WAR application?

      - -The short answer: the log4j classes and the properties file are not -within the scope of the same classloader.

      - -The long answer (and what to do about it): J2EE or Servlet containers -utilize Java's class loading system. Sun changed the way classloading -works with the release of Java 2. In Java 2, classloaders are -arranged in a hierarchial parent-child relationship. When a child -classloader needs to find a class or a resource, it first delegates -the request to the parent. - -

      Log4j only uses the default Class.forName() mechanism -for loading classes. Resources are handled similarly. See the -documentation for java.lang.ClassLoader for more details. - -

      So, if you're having problems, try loading the class or resource -yourself. If you can't find it, neither will log4j. ;) - -

      Is there a way to get log4j to -automatically reload a configuration file if it changes?

      - -

      Yes. Both the DOMConfigurator and the PropertyConfigurator support -automatic reloading through the configureAndWatch APIs. -See the API documentation for more details. - -

      What does the Windows NT Event -Viewer complain about missing descriptions for my event messages when -I use the NTEventLogAppender?

      - -

      The NT Event Viewer relies on message resource DLLs to -properly view an event message. The NTEventLogAppender.dll contains -these message resources, but that DLL must be copied to -%SYSTEMROOT%\SYSTEM32 for it to work properly. - - -

      Why can't I map my logger names -to the loggers that appear in the NT Event Log when I use the -NTEventLogAppender?

      - -

      Unfotunately, the logger names are hardcoded within the message -resource DLL (see previous question about NTEventLogAppender), so -there isn't any easy way to override those dynamically... in fact, I -don't think it's possible to do it, as you'd have to modify the DLL -resources for every application. Since most native applications don't -use the Logger column anyway... - -

      Why should I donate my extensions to log4j back to the -project?

      - -Contrary to the GNU Public License (GPL) the Apache Software License -does not make any claims over your extensions. By extensions, we mean -totally new code that invokes existing log4j classes. You are free -to do whatever you wish with your proprietary log4j extensions. -In particular, you may choose to never release your extensions to the -wider public. - -

      We are very careful not to change the log4j client API so that -newer log4j releases are backward compatible with previous -versions. We are a lot less scrupulous with the internal log4j -API. Thus, if your extension is designed to work with log4j version -n, then when log4j release version n+1 comes -out, you will probably need to adapt your proprietary extensions to -the new release. - -Thus, you will be forced to spend precious resources in order to keep -up with log4j changes. This is commonly referred to as the -"stupid-tax." By donating the code and making it part of the standard -distribution, you save yourself the unnecessary maintenance work. - -

      If your extensions are useful then someone will eventually write an -extension providing the same or very similar functionality. Your -development effort will be wasted. Unless the proprietary log4j -extension is business critical, there is little reason for not -donating your extensions back to the project. - -

      What should I keep in mind when contributing -code?

      - -
        - -
      1. Write a test case for your contribution. - -

        There is nothing more irritating than finding the bugs in - debugging (i.e. logging) code. Writing a test case takes some - effort but is crucial for a widely used library such as - log4j. Writing a test case will go a long way in earning you the - respect of fellow developers. See the tests/ directory for exiting - test cases. -

      2. -

      3. Stick to the existing indentation style even if you hate it. -

        Alternating between indentation styles makes it hard to - understand the source code. Make it hard on yourself but easier - on others. Log4j follows the Code Conventions for - the JavaTM Programming Language. -

      4. Make every effort to stick to the JDK 1.1 API. -

        One of the important advantages of log4j is its compatibility with - JDK 1.1.x. - -

      5. Keep it simple, small and fast. -

        It's all about the application not about logging. -

      6. Identify yourself as the contributor at the top of the - relevant file. -

      7. Take responsibility for your code. - -

        Authoring software is very much like running a marathon. It - takes time and endurance. -

      8. Did I mention sticking with the indentation style? -

      9. Did I mention writing test cases? - -
      -

      Where can I find the latest distribution of log4j?

      -

      The log4j project is hosted at http://jakarta.apache.org/log4j/. -

      -


      - diff --git a/docs/HISTORY b/docs/HISTORY index 3f393a39b6..ed0ab544f8 100644 --- a/docs/HISTORY +++ b/docs/HISTORY @@ -5,6 +5,24 @@ client code. [***] Changes requiring important modifications to existing client code. + + November 1st, 2004 + + - Release of version 1.2.9 + + Log4j version 1.2.9, is identical to version 1.2.8, except that + several key methods have been deprecated in preparation for version + 1.3.0, the next major release of log4j. These changes are intended to + enforce the rule that client code should never refer to the Category + class directly, but use the Logger class instead. Similarly, client + code should not refer to the Priority class but to the Level class + instead. + + For a more detailed discussion, refer to the document entitled + preparing for log4j 1.3 at: + + http://www.qos.ch/logging/preparingFor13.jsp + February 19th, 2003 - Release of version 1.2.8 diff --git a/docs/manual.html b/docs/manual.html index bbd4988c60..db910d5526 100644 --- a/docs/manual.html +++ b/docs/manual.html @@ -25,7 +25,7 @@

      Short introduction to log4j

      edition of JavaWorld. However, the present article contains more detailed and up to date information. The present short manual also borrows some text from "The + href="https://www.qos.ch/shop/products/eclm/">"The complete log4j manual" by the same author (yours truly). @@ -52,7 +52,7 @@

      Introduction

      href="http://www.opensource.org">open source initiative. The latest log4j version, including full-source code, class files and documentation can be found at http://jakarta.apache.org/log4j/. +href="http://logging.apache.org/log4j/">http://logging.apache.org/log4j/. By the way, log4j has been ported to the C, C++, C#, Perl, Python, Ruby, and Eiffel languages. diff --git a/src/java/org/apache/log4j/jmx/T.java b/src/java/org/apache/log4j/jmx/T.java deleted file mode 100644 index 24724744e3..0000000000 --- a/src/java/org/apache/log4j/jmx/T.java +++ /dev/null @@ -1,22 +0,0 @@ - - -import org.apache.log4j.jmx.Agent; -import org.apache.log4j.Category; -import org.apache.log4j.BasicConfigurator; -import org.apache.log4j.*; - -public class T { - - - public static void main(String[] args) { - Category cat = Category.getInstance(T.class); - Layout layout = new PatternLayout("%r %p [%t] %c - %m%n"); - ConsoleAppender consoleAppender = new ConsoleAppender(layout); - - consoleAppender.setName("console"); - BasicConfigurator.configure(consoleAppender); - Agent agent = new Agent(); - agent.start(); - } - -} From 7999a885f25e315057b4785c324f3abb09e32d6e Mon Sep 17 00:00:00 2001 From: No Author Date: Thu, 28 Apr 2005 20:34:05 +0000 Subject: [PATCH 098/342] This commit was manufactured by cvs2svn to create branch 'v1_2-branch'. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311327 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 1861 +++++++++++++++++ slf4j.xml | 82 + .../org/slf4j/LoggerFactory.java | 84 + .../org/slf4j/LoggerFactoryAdapter.java | 60 + src/filtered-java/org/slf4j/ULogger.java | 104 + .../org/slf4j/impl/JDK14Logger.java | 243 +++ .../org/slf4j/impl/JDK14LoggerFA.java | 74 + .../org/slf4j/impl/MessageFormatter.java | 143 ++ .../org/slf4j/impl/NOPLogger.java | 200 ++ .../org/slf4j/impl/NOPLoggerFA.java | 58 + .../org/slf4j/impl/SimpleLogger.java | 290 +++ .../org/slf4j/impl/SimpleLoggerFA.java | 83 + src/java/org/slf4j/LoggerFactory.java | 84 + src/java/org/slf4j/LoggerFactoryAdapter.java | 60 + src/java/org/slf4j/ULogger.java | 104 + src/java/org/slf4j/impl/Log4jLoggerFA.java | 58 + src/java/org/slf4j/impl/MessageFormatter.java | 143 ++ src/java/org/slf4j/impl/NOPLogger.java | 200 ++ src/java/org/slf4j/impl/NOPLoggerFA.java | 58 + src/java/org/slf4j/impl/SimpleLogger.java | 290 +++ src/java/org/slf4j/impl/SimpleLoggerFA.java | 83 + tests/.cvsignore | 8 + 22 files changed, 4370 insertions(+) create mode 100644 docs/HISTORY.txt create mode 100644 slf4j.xml create mode 100644 src/filtered-java/org/slf4j/LoggerFactory.java create mode 100644 src/filtered-java/org/slf4j/LoggerFactoryAdapter.java create mode 100644 src/filtered-java/org/slf4j/ULogger.java create mode 100644 src/filtered-java/org/slf4j/impl/JDK14Logger.java create mode 100644 src/filtered-java/org/slf4j/impl/JDK14LoggerFA.java create mode 100644 src/filtered-java/org/slf4j/impl/MessageFormatter.java create mode 100644 src/filtered-java/org/slf4j/impl/NOPLogger.java create mode 100644 src/filtered-java/org/slf4j/impl/NOPLoggerFA.java create mode 100644 src/filtered-java/org/slf4j/impl/SimpleLogger.java create mode 100644 src/filtered-java/org/slf4j/impl/SimpleLoggerFA.java create mode 100644 src/java/org/slf4j/LoggerFactory.java create mode 100644 src/java/org/slf4j/LoggerFactoryAdapter.java create mode 100644 src/java/org/slf4j/ULogger.java create mode 100644 src/java/org/slf4j/impl/Log4jLoggerFA.java create mode 100644 src/java/org/slf4j/impl/MessageFormatter.java create mode 100644 src/java/org/slf4j/impl/NOPLogger.java create mode 100644 src/java/org/slf4j/impl/NOPLoggerFA.java create mode 100644 src/java/org/slf4j/impl/SimpleLogger.java create mode 100644 src/java/org/slf4j/impl/SimpleLoggerFA.java create mode 100644 tests/.cvsignore diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt new file mode 100644 index 0000000000..a7f0f5d502 --- /dev/null +++ b/docs/HISTORY.txt @@ -0,0 +1,1861 @@ + + + [*] Changes that are 100% compatible with existing client code. + [**] Changes that requiring little or no modification to existing + client code. + [***] Changes requiring important modifications to existing client code. + + [D] Changes affect a method or property which was previously marked as + deprecated. + + ??, 2005 + - Release of version 1.3alpha-7 + + - Chatty output about Logger creation or retrieval events is now + suppressed by default. They can be enabled by explicitly setting the + log4j.coreDebug system property. [*] + + - The log4j.debug system property no longer has any affect as all + log4j output is done through regular Logger objects. However, in + configuration file in properties format, the log4j.debug property will + cause PropertyConfigurator to *temporarily* output logs generated + during the configuration process. This is very similar to the way the + debug attribute works in configuration files in XML format. [*] + + + January 20th, 2005 + - Release of version 1.3alpha-6 + + - Fixed involuntary omission of DOMConfigrator (deprecated) in log4j-VERSION.jar. + - Added missing files in log4-oro.jar. + - The lengthy system property "log4j.repositorySelectorClass" was renamed as + "log4j.repositorySelector". + + January 19th, 2005 + - Release of version 1.3alpha-5 + + - Universal and Generic Logging Interface (UGLI) is now part of log4j. + UGLI allows variation in the logging API implementattion in a simple and + robust way. Log4j directly supports the interfaces defined by UGLI. + For more information see http://logging.apache.org/log4j/docs/ugli.html [*] + + - Log4j now ships with several jar files, one jar file per dependency. [*/**] + + - Fixed Bugzilla 15198: TelnetAppender: NullPointerException if + SocketHandler not initialized. [*] + + - Fixed Bugzilla 12112: CountingQuietWriter miscounts bytes. [*] + + - Fixed Bugzilla 18076: setting of firstTime in OnlyOnceErrorHandler. [*] + + - Added pattern conversion support for the Subject line for emails + generated by SMTPAppender. The set of patterns is the same as those + supported by PatternLayout. [*] + + - Implemented Bugzilla 20985: charset support for SMTPAppender [**] + + - Implemented Bugzilla 20500: separate registry clearing from doConfigure in PropertyConfigurator + to allow to easier extension. [*] + + - Fixed Bugzilla 23912: unsafe access to BoundedFIFO in AsyncAppender. [*] + + - Changed converter register accessors in PatternParser to take/return Map instead + of HashMap, a cleaner abstraction allowing for different implementation types. [*] + + - Fixed Bugzilla 26658: modify build.xml chainsaw target with respect to crimson.jar [*] + + - Fixed Bugzilla 28682: NullPointerException in SocketHubAppender#cleanup. [*] + + - Fixed Bugzilla 28464: White space significant at end of line for PropertyConfigurator. [*] + + - Fixed Bugzilla 26117: Output encoding for TelnetAppender. [*] + + November 25, 2004 + + - Release of version 1.3alpha-3 + + - Classes are built with the javac debug setting on. + - Fixed unset activeFile bug in SlidingWindowRollingPolicy. + + November 25, 2004 + + - Release of version 1.3alpha-2 + + - The deprecated DOMConfigrator was mistakenly left as the default + configrator for XML files. This has been fixed and JoranConfigrator + now is the default configrator for XML files. + + November 24th, 2004 + + - Release of version 1.3alpha-1 + + - Log4j now uses itself for its own logging. For more details refer to + + http://www.qos.ch//logging/internalLogging.jsp + + - The Appender.requiresLayout() method is no longer needed. + + This method was only used by PropertConfigrurator and not + DOMConfigurator nor JoranConfigurator. It was never strictly necessary + and case the layout is *optional* for a given appender type, it causes + unwarranted error messages. + + This simplification will make it slightly easier to write appenders. + + - Added new printing methods message supporiting pattern parsing. These new forms + avoid superflous parameter construction and yield a significant performance + increase in the case of disavled log statements. [*] + + - Added new ListAppender & ListModelAppender classes to the org.apache.log4j.varia package. + These are rather simplistic Appender implementations that store LoggingEvents in + an internal buffer (java.util.List and a DefaultListModel respectively) which can + be useful in certain applications (such as a Swing GUI app etc). [*] + + - org.apache.log4j.HTMLLayout has been replaced with org.apache.log4j.html.HTMLLayout. + The new HTMLLayout admits a conversion pattern using the same syntax as + PatternLayout. Thus, the user can customize the content of columns in the HTML table + produced by HTMLLayout. Just as importantly, many visual aspects of the table can be + customized at row or even cell level with the help of a CSS file. + + The new HTMLLayout has been contributed by Steve Mactaggart. + + - Log4j now ships with JoranConfigurator, a powerful replacement for + DOMConfigurator. Joran bring a plethora of new capabilities. In + particular, it can be taught new parsing rules on the fly, even from + within the config file being processed. Moreover, with the help of + implicit actions, it can configure specialized sub-components of log4j + components. + + Many of the new components in version 1.3 can be configured thanks + to the new capabilitues found in JoranConfigurator. + + - Fixed bug #15585 relative to location information extraction on the AS400. The fix + was contributed by Patrice Kolata. [*] + + - Log4j will now automatically include stack traces for nested + exceptions. Log4j extends the automatic nested exception printing + available in JDK 1.4 to nested exceptions accessible through methods + named "getRootCause", "getNextException" and "getException", not just + "getCause" as in JDK 1.4. [*] + + - The location information extraction code has been refactored to use + a faster mechanism when running on JDK 1.4 or later. The new mechanism, contributed + by Martin Schulz, is at least twice as fast. + + See http://marc.theaimsgroup.com/?t=108473346700001&r=1&w=2 for more details. [*] + + - Made ignoresThrowable a settable property. The user can now force a layout + to ignore the throwable in the event even if the layout knows how to handle + exceptions. Conversely, an appender can be fooled to believe that a layout + handled the exception in the logging event by setting a layout's ignoresThrowable + property to false. [*] + + - The org.apache.log4j.db package replaces the old org.apache.log4j.jdbc + package. The new package supports most relational database systems + such as PostgreSQL, MySQL, Oracle, DB2 or MsSQL. It can also handle + retrieve connections using a JDBC driver class, a data source class or + JNDI. [*] + + - A sequenceNumber field has been added to LoggingEvent. This fields is useful when + checking for the equality of two logging events or when ordering them. [*] + + - Log4j now has its own Scheduler. It allows jobs to be executed at a certain date + or even periodically. It only requires just one extra thread. [*] + + - Added the "isPristine" flag to LoggerRepository. As soon as a configurator + starts configuring a repository this flag is set to false. + + - Removed support for the deprecated property "log4j.configDebug". [**/D] + + - The new ContextJNDISelector allows for the possibility of managing + multiple logger hiearchies within the same application server while + only a single copy of log4j.jar is present in memory. + + - Added keys() method to the MDC class as requested by Don Isenor. + + - Certain operations on Loggers are now made using ReaderWriterLocks which + allows simultaneous read operations but only one write operation. This should + significantly improve logging throughput in heavily loaded server environments. + + - Rolling can now be triggered based on time or size as was already the case in + log4j 1.2. However, the new architecture allows for much more variation in the + timing of the rollover and the actions taken during rollover (i.e on the fly + compression, renaming, moving). The new architecture was suggested a long time + ago by James P. Cakalic. A similar design can be found in the Avalon Logkit + package. + + In order to avoid duplication, the old org.apache.log4j.RollingAppender + and org.apache.log4j.RollingAppender classes have been removed. [**] + + - LoggingEvent was extended to allow properties. Properties are meant to be set + by Layout and Appender classes as they output/process logging events. + Properties are per logging event where MDC values are per thread. + + - Another LoggingEvent constructor was added to allow instances to be reconstituted + when received from remote sources that do not use LoggingEvent as the transport + type (like XML for example). + + - Fixed bug #23096. NullAppender getInstance method is now declared as a static. + + - Fixed bug #10706. The %X pattern without a key no longer causes a NullPointer + exception, + + - ADD: LIST OF CHAINSAW IMPROVEMENTS. + + November 2nd, 2004 + + - Release of version 1.2.9 + + Log4j version 1.2.9, is identical to version 1.2.8, except that + several key methods have been deprecated in preparation for version + 1.3.0, the next major release of log4j. These changes are intended to + enforce the rule that client code should never refer to the Category + class directly, but use the Logger class instead. Similarly, client + code should not refer to the Priority class but to the Level class + instead. + + For a more detailed discussion, refer to the document entitled + preparing for log4j 1.3 at: + + http://www.qos.ch/logging/preparingFor13.jsp + + February 19th, 2003 + + - Release of version 1.2.8 + + - Fixed bug #11570 whereby XMLAppender would throw a + NullPointerException if the input message was null. Many thanks to + David Vandegrift for reporting the bug and to Hendrik Brummermann for + supplying the patch. [*] + + - Fixed bug #12366 whereby various versions of Xerces would not parse + log4j configuration scripts expressed in XML format. [*] + + - Fixed bug #14827. The "removes" buffer used in the flushBuffer() method + of JDBCAppender is now cleared, solving the memory leak. Thanks to John + Landers for reporting the bug and suggesting the fix. [*] + + - Fixed bug #15599. SocketAppender now honors ReconnectionDelay of 0. + Many thanks to Scott Schram for reporting the bug and providing the fix. [*] + + October 9th, 2002 + + - Release of version 1.2.7 + + - Log4j now searches for the file log4j.xml as well as the file + log4j.properties during log4j initialization. [*] + + July 31st, 2002 + + - Release of version 1.2.6 + + - Addition of new options in JMSAppender and new command line arguments in + JMSSink. [*] + + - Added new method getLoggerName() in LoggingEvent class. The + getLoggerName is the preferred way for accessing the logger + name. The public access categoryName field should not be accessed + directly. Similarly, added the getLevel method which is now the + preferred way of accessing the event's level. The public access + level field should not be accessed directly. The javadocs now mark + the categoryName and level fields as deprecated. + + Modified existing appenders to comply with these new directives. [*] + + - Log4j now will check if a system property named "log4j.ignoreTCL" + is set. If it is set, then it will ignore the Thread Context + ClassLoader when loading classes. This solves the irritating + "appender is not assignable to Appender" messages observed when + log4j.jar is loaded by multiple class loaders. + + The error reporting for this problem was also improved. [*] + + - Fixed bug #10528 whereby calling the MDC.get method with a null + argument would throw a NullPointerException. [*] + + July 5th, 2002 + + - Release of version 1.2.5 + + - Minor changes and bug fixes in LF5. [*] + + - Calling an AsyncAppender close method also closes the embedded + appender instances. This resolves bug #10185 submitted by Paul + Voutier. [*] + + June 12th, 2002 + + - Release of version 1.2.4 + + - The JDBCAppender is marked as slated for replacement. Do not build + critical software using it. + + - Added LF5 documentation and examples. Further tests are required + for full integration. [*] + + - XMLLayout can now output messages which contain embedded CDATA + sections. This resolves bug #9750. Many thanks to Michael + A. McAngus for supplying the relevant patch. [*] + + - The dispatcher thread associated with AsyncAppender is now marked + as a deamon thread. This resolves bug #9750. [*] + + - Added missing NTEventLogAppender.dll as reported in bug #9606. [*] + + - In response to bug report 9435, the log4j.dtd was changed so that + is now made of logger and level attributes instead of + category and priority. Changed XMLLayout to conform to the + DTD. Chainsaw was changed to adapt to the XMLLayout. [*] + + - Added missing LevelRangeFilter file. [*] + + May 24th, 2002 + + - Release of version 1.2.3 + + - Fixed bug #9285 where the SyslogAppender would incorrectly compute + the length of the datagram to send to the remote syslogd host. + Reported by Mamoru Kadota. [*] + + - Fixed bug #8505 where the stack trace of exception would not be + properly printed on the Compaq tru64 Unix platform. Initially + reported by Fabrice Claes and later by Espen H. Kolstad who also + provided the fix. [*] + + May 22nd, 2002 + + - Release of version 1.2.2 + + - Log4j configurators take the "NULL" string value as a synonym for + "INHERITED". Both of these two strings are legal level values for + setting the level of a logger. Both values are case insensitive. [*] + + - When loading component classes, log4j will now first attempt to use + the Thread Context Loader and if that fails, it will use + Class.forName. In log4j 1.2 and 1.2.1, only Class.forName was used + and the TCL was ignored. This change is a response to bug #9305 + opened by Scott M. Stark. [*] + + May 17th, 2002 + + - Release of version 1.2.1 + + - This minor release fixes bug #9155 reported by Nicko Cadell. + LoggingEvent.getMDCCopy() method now sets mdcCopyLookupRequired + instead of ndcLookupRequired. This bug would cause the wrong MDC + information to appear on a log server. It could only occur if the + client wrapped an AsyncAppender around a SocketAppender or if the + server used an AsyncAppender for its logging. [*] + + May, 2002 + + - Release of version 1.2 + + - Fixed bug #8527. A closed TelnetAppender would continue waiting + for connections even if its ServerSocket was closed. This caused + the TelnetSocket to sit in a loop and complain about the closed + socket. [*] + + - AsyncAppender throws NullPointerException problem. The bug was actually in + AppenderSkeleton. See bug #5444 details. [*] + + - Added support for recursive variable substiuton as requested by + Eric Chastan. [*] + + - SocketNode now used a BufferedInputStream as suggested by Kok Chong + in bug report #3933. [*] + + - Fixed a problem with DailiyRollingAppender which would not + correctly compute the rollover period in certain timezones. See bug + report #7550. [*] + + - Fixed documentation bug #2726 in FAQ.html. [*] + + - In WriterAppender, fixed bug #2383 by adding a flush statement in the + writeFooter method. [*] + + - In XMLLayout, Fixed bug #7550 by escaping the method attribute. The + XMLLayout also outputs each item of a stack trace in a separate + line. [*] + + - Fixed bug #5932 as suggested by Heikki Linnakangas. The + LoggingEvent.getMDCCopy method now clones the MDC instead of just + referencing it. [*] + + (rc1) + + - The ANT build script was modified to use jar files specified in + the build.properties file instead of the CLASSPATH environment + variable. The build.properties file depends on local paths and is + supplied by the user. The build.properties.sample file is included + in the distribution. The build.sh and build.bat scripts have + been removed. This is the way many other jakarta projects build their + projects. The jar files in the dist/lib directory were also removed + since they are no longer used. [*] + + - The DOMConfigurator now interprets the string after the '#' + character in the value attribute within the element as + the fully qualified class name of a custom Level. This is consistent + with the way log4j handles "level" values in other places. The + class attribute is still honored. [*] + + - Added Oliver Burn's chainsaw tool to the core log4j + distribution. Visualisation and dynamic filtering of log events is + bound to be a very important area of activity in the future. [*] + + - Added the org.apache.log4j.jdbc.JDBCAppender which as the name + indicates sends events to a database using the JDBC API. Thanks to + Kevin Steppe for supplying the code. [*] + + - Added SocketHubAppender class as contributed by Mark Womack. This + appender sends LoggingEvent objects to a set of remote a log + servers. [*] + + - In the Category class, the getChainedPriority method has been + replaced with getEffectiveLevel method. [*] + + (beta4) + + - Replaced the custom class loading based on the thread context class + loader with a simple Class.forName() call. This solves two allied + but distinct problems encountered when using Ant with JUnit + although the bug is more general. In one instance of the + problem, log4j would throw java.lang.NoClassDefFoundError for + org/apache/log4j/AppenderSkeleton where log4j.jar and related + classes were clearly available to the Ant classloader. In another + incarnation, log4j would reject a custom appender claiming that it is + not assignable to a org.apache.log4j.Appender variable. This would + occur when log4j.jar was available to both the Ant classloader and the + system classloader. + + Thanks to Dave Herman for providing detailed scenarios exposing + the issues involved. See + http://forum.java.sun.com/thread.jsp?forum=38&thread=70946 + http://forum.java.sun.com/thread.jsp?forum=38&thread=70946#479697 + http://marc.theaimsgroup.com/?l=ant-user&m=101139178705895&w=2 + for more details. [*] + + + (beta3) + + - Fixed the complaints the compiler issued when using the + Logger.setLevel() methd. [*] + + - Incorporated the performance enhancements to ISO8601DateFormat and + AbsoluteTimeDateFormat classes submitted by Andrew Vajoczki. + + (beta2) + + - Source code written for log4j 1.1.3.jar will compile fine with + log4j 1.2X. However, code compiled for log4j 1.1.3 would previously + systematically throw "java.lang.NoSuchMethodError" runtime exceptions + when run with log4j 1.2 - prior to beta2. This problem has been + corrected in beta2. Pheew, that was a close one. [*] + + - Log4j 1.2 is now backward compatible in serialization of + LoggingEvents. For example, a 1.1.3 SocketAppedner can write to 1.2 + SocketServer. Similarly a 1.2 JMSAppender will work with 1.1.3 + JMSSink. This should ease the move to log4j 1.2, especially in + large deployments. [*] + + (alpha7) + + - The src/java/org/apache/log4j/examples/ directory moved under the + top-level directory as examples/. [*] + + - Fixed the ArrayIndexOutOfBoundsException that was thrown by + AsyncAppender if multiple threads were trying to log an event + containing an exception near simultaneously. Thanks to Thomas Tuft Muller + for reporting this bug. [*] + + (alpha1-alpha6) + + - Improved error reporting in DOMConfigurator. Thanks to Thomas Tuft + Muller for contributing the enhancement. [*] + + - Log4j is now configurable using JMX. JMX support is not of + production quality. [*] + + - Added support for different encodings in WriterAppender. Thanks to + Ben Sandee for submitting the relevant patch. [*] + + - Modified SMTPAppender to allow multiple email sessions. Thanks to + Jon Skeet for supplying the relevant patch. [*] + + - The CategoryFactory class has been replaced by the LoggerFactory + class. The makeNewCategoryInstance method has been renamed as + makeNewLoggerInstance. This change requires subclasses of Category + classes to be modified and recompiled. [**] + + - The Level class replaced the Priority class. Priority class now + extends Level to preserve backward compatibility. [*] + + - The Logger class replaced the Category class. Logger class + extends Category to preserve backward compatibility. We proudly + mark this change with a single star for 100% compatibility. [*] + + - The Category.assert method has been replaced by + Category.assertLog. This change was necessary because assert is a + language reserved word in JDK 1.4. [*/**] + + - Removed deprecated methods setOptions and getOptionStrings defined + in the org.apache.log4j.spi.OptionHandler interface. This interface + is implemented by most log4j appenders and layouts. In particular, + all appenders and layouts shipped with log4j contain these + deprecated methods. They have become totally redundant after we + moved to JavaBeans style configuration in log4j 1.1. [**] + + - The disable(Level) methods in Hierarchy have been removed and been + replaced by threshold methods. [**] + + - Added buffered IO capability to FileAppender and subclasses. [*] + + - The location information (or stack information) was not correctly + transmitted by JMSAppender. [*] + + - Added event reporting capability to the Hierarchy class. + + - Added new system property "log4j.configuratorClass". This property + allows the user to specify the custom configurator at the default + initialization phase. This property replaces the previous + interpretation of the reference part of "log4j.configuration" + as the custom configurator class. This interpretation was sometimes + erroneous and caused headaches. [*] + + - Introduced the Mapped Diagnostic Context or MDC class. This class + is similar to the NDC except that the diagnostic context is based + on a map instead of a stack. Moreover the MDC is automatically + inherited by child threads under JDK 1.2 and above. [*] + + - Corrected a performance bug in the NDC class as observed by Dan + Milstein and independently by Ray Millard. [*] + + - Removed deprecated methods disable(Priority), disableAll, + disableDebug, disableInfo and enableAll in BasicConfigurator. [*] + + - Added supports java.io.Reader objects in the method doConfigure(), + instead of only InputStream. Thanks to Mark Womack for submitting + the relevant patch. [*] + + - Corrected the restart bug in DayliRollingFileAppender. Thanks to + Jim Moore for supplying the relevant patch. [*] + + June 19, 2001 + + - Release of version 1.1.3 + + - Added a missing namespace declaration in the log4j:configuration + element in log4j.dtd. The missing declaration caused the new + generation of namespace aware parsers to barf when parsing log4j + configuration files. [*] + + - Reduced the size of log4j-core.jar to 78KB. [*] + + - Minor documentation changes. [*] + + June 7, 2001 + + - Release of version 1.1.2 + + - Corrected a problem with the static initializer of the Category + class which would use the wrong class loader to search for the + default configuration file. The associated search algorithm has + been also simplified. Nevertheless, the preferred method to specify + the automatic configuration file is by setting the + log4j.configuration system property. [*] + + - Documentation improvements. Added a new section to the manual + explaining the default initialization procedure [*] + + - Enhancements to the org.apache.log4j.examples.appserver package. [*] + + - Corrected a bug in the way the NTEventLogAppender printed + exceptions. [*] + + May 20, 2001 + + - Release of version 1.1.1. + + - Added missing custom priority support in PropertyConfigurator. [*] + + - Made a number of fields protected instead of default access in + SMTPAppender. [*] + + May 19, 2001 + + - Release of version 1.1. + + - This release has the same code as 1.1b7. It differs only in a few minor + documentation changes. + + May 9, 2001 + + - Release of version 1.1b7 + + - Made BasicConfigurator disable methods static as they were in log4j + 1.0.4. Thanks to Francisco Marin for reporting the bug. [*] + + - Corrected a two related deadlock problems introduced while fixing + bug 1505. Thanks to joelr@viair.com for reporting the problem. [*] + + - The configureAndWatch methods in Configurators did not close the + configuration file, preventing its editing. See bug 1686. [*] + + - In DOMConfigurator.setParameter special character conversion now + precedes variable substitution. This change was suggested by Steven + Velez. The vast majority of users should be oblivious to it. [*] + + - The TextPaneAppender is no longer maintained and has been + removed. It is still available under the contribs/ + directory. This change has been discussed in the log4j mailing + lists and no one objected to the removal of the TextPaneAppender + class. + + April 26, 2001 + + - Release of version 1.1b6 + + - Aaron Greenhouse from Carnegie Mellon SCS found a series of + multi-threading related bugs in Category and AsyncAppender. See bug + ids 1505 and 1507 in our bug database for exemplary bug + reports. They are worth the detour. [*] + + - InvalidJarIndexException is only available in JDK 1.3. Referring + to this exception type caused log4j 1.1b5 to break on earlier JDKs. + We now avoid referring to it. [*] + + - Added PriorityRangeFilter by Simon Kitching. See the Threshold + option in AppenderSkeleton for a more convenient alternative. [*] + + April 22, 2001 + + - Release of version 1.1b5 + + - In HTMLLayout, the Title option sets the HTML document + title (...<title>). [*] + + - Corrected an important performance bug in LocationInfo. Hein Couwet + and kr@it-practice.dk have independently identified the bug. This is + yet another example of the difference made by the number of eyeballs + studying source code. [*] + + - Corrected the incorrect value returned by LocationInfo.getClassName + method when running under IBM Visual Age. Thanks to Mathias + Rupprecht for supplying the relevant patch. [*] + + - Corrected a bug where the build.sh file in the distribution would be in + DOS CRLF format. Thanks to ma.darche@free.fr for reporting the + problem. [*] + + - Corrected InvalidJarIndexException thrown in applets while + searching for the default log4j configuration file. Thanks to + Michael Lundahl for reporting this bug. [*] + + - Added missing PropertySetterException class to log4j-core.jar. + Thanks to ma.darche@free.fr for reporting this bug. [*] + + April 20, 2001 + + - Release of version 1.1b4 + + - Mathias Bogaert observed that in version 1.1b3 the search algorithm + for the resource used in automatic log4j configuration was + different than in 1.0.x. Beta4 uses a more powerful mechanism which + is also compatible with 1.0.x. [*] + + - Paul Glezen correctly observed that if log4j is deployed in a + client/server mode where multiple log4j clients log to a log4j + server, all hosts must be upgraded to version 1.1 in one go because + the internal LoggingEvent class used in client/server communication + changed in log4j 1.1. + + April 18, 2001 + + - Release of version 1.1b3 + + - Added a RollingFileAppenderBeanInfo class that fakes the + maxFileSize JavaBeans property as a String type instead of a long. + This allows us to resuscitate setMaxFileSize(long) method that was + removed in 1.1b2 breaking 100% backward compatibility. This addition + restores 100% backward compatibility. [*] + + April 18, 2001 + + - Release of version 1.1b2 + + - The directory structure has changed to better suit Jakarta + conventions as follows: + + org/** --> src/java/org/** + xdocs/** --> src/xdocs/** + + If you have a CVS checked out copy of log4j be sure to check out a + fresh copy. [*] + + - Added a few jar files required at build time to build/lib so that + it is now possible to compile log4j out of the box. [*] + + - Whenever a priority parameter is expected in a configuration file, + one can now use a custom priority class. See OptionConverter.toPriority + method for more information. Note that the <priority> element in + log4j.dtd remains unaffected by this change. [*] + + - Added the setQuietMode(boolean) method to LogLog. In quiet mode + LogLog will not output anything even in case of errors. [*] + + - Log4j components are now configured as JavaBeans. The setOption and + getOptionString methods have been deprecated in OptionHandler + interface which is implemented by most log4j components. [*] + + - The stack trace of a throwable passed in a logging statement is not + parsed into a stack array which is serializable. This allows cascading of + log4j servers to properly propagate throwable information. [*] + + - In XML configuration files, the <configuration> element has been + deprecated and was replaced by the <log4j:configuration> element. [*] + + The following perl command can help to migrate: + + perl -p -i.bak -e "s/configuration/log4j:configuration/;" file1.xml .. fileN.xml + + - The "log4j.configDebug" system property has been replaced with the + "log4j.debug" system property although it is still available. + Similarly, the "configDebug" attribute has been deprecated and + replaced with the "debug" attribute in log4j.dtd. [*] + + + February 23, 2001 + + - Release of version 1.1b1 + + - Logging can now be disabled per Hierarchy. It can also be disabled + using configuration files using the "disable" directive. The + "disableOverride" directive takes precedence over the "disable" + directive. As a result of this change the disable family of + methods in BasicConfigurator has been deprecated and replaced by the same + family of methods in the Hierarchy class. [*] + + - The FileAppender has been split into three parts: WriterAppender, + ConsoleAppender and FileAppender. ConsoleAppender takes over the + console logging functionality of FileAppender. As a result support + for stream and console printing has been deprecated in FileAppender. [**] + + - The FileAppender now correctly outputs the header and footer of its + layout. This problem was reported by too many users to list here. [*] + + - Appenders and Layouts now get to see the raw message object in + LoggingEvent not just its rendered form. The access modifiers of + some LoggingEvent fields were changed so that they can be accessed + in less error-prone ways. Thanks to Jim Cakalic and Anders Kristens + for their valuable advice. [*] + + - Added getLayout(), getErrorHandler(), and getFilter() to the + Appender interface. [*] + + - Added getOption(key) method to the OptionHandler interface and modified + implementations of it as appropriate. [*] + + - Added the much awaited DailyRollingFileAppender. [*] + + - The structure of the distribution changed somewhat. The log4j.jar + files can be found under dist/. The javadoc directory has been + moved to docs/api/. We are now totally dependent on ANT to perform + all the steps involved in creating a release, including + compilation, jar file creation, generation of the javadocs, and for + the creation of the distribution tar and zip files. [*] + + - Removed org/apache/log4j/varia/ResilientFileAppender.java which was + bogus to begin with. [*] + + - XMLLayout will now mark some output as <![CDATA[ .. ]]> so that it + does not get interpreted by the XML parser. This was suggested by + Mathias Bogaert like a long list of other fixes. [*] + + - Corrected a bug in CyclicBuffer.resize method that would not update the + next insertion point. Thanks to Ole Bulbuk for accurately reporting + the bug. [*] + + - The LoggingEvent class now supports serialization of priorities + derived from the org.apache.log4j.Priority class. [*] + + - Improved the search method for finding the "log4j.properties" file in + the static initializer of Category class. Thanks to Calvin Chan for + supplying a better method. [*] + + - The code handling the FCQN (formerly instanceFQN) parameter was + cleaned up. There is now a well-established and simple manner for + sub-classes of Category (or wrapper classes) to define the FCQN + variable: just define a static variable, say FCQN, consisting of + the fully qualified class name of the subclass or wrapper, supply + this variable as an argument to forcedLog method if and when + the sub-class or wrapper invokes that method. [*] + + - Made the instanceFCQN an instance variable instead of a class + static in Category.java. In related move, the Category constructor + now takes an additional argument setting the instanceFCQN. This + makes life less miserable for Category subclasses. [*] + + - Corrected a bug in the OptionConverter.instantiateByClassName + method that would not return the defaultValue in case of error. Thanks + to Matthieu Verbert for identifying this bug. + + - Corrected the missing stack trace in e-mails generated by the + SMTPAppender when using certain Layouts. [*] + + - Updated the "Adding Conversion Characters to PatternLayout" + document to reflect the latest changes to the code. Also added the + org/apache/log4j/examples/appserver directory containing the + associated example code. [*] + + - Added the BufferSize option to the AsyncAppender. [*] + + - Eliminated the SecurityExceptions thrown in Applets. Thanks Timur + Zambalayev for reporting this bug. [*] + + - Fixed the erroneously thrown IOInterruptedException when the AsyncAppender + was closed. Thanks to Tom Palmer for accurately reporting this bug. [*] + + January 12th, 2001 + + - Release of version 1.0.4 (the 20th major release) + + - Corrected a serious bug in Hierarchy.java that would cause a + NullPointerException depending on the order of instantiation of + categories. Thanks to Wolfram Gewohn for reporting this bug. [*] + + - Corrected a bug in the getOptionsStrings method of SMTPAppender + that omitted to mention the EvaluatorClass option. Thanks to Mark + Balster for reporting this bug. [*] + + January 11th, 2001 + + - Release of version 1.0.3 (the 20th major release) + + - Fixed a NullPointerException occurring in AsyncAppender after + invoking Category.shutdown. Thanks to Frank-Olaf Lohmann for + reporting this bug. [*] + + - Modified the OptionConverter.selectAndConfigure method to take an + extra argument of type Hierarchy. This method is used internally + and should not affect most users. [*/**] + + - Added the warn method to LogLog which is used internally by log4j + to report on itself. [*] + + - Displaced a number of HTML files under the docs directory. The new + structure is compatible with the jakarta site and results in a + more consistent navigation experience. [*] + + - Made a few improvements in the javadocs. [*] + + January 11th, 2001 + + - Release of version 1.0.2 (the 20th major release) + + - Added the missing build.inc file to the distribution. No code + changed. + + January 10th, 2001 + + - Release of version 1.0.1 (the 20th major release) + + - This version corrects some documentation and build script bugs; + code has not changed. + + January 8th, 2001 + + - Release of version 1.0 (the 20th major release) + + - Package hierarchy now starts at org.apache.log4j. [***] + + The following perl command can help in the transition: + + > perl -p -i.bak -e "s/org.log4j/org.apache.log4j/;" file1.java .. fileN.java + + - Added the fatal() family of methods to the Category + class. Moreover, the EMERG priority has been removed from the + Priority class. This priority has been replaced by the FATAL + priority that is more widely accepted. This change will + require EMERG log statements to be replaced by FATAL log + statements. Assuming EMERG log statements are rare, this should + have a small but bearable impact on existing client code. + + Moreover, the Unix Syslog priorities ALERT, CRIT and NOTICE are no + longer recognized. Support for these priorities was minimal and + few users should suffer from these changes. [**] + + - Removed the methods setRootPriority, getRootPriority as these + methods were redundant and had been previously deprecated. [**] + + - Removed the DOM Level 2 dependency in DOMConfigurator. This makes + log4j XML configurable using Sun's parser or Apache's Xerces. [*] + + - The static initializer of the Category class now takes the + log4j.configuration system property to search for its configuration + file. The type of the configurator used to parse the configuration + file depends on the value of the log4j.configuration system + property. [*] + + - Enhanced the PropertyConfigurator and DOMConfigurator to support + customisation of independent Hierarchy instances. The + org.apache.log4j.net.SocketServer has been enhanced to take + advantage of this functionality. The old code of SocketServer has + been moved to SimpleSocketServer. [**] + + - Enhanced the PropertyConfigurator to support variable substitution + for all options *values* (but not keys!). [*] + + - Categories are now aware of the Hierarchy they are linked to. This + will provide a basis for several performance enhancements planned + for the future. [*] + + - Added support for object rendering. It is now possible to register + an object renderer for a given object type. When the given object + needs to be logged log4j will invoke the corresponding renderer to + transform the object into a String. + + As a result of this enhancement, all the String forms of all the + printing methods such as debug(String), info(String) have been + removed as they are no longer necessary. This change should be + backward compatible but requires recompilation of old client + code. Thanks to Michael Smith for noting the recompilation + requirement. [**] + + - Added support for user defined category factories in the + PropertyConfigurator. Thus, it is now possible to configure log4j + with a properties file and still use custom Category + sub-classes. The DOMConfigurator had already a finer grain + support. [*] + + - Added the SMTPAppender that in case of an error or fatal event + sends an e-mail containing latest N logging events in its buffer, + where N is chosen by the user. [*] + + - Added the method getInstance(Class) to the Category class. [*] + + - Corrected a bug in configureAndWatch method of configurators that + would configure log4j only after an unnecessary delay. [*] + + November 30, 2000 + + - Release of version 0.9.1 (the 19th public release) + + - Corrected a typo making NTEventLogAppender.dll register the wrong + category message file. Thanks to Peter Hayes for accurately + reporting this bug. [*] + + - The DOMConfigurator and PropertyConfigurator can now automatically + detect modified configuration files and re-read them. [*] + + - Added AsyncAppender which buffers log requests and serves them + at a later time. AsyncAppender can increase logging performance + tremendously if logging operations are interspersed with long + and blocking non CPU-intensive operations, typically I/O or network + access. For CPU intensive applications, using the AsyncAppender + will actualy degrade logging performance by 10 to 25 percent. [*] + + - The log4j.dtd has been modified to allow appenders to refer to + other appenders by IDREF. [*] + + - The DOMConfigurator has been modified to take advantage of ID/IDREF + attributes when referring to appenders. This change requires a + DOM Level-2 API compliant parser. DOM Level-2 java bindings are + available at + http://www.w3.org/TR/1999/WD-DOM-Level-2-19990923/java-binding.html. + + - Added the configure(String filename) method to DOMConfigurator. + This method requires the presence of a JAXP compatible parser. + + At this time, the only DOM2 and JAXP compatible parser seems to be + the Apache xerces parser. + + - Added the PriorityMatchFilter allowing filtering by exact priority + match. This was a common request by users. [*] + + - The configuration of a category is now an atomic operation. This + ensures that log requests are not lost while configuration is in + progress. Anders Kristensen was to first to observe the potential + problems in non-atomic configurations. [*] + + November 20th, 2000 + + - Release of version 0.9.0 (the 18th public release) + + - The "log4j" element has been renamed to "configuration" in the + log4j DTD. This change requires that log4j configuration files + written in XML be modified. Since the log4j element figures only + once in the XML file, this change should take little time. [**] + + - ResourceBundles are now category instance specific and no longer + class static. Moreover, like other properties resource bundles + are inherited from the category hierarchy. [**] + + - The jar files log4j.jar and log4j-full.jar now contain versioning + information in their respective manifest files. [*] + + - Corrected an inconsistency in the NTEventLogAppender which broke it. + + - Fixed a bug where configuration files were not parsed correctely + due to trailing spaces in option values as returned by + java.util.Properties. Trailing spaces are now removed from option + values. This bug was quite disconcerting because the + trailing spaces cannot be seen without careful examination of the + configuration file. [*] + + - Added the XMLLayout. + + The output of the XMLLayout consists of a series of log4j:event + elements. It does not output a complete XML file. The output is designed to + be included as an external entity to form a well-formed XML file. [*] + + - Added a new abstract class org.log4j.helpers.DateLayout. The TTCCLayout + now extends DateLayout. [*] + + - Corrected a rather subtle performance bug in the buffer management code + in PatternLayout. Thanks to Vladislav Dutov and Constantine + A. Plotnikov for for insisting on the correction of this bug. [*] + + - Created a new package called org.log4j.spi. This new package + holds classes that are hidden from the casual user but are needed + to extend log4j. [*] + + - Added org.log4j.varia.ExternallyRolledFileAppender to handle + externally triggered file rollovers. [*] + + - Added support for multiple hierarchy trees. [*] + + - PatternLayout can now be subclassed to support new conversion + patterns. [*] + + - Extended the DOMConfigurator and the log4j DTD to properly handle + sub-classing of Category and Priority classes. + + There have been also minor adjustments to other classes to handle + sub-classing. These changes should be invisible to users. + + All categories except the root category can be sub-classed and also + assigned priorities sub-classing org.log4j.Priority. + + The root category always exists and CANNOT be subclassed. + + The ProppertyConfigurator remains unchanged. Thus, it does not + handle extensions of the Category class. [*] + + - Added filter support in appenders. The DOMConfigurator and the + log4j.dtd have been enhanced to support filters. [*] + + - Added error handling support to appenders. The DOMConfigurator and the + log4j.dtd have been enhanced to support filters. [*] + + - Added support for correct interpretation of location information in + IBM's Visual Age environment. Thanks to Wolf Siberski for supplying + the relevant patch. [*] + + - Added getAdditivity method to Category. This feature was requested + by Constantin Mitran. (mitran at ecircle.de) [*] + + August 27, 2000 + + - Release of version 0.8.5b. + + - Corrected multiple bugs in default initialization code of + Category class. Thanks to Jeff Turner for identifying and supplying + corrective patches. [*] + + August 24, 2000 + + - Release of version 0.8.5a. + + - Added the %n conversion character to PatternLayout so that a line + separator can be specified in a platform independent way. [*] + + - In 0.8.5 internal Priority integer values were decoupled from the + Unix Syslog values. This broke SyslogAppedder. A new function + Priority.toSyslogInt is introduced to solve this bug. [*] + +Corrected a bug where the internal prtar tzvf iority integer + + August 23, 2000 + + - Release of version 0.8.5. + + - All log4j internal output is now prepended with the string + "log4j: ". This makes is easier to differentiate log4j internal + logs from messages output by other sources. [*] + + - Sub-classes of Category class must now specify their fully + qualified name when constructing logging events. This allows the %C + conversion specifier in PatternLayout to work properly even with + sub-classes or wrappers of Category. [*] + + - Added the method disableDebug to BasicConfigurator. This method + disables all print requests of debug priority regardless its + category. Similar methods disableInfo, disable, disableAll and + enableAll have also been added. Disable type methods can be + overriden by setting the log4j.disableOverride system property. + + Calling BasicConfigurator.disableInfo is equivalent to the now + deprecated flagAsShippedCode method. [*] + + - Given the above changes, the system property + log4j.shippedCodeFlagOverride is no longer honored. [**] + + - It is now possible to sub-class Category. The sub-classes may + continue to adhere to the category hierarchy. This was a frequently + requested feature. [*] + + - Corrected a problem with the additivity flag being ignored in + categories without appenders. This bug was discovered by Anders + Kristensen. [*] + + - Added a method BasicConfigurator.resetConfiguration to reset the + log4j environment. This method should be used sparingly. [*] + + - At the initialization of the Category class, the file + log4j.properties will now be searched from the search path used to + load classes. If the file can be found, then it is fed to the + PropertyConfigurator.configure(java.net.URL) method. [*] + + - Failing to access system properties within the static initializer + of BasicConfigurator class is no longer reported as an error but as + a debug message. Thanks to Gilles Schlienger for reporting this + problem with applets. [*] + + - Corrected a bug which caused infinite loops when using conversion + patterns with a single element, fortunately under very rare + circumstances. This bug was first reported by Igor Potraev, the + author of log4p. It was independently reported by Joe Haberl from + IBM Global Services. [*] + + - Added a mechanism to lazily remove references to dead threads in + the NDC class. Indeed, in previous versions calling NDC.pop within + a thread but forgetting to call to NDC.remove before exiting (that + thread) resulted in a memory leak. [*] + + - Corrected a huge memory leak in SocketAppender. This leak was due + to the ObjectOutputStream indefinitely holding a reference for each + written to the stream. Thanks to Dan MacDonald for very accurately + describing this bug. [*] + + - The log and l7dlog methods in Category no longer ignore the shipped + code flag. This bug was reported by Mario Schomburg. [*] + + - Added missing NDC information to LoggingEvent.writeObject + method. [*] + + - Corrected handling of SocketException in SocketNode. Thanks to + Gerald Gutierez (ggutierez@emobiledata.com) for reporting this and + the previous problem. [*] + + - Phased out custom shell scripts to build java documentation and jar + files in favor of Jakarta's ANT. It was becoming a nuisance to keep + the ANT build file in sync with the custom shell scripts. [*] + + + May 11, 2000 + + - Release of version 0.8.4d. + + - The NT EventViewer no longer complains about missing message 4096. + + - Minor corrections in documentation. + + - Added missing icons GIFs into the distribution. + + - SocketNode now attempts to close the socket when exiting. Thanks to + Moses Hohman (mmhohman@rainbow.uchicago.edu) for noting this. + + - Removed the com.ibm.log4j from the javadoc directory. This seems to + confuse VAJ. Thanks to Steve Ashcroft for reporting this problem. + + May 5, 2000 + + - Release of version 0.8.4c. + + - As a result of the infinite loop problem (see next item), added + over 800 new test cases to stress-test the code in CategoryFactory + class where category creation occurs. [*] + + - Under certain rare circumstances the Category.getInstance method + entered an infinite loop. Thanks to Mario Schomburg from IBM Global + Services / Hannover for identifying this problem and proposing a + patch. [*] + + - DOMConfigurator and the log4j.dtd were out of sync on the type of + the priority directive. As a result, priority directives all + defaulted to DEBUG. Thanks to Peter (petervt@users.sourceforge.net) + for accurately reporting this bug. [*] + + - Minor additions to the FAQ. [*] + + - Added the NumberCruncher example showing how the NDC class can be + used to distinguish output from different clients. [*] + + - Added the %x conversion specifier to the TTCC_CONVERSION_PATTERN in + the PatternLayout class. This is consistent expected output of + Trivial.java example. Thanks to Jerome (schrom@users.sourceforge.net) + for reporting this bug. [*] + + May 3, 2000 + + - Release of version 0.8.4b. + + - The value of the additivity option would not be parsed properly by + the ProperytConfigurator if the line containing the option + contained trailing spaces. [*] + + - Release of version 0.8.4a. + + - The localized logging methods (l7dlog) omitted priority based + evaluation and erroneously logged all requests. [*] + + May 1, 2000 + + - Release of version 0.8.4. + + - The close method was added to the Appender interface allowing + appender implementations to release any resources they may have + allocated. [*] + + - The package naming scheme of changed from "com.ibm.log4j.*" to + "org.log4j.*". The new naming reflects the open source nature of + the project and is consistent with the URL http://www.log4j.org. [***] + + - Added internationalization support. See the newly introduced l7dlog + methods in Category class. [*] + + - In the FileAppender, the File option now admits variable + substitution. For example, if "java.home" system property is set + to /home/xyz and the File option is given the value + "%{java.home}/test.log", then File option will be interpreted as + "/home/xyz/test.log". + + Thanks to Avy Sharell (sharell@online.fr) for contributing this + feature. [*] + + - SocketAppender is now officially part of the package. It is capable + of sending logging events to a remote SocketNode. The SocketNode + logs events according to server (local) policy. For example, a + client can log events to a local file and also send them to a + remote server (a SocketNode). This server can log the event to any + number of files, to the console, to any number of TextPaneAppenders + and even re-transmit the event to another server, and so forth. + + This paradigm is common in most logging systems, e.g. Syslog and NT + Event Log. Many thanks to Andrew Harrison for showing a way to + actually implement the paradigm. [*] + + - The Category.callAppenders method now accepts a LoggingEvent + instead of creating one itself. This was necessary to accommodate + events generated at a remote client. [*] + + - LoggingEvent class changed slightly to support remote logging. The + category field (a Category) has been replaced by the categoryName + field (a String). [*] + + April 14, 2000 + + Release of version 0.8.3b + + - Corrected a bug in Category.removeAppender(String) which would + never remove the desired appender. Thanks to Moses Hohman for + reporting this bug. + + Release of version 0.8.3a + + - Corrected a bug RollingFileAppender which would throw an uncaught + exception in case output file could not be opened for + writing. Thanks to Vinay Aggarwal for signaling this problem. + + April 13, 2000 + + - Release of version 0.8.3. + + - The log4j.override key defined in BasicConfigurator has been + renamed to log4j.shippedCodeFlagOverride. [**] + + - The getCurrentCategories method in the Category class would not + return the correct value. Thanks to Timothy Potter + (tpotter@agency.com) for reporting this problem. [*] + + - Appenders now admit a priority threshold as an option. All requests + with a priority lower than the appender's threshold priority are + ignored by the appender. [*] + + - Integrated Christopher Taylor's DOMConfigurator parsing XML + configuration files. [*] + + - The jar file log4j-net.jar has been replaced by log4j-full.jar. It + contains DOMConfigurator.class in addition to the com.ibm.log4j.net + package. [**] + + - Added support for the ANT build tool. Thanks to Christopher Taylor + for supplying the build.xml file. ANT is available form + http://jakarta.apache.org. [*] + + - FileAppender's File option now accepts the values "System.out" or + "System.err". If one these values is suppiled in a configuration + file then the output is directed to the corresponding stream. + Moreover, the default constructor of FileAppender no longer sets + System.out as an output target nor does it define a default + layout. [*] + + - Added caller class (C), caller file name (F), caller line number + (L), caller method name (M) conversion specifiers to the + PatternLayout class. + + The category conversion specifier now takes an optional precision + modifier allowing the user to control the number of right most + components in the category name that will be printed. + + Corrected a bug occuring when the caller file name and line number + information were unavilable due to JIT compilation. In that case, + the PatternLayout would not properly use the rest of the available + location information. [*] + + The above enhancements and bug-fixes originate from comments by + Nelson Minar (nelson@monkey.org). + + March 23, 2000 + + - Release of version 0.8.2. + + - The SimpleLayout and TTCCLayout are replaced by the PatternLayout + in the log4j.jar file to keep its size small. These two layouts are + still part of the package. + + - The PatternLayout class is introduced. This new layout is + configurable using a conversion pattern which is parsed at + runtime. This allows the user to choose the output layout without + writing any code and only at a marginal performance cost compared + to the dedicated layouts such as SimpleLayout and TTCCLayout. The + PatternLayout also allows the user to determine minimum and maximum + field lengths. + + The PatternLayout was written by Jim Cakalic + (jim_cakalic@na.biomerieux.com). [*] + + - All internal components now use LoggingEvent instances to specifiy + logging information. + + - Corrected a problem with a missing variable initialization in + SyslogAppender. This caused NullPinterException to be thrown when + logging exceptions. + + Added a default constructor to SyslogAppender. The lack of this + constructor caused PropertyConfigurator to throw a + java.lang.InstantiationException when the appender type was set to + be SyslogAppender. + + Thanks to Yves Bossel (ybossel@opengets.cl) for accurately + identifying these bugs. + + Modified some other related option handling code in + SyslogAppender. [*] + + - Made NDC.get public access instead of default access. Thanks to + Y. J. Chun (monac@softonnet.com) for reporting this problem. [*] + + - PropertyConfigurator now parses the additivity option for + categories. [*] + + - Corrected the value of the ADDITIVITY_PREFIX constant to match the + documented value, that is "log4j.additivity". [**] + + - Corrected a really bad bug where System.out would be closed when + PropertyConfigurator.configure was called. Thanks to Christopher + Taylor (cstaylor@pacbell.net) for tracking and reporting this bug. [*] + + - The PropertyConfiguator now prints debug messages if the flag + "log4j.configDebug" is defined in the configuration + file. Previously, only if the system property "log4j.configDebug" + was set would debug messages be printed. A question by Shawn + Kircher (skircher@vninet.com) induced this change. [*] + + - In AbsoluteTimeDateFormat, DateTimeDateFormat and ISO8601DateFormat + the separator between the seconds and milliseconds has been changed + to comma from full stop, in order to be compliant with ISO8601's + preferred sign. Thanks to Jim Cakalic + (jim_cakalic@na.biomerieux.com) for pointing out this discrepancy + with the standard. [*] + + - Corrected a bug where RollingFileAppender would not work + properly on Windows systems. Thanks to Heinz Richter + (heinz.richter@ecmwf.int) for noting this problem. + + February 19, 2000 + + - Release of version 0.8.1. + + - Core classes are now independent of the format of the options + file. Configurable core classes implement the OptionHandler + interface. OptionHandlers allows configurators to learn the + relevant option names. The configurator feeds option values to the + OptionHandler which configures itself. + + As a result of these changes, the Init class has been broken down + to two separate classes: the BasicConfigurator and the + PropertiesConfigurator. [**] + + An XML configurator for 0.8.0 has been already written by + Christopher Taylor (cstaylor@pacbell.net). + + - Added multiple appender support per category. The appenders follow + the category hierarchy, i.e. a child category inherits the + appenders of its parents. + + - Added an assert() method to the Category class. Steven Marcus + (srnm@awaretechnologies.com) requested this addition. [*] + + - Atomatic stack printing is no longer supported. This was an unused + and unreliable feature which unnecessarily complicated the + code. [*] + + - log4j now emits a single warning message when no appender to write to + could be found. This is typically the case when the user forgets + to configure the log4j environment. This change was suggested by + Jim Cakalic (jim_cakalic@na.biomerieux.com). [*] + + - RollingFileAppender adds file roll over capability--implemented by + Heinz Richter (heinz.richter@ecmwf.int). [*] + + - Corrected a bug where a java.lang.NoClassDefFoundError would be + thrown because com.ibm.log4j.helpers.SyslogTracerPrintWriter was + not included in log4j.jar. Thanks to Jim Cakalic (jim_cakalic@na.biomerieux.com) + for signaling this bug. [*] + + February 9, 2000 + + - Release of version 0.8.0. + + - There has been an important API changes. The Log, NOPLog and ILog + classes have been removed. Their functionality has been migrated to + the Category class. [***] + + In this release, instead of writing + + ILog.debug(CAT, "Some message."); + + one will write + + CAT.debug("Some message."); + + Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> observed that + one could use the Category objects directly for logging. + + - It is no longer possible to instantiate Category objects directly. + Instead, one would use the factory method + Category.getInstance(String name). [***] + + There category instantiation code was moved to CateogryFactory + class. This class has package visibility and remains hidden from + the user. + + This stylistic improvement was suggested by Luke Blanshard + (luke@quiq.com). + + - The Init class offers methods to initialize the log4j + environment. The Init.flagAsShippedCode method replaces the NOPLog + class. + + - Changes in the documentation to reflect the API changes. + + - The NDC.cloneStack and inherit methods now tolerate null-stacks. [*] + + + January 29, 2000 + + - Release of version 0.7.5. + + - TTCCLayout now takes a java.text.DateFormat object as a + parameter. The task of formatting the date is delegated to this + object. + + Added four classes extending the java.text.DateFormat class. These + are RelativeTimeDateFormat, AbsoluteTimeDateFormat, + DateTimeDateFormat and ISO8601DateFormat classes. + + Thanks to Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> + for suggesting the ISO8601 date format. + + These four classes can be parametrized with a particular + TimeZone. The TTCCLayout class now accepts a new configuration file + option called "TimeZone". + + These four DateFormats are less malleable than the + java.text.SimpleDateFormat but they are also much faster. + + As a consequence of these changes, the setRelativeTime, + setDatePrinting methods in TTCCLayout have been removed along with + the associated configuration file options RelativeTime, + DatePrinting and TimePrinting. [**] + + The current code is inspired by code contributed by + Heinz Richter (heinz.richter@ecmwf.int). + + - The Log.emerg method has been deprecated. If you use statements of + EMERG priority, please use the Log.log form instead. [**] + + - Added getDepth and setMaxdepth methods to the NDC class. This makes + it easier to manage the nested context depth especially when + callees push but forget to pop. + + - Moved the documentation in com/ibm/log4j/package.html to + com/ibm/log4j/overview.html. Many users were failing to read the + com/ibm/log4j/package.html description due to the unfortunate + layout of the text. Hopefully more people will read the package + overview in its present location. + + - Added the com.ibm.log4j.net package for doing remote logging using + TCP sockets. This is still experimental code. + + - Added new debug, .., emerg methods that do not require a category + parameter. They assume the "root" category, that is the decision to + whether print or not is made by comparing the statement's priority + with the default priority. [*] + +January 21, 2000 + + - Release of version 0.7.4. + + - Added a new ILog.init method accepting an Appender and a + configuration file as parameters. + + - FileAppender's setWriter and setFile methods where not instantiating + a new tracer. This caused stack traces to be lost! SyslogAppender + had a similar problem. [*] + + - The FileAppender and SyslogAppender where not calling the layout's + readConfig method to set layout specific options. Thanks to Heinz + Richter (heinz.richter@ecmwf.int) for reporting this bug. [*] + + - Corrected a bug in Log.log() method where the appender was always + called with Priority.DEBUG. Thanks to Oliver Boehm + (Oliver.Boehm@abaxx.de) for reporting this bug. [*] + +January 14, 2000 + + - Release of version 0.7.3. + + - Added Syslog compatibility. One can now choose (at runtime) between + remote syslog logging or file logging. [*] + + Syslog logging performance, although not appalling, is significantly + slower than file logging. + + - Priority class was enriched with the previously missing priorities + NOTICE, ALERT and CRIT. The internal constants were also aligned with + the syslog counterparts. [*] + + - Added the Log.log method to support the new priorities. [*] + + - TracerPrintWriter is now an independent class instead of being a + nested top-level class in Tracer. [*] + + - A number of writers, namely the SyslogWriter, SyslogQuietWriter, + SyslogTracerPrintWriter, were added to the helper package. [*] + + - Log.force method was removed. The various Appender.doAppend + implementations take over its functionality. [*] + + - FileAppender and SyslogAppender now use QuietWriter. QuietWriter is + a FilterWriter which hides exceptions and instead emits a single + warning message to System.err. [*] + + - The layout is now an initialization parameter to the appender + type. Previously, the layout and the appender where independent + parameters to the Log constructor. [**] + + - Many small improvements and corrections in the documentation. + Syslog related documentation remains sparse. + + - ILog.init() and ILog.init(String configFile) have been changed to + call ILog.init(,,,) with "com.ibm.log4j.Log.class" as the first + parameter. This makes it easier for people to get familiar with log4j. [**] + + - Added missing files to the make directory. These files are useful + for those wishing to use the log4j make environment. Thanks to "Lee + Hall" <LHall@JavaFoundry.com> for reporting this omission. [*] + + Until recently the make environment failed to compile RMI stubs in + a single run. This nagging problem has been corrected thanks to + help from Thomas Eirich (IBM Zurich Research Lab). + +January 4, 2000 + + - Release of version 0.7.2. + + - Some users have been rightly complaining about the verbosity + TTCCLayout's date output. The full date output is now shortened to + "dd MMM YYYY HH:mm:ss.SSS" for example, "06 Nov 1994 08:49:37.459" + In addition, users may now choose to print only time information, + as in "08:49:37.459". [*] + + - The package now uses Writer instead of OutputStream as its output + target. This makes the log4j code smaller and easier to + understand at the cost of a slight performance degradation. As a + result of this change a few method names in FileAppender class were + changed. [**] + + - Preliminary experiments with SyslogAppedner and SyslogLayout show + that syslog compatibility is not far away. The difficultly is + adding syslog compatibility without making radical changes to the + current log4j architecture. + + - Corrected a bug in the NOPLog.createInstance method which always + created a Log singleton even if the system property "log4j.logType" + was set to NOPLog. Thanks to Robert Gottofrey + (Robert.Gottofrey@wdr.com) for reporting this bug and the + associated test case. + + - Removed the inconsistent "Layout" configuration option in + Log.readConfig(). This change should be transparent to most + users. [*/**] + +December 20, 1999 + + - Release of version 0.7.1. + + - The LogCreationManager class has been removed. Its functionality + has been transfered to the createInstance and getInstance methods + in the Log and NOPLog classes. The new way of creating instances is + both simpler and less error prone although just as flexible. [**] + + As a result of these changes, the init family of methods in the + ILog class have been adjusted to the new way of creating the log + singleton. + + - The Appender interface has been introduced. The method of writing a + log statement into an output stream can now be varied by using a + different Appender. The new FileAppender offers the same + functionality that was previously part of the Log class. [**] + + - Changed the time format used in TTCCLayout to be of the form "Day, + dd MMM YYYY HH:mm:ss.SSS GMT" for example, "Sun, 06 Nov 1994 + 22:49:37.459 GMT". This format is almost the same as the format + specified in RFC 1123 and also the format recommended in RFC + 2616. The only difference is the additional milliseconds + information. [*] + + - The layout specific options were not read from the configuration + file due to a missing instruction. Many thanks to Vikram Sridharan + (Vikram.Sridharan@alysis.com) to patiently pointing out this + omission to an unbelieving maintainer. [*] + +December 16, 1999 + + - Release of version 0.7.0. + + - Version 0.7.0 and above will be distributed under the IBM Public + License (IPL). The IPL is an approved open source license (see + http://www.opensource.org/licenses/ for a list). It grants similar + rights to the previous ALPHAWORKS license agreement, in particular, + the right to redistribute and to modify the package. + + - The Log class can now be parameterized with a Layout object. + Layouts determine the format of what is printed, where as the Log + class decides when to print and to where. [**] + + As a result of this modularization, the CGULog and NOPCGULog + classes no longer exists. CGULog class has been replaced with the + TTCCLayout (Time Thread Context Category). This should make it + easier to create new log output formats. + + Some time in the near future, the Log class will be further broken + down to allow different strategies for writing to output streams. + + - Renamed com.ibm.util.log hierarchy to to com.ibm.log4j. I wanted to + do this for some time. I feel release 0.7.0 was the last + opportunity to do so. I am sorry for the the trouble caused by this + change. [**/***] + + - New NDC class. This class implements nested diagnostic contexts as + suggested by Neil Harrison in the article "Patterns for Logging + Diagnostic Messages" part of the book "Pattern Languages of Program + Design 3" edited by Martin et al. Nested diagnostic contexts is a + nifty feature that was missing up to now. [*] + + The StressNDC test class seems to break JDK 1.2.2 beta on AIX. On + Linux and NT using sun's JDK 1.2.2 it seem to work OK. In any case, + tests done with StressNDC and associated perl script seem to + indicate that the NDC class is bug-free. + + - Corrected a date formatting bug in CGULog class where on some + environments the wrong month was printed. Thanks to Christopher + Williams (Christopher_Williams@mail.northgrum.com) for signaling + this bug. Also changed the month format from a number to a three + letter abbreviation such as "Jan", "Feb", ..., "Dec". The new + format is unambiguous regardless of local date format. [*] + +December 8, 1999 + + - Release of version 0.6.2. + + - Clearer documentation with still much room for improvement. + + - Corrected a bug in the Tracer class which always used the Unix line + separator instead of the system specific separator. Thanks to + Vikram Sridharan (Vikram.Sridharan@alysis.com) for singaling this + bug. [*] + + - Corrected a runaway comment which gulped the CGULog.readConfig + method. [*] + + - Added the init family of methods to the ILog class to ease the + setup of a basic logging environment. Thanks to Mark Donszelmann + (Mark.Donszelmann@cern.ch) for this enhancement. [*] + + - Just an hour after releasing version 0.6.1 detected and corrected a + bug where the Tracer class would correctly print Exception stack + trace but not the type of the Exception. Replaced the + distribution on www.zurich.ibm.com without changing the version + number. I hope nobody is using the intermediary (and buggy) release + of 0.6.1. [*] + +November 16, 1999 + + - Release of log4j version 0.6.1. + + - Better documentation with still much room for improvement. + + - For consistence sake, added setDefaultPriority and + getDefaultPriority methods to the Category class and deprecated + setDefaultPriority in the Log.class. [**] + + - Corrected a major bug where if two categories were homonyms the + second instance would not be properly initialized. + + - Increased the speed of Exception logging from about 4000 + microseconds to about 1000. It seems that for some people Exception + logging is performance critical. Improved implementation is a + variant of Nocolai's (XNH@crisplant.com) implementation. [*] + +November 9, 1999 + + - Release of log4j 0.6.0 with incomplete documentation. + + - Added a stress test program to debug the new Category class. It + turns out that the test program was as hard to get right as the + Category class. Given the favorable results of the stress test I am + quite confident that the new class is now bug free. This assumption + has been proven to be wrong. See above. + + - Created a new class called Category to manipulate categories + instead of plain Strings. The new class is just as easy to use. + However, the evaluation of whether to log or not to log is at least + 10 times faster. The NOP class performance remain unaffected by the + change. (You can't improve on the performance of an empty function + call.) + + Many thanks to Alex Blewitt "Alex.Blewitt@ioshq.com" for his + valuable comments. He was the first to observe that finding Strings + in a hash table was an expensive operation. + + This change will require some recoding on your part. See the FAQ + for more details. [***] + + - Modified the force in Log and CGULog method to use a byte[] buffer + instead of a StringBuffer. The old code was clearer but the new one + is at least 25% faster. [*] + + - Added regression testing. + + - We now enforce a policy where the OutputStream set by + setOutputStream is a user managed resource whereas the OutputStream + opened using setLogFile is the Log class' responsibility. + + The setLogFile method now closes any previous OutputStream if only + if opened through setLogFile. If the previous OutputStream was + opened by the user and set through setOutputStream the previous + OutputStream is untouched. + + Similarly, setOutputStream will close any previous OutputStream if + and only if it was opened using setLogFile. + + - Added a new method logOutputStreamExists to the Log class allowing + the programmer to check if there is already an opened stream before + trying to set a new one. A stream can be opened as a byproduct of + reading the configuration file. + + - Changed the behavior of the (private) Log.Append method in case of + failure to write to the OutputStream. + + Previously, in case of failure, we reverted to System.err. Now, we + emit a warning message and discard all future log messages. The + new behavior is consistent with our current unreliable logging + semantics. The change prevents an otherwise functional program + from failing because the terminal is flooded with logging messages. + + - Renamed the iLog to ILog to remain consistent with our class naming + scheme. The initial intention was to add ILog and deprecate + iLog. However, I am running CVS on a fat16 partition, causing + serious problems when files differ only in case. + + - Corrected a bug where the LogFileName was not remembered. Thanks to + Jens for signaling this bug. + +October 28, 1999 + + - Release of log4j v0.5a + + - Now the programmer can choose to truncate the log file instead of + always appending to it. This functionality was first requested and + intially implemented by "Jens Uwe Pipka" jens.pipka@gmx.de. [*] + + - setLogFile now opens the requested file instead of having the + Append function open it later. Cleaned up some related code in the + Append function. Although nobody has requested it, there is still + no method to close the log file. This is harder to implement + reliably than it sounds. [*] + + - Simplified setLogOutputStream so that it does no longer return the + previously set OutputStream. [*] + +October 27, 1999 + + - Released log4j v0.5 + + - Joe Walker (joe@eireneh.com) observed that the + LogCreationManager.getSingleton mechanism was cumbersome. There is + now a new class iLog (indirect Log) which hides the need to call + getSingleton. Performance testing on my 233Mhz Thinkpad shows that + this indirection has small performance impact on non-logged calls + in the order of 40 nanoseconds. The impact on logged calls is + negligible. [*] + + - Added a jar file to the distribution. The jar file contains only + the files you would need to use log but not other classes needed + for testing nor examples. + + - Corrected a bug where CGUNOPLog was not integrated to the Makefile. + + - Added new public methods isDebugEnabled and isInfoEnabled to allow + programmers to check whether a debug/info statement will be logged + without incurring the cost of message parameter construction. This + addition was suggested by Luke Blanshard Luke@quiq.com. [*] + + - Renamed the private method evaluate to isEnabled. Also made it + final with no apparent speed gains. In addition, made the + Log.force method public. [*] + + - New syntactic sugar debug, ..., emerg, methods to log objects. [*] + + - Modified the interface to deal with Throwables and not just + Exceptions. My thanks to Luke Blanshard for signaling this "bug". [*] + + - Added more tests to the LogPerformance class. In particular, to + test the influence of indirect debug calls. + + - Added a "make" mini-tutorial for those who want to modify the code. + + - License updated to standard alphaWorks license allowing + modifications to source code. However, this license explicitly + requires that modifications be communicated back to alphaWorks. + +October 15, 1999 + + - Initial availability on alphaWorks. + +Refer to the FAQ for the lineage of the package. + + diff --git a/slf4j.xml b/slf4j.xml new file mode 100644 index 0000000000..c314fb53b9 --- /dev/null +++ b/slf4j.xml @@ -0,0 +1,82 @@ +<project name="slf4j" default="usage" basedir="." > + + <!-- The directory where source files are stored. --> + <property name="java.source.dir" value="./src/java/"/> + + <!-- Destination for compiled files --> + <property name="javac.dest" value="./classes"/> + + <!-- The directory where source files are stored. --> + <property name="version" value="1.0alpha"/> + + <!-- Deprecation warning? --> + <property name="deprecation" value="on"/> + + + <property name="SLF4J_STEM" value="org/slf4j"/> + + + <!-- ================================================================= --> + <!-- Default target --> + <!-- ================================================================= --> + <target name="usage"> + <echo> + These are some of the targets supported by this ANT build scpript: + + svnCheckout - get SLF4J files into src/filtered-java + + refresh-slf4j - copy source files into the log4j source tree, using + variable substitution + </echo> + </target> + + <target name="init"> + <mkdir dir="tmp"/> + <mkdir dir="${java.source.dir}/${SLF4J_STEM}"/> + </target> + + <!-- ================================================================= --> + <!-- Remove all generated (compiled) class files. --> + <!-- ================================================================= --> + <target name="clean" description="Delete all compiled SLF4J files."> + <delete dir="${javac.dest}/org/slf4j" /> + </target> + + <!-- =================================================================== --> + <!-- Copy SLF4J files into log4j source tree. This step is necessary for --> + <!-- building log4j. However, it needs to be done whenever code in SLF4J --> + <!-- changes, that is seldom --> + <!-- =================================================================== --> + <target name="refresh-slf4j" depends="init, svnCheckout"> + <!-- delete any stale copy of LoggerFactory.java --> + <delete> + <fileset dir="src/java/org/slf4j" + includes="**/*.java" + excludes="impl/Log4jLoggerFA.java"/> + </delete> + + <!-- copy a filtered version of slf4j to tmp/src --> + <copy todir="src/java"> + <fileset dir="src/filtered-java"> + <include name="**/*.java"/> + <exclude name="**/impl/JDK14*.java"/> + </fileset> + <filterset><filter token="IMPL" value="Log4j"/></filterset> + </copy> + </target> + + + <target name="svnCheckout"> + <property name="repository.URL" value="http://svn.slf4j.org/repos/slf4j/trunk/src/filtered-java"/> + <java classname="org.tmatesoft.svn.cli.SVN" dir="src/" fork="true"> + <arg value="co"/> + <arg value="${repository.URL}"/> + <arg value="filtered-java"/> + <classpath> + <pathelement location="lib/javasvn.jar" /> + <pathelement location="lib/javasvn-cli.jar" /> + </classpath> + </java> + </target> + +</project> diff --git a/src/filtered-java/org/slf4j/LoggerFactory.java b/src/filtered-java/org/slf4j/LoggerFactory.java new file mode 100644 index 0000000000..e4bb471133 --- /dev/null +++ b/src/filtered-java/org/slf4j/LoggerFactory.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j; + +// WARNING +// WARNING Modifications MUST be made to the original file found at +// WARNING $SLF4J_HOME/src/filtered-java/org/slf4j/LoggerFactory.java +// WARNING + +/** + * The <code>LoggerFactory</code> can produce Loggers for various logging APIs, + * most notably for log4j, JDK 1.4 logging. Other implemenations such as + * {@link org.slf4j.impl.NOPLogger NOPLogger} and + * {@link org.slf4j.impl.SimpleLogger SimpleLogger} are also supported. + * + * @author Ceki Gülcü + */ +public class LoggerFactory { + static LoggerFactoryAdapter adapter; + + // + // WARNING Modify the original in + // $SLF4J_HOME/src/filtered-java/org/slf4j/ + + static { + String adapterClassStr = "org.slf4j.impl.@IMPL@LoggerFA"; + System.out.println("SLF4J built for "+adapterClassStr); + try { + adapter = new org.slf4j.impl.@IMPL@LoggerFA(); + } catch (Exception e) { + // unless there was a problem with the build or the JVM we will never + // get exceptions + System.err.println( + "Could not instantiate instance of class [" + adapterClassStr + "]"); + e.printStackTrace(); + } + } + + public static ULogger getLogger(String name) { + return adapter.getLogger(name); + } + + public static ULogger getLogger(String domainName, String subDomainName) { + return adapter.getLogger(domainName, subDomainName); + } + + public static ULogger getLogger(Class clazz) { + return adapter.getLogger(clazz.getName()); + } + + public static ULogger getLogger(Class clazz, String subDomainName) { + return adapter.getLogger(clazz.getName(), subDomainName); + } +} diff --git a/src/filtered-java/org/slf4j/LoggerFactoryAdapter.java b/src/filtered-java/org/slf4j/LoggerFactoryAdapter.java new file mode 100644 index 0000000000..55b047e18c --- /dev/null +++ b/src/filtered-java/org/slf4j/LoggerFactoryAdapter.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j; + +/** + * LoggerFactoryAdapter interface is used internally by {@link + * LoggerFactory}. + * + * <p>Only developers wishing to write new UGLI adapters need to worry + * about this interface. + * + * @author Ceki Gülcü + * + */ +public interface LoggerFactoryAdapter { + + /** + * Return the appropriate named {@link ULogger} instance. + */ + public ULogger getLogger(String name); + + /** + * Return a {@link ULogger} instance in <code>domain</code>, <code>subDomain</code>. + * + * @param domain + * @param subDomain + * @return ULogger instance + */ + public ULogger getLogger(String domain, String subDomain); +} diff --git a/src/filtered-java/org/slf4j/ULogger.java b/src/filtered-java/org/slf4j/ULogger.java new file mode 100644 index 0000000000..279178e635 --- /dev/null +++ b/src/filtered-java/org/slf4j/ULogger.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j; + +/** + * + * The main user inteface to logging. It is expected that logging + * takes places through concerete implemetations of the ULogger + * interface. + * + * @author Ceki Gülcü + */ +public interface ULogger { + + /** + * Is the logger instance enabled for the DEBUG level? + * @return True if this ULogger is enabled for the DEBUG level, + * false otherwise. + */ + public boolean isDebugEnabled(); + + /** + * Log a message object with the DEBUG level. + * @param msg - the message object to be logged + */ + public void debug(Object msg); + + + /** + * Log a parameterized message object at the DEBUG level. + * + * <p>This form is useful in avoiding the superflous object creation + * problem when invoking this method while it is disabled. + * </p> + * @param parameterizedMsg - the parameterized message object + * @param param1 - the parameter + */ + public void debug(Object parameterizedMsg, Object param1); + + /** + * Log a parameterized message object at the DEBUG level. + * + * <p>This form is useful in avoiding the superflous object creation + * problem when invoking this method while it is disabled. + * </p> + * @param parameterizedMsg - the parameterized message object + * @param param1 - the first parameter + * @param param2 - the second parameter + */ + public void debug(String parameterizedMsg, Object param1, Object param2); + public void debug(Object msg, Throwable t); + + + public boolean isInfoEnabled(); + public void info(Object msg); + public void info(Object parameterizedMsg, Object param1); + public void info(String parameterizedMsg, Object param1, Object param2); + public void info(Object msg, Throwable t); + + + public boolean isWarnEnabled(); + public void warn(Object msg); + public void warn(Object parameterizedMsg, Object param1); + public void warn(String parameterizedMsg, Object param1, Object param2); + public void warn(Object msg, Throwable t); + + + public boolean isErrorEnabled(); + public void error(Object msg); + public void error(Object parameterizedMsg, Object param1); + public void error(String parameterizedMsg, Object param1, Object param2); + public void error(Object msg, Throwable t); + +} diff --git a/src/filtered-java/org/slf4j/impl/JDK14Logger.java b/src/filtered-java/org/slf4j/impl/JDK14Logger.java new file mode 100644 index 0000000000..9ae85069f1 --- /dev/null +++ b/src/filtered-java/org/slf4j/impl/JDK14Logger.java @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.impl; +import org.slf4j.ULogger; + +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * A wrapper over @{link java.utill.Logger} which conforms to the + * {@link ULogger} interface. + * + * @author Ceki Gülcü + */ +public class JDK14Logger implements ULogger { + final Logger logger; + + // WARN: JDK14Logger constructor should have only package access so that + // only JDK14LoggerFA be able to create one. + JDK14Logger(Logger logger) { + this.logger = logger; + } + + /** + * Is the logger instance enabled for the DEBUG level? + * @return + */ + public boolean isDebugEnabled() { + return logger.isLoggable(Level.FINE); + } + + // + + /** + * Log a message object with the DEBUG level. + * @param msg - the message object to be logged + */ + public void debug(Object msg) { + logger.fine(String.valueOf(msg)); + } + + /** + * Log a parameterized message object at the DEBUG level. + * + * <p>This form is useful in avoiding the superflous object creation + * problem when invoking this method while it is disabled. + * </p> + * @param parameterizedMsg - the parameterized message object + * @param param1 - the parameter + */ + public void debug(Object parameterizedMsg, Object param1) { + if (logger.isLoggable(Level.FINE)) { + if (parameterizedMsg instanceof String) { + String msgStr = (String) parameterizedMsg; + msgStr = MessageFormatter.format(msgStr, param1); + logger.fine(msgStr); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should not happen. + logger.fine(parameterizedMsg.toString()); + } + } + } + + /** + * Log a parameterized message object at the DEBUG level. + * + * <p>This form is useful in avoiding the superflous object creation + * problem when invoking this method while it is disabled. + * </p> + * @param parameterizedMsg - the parameterized message object + * @param param1 - the first parameter + * @param param2 - the second parameter + */ + public void debug(String parameterizedMsg, Object param1, Object param2) { + if (logger.isLoggable(Level.FINE)) { + if (parameterizedMsg instanceof String) { + String msgStr = (String) parameterizedMsg; + msgStr = MessageFormatter.format(msgStr, param1, param2); + logger.fine(msgStr); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should not happen. + logger.fine(parameterizedMsg.toString()); + } + } + } + + public void debug(Object msg, Throwable t) { + logger.log(Level.FINE, msg.toString(), t); + } + + public boolean isInfoEnabled() { + return logger.isLoggable(Level.INFO); + } + + public void info(Object msg) { + logger.info(msg.toString()); + } + + public void info(Object parameterizedMsg, Object param1) { + if (logger.isLoggable(Level.INFO)) { + if (parameterizedMsg instanceof String) { + String msgStr = (String) parameterizedMsg; + msgStr = MessageFormatter.format(msgStr, param1); + logger.info(msgStr); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should not happen. + logger.info(parameterizedMsg.toString()); + } + } + } + + public void info(String parameterizedMsg, Object param1, Object param2) { + if (logger.isLoggable(Level.INFO)) { + if (parameterizedMsg instanceof String) { + String msgStr = (String) parameterizedMsg; + msgStr = MessageFormatter.format(msgStr, param1, param2); + logger.info(msgStr); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should not happen. + logger.info(parameterizedMsg.toString()); + } + } + } + + public void info(Object msg, Throwable t) { + logger.log(Level.INFO, msg.toString(), t); + } + + public boolean isWarnEnabled() { + return logger.isLoggable(Level.WARNING); + } + + public void warn(Object msg) { + logger.warning(msg.toString()); + } + + public void warn(Object parameterizedMsg, Object param1) { + if (logger.isLoggable(Level.WARNING)) { + if (parameterizedMsg instanceof String) { + String msgStr = (String) parameterizedMsg; + msgStr = MessageFormatter.format(msgStr, param1); + logger.warning(msgStr); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should not happen. + logger.warning(parameterizedMsg.toString()); + } + } + } + + public void warn(String parameterizedMsg, Object param1, Object param2) { + if (logger.isLoggable(Level.WARNING)) { + if (parameterizedMsg instanceof String) { + String msgStr = (String) parameterizedMsg; + msgStr = MessageFormatter.format(msgStr, param1, param2); + logger.warning(msgStr); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should not happen. + logger.warning(parameterizedMsg.toString()); + } + } + } + + public void warn(Object msg, Throwable t) { + logger.log(Level.WARNING, msg.toString(), t); + } + + public boolean isErrorEnabled() { + return logger.isLoggable(Level.SEVERE); + } + + public void error(Object msg) { + logger.severe(msg.toString()); + } + + public void error(Object parameterizedMsg, Object param1) { + if (logger.isLoggable(Level.WARNING)) { + if (parameterizedMsg instanceof String) { + String msgStr = (String) parameterizedMsg; + msgStr = MessageFormatter.format(msgStr, param1); + logger.severe(msgStr); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should not happen. + logger.severe(parameterizedMsg.toString()); + } + } + } + + public void error(String parameterizedMsg, Object param1, Object param2) { + if (logger.isLoggable(Level.WARNING)) { + if (parameterizedMsg instanceof String) { + String msgStr = (String) parameterizedMsg; + msgStr = MessageFormatter.format(msgStr, param1, param2); + logger.severe(msgStr); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should not happen. + logger.severe(parameterizedMsg.toString()); + } + } + } + public void error(Object msg, Throwable t) { + logger.log(Level.SEVERE, msg.toString(), t); + } +} diff --git a/src/filtered-java/org/slf4j/impl/JDK14LoggerFA.java b/src/filtered-java/org/slf4j/impl/JDK14LoggerFA.java new file mode 100644 index 0000000000..b90154cc7a --- /dev/null +++ b/src/filtered-java/org/slf4j/impl/JDK14LoggerFA.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.impl; + +import org.slf4j.LoggerFactoryAdapter; +import org.slf4j.ULogger; + +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Logger; + + +/** + * + * @author Ceki Gülcü + */ +public class JDK14LoggerFA implements LoggerFactoryAdapter { + Map map; + + public JDK14LoggerFA() { + map = new HashMap(); + } + + /* (non-Javadoc) + * @see org.slf4j.LoggerFactoryAdapter#getLogger(java.lang.String) + */ + public ULogger getLogger(String name) { + ULogger ulogger = (ULogger) map.get(name); + if (ulogger == null) { + Logger logger = Logger.getLogger(name); + ulogger = new JDK14Logger(logger); + map.put(name, ulogger); + } + return ulogger; + } + + /* (non-Javadoc) + * @see org.slf4j.LoggerFactoryAdapter#getLogger(java.lang.String, java.lang.String) + */ + public ULogger getLogger(String domainName, String subDomainName) { + return getLogger(domainName); + } +} diff --git a/src/filtered-java/org/slf4j/impl/MessageFormatter.java b/src/filtered-java/org/slf4j/impl/MessageFormatter.java new file mode 100644 index 0000000000..c650c3992f --- /dev/null +++ b/src/filtered-java/org/slf4j/impl/MessageFormatter.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.impl; + + +/** + * Formats messages according to very simple rules. + * See {@link #format(String, Object)} and + * {@link #format(String, Object, Object)} for more details. + * + * @author Ceki Gülcü + */ +public class MessageFormatter { + static final char DELIM_START = '{'; + static final char DELIM_STOP = '}'; + + /** + * Performs single argument substitution for the 'messagePattern' passed as + * parameter. + * <p> + * For example, <code>MessageFormatter.format("Hi {}.", "there");</code> will + * return the string "Hi there.". + * <p> + * The {} pair is called the formatting element. It serves to designate the + * location where the argument needs to be inserted within the pattern. + * + * @param messagePattern The message pattern which will be parsed and formatted + * @param argument The argument to be inserted instead of the formatting element + * @return The formatted message + */ + public static String format(String messagePattern, Object argument) { + int j = messagePattern.indexOf(DELIM_START); + int len = messagePattern.length(); + char escape = 'x'; + + // if there are no { characters or { is the last character of the messsage + // then we just return messagePattern + if (j == -1 || (j+1 == len)) { + return messagePattern; + } else { + if(j+1 == len) { + } + + char delimStop = messagePattern.charAt(j + 1); + if (j > 0) { + escape = messagePattern.charAt(j - 1); + } + if ((delimStop != DELIM_STOP) || (escape == '\\')) { + // invalid DELIM_START/DELIM_STOP pair or espace character is + // present + return messagePattern; + } else { + StringBuffer sbuf = new StringBuffer(len + 20); + sbuf.append(messagePattern.substring(0, j)); + sbuf.append(argument); + sbuf.append(messagePattern.substring(j + 2)); + return sbuf.toString(); + } + } + } + + /** + * /** + * Performs a two argument substitution for the 'messagePattern' passed as + * parameter. + * <p> + * For example, <code>MessageFormatter.format("Hi {}. My name is {}.", + * "there", "David");</code> will return the string "Hi there. My name is David.". + * <p> + * The '{}' pair is called a formatting element. It serves to designate the + * location where the arguments need to be inserted within the message pattern. + * + * @param messagePattern The message pattern which will be parsed and formatted + * @param arg1 The first argument to replace the first formatting element + * @param arg2 The second argument to replace the second formatting element + * @return The formatted message + */ + public static String format(String messagePattern, Object arg1, Object arg2) { + int i = 0; + int len = messagePattern.length(); + int j = messagePattern.indexOf(DELIM_START); + + StringBuffer sbuf = new StringBuffer(messagePattern.length() + 50); + + for (int L = 0; L < 2; L++) { + j = messagePattern.indexOf(DELIM_START, i); + + if (j == -1 || (j+1 == len)) { + // no more variables + if (i == 0) { // this is a simple string + return messagePattern; + } else { // add the tail string which contains no variables and return the result. + sbuf.append(messagePattern.substring(i, messagePattern.length())); + return sbuf.toString(); + } + } else { + char delimStop = messagePattern.charAt(j + 1); + if ((delimStop != DELIM_STOP)) { + // invalid DELIM_START/DELIM_STOP pair + sbuf.append(messagePattern.substring(i, messagePattern.length())); + return sbuf.toString(); + } + sbuf.append(messagePattern.substring(i, j)); + sbuf.append((L == 0) ? arg1 : arg2); + i = j + 2; + } + } + // append the characters following the second {} pair. + sbuf.append(messagePattern.substring(i, messagePattern.length())); + return sbuf.toString(); + } +} diff --git a/src/filtered-java/org/slf4j/impl/NOPLogger.java b/src/filtered-java/org/slf4j/impl/NOPLogger.java new file mode 100644 index 0000000000..d0c4820f61 --- /dev/null +++ b/src/filtered-java/org/slf4j/impl/NOPLogger.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.impl; + +import org.slf4j.ULogger; + + +/** + * A no operation (NOP) implementation of {@link ULogger}. + * + * @author Ceki Gülcü + */ +public class NOPLogger implements ULogger { + + /** + * The unique instance of NOPLogger. + */ + public final static NOPLogger NOP_LOGGER = new NOPLogger(); + + /** + * There is no point in people creating multiple instances of NullLogger. + * Hence, the private access modifier. + */ + private NOPLogger() { + } + + /* Always returns false. + * + * @see org.slf4j.Logger#isDebugEnabled() + */ + public boolean isDebugEnabled() { + return false; + } + + /* A NOP implementation. + * @see org.slf4j.Logger#debug(java.lang.Object) + */ + public void debug(Object msg) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#debug(java.lang.Object, java.lang.Object) + */ + public void debug(Object parameterizedMsg, Object param1) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#debug(java.lang.Object, java.lang.Object, java.lang.Object) + */ + public void debug(String parameterizedMsg, Object param1, Object param2) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#debug(java.lang.Object, java.lang.Throwable) + */ + public void debug(Object msg, Throwable t) { + // NOP + } + + /* Always returns false. + * @see org.slf4j.Logger#isInfoEnabled() + */ + public boolean isInfoEnabled() { + // NOP + return false; + } + + /* A NOP implementation. + * @see org.slf4j.Logger#info(java.lang.Object) + */ + public void info(Object msg) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#info(java.lang.Object, java.lang.Object) + */ + public void info(Object parameterizedMsg, Object param1) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#info(java.lang.Object, java.lang.Object, java.lang.Object) + */ + public void info(String parameterizedMsg, Object param1, Object param2) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#info(java.lang.Object, java.lang.Throwable) + */ + public void info(Object msg, Throwable t) { + // NOP + } + + /* Always returns false. + * @see org.slf4j.Logger#isWarnEnabled() + */ + public boolean isWarnEnabled() { + return false; + } + + /* A NOP implementation. + * @see org.slf4j.Logger#warn(java.lang.Object) + */ + public void warn(Object msg) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#warn(java.lang.Object, java.lang.Object) + */ + public void warn(Object parameterizedMsg, Object param1) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#warn(java.lang.Object, java.lang.Object, java.lang.Object) + */ + public void warn(String parameterizedMsg, Object param1, Object param2) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#warn(java.lang.Object, java.lang.Throwable) + */ + public void warn(Object msg, Throwable t) { + // NOP + } + + /* Always returns false. + * @see org.slf4j.Logger#isErrorEnabled() + */ + public boolean isErrorEnabled() { + return false; + } + + /* A NOP implementation. + * @see org.slf4j.Logger#error(java.lang.Object) + */ + public void error(Object msg) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#error(java.lang.Object, java.lang.Object) + */ + public void error(Object parameterizedMsg, Object param1) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#error(java.lang.Object, java.lang.Object, java.lang.Object) + */ + public void error(String parameterizedMsg, Object param1, Object param2) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#error(java.lang.Object, java.lang.Throwable) + */ + public void error(Object msg, Throwable t) { + // NOP + } + +} diff --git a/src/filtered-java/org/slf4j/impl/NOPLoggerFA.java b/src/filtered-java/org/slf4j/impl/NOPLoggerFA.java new file mode 100644 index 0000000000..2d321ad6fb --- /dev/null +++ b/src/filtered-java/org/slf4j/impl/NOPLoggerFA.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.impl; + +import org.slf4j.LoggerFactoryAdapter; +import org.slf4j.ULogger; + + +/** + * NOPLoggerFA is am implementation of {@link LoggerFactoryAdapter} + * which always returns the unique instance of NOPLogger. + * + * @author Ceki Gulcu + */ +public class NOPLoggerFA implements LoggerFactoryAdapter { + + public NOPLoggerFA() { + // nothing to do + } + + public ULogger getLogger(String name) { + return NOPLogger.NOP_LOGGER; + } + public ULogger getLogger(String domainName, String subDomainName) { + return NOPLogger.NOP_LOGGER; + } +} diff --git a/src/filtered-java/org/slf4j/impl/SimpleLogger.java b/src/filtered-java/org/slf4j/impl/SimpleLogger.java new file mode 100644 index 0000000000..7b8be4a753 --- /dev/null +++ b/src/filtered-java/org/slf4j/impl/SimpleLogger.java @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.impl; + +import org.slf4j.ULogger; + + +/** + * A simple implementation that logs messages of level INFO or higher on + * the console (<code>System.out<code>). + * <p> + * The output includes the relative time in milliseconds, thread name, the level, + * logger name, and the message followed by the line separator for the host. + * In log4j terms it amounts to the "%r [%t] %level %logger - %m%n" pattern. + * <pre> +176 [main] INFO examples.Sort - Populating an array of 2 elements in reverse order. +225 [main] INFO examples.SortAlgo - Entered the sort method. +304 [main] INFO SortAlgo.DUMP - Dump of interger array: +317 [main] INFO SortAlgo.DUMP - Element [0] = 0 +331 [main] INFO SortAlgo.DUMP - Element [1] = 1 +343 [main] INFO examples.Sort - The next log statement should be an error message. +346 [main] ERROR SortAlgo.DUMP - Tried to dump an uninitialized array. + at org.log4j.examples.SortAlgo.dump(SortAlgo.java:58) + at org.log4j.examples.Sort.main(Sort.java:64) +467 [main] INFO examples.Sort - Exiting main method. +</pre> + * + * @author Ceki Gülcü + */ +public class SimpleLogger implements ULogger { + + String loggerName; + + /** + * Mark the time when this class gets loaded into memory. + */ + static private long startTime = System.currentTimeMillis(); + + public static final String LINE_SEPARATOR = System.getProperty("line.separator"); + + static private String INFO_STR = "INFO"; + static private String WARN_STR = "WARN"; + static private String ERROR_STR = "ERROR"; + + /** + * Package access allows only {@link SimpleLoggerFA} to instantiate + * SimpleLogger instances. + */ + SimpleLogger(String name) { + this.loggerName = name; + } + + /** + * Always returns false. + */ + public boolean isDebugEnabled() { + return false; + } + + /** + * A NOP implementation. + */ + public void debug(Object msg) { + // NOP + } + + /** + * A NOP implementation. + */ + public void debug(Object parameterizedMsg, Object param1) { + // NOP + } + + /** + * A NOP implementation. + */ + public void debug(String parameterizedMsg, Object param1, Object param2) { + // NOP + } + + /** + * A NOP implementation. + */ + public void debug(Object msg, Throwable t) { + // NOP + } + + /** + * This is our internal implementation for logging regular (non-parameterized) + * log messages. + * + * @param level + * @param message + * @param t + */ + private void log(String level, String message, Throwable t) { + StringBuffer buf = new StringBuffer(); + + long millis = System.currentTimeMillis(); + buf.append(millis-startTime); + + buf.append(" ["); + buf.append(Thread.currentThread().getName()); + buf.append("] "); + + buf.append(level); + buf.append(" "); + + buf.append(loggerName); + buf.append(" - "); + + buf.append(message); + + buf.append(LINE_SEPARATOR); + + System.out.print(buf.toString()); + if(t != null) { + t.printStackTrace(System.out); + } + System.out.flush(); + } + /** + * For parameterized messages, first substitute parameters and then log. + * + * @param level + * @param parameterizedMsg + * @param param1 + * @param param2 + */ + private void parameterizedLog(String level, Object parameterizedMsg, Object param1, Object param2) { + if (parameterizedMsg instanceof String) { + String msgStr = (String) parameterizedMsg; + msgStr = MessageFormatter.format(msgStr, param1, param2); + log(level, msgStr, null); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should not happen. + log(level, parameterizedMsg.toString(), null); + } + } + + /** + * Always returns true. + */ + public boolean isInfoEnabled() { + return true; + } + + /** + * A simple implementation which always logs messages of level INFO according + * to the format outlined above. + */ + public void info(Object msg) { + log(INFO_STR, msg.toString(), null); + } + + + /** + * Perform single parameter substituion before logging the message of level + * INFO according to the format outlined above. + */ + public void info(Object parameterizedMsg, Object param1) { + parameterizedLog(INFO_STR, parameterizedMsg, param1, null); + } + + /** + * Perform double parameter substituion before logging the message of level + * INFO according to the format outlined above. + */ + + public void info(String parameterizedMsg, Object param1, Object param2) { + parameterizedLog(INFO_STR, parameterizedMsg, param1, param2); + } + + /** + * Log a message of level INFO, including an exception. + */ + public void info(Object msg, Throwable t) { + log(INFO_STR, msg.toString(), t); + } + + /** + * Always returns true. + */ + public boolean isWarnEnabled() { + return true; + } + + /** + * A simple implementation which always logs messages of level WARN according + * to the format outlined above. + */ + public void warn(Object msg) { + log(WARN_STR, msg.toString(), null); + } + + /** + * Perform single parameter substituion before logging the message of level + * WARN according to the format outlined above. + */ + public void warn(Object parameterizedMsg, Object param1) { + parameterizedLog(WARN_STR, parameterizedMsg, param1, null); + } + + /** + * Perform double parameter substituion before logging the message of level + * WARN according to the format outlined above. + */ + public void warn(String parameterizedMsg, Object param1, Object param2) { + parameterizedLog(WARN_STR, parameterizedMsg, param1, param2); + } + + /** + * Log a message of level WARN, including an exception. + */ + public void warn(Object msg, Throwable t) { + log(WARN_STR, msg.toString(), t); + } + + /** + * Always returns true. + */ + public boolean isErrorEnabled() { + return true; + } + + /** + * A simple implementation which always logs messages of level ERROR acoording + * to the format outlined above. + */ + public void error(Object msg) { + log(ERROR_STR, msg.toString(), null); + } + + + /** + * Perform single parameter substituion before logging the message of level + * ERROR according to the format outlined above. + */ + public void error(Object parameterizedMsg, Object param1) { + parameterizedLog(ERROR_STR, parameterizedMsg, param1, null); + } + + /** + * Perform double parameter substituion before logging the message of level + * ERROR according to the format outlined above. + */ + public void error(String parameterizedMsg, Object param1, Object param2) { + parameterizedLog(ERROR_STR, parameterizedMsg, param1, param2); + } + + /** + * Log a message of level ERROR, including an exception. + */ + public void error(Object msg, Throwable t) { + log(ERROR_STR, msg.toString(), t); + } + +} diff --git a/src/filtered-java/org/slf4j/impl/SimpleLoggerFA.java b/src/filtered-java/org/slf4j/impl/SimpleLoggerFA.java new file mode 100644 index 0000000000..6b04340061 --- /dev/null +++ b/src/filtered-java/org/slf4j/impl/SimpleLoggerFA.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.impl; + +import java.util.HashMap; +import java.util.Map; + +import org.slf4j.LoggerFactoryAdapter; +import org.slf4j.ULogger; + + +/** + * An implementation of {@link LoggerFactoryAdapter} which always returns + * {@link SimpleLogger} instances. + * + * @author Ceki Gülcü + */ +public class SimpleLoggerFA implements LoggerFactoryAdapter { + + Map map; + + public SimpleLoggerFA() { + map = new HashMap(); + } + + + /** + * Return an appropriate {@link SimpleLogger} instance by name. At this time, + * + */ + /** + * Return an appropriate {@link SimpleLogger} instance. + * */ + public ULogger getLogger(String name) { + ULogger ulogger = (ULogger) map.get(name); + if(ulogger == null) { + ulogger = new SimpleLogger(name); + map.put(name, ulogger); + } + return ulogger; + } + + /* + * (non-Javadoc) + * @see org.slf4j.LoggerFactoryAdapter#getLogger(java.lang.String, java.lang.String) + */ + public ULogger getLogger(String domainName, String subDomainName) { + return getLogger(domainName); + } + + +} diff --git a/src/java/org/slf4j/LoggerFactory.java b/src/java/org/slf4j/LoggerFactory.java new file mode 100644 index 0000000000..cf7ce74f7f --- /dev/null +++ b/src/java/org/slf4j/LoggerFactory.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j; + +// WARNING +// WARNING Modifications MUST be made to the original file found at +// WARNING $SLF4J_HOME/src/filtered-java/org/slf4j/LoggerFactory.java +// WARNING + +/** + * The <code>LoggerFactory</code> can produce Loggers for various logging APIs, + * most notably for log4j, JDK 1.4 logging. Other implemenations such as + * {@link org.slf4j.impl.NOPLogger NOPLogger} and + * {@link org.slf4j.impl.SimpleLogger SimpleLogger} are also supported. + * + * @author Ceki Gülcü + */ +public class LoggerFactory { + static LoggerFactoryAdapter adapter; + + // + // WARNING Modify the original in + // $SLF4J_HOME/src/filtered-java/org/slf4j/ + + static { + String adapterClassStr = "org.slf4j.impl.Log4jLoggerFA"; + System.out.println("SLF4J built for "+adapterClassStr); + try { + adapter = new org.slf4j.impl.Log4jLoggerFA(); + } catch (Exception e) { + // unless there was a problem with the build or the JVM we will never + // get exceptions + System.err.println( + "Could not instantiate instance of class [" + adapterClassStr + "]"); + e.printStackTrace(); + } + } + + public static ULogger getLogger(String name) { + return adapter.getLogger(name); + } + + public static ULogger getLogger(String domainName, String subDomainName) { + return adapter.getLogger(domainName, subDomainName); + } + + public static ULogger getLogger(Class clazz) { + return adapter.getLogger(clazz.getName()); + } + + public static ULogger getLogger(Class clazz, String subDomainName) { + return adapter.getLogger(clazz.getName(), subDomainName); + } +} diff --git a/src/java/org/slf4j/LoggerFactoryAdapter.java b/src/java/org/slf4j/LoggerFactoryAdapter.java new file mode 100644 index 0000000000..55b047e18c --- /dev/null +++ b/src/java/org/slf4j/LoggerFactoryAdapter.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j; + +/** + * LoggerFactoryAdapter interface is used internally by {@link + * LoggerFactory}. + * + * <p>Only developers wishing to write new UGLI adapters need to worry + * about this interface. + * + * @author Ceki Gülcü + * + */ +public interface LoggerFactoryAdapter { + + /** + * Return the appropriate named {@link ULogger} instance. + */ + public ULogger getLogger(String name); + + /** + * Return a {@link ULogger} instance in <code>domain</code>, <code>subDomain</code>. + * + * @param domain + * @param subDomain + * @return ULogger instance + */ + public ULogger getLogger(String domain, String subDomain); +} diff --git a/src/java/org/slf4j/ULogger.java b/src/java/org/slf4j/ULogger.java new file mode 100644 index 0000000000..279178e635 --- /dev/null +++ b/src/java/org/slf4j/ULogger.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j; + +/** + * + * The main user inteface to logging. It is expected that logging + * takes places through concerete implemetations of the ULogger + * interface. + * + * @author Ceki Gülcü + */ +public interface ULogger { + + /** + * Is the logger instance enabled for the DEBUG level? + * @return True if this ULogger is enabled for the DEBUG level, + * false otherwise. + */ + public boolean isDebugEnabled(); + + /** + * Log a message object with the DEBUG level. + * @param msg - the message object to be logged + */ + public void debug(Object msg); + + + /** + * Log a parameterized message object at the DEBUG level. + * + * <p>This form is useful in avoiding the superflous object creation + * problem when invoking this method while it is disabled. + * </p> + * @param parameterizedMsg - the parameterized message object + * @param param1 - the parameter + */ + public void debug(Object parameterizedMsg, Object param1); + + /** + * Log a parameterized message object at the DEBUG level. + * + * <p>This form is useful in avoiding the superflous object creation + * problem when invoking this method while it is disabled. + * </p> + * @param parameterizedMsg - the parameterized message object + * @param param1 - the first parameter + * @param param2 - the second parameter + */ + public void debug(String parameterizedMsg, Object param1, Object param2); + public void debug(Object msg, Throwable t); + + + public boolean isInfoEnabled(); + public void info(Object msg); + public void info(Object parameterizedMsg, Object param1); + public void info(String parameterizedMsg, Object param1, Object param2); + public void info(Object msg, Throwable t); + + + public boolean isWarnEnabled(); + public void warn(Object msg); + public void warn(Object parameterizedMsg, Object param1); + public void warn(String parameterizedMsg, Object param1, Object param2); + public void warn(Object msg, Throwable t); + + + public boolean isErrorEnabled(); + public void error(Object msg); + public void error(Object parameterizedMsg, Object param1); + public void error(String parameterizedMsg, Object param1, Object param2); + public void error(Object msg, Throwable t); + +} diff --git a/src/java/org/slf4j/impl/Log4jLoggerFA.java b/src/java/org/slf4j/impl/Log4jLoggerFA.java new file mode 100644 index 0000000000..0995d495af --- /dev/null +++ b/src/java/org/slf4j/impl/Log4jLoggerFA.java @@ -0,0 +1,58 @@ +/* + * Copyright 1999,2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.slf4j.impl; + +import org.apache.log4j.LogManager; +import org.slf4j.LoggerFactoryAdapter; +import org.slf4j.ULogger; + +/** + * This factory adapter relies on log4's {@link LogManager} to do its job. + * + * @author Ceki Gülcü + * + */ +public class Log4jLoggerFA implements LoggerFactoryAdapter { + + public Log4jLoggerFA() { + } + + /** + * Get a {@link ULogger} by name, by delegating all work to log4's + * {@link LogManager}. + * + * <p>The implementation is trivial because log4j + * {@link org.apache.log4j.Logger loggers} directly implement the + * {@link ULogger} interface. + */ + public ULogger getLogger(String name) { + return LogManager.getLogger(name); + } + + /** + * Get a {@link ULogger} by domain and subdomain name, by delegating all work + * to log4's {@link LogManager}. + * + * <p>The implementation is trivial because log4j + * {@link org.apache.log4j.Logger loggers} directly implement the + * {@link ULogger} interface. + */ + public ULogger getLogger(String domainName, String subDomainName) { + return LogManager.getLogger(domainName); + } +} + diff --git a/src/java/org/slf4j/impl/MessageFormatter.java b/src/java/org/slf4j/impl/MessageFormatter.java new file mode 100644 index 0000000000..c650c3992f --- /dev/null +++ b/src/java/org/slf4j/impl/MessageFormatter.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.impl; + + +/** + * Formats messages according to very simple rules. + * See {@link #format(String, Object)} and + * {@link #format(String, Object, Object)} for more details. + * + * @author Ceki Gülcü + */ +public class MessageFormatter { + static final char DELIM_START = '{'; + static final char DELIM_STOP = '}'; + + /** + * Performs single argument substitution for the 'messagePattern' passed as + * parameter. + * <p> + * For example, <code>MessageFormatter.format("Hi {}.", "there");</code> will + * return the string "Hi there.". + * <p> + * The {} pair is called the formatting element. It serves to designate the + * location where the argument needs to be inserted within the pattern. + * + * @param messagePattern The message pattern which will be parsed and formatted + * @param argument The argument to be inserted instead of the formatting element + * @return The formatted message + */ + public static String format(String messagePattern, Object argument) { + int j = messagePattern.indexOf(DELIM_START); + int len = messagePattern.length(); + char escape = 'x'; + + // if there are no { characters or { is the last character of the messsage + // then we just return messagePattern + if (j == -1 || (j+1 == len)) { + return messagePattern; + } else { + if(j+1 == len) { + } + + char delimStop = messagePattern.charAt(j + 1); + if (j > 0) { + escape = messagePattern.charAt(j - 1); + } + if ((delimStop != DELIM_STOP) || (escape == '\\')) { + // invalid DELIM_START/DELIM_STOP pair or espace character is + // present + return messagePattern; + } else { + StringBuffer sbuf = new StringBuffer(len + 20); + sbuf.append(messagePattern.substring(0, j)); + sbuf.append(argument); + sbuf.append(messagePattern.substring(j + 2)); + return sbuf.toString(); + } + } + } + + /** + * /** + * Performs a two argument substitution for the 'messagePattern' passed as + * parameter. + * <p> + * For example, <code>MessageFormatter.format("Hi {}. My name is {}.", + * "there", "David");</code> will return the string "Hi there. My name is David.". + * <p> + * The '{}' pair is called a formatting element. It serves to designate the + * location where the arguments need to be inserted within the message pattern. + * + * @param messagePattern The message pattern which will be parsed and formatted + * @param arg1 The first argument to replace the first formatting element + * @param arg2 The second argument to replace the second formatting element + * @return The formatted message + */ + public static String format(String messagePattern, Object arg1, Object arg2) { + int i = 0; + int len = messagePattern.length(); + int j = messagePattern.indexOf(DELIM_START); + + StringBuffer sbuf = new StringBuffer(messagePattern.length() + 50); + + for (int L = 0; L < 2; L++) { + j = messagePattern.indexOf(DELIM_START, i); + + if (j == -1 || (j+1 == len)) { + // no more variables + if (i == 0) { // this is a simple string + return messagePattern; + } else { // add the tail string which contains no variables and return the result. + sbuf.append(messagePattern.substring(i, messagePattern.length())); + return sbuf.toString(); + } + } else { + char delimStop = messagePattern.charAt(j + 1); + if ((delimStop != DELIM_STOP)) { + // invalid DELIM_START/DELIM_STOP pair + sbuf.append(messagePattern.substring(i, messagePattern.length())); + return sbuf.toString(); + } + sbuf.append(messagePattern.substring(i, j)); + sbuf.append((L == 0) ? arg1 : arg2); + i = j + 2; + } + } + // append the characters following the second {} pair. + sbuf.append(messagePattern.substring(i, messagePattern.length())); + return sbuf.toString(); + } +} diff --git a/src/java/org/slf4j/impl/NOPLogger.java b/src/java/org/slf4j/impl/NOPLogger.java new file mode 100644 index 0000000000..d0c4820f61 --- /dev/null +++ b/src/java/org/slf4j/impl/NOPLogger.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.impl; + +import org.slf4j.ULogger; + + +/** + * A no operation (NOP) implementation of {@link ULogger}. + * + * @author Ceki Gülcü + */ +public class NOPLogger implements ULogger { + + /** + * The unique instance of NOPLogger. + */ + public final static NOPLogger NOP_LOGGER = new NOPLogger(); + + /** + * There is no point in people creating multiple instances of NullLogger. + * Hence, the private access modifier. + */ + private NOPLogger() { + } + + /* Always returns false. + * + * @see org.slf4j.Logger#isDebugEnabled() + */ + public boolean isDebugEnabled() { + return false; + } + + /* A NOP implementation. + * @see org.slf4j.Logger#debug(java.lang.Object) + */ + public void debug(Object msg) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#debug(java.lang.Object, java.lang.Object) + */ + public void debug(Object parameterizedMsg, Object param1) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#debug(java.lang.Object, java.lang.Object, java.lang.Object) + */ + public void debug(String parameterizedMsg, Object param1, Object param2) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#debug(java.lang.Object, java.lang.Throwable) + */ + public void debug(Object msg, Throwable t) { + // NOP + } + + /* Always returns false. + * @see org.slf4j.Logger#isInfoEnabled() + */ + public boolean isInfoEnabled() { + // NOP + return false; + } + + /* A NOP implementation. + * @see org.slf4j.Logger#info(java.lang.Object) + */ + public void info(Object msg) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#info(java.lang.Object, java.lang.Object) + */ + public void info(Object parameterizedMsg, Object param1) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#info(java.lang.Object, java.lang.Object, java.lang.Object) + */ + public void info(String parameterizedMsg, Object param1, Object param2) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#info(java.lang.Object, java.lang.Throwable) + */ + public void info(Object msg, Throwable t) { + // NOP + } + + /* Always returns false. + * @see org.slf4j.Logger#isWarnEnabled() + */ + public boolean isWarnEnabled() { + return false; + } + + /* A NOP implementation. + * @see org.slf4j.Logger#warn(java.lang.Object) + */ + public void warn(Object msg) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#warn(java.lang.Object, java.lang.Object) + */ + public void warn(Object parameterizedMsg, Object param1) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#warn(java.lang.Object, java.lang.Object, java.lang.Object) + */ + public void warn(String parameterizedMsg, Object param1, Object param2) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#warn(java.lang.Object, java.lang.Throwable) + */ + public void warn(Object msg, Throwable t) { + // NOP + } + + /* Always returns false. + * @see org.slf4j.Logger#isErrorEnabled() + */ + public boolean isErrorEnabled() { + return false; + } + + /* A NOP implementation. + * @see org.slf4j.Logger#error(java.lang.Object) + */ + public void error(Object msg) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#error(java.lang.Object, java.lang.Object) + */ + public void error(Object parameterizedMsg, Object param1) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#error(java.lang.Object, java.lang.Object, java.lang.Object) + */ + public void error(String parameterizedMsg, Object param1, Object param2) { + // NOP + } + + /* A NOP implementation. + * @see org.slf4j.Logger#error(java.lang.Object, java.lang.Throwable) + */ + public void error(Object msg, Throwable t) { + // NOP + } + +} diff --git a/src/java/org/slf4j/impl/NOPLoggerFA.java b/src/java/org/slf4j/impl/NOPLoggerFA.java new file mode 100644 index 0000000000..2d321ad6fb --- /dev/null +++ b/src/java/org/slf4j/impl/NOPLoggerFA.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.impl; + +import org.slf4j.LoggerFactoryAdapter; +import org.slf4j.ULogger; + + +/** + * NOPLoggerFA is am implementation of {@link LoggerFactoryAdapter} + * which always returns the unique instance of NOPLogger. + * + * @author Ceki Gulcu + */ +public class NOPLoggerFA implements LoggerFactoryAdapter { + + public NOPLoggerFA() { + // nothing to do + } + + public ULogger getLogger(String name) { + return NOPLogger.NOP_LOGGER; + } + public ULogger getLogger(String domainName, String subDomainName) { + return NOPLogger.NOP_LOGGER; + } +} diff --git a/src/java/org/slf4j/impl/SimpleLogger.java b/src/java/org/slf4j/impl/SimpleLogger.java new file mode 100644 index 0000000000..7b8be4a753 --- /dev/null +++ b/src/java/org/slf4j/impl/SimpleLogger.java @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.impl; + +import org.slf4j.ULogger; + + +/** + * A simple implementation that logs messages of level INFO or higher on + * the console (<code>System.out<code>). + * <p> + * The output includes the relative time in milliseconds, thread name, the level, + * logger name, and the message followed by the line separator for the host. + * In log4j terms it amounts to the "%r [%t] %level %logger - %m%n" pattern. + * <pre> +176 [main] INFO examples.Sort - Populating an array of 2 elements in reverse order. +225 [main] INFO examples.SortAlgo - Entered the sort method. +304 [main] INFO SortAlgo.DUMP - Dump of interger array: +317 [main] INFO SortAlgo.DUMP - Element [0] = 0 +331 [main] INFO SortAlgo.DUMP - Element [1] = 1 +343 [main] INFO examples.Sort - The next log statement should be an error message. +346 [main] ERROR SortAlgo.DUMP - Tried to dump an uninitialized array. + at org.log4j.examples.SortAlgo.dump(SortAlgo.java:58) + at org.log4j.examples.Sort.main(Sort.java:64) +467 [main] INFO examples.Sort - Exiting main method. +</pre> + * + * @author Ceki Gülcü + */ +public class SimpleLogger implements ULogger { + + String loggerName; + + /** + * Mark the time when this class gets loaded into memory. + */ + static private long startTime = System.currentTimeMillis(); + + public static final String LINE_SEPARATOR = System.getProperty("line.separator"); + + static private String INFO_STR = "INFO"; + static private String WARN_STR = "WARN"; + static private String ERROR_STR = "ERROR"; + + /** + * Package access allows only {@link SimpleLoggerFA} to instantiate + * SimpleLogger instances. + */ + SimpleLogger(String name) { + this.loggerName = name; + } + + /** + * Always returns false. + */ + public boolean isDebugEnabled() { + return false; + } + + /** + * A NOP implementation. + */ + public void debug(Object msg) { + // NOP + } + + /** + * A NOP implementation. + */ + public void debug(Object parameterizedMsg, Object param1) { + // NOP + } + + /** + * A NOP implementation. + */ + public void debug(String parameterizedMsg, Object param1, Object param2) { + // NOP + } + + /** + * A NOP implementation. + */ + public void debug(Object msg, Throwable t) { + // NOP + } + + /** + * This is our internal implementation for logging regular (non-parameterized) + * log messages. + * + * @param level + * @param message + * @param t + */ + private void log(String level, String message, Throwable t) { + StringBuffer buf = new StringBuffer(); + + long millis = System.currentTimeMillis(); + buf.append(millis-startTime); + + buf.append(" ["); + buf.append(Thread.currentThread().getName()); + buf.append("] "); + + buf.append(level); + buf.append(" "); + + buf.append(loggerName); + buf.append(" - "); + + buf.append(message); + + buf.append(LINE_SEPARATOR); + + System.out.print(buf.toString()); + if(t != null) { + t.printStackTrace(System.out); + } + System.out.flush(); + } + /** + * For parameterized messages, first substitute parameters and then log. + * + * @param level + * @param parameterizedMsg + * @param param1 + * @param param2 + */ + private void parameterizedLog(String level, Object parameterizedMsg, Object param1, Object param2) { + if (parameterizedMsg instanceof String) { + String msgStr = (String) parameterizedMsg; + msgStr = MessageFormatter.format(msgStr, param1, param2); + log(level, msgStr, null); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should not happen. + log(level, parameterizedMsg.toString(), null); + } + } + + /** + * Always returns true. + */ + public boolean isInfoEnabled() { + return true; + } + + /** + * A simple implementation which always logs messages of level INFO according + * to the format outlined above. + */ + public void info(Object msg) { + log(INFO_STR, msg.toString(), null); + } + + + /** + * Perform single parameter substituion before logging the message of level + * INFO according to the format outlined above. + */ + public void info(Object parameterizedMsg, Object param1) { + parameterizedLog(INFO_STR, parameterizedMsg, param1, null); + } + + /** + * Perform double parameter substituion before logging the message of level + * INFO according to the format outlined above. + */ + + public void info(String parameterizedMsg, Object param1, Object param2) { + parameterizedLog(INFO_STR, parameterizedMsg, param1, param2); + } + + /** + * Log a message of level INFO, including an exception. + */ + public void info(Object msg, Throwable t) { + log(INFO_STR, msg.toString(), t); + } + + /** + * Always returns true. + */ + public boolean isWarnEnabled() { + return true; + } + + /** + * A simple implementation which always logs messages of level WARN according + * to the format outlined above. + */ + public void warn(Object msg) { + log(WARN_STR, msg.toString(), null); + } + + /** + * Perform single parameter substituion before logging the message of level + * WARN according to the format outlined above. + */ + public void warn(Object parameterizedMsg, Object param1) { + parameterizedLog(WARN_STR, parameterizedMsg, param1, null); + } + + /** + * Perform double parameter substituion before logging the message of level + * WARN according to the format outlined above. + */ + public void warn(String parameterizedMsg, Object param1, Object param2) { + parameterizedLog(WARN_STR, parameterizedMsg, param1, param2); + } + + /** + * Log a message of level WARN, including an exception. + */ + public void warn(Object msg, Throwable t) { + log(WARN_STR, msg.toString(), t); + } + + /** + * Always returns true. + */ + public boolean isErrorEnabled() { + return true; + } + + /** + * A simple implementation which always logs messages of level ERROR acoording + * to the format outlined above. + */ + public void error(Object msg) { + log(ERROR_STR, msg.toString(), null); + } + + + /** + * Perform single parameter substituion before logging the message of level + * ERROR according to the format outlined above. + */ + public void error(Object parameterizedMsg, Object param1) { + parameterizedLog(ERROR_STR, parameterizedMsg, param1, null); + } + + /** + * Perform double parameter substituion before logging the message of level + * ERROR according to the format outlined above. + */ + public void error(String parameterizedMsg, Object param1, Object param2) { + parameterizedLog(ERROR_STR, parameterizedMsg, param1, param2); + } + + /** + * Log a message of level ERROR, including an exception. + */ + public void error(Object msg, Throwable t) { + log(ERROR_STR, msg.toString(), t); + } + +} diff --git a/src/java/org/slf4j/impl/SimpleLoggerFA.java b/src/java/org/slf4j/impl/SimpleLoggerFA.java new file mode 100644 index 0000000000..6b04340061 --- /dev/null +++ b/src/java/org/slf4j/impl/SimpleLoggerFA.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2004-2005 SLF4J.ORG + * Copyright (c) 2004-2005 QOS.ch + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * of the copyright holder. + * + */ + +package org.slf4j.impl; + +import java.util.HashMap; +import java.util.Map; + +import org.slf4j.LoggerFactoryAdapter; +import org.slf4j.ULogger; + + +/** + * An implementation of {@link LoggerFactoryAdapter} which always returns + * {@link SimpleLogger} instances. + * + * @author Ceki Gülcü + */ +public class SimpleLoggerFA implements LoggerFactoryAdapter { + + Map map; + + public SimpleLoggerFA() { + map = new HashMap(); + } + + + /** + * Return an appropriate {@link SimpleLogger} instance by name. At this time, + * + */ + /** + * Return an appropriate {@link SimpleLogger} instance. + * */ + public ULogger getLogger(String name) { + ULogger ulogger = (ULogger) map.get(name); + if(ulogger == null) { + ulogger = new SimpleLogger(name); + map.put(name, ulogger); + } + return ulogger; + } + + /* + * (non-Javadoc) + * @see org.slf4j.LoggerFactoryAdapter#getLogger(java.lang.String, java.lang.String) + */ + public ULogger getLogger(String domainName, String subDomainName) { + return getLogger(domainName); + } + + +} diff --git a/tests/.cvsignore b/tests/.cvsignore new file mode 100644 index 0000000000..e3fa3d38fb --- /dev/null +++ b/tests/.cvsignore @@ -0,0 +1,8 @@ +goEnv +build.properties +output +classes +lib +coverage +log4j.db* + From ae65664f028bcfbe06e617e19de528ae4dabf330 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu <ceki@apache.org> Date: Thu, 28 Apr 2005 20:34:05 +0000 Subject: [PATCH 099/342] Added SLF4J support. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311328 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/Category.java | 246 ++++++++++++++++++++++++ src/java/org/apache/log4j/Logger.java | 3 +- 2 files changed, 248 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/Category.java b/src/java/org/apache/log4j/Category.java index d9d8f1f351..f8dfdf46f2 100644 --- a/src/java/org/apache/log4j/Category.java +++ b/src/java/org/apache/log4j/Category.java @@ -31,6 +31,7 @@ import java.util.MissingResourceException; import java.util.ResourceBundle; +import org.slf4j.impl.MessageFormatter; /** * <font color="#AA2222"><b>This class has been deprecated and @@ -249,6 +250,60 @@ void debug(Object message) { } } + /** + * Log a message with the <code>DEBUG</code> level with message formatting + * done according to the value of <code>messagePattern</code> and + * <code>arg</code> parameters. + * <p> + * This form avoids superflous parameter construction. Whenever possible, + * you should use this form instead of constructing the message parameter + * using string concatenation. + * + * @param messagePattern The message pattern which will be parsed and formatted + * @param arg The argument to replace the formatting element, i,e, + * the '{}' pair within <code>messagePattern</code>. + * @since 1.2.10 + */ + public void debug(Object messagePattern, Object arg) { + if (repository.isDisabled(Level.DEBUG_INT)) { + return; + } + + if (Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) { + if (messagePattern instanceof String){ + String msgStr = (String) messagePattern; + msgStr = MessageFormatter.format(msgStr, arg); + forcedLog(FQCN, Level.DEBUG, msgStr, null); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should never happen. + forcedLog(FQCN, Level.DEBUG, messagePattern, null); + } + } + } + + /** + * Log a message with the <code>DEBUG</code> level with message formatting + * done according to the messagePattern and the arguments arg1 and arg2. + * <p> + * This form avoids superflous parameter construction. Whenever possible, + * you should use this form instead of constructing the message parameter + * using string concatenation. + * + * @param messagePattern The message pattern which will be parsed and formatted + * @param arg1 The first argument to replace the first formatting element + * @param arg2 The second argument to replace the second formatting element + * @since 1.2.10 + */ + public void debug(String messagePattern, Object arg1, Object arg2) { + if (repository.isDisabled(Level.DEBUG_INT)) { + return; + } + if (Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) { + messagePattern = MessageFormatter.format(messagePattern, arg1, arg2); + forcedLog(FQCN, Level.DEBUG, messagePattern, null); + } + } /** Log a message object with the <code>DEBUG</code> level including @@ -293,6 +348,62 @@ void error(Object message) { forcedLog(FQCN, Level.ERROR, message, null); } + +/** + * Log a message with the <code>ERROR</code> level with message formatting + * done according to the value of <code>messagePattern</code> and + * <code>arg</code> parameters. + * <p> + * This form avoids superflous parameter construction. Whenever possible, + * you should use this form instead of constructing the message parameter + * using string concatenation. + * + * @param messagePattern The message pattern which will be parsed and formatted + * @param arg The argument to replace the formatting element, i,e, + * the '{}' pair within <code>messagePattern</code>. + * @since 1.2.10 + */ + public void error(Object messagePattern, Object arg) { + if (repository.isDisabled(Level.ERROR_INT)) { + return; + } + + if (Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel())) { + if (messagePattern instanceof String){ + String msgStr = (String) messagePattern; + msgStr = MessageFormatter.format(msgStr, arg); + forcedLog(FQCN, Level.ERROR, msgStr, null); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should never happen. + forcedLog(FQCN, Level.ERROR, messagePattern, null); + } + } + } + + /** + * Log a message with the <code>ERROR</code> level with message formatting + * done according to the messagePattern and the arguments arg1 and arg2. + * <p> + * This form avoids superflous parameter construction. Whenever possible, + * you should use this form instead of constructing the message parameter + * using string concatenation. + * + * @param messagePattern The message pattern which will be parsed and formatted + * @param arg1 The first argument to replace the first formatting element + * @param arg2 The second argument to replace the second formatting element + * @since 1.2.10 + */ + public void error(String messagePattern, Object arg1, Object arg2) { + if (repository.isDisabled(Level.ERROR_INT)) { + return; + } + if (Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel())) { + messagePattern = MessageFormatter.format(messagePattern, arg1, arg2); + forcedLog(FQCN, Level.ERROR, messagePattern, null); + } + } + /** Log a message object with the <code>ERROR</code> level including the stack trace of the {@link Throwable} <code>t</code> passed as @@ -654,6 +765,60 @@ void info(Object message) { forcedLog(FQCN, Level.INFO, message, null); } + /** + * Log a message with the <code>INFO</code> level with message formatting + * done according to the value of <code>messagePattern</code> and + * <code>arg</code> parameters. + * <p> + * This form avoids superflous parameter construction. Whenever possible, + * you should use this form instead of constructing the message parameter + * using string concatenation. + * + * @param messagePattern The message pattern which will be parsed and formatted + * @param arg The argument to replace the formatting element, i,e, + * the '{}' pair within <code>messagePattern</code>. + * @since 1.2.10 + */ + public void info(Object messagePattern, Object arg) { + if (repository.isDisabled(Level.INFO_INT)) { + return; + } + + if (Level.INFO.isGreaterOrEqual(this.getEffectiveLevel())) { + if (messagePattern instanceof String){ + String msgStr = (String) messagePattern; + msgStr = MessageFormatter.format(msgStr, arg); + forcedLog(FQCN, Level.INFO, msgStr, null); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should never happen. + forcedLog(FQCN, Level.INFO, messagePattern, null); + } + } + } + + /** + * Log a message with the <code>INFO</code> level with message formatting + * done according to the messagePattern and the arguments arg1 and arg2. + * <p> + * This form avoids superflous parameter construction. Whenever possible, + * you should use this form instead of constructing the message parameter + * using string concatenation. + * + * @param messagePattern The message pattern which will be parsed and formatted + * @param arg1 The first argument to replace the first formatting element + * @param arg2 The second argument to replace the second formatting element + * @since 1.2.10 + */ + public void info(String messagePattern, Object arg1, Object arg2) { + if (repository.isDisabled(Level.INFO_INT)) { + return; + } + if (Level.INFO.isGreaterOrEqual(this.getEffectiveLevel())) { + messagePattern = MessageFormatter.format(messagePattern, arg1, arg2); + forcedLog(FQCN, Level.INFO, messagePattern, null); + } + } /** Log a message object with the <code>INFO</code> level including the stack trace of the {@link Throwable} <code>t</code> passed as @@ -753,6 +918,33 @@ boolean isInfoEnabled() { return Level.INFO.isGreaterOrEqual(this.getEffectiveLevel()); } + /** + Check whether this category is enabled for the info Level. + See also {@link #isDebugEnabled}. + + @return boolean - <code>true</code> if this category is enabled + for level WARN, <code>false</code> otherwise. + @since 1.2.10 + */ + public boolean isWarnEnabled() { + if(repository.isDisabled(Level.WARN_INT)) + return false; + return Level.WARN.isGreaterOrEqual(this.getEffectiveLevel()); + } + + /** + Check whether this category is enabled for the info Level. + See also {@link #isDebugEnabled}. + + @return boolean - <code>true</code> if this category is enabled + for level ERROR, <code>false</code> otherwise. + @since 1.2.10 + */ + public boolean isErrorEnabled() { + if(repository.isDisabled(Level.ERROR_INT)) + return false; + return Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel()); + } /** Log a localized message. The user supplied parameter @@ -999,6 +1191,60 @@ void warn(Object message) { forcedLog(FQCN, Level.WARN, message, null); } + /** + * Log a message with the <code>WARN</code> level with message formatting + * done according to the value of <code>messagePattern</code> and + * <code>arg</code> parameters. + * <p> + * This form avoids superflous parameter construction. Whenever possible, + * you should use this form instead of constructing the message parameter + * using string concatenation. + * + * @param messagePattern The message pattern which will be parsed and formatted + * @param arg The argument to replace the formatting element, i,e, + * the '{}' pair within <code>messagePattern</code>. + * @since 1.2.10 + */ + public void warn(Object messagePattern, Object arg) { + if (repository.isDisabled(Level.WARN_INT)) { + return; + } + + if (Level.WARN.isGreaterOrEqual(this.getEffectiveLevel())) { + if (messagePattern instanceof String){ + String msgStr = (String) messagePattern; + msgStr = MessageFormatter.format(msgStr, arg); + forcedLog(FQCN, Level.WARN, msgStr, null); + } else { + // To be failsafe, we handle the case where 'messagePattern' is not + // a String. Unless the user makes a mistake, this should never happen. + forcedLog(FQCN, Level.WARN, messagePattern, null); + } + } + } + /** + * Log a message with the <code>WARN</code> level with message formatting + * done according to the messagePattern and the arguments arg1 and arg2. + * <p> + * This form avoids superflous parameter construction. Whenever possible, + * you should use this form instead of constructing the message parameter + * using string concatenation. + * + * @param messagePattern The message pattern which will be parsed and formatted + * @param arg1 The first argument to replace the first formatting element + * @param arg2 The second argument to replace the second formatting element + * @since 1.2.10 + */ + public void warn(String messagePattern, Object arg1, Object arg2) { + if (repository.isDisabled(Level.WARN_INT)) { + return; + } + if (Level.WARN.isGreaterOrEqual(this.getEffectiveLevel())) { + messagePattern = MessageFormatter.format(messagePattern, arg1, arg2); + forcedLog(FQCN, Level.WARN, messagePattern, null); + } + } + /** Log a message with the <code>WARN</code> level including the stack trace of the {@link Throwable} <code>t</code> passed as diff --git a/src/java/org/apache/log4j/Logger.java b/src/java/org/apache/log4j/Logger.java index 61a36e318d..369d9520f4 100644 --- a/src/java/org/apache/log4j/Logger.java +++ b/src/java/org/apache/log4j/Logger.java @@ -8,6 +8,7 @@ package org.apache.log4j; import org.apache.log4j.spi.LoggerFactory; +import org.slf4j.ULogger; /** @@ -17,7 +18,7 @@ @since log4j 1.2 @author Ceki Gülcü */ -public class Logger extends Category { +public class Logger extends Category implements ULogger { /** The fully qualified name of the Level class. See also the From 227d8e938c62943820b13e394cf3ea665e5db2c3 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu <ceki@apache.org> Date: Thu, 28 Apr 2005 20:36:23 +0000 Subject: [PATCH 100/342] On the v1_2-branch, more changes to support SLF4J PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311329 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/build.xml b/build.xml index e49b3f18f5..d0942cfc86 100644 --- a/build.xml +++ b/build.xml @@ -4,7 +4,7 @@ <!-- ================================================================= --> -<!-- NOTE: all directories are relative to jakarta-log4j/ --> +<!-- NOTE: all directories are relative to logging-log4j/ --> <!-- the parent of build/ --> <!-- ================================================================= --> <project name="log4j" default="usage" basedir="." > @@ -17,7 +17,7 @@ <!-- prefixed with "env". --> <property environment="env"/> - <property name="version" value="1.2.9"/> + <property name="version" value="1.2.10"/> <!-- The base directory relative to which most targets are built --> <property name="base" value="."/> @@ -161,6 +161,19 @@ <echo message="JAVAMAIL is present."/> </target> + <target name="slf4jCheck"> + <available file="${java.source.dir}/org/slf4j/ULogger.java" + property="slf4j-present"/> + + <fail unless="slf4j-present"> + Missing src/java/org/slf4j/*.java source files. + + Just run the refresh-slf4j target with the command: + + ant refresh-slf4j + </fail> + </target> + <!-- ================================================================= --> <!-- Initialize variables --> <!-- NOTE: all directories are relative to jakarta-log4j/ --> @@ -169,14 +182,23 @@ <tstamp /> </target> + + <target name="refresh-slf4j"> + <echo>Fecthing required source files from SLF4J.ORG</echo> + <!-- copy required SLF4J files into log4j --> + <ant antfile="slf4j.xml" target="refresh-slf4j"/> + </target> + <target name="build" depends="init, build.core, build.examples, build.xml, build.javamail, build.jms, build.jmx"/> - <target name="build.core" depends="init"> + <target name="build.core" depends="init, slf4jCheck"> <mkdir dir="${javac.dest}" /> <javac srcdir="${java.source.dir}" destdir="${javac.dest}" - includes="${stem}/**/*.java, ${stem}/xml/XMLLayout.java," + includes="org/slf4j/**/*.java, + ${stem}/**/*.java, + ${stem}/xml/XMLLayout.java" excludes="misc/*, **/UnitTest*.java, **/StressCategory.java, **/doc-files/*, @@ -325,7 +347,9 @@ </delete> <jar jarfile="${jar.dest}/${jar.filename}" basedir="${javac.dest}" - includes="${stem}/*.class, ${stem}/xml/log4j.dtd, + includes="org/slf4j/**/*.class, + ${stem}/*.class, + ${stem}/xml/log4j.dtd, ${stem}/config/*.class, ${stem}/helpers/*.class, ${stem}/spi/*.class, @@ -383,9 +407,9 @@ doctitle="log4j version ${version}<br>API Specification" windowtitle="Log4j Version ${version}" header="<b>Log4j ${version}</b>" - bottom="Copyright 2000-2002 Apache Software Foundation."> + bottom="Copyright 2000-2005 Apache Software Foundation."> - <link href="http://java.sun.com/products/jdk/1.3/docs/api"/> + <link href="http://java.sun.com/products/jdk/1.3/docs/api/"/> <link href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/"/> <classpath refid="compile.classpath"/> </javadoc> From 871555268ccd9f579a58cf199c3205e36c279a92 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu <ceki@apache.org> Date: Fri, 29 Apr 2005 09:55:50 +0000 Subject: [PATCH 101/342] Added missing source files required from gump intergration. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311331 13f79535-47bb-0310-9956-ffa450edef68 From f45374177c655e52431f1888402c47fbd2650fa1 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu <ceki@apache.org> Date: Fri, 29 Apr 2005 17:07:43 +0000 Subject: [PATCH 102/342] Removing obsolete html files. Renamed HISTRORY as HISTORY.txt PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311332 13f79535-47bb-0310-9956-ffa450edef68 --- docs/FAQ.html | 50 +- docs/HISTORY | 1665 --------------------------------------- docs/HISTORY.txt | 207 +---- docs/critique.html | 294 ------- docs/deepExtension.html | 735 ----------------- docs/praise.html | 266 ------- 6 files changed, 56 insertions(+), 3161 deletions(-) delete mode 100644 docs/HISTORY delete mode 100644 docs/critique.html delete mode 100644 docs/deepExtension.html delete mode 100755 docs/praise.html diff --git a/docs/FAQ.html b/docs/FAQ.html index a1fa59f90d..ad8e55e621 100644 --- a/docs/FAQ.html +++ b/docs/FAQ.html @@ -506,6 +506,41 @@ <h2>Frequently Asked Questions about log4j</h2> statement. </p> + <h3>Better alternative based on message patterns</h3> + <p>As of log4j version 1.3, there is a significantly more + convenient alternative based on message patterns. Assuming + <code>entry</code> is a non-primitive object, you can write: + </p> + + <p class="source"> + l.debug("The new entry is {}.", entry); + </p> + + <p>After evaluting whether to log or not, and only if the + decision is affirmative, the logger instace will format the + message and replace the '{}' pair with the string value of the + <code>entry</code> parameter within the message pattern. + </p> + + <p>Thus, the following two lines will yield the exact sane + output. However, the second form will perform at least 30 + times faster in case the logger is disabled for DEBUG. + </p> + + <p class="source"> + l.debug("The new entry is "+entry+"."); <br /> + l.debug("The new entry is {}.", entry); + </p> + + <p>A 2 argument variant is also availalble. Thus, you can also + write: + </p> + <p class="source"> + l.debug("The new entry is {}. It replaces {}.", entry, oldEntry); + </p> + + + <div class="question"> <a name="2.4">2.4 Are there any suggested ways for naming loggers?</a> @@ -1012,12 +1047,12 @@ <h2>Frequently Asked Questions about log4j</h2> appear in the file <em>/docs/faq.html</em>. </p> - + <!-- FOOTER --> <div align="center"><font color="#525D76" size="-1"><em> - Copyright © 1999-2004, Apache Software Foundation + Copyright © 1999-2005, Apache Software Foundation </em></font></div> <!-- END main table --> @@ -1031,12 +1066,6 @@ <h2>Frequently Asked Questions about log4j</h2> <div class="menu_item"> <a href="./download.html">Download</a> </div> <div class="menu_item"> <a href="./documentation.html">Documentation</a> - </div> - <div class="menu_item"> <a href="./chainsaw.html">Chainsaw</a> - </div> - <div class="menu_item"> <a href="./plan.html">Plan</a> - </div> - <div class="menu_item"> <a href="http://wiki.apache.org/logging-log4j/Log4JProjectPages">Wiki</a> </div> <div class="menu_item"> <a href="./contactUs.html">Contact us</a> </div> @@ -1052,6 +1081,9 @@ <h2>Frequently Asked Questions about log4j</h2> <div class="menu_item"> <a href="http://logging.apache.org/site/mission-statement.html">Mission</a> </div> <div class="menu_item"> <a href="http://logging.apache.org/site/bylaws.html">Guidelines</a> + </div> + <div class="menu_header">Related Projects</div> + <div class="menu_item"> <a href="http://www.slf4j.org">SLF4J</a> </div> <div class="menu_header">Translations</div> <div class="menu_item"> <a href="http://jakarta.apache-korea.org/log4j/index.html">Korean</a> @@ -1082,4 +1114,6 @@ <h2>Frequently Asked Questions about log4j</h2> + + diff --git a/docs/HISTORY b/docs/HISTORY deleted file mode 100644 index ed0ab544f8..0000000000 --- a/docs/HISTORY +++ /dev/null @@ -1,1665 +0,0 @@ - - - [*] Changes that are 100% compatible with existing client code. - [**] Changes that requiring little or no modification to existing - client code. - [***] Changes requiring important modifications to existing client code. - - - November 1st, 2004 - - - Release of version 1.2.9 - - Log4j version 1.2.9, is identical to version 1.2.8, except that - several key methods have been deprecated in preparation for version - 1.3.0, the next major release of log4j. These changes are intended to - enforce the rule that client code should never refer to the Category - class directly, but use the Logger class instead. Similarly, client - code should not refer to the Priority class but to the Level class - instead. - - For a more detailed discussion, refer to the document entitled - preparing for log4j 1.3 at: - - http://www.qos.ch/logging/preparingFor13.jsp - - February 19th, 2003 - - - Release of version 1.2.8 - - - Fixed bug #11570 whereby XMLAppender would throw a - NullPointerException if the input message was null. Many thanks to - David Vandegrift for reporting the bug and to Hendrik Brummermann for - supplying the patch. [*] - - - Fixed bug #12366 whereby various versions of Xerces would not parse - log4j configuration scripts expressed in XML format. [*] - - - Fixed bug #14827. The "removes" buffer used in the flushBuffer() method - of JDBCAppender is now cleared, solving the memory leak. Thanks to John - Landers for reporting the bug and suggesting the fix. [*] - - - Fixed bug #15599. SocketAppender now honors ReconnectionDelay of 0. - Many thanks to Scott Schram for reporting the bug and providing the fix. [*] - - October 9th, 2002 - - - Release of version 1.2.7 - - - Log4j now searches for the file log4j.xml as well as the file - log4j.properties during log4j initialization. [*] - - July 31st, 2002 - - - Release of version 1.2.6 - - - Addition of new options in JMSAppender and new command line arguments in - JMSSink. [*] - - - Added new method getLoggerName() in LoggingEvent class. The - getLoggerName is the preferred way for accessing the logger - name. The public access categoryName field should not be accessed - directly. Similarly, added the getLevel method which is now the - preferred way of accessing the event's level. The public access - level field should not be accessed directly. The javadocs now mark - the categoryName and level fields as deprecated. - - Modified existing appenders to comply with these new directives. [*] - - - Log4j now will check if a system property named "log4j.ignoreTCL" - is set. If it is set, then it will ignore the Thread Context - ClassLoader when loading classes. This solves the irritating - "appender is not assignable to Appender" messages observed when - log4j.jar is loaded by multiple class loaders. - - The error reporting for this problem was also improved. [*] - - - Fixed bug #10528 whereby calling the MDC.get method with a null - argument would throw a NullPointerException. [*] - - July 5th, 2002 - - - Release of version 1.2.5 - - - Minor changes and bug fixes in LF5. [*] - - - Calling an AsyncAppender close method also closes the embedded - appender instances. This resolves bug #10185 submitted by Paul - Voutier. [*] - - June 12th, 2002 - - - Release of version 1.2.4 - - - The JDBCAppender is marked as slated for replacement. Do not build - critical software using it. - - - Added LF5 documentation and examples. Further tests are required - for full integration. [*] - - - XMLLayout can now output messages which contain embedded CDATA - sections. This resolves bug #9750. Many thanks to Michael - A. McAngus for supplying the relevant patch. [*] - - - The dispatcher thread associated with AsyncAppender is now marked - as a deamon thread. This resolves bug #9750. [*] - - - Added missing NTEventLogAppender.dll as reported in bug #9606. [*] - - - In response to bug report 9435, the log4j.dtd was changed so that - <log4j:event> is now made of logger and level attributes instead of - category and priority. Changed XMLLayout to conform to the - DTD. Chainsaw was changed to adapt to the XMLLayout. [*] - - - Added missing LevelRangeFilter file. [*] - - May 24th, 2002 - - - Release of version 1.2.3 - - - Fixed bug #9285 where the SyslogAppender would incorrectly compute - the length of the datagram to send to the remote syslogd host. - Reported by Mamoru Kadota. [*] - - - Fixed bug #8505 where the stack trace of exception would not be - properly printed on the Compaq tru64 Unix platform. Initially - reported by Fabrice Claes and later by Espen H. Kolstad who also - provided the fix. [*] - - May 22nd, 2002 - - - Release of version 1.2.2 - - - Log4j configurators take the "NULL" string value as a synonym for - "INHERITED". Both of these two strings are legal level values for - setting the level of a logger. Both values are case insensitive. [*] - - - When loading component classes, log4j will now first attempt to use - the Thread Context Loader and if that fails, it will use - Class.forName. In log4j 1.2 and 1.2.1, only Class.forName was used - and the TCL was ignored. This change is a response to bug #9305 - opened by Scott M. Stark. [*] - - May 17th, 2002 - - - Release of version 1.2.1 - - - This minor release fixes bug #9155 reported by Nicko Cadell. - LoggingEvent.getMDCCopy() method now sets mdcCopyLookupRequired - instead of ndcLookupRequired. This bug would cause the wrong MDC - information to appear on a log server. It could only occur if the - client wrapped an AsyncAppender around a SocketAppender or if the - server used an AsyncAppender for its logging. [*] - - May, 2002 - - - Release of version 1.2 - - - Fixed bug #8527. A closed TelnetAppender would continue waiting - for connections even if its ServerSocket was closed. This caused - the TelnetSocket to sit in a loop and complain about the closed - socket. [*] - - - AsyncAppender throws NullPointerException problem. The bug was actually in - AppenderSkeleton. See bug #5444 details. [*] - - - Added support for recursive variable substiuton as requested by - Eric Chastan. [*] - - - SocketNode now used a BufferedInputStream as suggested by Kok Chong - in bug report #3933. [*] - - - Fixed a problem with DailiyRollingAppender which would not - correctly compute the rollover period in certain timezones. See bug - report #7550. [*] - - - Fixed documentation bug #2726 in FAQ.html. [*] - - - In WriterAppender, fixed bug #2383 by adding a flush statement in the - writeFooter method. [*] - - - In XMLLayout, Fixed bug #7550 by escaping the method attribute. The - XMLLayout also outputs each item of a stack trace in a separate - line. [*] - - - Fixed bug #5932 as suggested by Heikki Linnakangas. The - LoggingEvent.getMDCCopy method now clones the MDC instead of just - referencing it. [*] - - (rc1) - - - The ANT build script was modified to use jar files specified in - the build.properties file instead of the CLASSPATH environment - variable. The build.properties file depends on local paths and is - supplied by the user. The build.properties.sample file is included - in the distribution. The build.sh and build.bat scripts have - been removed. This is the way many other jakarta projects build their - projects. The jar files in the dist/lib directory were also removed - since they are no longer used. [*] - - - The DOMConfigurator now interprets the string after the '#' - character in the value attribute within the <level> element as - the fully qualified class name of a custom Level. This is consistent - with the way log4j handles "level" values in other places. The - class attribute is still honored. [*] - - - Added Oliver Burn's chainsaw tool to the core log4j - distribution. Visualisation and dynamic filtering of log events is - bound to be a very important area of activity in the future. [*] - - - Added the org.apache.log4j.jdbc.JDBCAppender which as the name - indicates sends events to a database using the JDBC API. Thanks to - Kevin Steppe for supplying the code. [*] - - - Added SocketHubAppender class as contributed by Mark Womack. This - appender sends LoggingEvent objects to a set of remote a log - servers. [*] - - - In the Category class, the getChainedPriority method has been - replaced with getEffectiveLevel method. [*] - - (beta4) - - - Replaced the custom class loading based on the thread context class - loader with a simple Class.forName() call. This solves two allied - but distinct problems encountered when using Ant with JUnit - although the bug is more general. In one instance of the - problem, log4j would throw java.lang.NoClassDefFoundError for - org/apache/log4j/AppenderSkeleton where log4j.jar and related - classes were clearly available to the Ant classloader. In another - incarnation, log4j would reject a custom appender claiming that it is - not assignable to a org.apache.log4j.Appender variable. This would - occur when log4j.jar was available to both the Ant classloader and the - system classloader. - - Thanks to Dave Herman for providing detailed scenarios exposing - the issues involved. See - http://forum.java.sun.com/thread.jsp?forum=38&thread=70946 - http://forum.java.sun.com/thread.jsp?forum=38&thread=70946#479697 - http://marc.theaimsgroup.com/?l=ant-user&m=101139178705895&w=2 - for more details. [*] - - - (beta3) - - - Fixed the complaints the compiler issued when using the - Logger.setLevel() methd. [*] - - - Incorporated the performance enhancements to ISO8601DateFormat and - AbsoluteTimeDateFormat classes submitted by Andrew Vajoczki. - - (beta2) - - - Source code written for log4j 1.1.3.jar will compile fine with - log4j 1.2X. However, code compiled for log4j 1.1.3 would previously - systematically throw "java.lang.NoSuchMethodError" runtime exceptions - when run with log4j 1.2 - prior to beta2. This problem has been - corrected in beta2. Pheew, that was a close one. [*] - - - Log4j 1.2 is now backward compatible in serialization of - LoggingEvents. For example, a 1.1.3 SocketAppedner can write to 1.2 - SocketServer. Similarly a 1.2 JMSAppender will work with 1.1.3 - JMSSink. This should ease the move to log4j 1.2, especially in - large deployments. [*] - - (alpha7) - - - The src/java/org/apache/log4j/examples/ directory moved under the - top-level directory as examples/. [*] - - - Fixed the ArrayIndexOutOfBoundsException that was thrown by - AsyncAppender if multiple threads were trying to log an event - containing an exception near simultaneously. Thanks to Thomas Tuft Muller - for reporting this bug. [*] - - (alpha1-alpha6) - - - Improved error reporting in DOMConfigurator. Thanks to Thomas Tuft - Muller for contributing the enhancement. [*] - - - Log4j is now configurable using JMX. JMX support is not of - production quality. [*] - - - Added support for different encodings in WriterAppender. Thanks to - Ben Sandee for submitting the relevant patch. [*] - - - Modified SMTPAppender to allow multiple email sessions. Thanks to - Jon Skeet for supplying the relevant patch. [*] - - - The CategoryFactory class has been replaced by the LoggerFactory - class. The makeNewCategoryInstance method has been renamed as - makeNewLoggerInstance. This change requires subclasses of Category - classes to be modified and recompiled. [**] - - - The Level class replaced the Priority class. Priority class now - extends Level to preserve backward compatibility. [*] - - - The Logger class replaced the Category class. Logger class - extends Category to preserve backward compatibility. We proudly - mark this change with a single star for 100% compatibility. [*] - - - The Category.assert method has been replaced by - Category.assertLog. This change was necessary because assert is a - language reserved word in JDK 1.4. [*/**] - - - Removed deprecated methods setOptions and getOptionStrings defined - in the org.apache.log4j.spi.OptionHandler interface. This interface - is implemented by most log4j appenders and layouts. In particular, - all appenders and layouts shipped with log4j contain these - deprecated methods. They have become totally redundant after we - moved to JavaBeans style configuration in log4j 1.1. [**] - - - The disable(Level) methods in Hierarchy have been removed and been - replaced by threshold methods. [**] - - - Added buffered IO capability to FileAppender and subclasses. [*] - - - The location information (or stack information) was not correctly - transmitted by JMSAppender. [*] - - - Added event reporting capability to the Hierarchy class. - - - Added new system property "log4j.configuratorClass". This property - allows the user to specify the custom configurator at the default - initialization phase. This property replaces the previous - interpretation of the reference part of "log4j.configuration" - as the custom configurator class. This interpretation was sometimes - erroneous and caused headaches. [*] - - - Introduced the Mapped Diagnostic Context or MDC class. This class - is similar to the NDC except that the diagnostic context is based - on a map instead of a stack. Moreover the MDC is automatically - inherited by child threads under JDK 1.2 and above. [*] - - - Corrected a performance bug in the NDC class as observed by Dan - Milstein and independently by Ray Millard. [*] - - - Removed deprecated methods disable(Priority), disableAll, - disableDebug, disableInfo and enableAll in BasicConfigurator. [*] - - - Added supports java.io.Reader objects in the method doConfigure(), - instead of only InputStream. Thanks to Mark Womack for submitting - the relevant patch. [*] - - - Corrected the restart bug in DayliRollingFileAppender. Thanks to - Jim Moore for supplying the relevant patch. [*] - - June 19, 2001 - - - Release of version 1.1.3 - - - Added a missing namespace declaration in the log4j:configuration - element in log4j.dtd. The missing declaration caused the new - generation of namespace aware parsers to barf when parsing log4j - configuration files. [*] - - - Reduced the size of log4j-core.jar to 78KB. [*] - - - Minor documentation changes. [*] - - June 7, 2001 - - - Release of version 1.1.2 - - - Corrected a problem with the static initializer of the Category - class which would use the wrong class loader to search for the - default configuration file. The associated search algorithm has - been also simplified. Nevertheless, the preferred method to specify - the automatic configuration file is by setting the - log4j.configuration system property. [*] - - - Documentation improvements. Added a new section to the manual - explaining the default initialization procedure [*] - - - Enhancements to the org.apache.log4j.examples.appserver package. [*] - - - Corrected a bug in the way the NTEventLogAppender printed - exceptions. [*] - - May 20, 2001 - - - Release of version 1.1.1. - - - Added missing custom priority support in PropertyConfigurator. [*] - - - Made a number of fields protected instead of default access in - SMTPAppender. [*] - - May 19, 2001 - - - Release of version 1.1. - - - This release has the same code as 1.1b7. It differs only in a few minor - documentation changes. - - May 9, 2001 - - - Release of version 1.1b7 - - - Made BasicConfigurator disable methods static as they were in log4j - 1.0.4. Thanks to Francisco Marin for reporting the bug. [*] - - - Corrected a two related deadlock problems introduced while fixing - bug 1505. Thanks to joelr@viair.com for reporting the problem. [*] - - - The configureAndWatch methods in Configurators did not close the - configuration file, preventing its editing. See bug 1686. [*] - - - In DOMConfigurator.setParameter special character conversion now - precedes variable substitution. This change was suggested by Steven - Velez. The vast majority of users should be oblivious to it. [*] - - - The TextPaneAppender is no longer maintained and has been - removed. It is still available under the contribs/ - directory. This change has been discussed in the log4j mailing - lists and no one objected to the removal of the TextPaneAppender - class. - - April 26, 2001 - - - Release of version 1.1b6 - - - Aaron Greenhouse from Carnegie Mellon SCS found a series of - multi-threading related bugs in Category and AsyncAppender. See bug - ids 1505 and 1507 in our bug database for exemplary bug - reports. They are worth the detour. [*] - - - InvalidJarIndexException is only available in JDK 1.3. Referring - to this exception type caused log4j 1.1b5 to break on earlier JDKs. - We now avoid referring to it. [*] - - - Added PriorityRangeFilter by Simon Kitching. See the Threshold - option in AppenderSkeleton for a more convenient alternative. [*] - - April 22, 2001 - - - Release of version 1.1b5 - - - In HTMLLayout, the Title option sets the HTML document - title (<title>...<title>). [*] - - - Corrected an important performance bug in LocationInfo. Hein Couwet - and kr@it-practice.dk have independently identified the bug. This is - yet another example of the difference made by the number of eyeballs - studying source code. [*] - - - Corrected the incorrect value returned by LocationInfo.getClassName - method when running under IBM Visual Age. Thanks to Mathias - Rupprecht for supplying the relevant patch. [*] - - - Corrected a bug where the build.sh file in the distribution would be in - DOS CRLF format. Thanks to ma.darche@free.fr for reporting the - problem. [*] - - - Corrected InvalidJarIndexException thrown in applets while - searching for the default log4j configuration file. Thanks to - Michael Lundahl for reporting this bug. [*] - - - Added missing PropertySetterException class to log4j-core.jar. - Thanks to ma.darche@free.fr for reporting this bug. [*] - - April 20, 2001 - - - Release of version 1.1b4 - - - Mathias Bogaert observed that in version 1.1b3 the search algorithm - for the resource used in automatic log4j configuration was - different than in 1.0.x. Beta4 uses a more powerful mechanism which - is also compatible with 1.0.x. [*] - - - Paul Glezen correctly observed that if log4j is deployed in a - client/server mode where multiple log4j clients log to a log4j - server, all hosts must be upgraded to version 1.1 in one go because - the internal LoggingEvent class used in client/server communication - changed in log4j 1.1. - - April 18, 2001 - - - Release of version 1.1b3 - - - Added a RollingFileAppenderBeanInfo class that fakes the - maxFileSize JavaBeans property as a String type instead of a long. - This allows us to resuscitate setMaxFileSize(long) method that was - removed in 1.1b2 breaking 100% backward compatibility. This addition - restores 100% backward compatibility. [*] - - April 18, 2001 - - - Release of version 1.1b2 - - - The directory structure has changed to better suit Jakarta - conventions as follows: - - org/** --> src/java/org/** - xdocs/** --> src/xdocs/** - - If you have a CVS checked out copy of log4j be sure to check out a - fresh copy. [*] - - - Added a few jar files required at build time to build/lib so that - it is now possible to compile log4j out of the box. [*] - - - Whenever a priority parameter is expected in a configuration file, - one can now use a custom priority class. See OptionConverter.toPriority - method for more information. Note that the <priority> element in - log4j.dtd remains unaffected by this change. [*] - - - Added the setQuietMode(boolean) method to LogLog. In quiet mode - LogLog will not output anything even in case of errors. [*] - - - Log4j components are now configured as JavaBeans. The setOption and - getOptionString methods have been deprecated in OptionHandler - interface which is implemented by most log4j components. [*] - - - The stack trace of a throwable passed in a logging statement is not - parsed into a stack array which is serializable. This allows cascading of - log4j servers to properly propagate throwable information. [*] - - - In XML configuration files, the <configuration> element has been - deprecated and was replaced by the <log4j:configuration> element. [*] - - The following perl command can help to migrate: - - perl -p -i.bak -e "s/configuration/log4j:configuration/;" file1.xml .. fileN.xml - - - The "log4j.configDebug" system property has been replaced with the - "log4j.debug" system property although it is still available. - Similarly, the "configDebug" attribute has been deprecated and - replaced with the "debug" attribute in log4j.dtd. [*] - - - February 23, 2001 - - - Release of version 1.1b1 - - - Logging can now be disabled per Hierarchy. It can also be disabled - using configuration files using the "disable" directive. The - "disableOverride" directive takes precedence over the "disable" - directive. As a result of this change the disable family of - methods in BasicConfigurator has been deprecated and replaced by the same - family of methods in the Hierarchy class. [*] - - - The FileAppender has been split into three parts: WriterAppender, - ConsoleAppender and FileAppender. ConsoleAppender takes over the - console logging functionality of FileAppender. As a result support - for stream and console printing has been deprecated in FileAppender. [**] - - - The FileAppender now correctly outputs the header and footer of its - layout. This problem was reported by too many users to list here. [*] - - - Appenders and Layouts now get to see the raw message object in - LoggingEvent not just its rendered form. The access modifiers of - some LoggingEvent fields were changed so that they can be accessed - in less error-prone ways. Thanks to Jim Cakalic and Anders Kristens - for their valuable advice. [*] - - - Added getLayout(), getErrorHandler(), and getFilter() to the - Appender interface. [*] - - - Added getOption(key) method to the OptionHandler interface and modified - implementations of it as appropriate. [*] - - - Added the much awaited DailyRollingFileAppender. [*] - - - The structure of the distribution changed somewhat. The log4j.jar - files can be found under dist/. The javadoc directory has been - moved to docs/api/. We are now totally dependent on ANT to perform - all the steps involved in creating a release, including - compilation, jar file creation, generation of the javadocs, and for - the creation of the distribution tar and zip files. [*] - - - Removed org/apache/log4j/varia/ResilientFileAppender.java which was - bogus to begin with. [*] - - - XMLLayout will now mark some output as <![CDATA[ .. ]]> so that it - does not get interpreted by the XML parser. This was suggested by - Mathias Bogaert like a long list of other fixes. [*] - - - Corrected a bug in CyclicBuffer.resize method that would not update the - next insertion point. Thanks to Ole Bulbuk for accurately reporting - the bug. [*] - - - The LoggingEvent class now supports serialization of priorities - derived from the org.apache.log4j.Priority class. [*] - - - Improved the search method for finding the "log4j.properties" file in - the static initializer of Category class. Thanks to Calvin Chan for - supplying a better method. [*] - - - The code handling the FCQN (formerly instanceFQN) parameter was - cleaned up. There is now a well-established and simple manner for - sub-classes of Category (or wrapper classes) to define the FCQN - variable: just define a static variable, say FCQN, consisting of - the fully qualified class name of the subclass or wrapper, supply - this variable as an argument to forcedLog method if and when - the sub-class or wrapper invokes that method. [*] - - - Made the instanceFCQN an instance variable instead of a class - static in Category.java. In related move, the Category constructor - now takes an additional argument setting the instanceFCQN. This - makes life less miserable for Category subclasses. [*] - - - Corrected a bug in the OptionConverter.instantiateByClassName - method that would not return the defaultValue in case of error. Thanks - to Matthieu Verbert for identifying this bug. - - - Corrected the missing stack trace in e-mails generated by the - SMTPAppender when using certain Layouts. [*] - - - Updated the "Adding Conversion Characters to PatternLayout" - document to reflect the latest changes to the code. Also added the - org/apache/log4j/examples/appserver directory containing the - associated example code. [*] - - - Added the BufferSize option to the AsyncAppender. [*] - - - Eliminated the SecurityExceptions thrown in Applets. Thanks Timur - Zambalayev for reporting this bug. [*] - - - Fixed the erroneously thrown IOInterruptedException when the AsyncAppender - was closed. Thanks to Tom Palmer for accurately reporting this bug. [*] - - January 12th, 2001 - - - Release of version 1.0.4 (the 20th major release) - - - Corrected a serious bug in Hierarchy.java that would cause a - NullPointerException depending on the order of instantiation of - categories. Thanks to Wolfram Gewohn for reporting this bug. [*] - - - Corrected a bug in the getOptionsStrings method of SMTPAppender - that omitted to mention the EvaluatorClass option. Thanks to Mark - Balster for reporting this bug. [*] - - January 11th, 2001 - - - Release of version 1.0.3 (the 20th major release) - - - Fixed a NullPointerException occurring in AsyncAppender after - invoking Category.shutdown. Thanks to Frank-Olaf Lohmann for - reporting this bug. [*] - - - Modified the OptionConverter.selectAndConfigure method to take an - extra argument of type Hierarchy. This method is used internally - and should not affect most users. [*/**] - - - Added the warn method to LogLog which is used internally by log4j - to report on itself. [*] - - - Displaced a number of HTML files under the docs directory. The new - structure is compatible with the jakarta site and results in a - more consistent navigation experience. [*] - - - Made a few improvements in the javadocs. [*] - - January 11th, 2001 - - - Release of version 1.0.2 (the 20th major release) - - - Added the missing build.inc file to the distribution. No code - changed. - - January 10th, 2001 - - - Release of version 1.0.1 (the 20th major release) - - - This version corrects some documentation and build script bugs; - code has not changed. - - January 8th, 2001 - - - Release of version 1.0 (the 20th major release) - - - Package hierarchy now starts at org.apache.log4j. [***] - - The following perl command can help in the transition: - - > perl -p -i.bak -e "s/org.log4j/org.apache.log4j/;" file1.java .. fileN.java - - - Added the fatal() family of methods to the Category - class. Moreover, the EMERG priority has been removed from the - Priority class. This priority has been replaced by the FATAL - priority that is more widely accepted. This change will - require EMERG log statements to be replaced by FATAL log - statements. Assuming EMERG log statements are rare, this should - have a small but bearable impact on existing client code. - - Moreover, the Unix Syslog priorities ALERT, CRIT and NOTICE are no - longer recognized. Support for these priorities was minimal and - few users should suffer from these changes. [**] - - - Removed the methods setRootPriority, getRootPriority as these - methods were redundant and had been previously deprecated. [**] - - - Removed the DOM Level 2 dependency in DOMConfigurator. This makes - log4j XML configurable using Sun's parser or Apache's Xerces. [*] - - - The static initializer of the Category class now takes the - log4j.configuration system property to search for its configuration - file. The type of the configurator used to parse the configuration - file depends on the value of the log4j.configuration system - property. [*] - - - Enhanced the PropertyConfigurator and DOMConfigurator to support - customisation of independent Hierarchy instances. The - org.apache.log4j.net.SocketServer has been enhanced to take - advantage of this functionality. The old code of SocketServer has - been moved to SimpleSocketServer. [**] - - - Enhanced the PropertyConfigurator to support variable substitution - for all options *values* (but not keys!). [*] - - - Categories are now aware of the Hierarchy they are linked to. This - will provide a basis for several performance enhancements planned - for the future. [*] - - - Added support for object rendering. It is now possible to register - an object renderer for a given object type. When the given object - needs to be logged log4j will invoke the corresponding renderer to - transform the object into a String. - - As a result of this enhancement, all the String forms of all the - printing methods such as debug(String), info(String) have been - removed as they are no longer necessary. This change should be - backward compatible but requires recompilation of old client - code. Thanks to Michael Smith for noting the recompilation - requirement. [**] - - - Added support for user defined category factories in the - PropertyConfigurator. Thus, it is now possible to configure log4j - with a properties file and still use custom Category - sub-classes. The DOMConfigurator had already a finer grain - support. [*] - - - Added the SMTPAppender that in case of an error or fatal event - sends an e-mail containing latest N logging events in its buffer, - where N is chosen by the user. [*] - - - Added the method getInstance(Class) to the Category class. [*] - - - Corrected a bug in configureAndWatch method of configurators that - would configure log4j only after an unnecessary delay. [*] - - November 30, 2000 - - - Release of version 0.9.1 (the 19th public release) - - - Corrected a typo making NTEventLogAppender.dll register the wrong - category message file. Thanks to Peter Hayes for accurately - reporting this bug. [*] - - - The DOMConfigurator and PropertyConfigurator can now automatically - detect modified configuration files and re-read them. [*] - - - Added AsyncAppender which buffers log requests and serves them - at a later time. AsyncAppender can increase logging performance - tremendously if logging operations are interspersed with long - and blocking non CPU-intensive operations, typically I/O or network - access. For CPU intensive applications, using the AsyncAppender - will actualy degrade logging performance by 10 to 25 percent. [*] - - - The log4j.dtd has been modified to allow appenders to refer to - other appenders by IDREF. [*] - - - The DOMConfigurator has been modified to take advantage of ID/IDREF - attributes when referring to appenders. This change requires a - DOM Level-2 API compliant parser. DOM Level-2 java bindings are - available at - http://www.w3.org/TR/1999/WD-DOM-Level-2-19990923/java-binding.html. - - - Added the configure(String filename) method to DOMConfigurator. - This method requires the presence of a JAXP compatible parser. - - At this time, the only DOM2 and JAXP compatible parser seems to be - the Apache xerces parser. - - - Added the PriorityMatchFilter allowing filtering by exact priority - match. This was a common request by users. [*] - - - The configuration of a category is now an atomic operation. This - ensures that log requests are not lost while configuration is in - progress. Anders Kristensen was to first to observe the potential - problems in non-atomic configurations. [*] - - November 20th, 2000 - - - Release of version 0.9.0 (the 18th public release) - - - The "log4j" element has been renamed to "configuration" in the - log4j DTD. This change requires that log4j configuration files - written in XML be modified. Since the log4j element figures only - once in the XML file, this change should take little time. [**] - - - ResourceBundles are now category instance specific and no longer - class static. Moreover, like other properties resource bundles - are inherited from the category hierarchy. [**] - - - The jar files log4j.jar and log4j-full.jar now contain versioning - information in their respective manifest files. [*] - - - Corrected an inconsistency in the NTEventLogAppender which broke it. - - - Fixed a bug where configuration files were not parsed correctely - due to trailing spaces in option values as returned by - java.util.Properties. Trailing spaces are now removed from option - values. This bug was quite disconcerting because the - trailing spaces cannot be seen without careful examination of the - configuration file. [*] - - - Added the XMLLayout. - - The output of the XMLLayout consists of a series of log4j:event - elements. It does not output a complete XML file. The output is designed to - be included as an external entity to form a well-formed XML file. [*] - - - Added a new abstract class org.log4j.helpers.DateLayout. The TTCCLayout - now extends DateLayout. [*] - - - Corrected a rather subtle performance bug in the buffer management code - in PatternLayout. Thanks to Vladislav Dutov and Constantine - A. Plotnikov for for insisting on the correction of this bug. [*] - - - Created a new package called org.log4j.spi. This new package - holds classes that are hidden from the casual user but are needed - to extend log4j. [*] - - - Added org.log4j.varia.ExternallyRolledFileAppender to handle - externally triggered file rollovers. [*] - - - Added support for multiple hierarchy trees. [*] - - - PatternLayout can now be subclassed to support new conversion - patterns. [*] - - - Extended the DOMConfigurator and the log4j DTD to properly handle - sub-classing of Category and Priority classes. - - There have been also minor adjustments to other classes to handle - sub-classing. These changes should be invisible to users. - - All categories except the root category can be sub-classed and also - assigned priorities sub-classing org.log4j.Priority. - - The root category always exists and CANNOT be subclassed. - - The ProppertyConfigurator remains unchanged. Thus, it does not - handle extensions of the Category class. [*] - - - Added filter support in appenders. The DOMConfigurator and the - log4j.dtd have been enhanced to support filters. [*] - - - Added error handling support to appenders. The DOMConfigurator and the - log4j.dtd have been enhanced to support filters. [*] - - - Added support for correct interpretation of location information in - IBM's Visual Age environment. Thanks to Wolf Siberski for supplying - the relevant patch. [*] - - - Added getAdditivity method to Category. This feature was requested - by Constantin Mitran. (mitran at ecircle.de) [*] - - August 27, 2000 - - - Release of version 0.8.5b. - - - Corrected multiple bugs in default initialization code of - Category class. Thanks to Jeff Turner for identifying and supplying - corrective patches. [*] - - August 24, 2000 - - - Release of version 0.8.5a. - - - Added the %n conversion character to PatternLayout so that a line - separator can be specified in a platform independent way. [*] - - - In 0.8.5 internal Priority integer values were decoupled from the - Unix Syslog values. This broke SyslogAppedder. A new function - Priority.toSyslogInt is introduced to solve this bug. [*] - -Corrected a bug where the internal prtar tzvf iority integer - - August 23, 2000 - - - Release of version 0.8.5. - - - All log4j internal output is now prepended with the string - "log4j: ". This makes is easier to differentiate log4j internal - logs from messages output by other sources. [*] - - - Sub-classes of Category class must now specify their fully - qualified name when constructing logging events. This allows the %C - conversion specifier in PatternLayout to work properly even with - sub-classes or wrappers of Category. [*] - - - Added the method disableDebug to BasicConfigurator. This method - disables all print requests of debug priority regardless its - category. Similar methods disableInfo, disable, disableAll and - enableAll have also been added. Disable type methods can be - overriden by setting the log4j.disableOverride system property. - - Calling BasicConfigurator.disableInfo is equivalent to the now - deprecated flagAsShippedCode method. [*] - - - Given the above changes, the system property - log4j.shippedCodeFlagOverride is no longer honored. [**] - - - It is now possible to sub-class Category. The sub-classes may - continue to adhere to the category hierarchy. This was a frequently - requested feature. [*] - - - Corrected a problem with the additivity flag being ignored in - categories without appenders. This bug was discovered by Anders - Kristensen. [*] - - - Added a method BasicConfigurator.resetConfiguration to reset the - log4j environment. This method should be used sparingly. [*] - - - At the initialization of the Category class, the file - log4j.properties will now be searched from the search path used to - load classes. If the file can be found, then it is fed to the - PropertyConfigurator.configure(java.net.URL) method. [*] - - - Failing to access system properties within the static initializer - of BasicConfigurator class is no longer reported as an error but as - a debug message. Thanks to Gilles Schlienger for reporting this - problem with applets. [*] - - - Corrected a bug which caused infinite loops when using conversion - patterns with a single element, fortunately under very rare - circumstances. This bug was first reported by Igor Potraev, the - author of log4p. It was independently reported by Joe Haberl from - IBM Global Services. [*] - - - Added a mechanism to lazily remove references to dead threads in - the NDC class. Indeed, in previous versions calling NDC.pop within - a thread but forgetting to call to NDC.remove before exiting (that - thread) resulted in a memory leak. [*] - - - Corrected a huge memory leak in SocketAppender. This leak was due - to the ObjectOutputStream indefinitely holding a reference for each - written to the stream. Thanks to Dan MacDonald for very accurately - describing this bug. [*] - - - The log and l7dlog methods in Category no longer ignore the shipped - code flag. This bug was reported by Mario Schomburg. [*] - - - Added missing NDC information to LoggingEvent.writeObject - method. [*] - - - Corrected handling of SocketException in SocketNode. Thanks to - Gerald Gutierez (ggutierez@emobiledata.com) for reporting this and - the previous problem. [*] - - - Phased out custom shell scripts to build java documentation and jar - files in favor of Jakarta's ANT. It was becoming a nuisance to keep - the ANT build file in sync with the custom shell scripts. [*] - - - May 11, 2000 - - - Release of version 0.8.4d. - - - The NT EventViewer no longer complains about missing message 4096. - - - Minor corrections in documentation. - - - Added missing icons GIFs into the distribution. - - - SocketNode now attempts to close the socket when exiting. Thanks to - Moses Hohman (mmhohman@rainbow.uchicago.edu) for noting this. - - - Removed the com.ibm.log4j from the javadoc directory. This seems to - confuse VAJ. Thanks to Steve Ashcroft for reporting this problem. - - May 5, 2000 - - - Release of version 0.8.4c. - - - As a result of the infinite loop problem (see next item), added - over 800 new test cases to stress-test the code in CategoryFactory - class where category creation occurs. [*] - - - Under certain rare circumstances the Category.getInstance method - entered an infinite loop. Thanks to Mario Schomburg from IBM Global - Services / Hannover for identifying this problem and proposing a - patch. [*] - - - DOMConfigurator and the log4j.dtd were out of sync on the type of - the priority directive. As a result, priority directives all - defaulted to DEBUG. Thanks to Peter (petervt@users.sourceforge.net) - for accurately reporting this bug. [*] - - - Minor additions to the FAQ. [*] - - - Added the NumberCruncher example showing how the NDC class can be - used to distinguish output from different clients. [*] - - - Added the %x conversion specifier to the TTCC_CONVERSION_PATTERN in - the PatternLayout class. This is consistent expected output of - Trivial.java example. Thanks to Jerome (schrom@users.sourceforge.net) - for reporting this bug. [*] - - May 3, 2000 - - - Release of version 0.8.4b. - - - The value of the additivity option would not be parsed properly by - the ProperytConfigurator if the line containing the option - contained trailing spaces. [*] - - - Release of version 0.8.4a. - - - The localized logging methods (l7dlog) omitted priority based - evaluation and erroneously logged all requests. [*] - - May 1, 2000 - - - Release of version 0.8.4. - - - The close method was added to the Appender interface allowing - appender implementations to release any resources they may have - allocated. [*] - - - The package naming scheme of changed from "com.ibm.log4j.*" to - "org.log4j.*". The new naming reflects the open source nature of - the project and is consistent with the URL http://www.log4j.org. [***] - - - Added internationalization support. See the newly introduced l7dlog - methods in Category class. [*] - - - In the FileAppender, the File option now admits variable - substitution. For example, if "java.home" system property is set - to /home/xyz and the File option is given the value - "%{java.home}/test.log", then File option will be interpreted as - "/home/xyz/test.log". - - Thanks to Avy Sharell (sharell@online.fr) for contributing this - feature. [*] - - - SocketAppender is now officially part of the package. It is capable - of sending logging events to a remote SocketNode. The SocketNode - logs events according to server (local) policy. For example, a - client can log events to a local file and also send them to a - remote server (a SocketNode). This server can log the event to any - number of files, to the console, to any number of TextPaneAppenders - and even re-transmit the event to another server, and so forth. - - This paradigm is common in most logging systems, e.g. Syslog and NT - Event Log. Many thanks to Andrew Harrison for showing a way to - actually implement the paradigm. [*] - - - The Category.callAppenders method now accepts a LoggingEvent - instead of creating one itself. This was necessary to accommodate - events generated at a remote client. [*] - - - LoggingEvent class changed slightly to support remote logging. The - category field (a Category) has been replaced by the categoryName - field (a String). [*] - - April 14, 2000 - - Release of version 0.8.3b - - - Corrected a bug in Category.removeAppender(String) which would - never remove the desired appender. Thanks to Moses Hohman for - reporting this bug. - - Release of version 0.8.3a - - - Corrected a bug RollingFileAppender which would throw an uncaught - exception in case output file could not be opened for - writing. Thanks to Vinay Aggarwal for signaling this problem. - - April 13, 2000 - - - Release of version 0.8.3. - - - The log4j.override key defined in BasicConfigurator has been - renamed to log4j.shippedCodeFlagOverride. [**] - - - The getCurrentCategories method in the Category class would not - return the correct value. Thanks to Timothy Potter - (tpotter@agency.com) for reporting this problem. [*] - - - Appenders now admit a priority threshold as an option. All requests - with a priority lower than the appender's threshold priority are - ignored by the appender. [*] - - - Integrated Christopher Taylor's DOMConfigurator parsing XML - configuration files. [*] - - - The jar file log4j-net.jar has been replaced by log4j-full.jar. It - contains DOMConfigurator.class in addition to the com.ibm.log4j.net - package. [**] - - - Added support for the ANT build tool. Thanks to Christopher Taylor - for supplying the build.xml file. ANT is available form - http://jakarta.apache.org. [*] - - - FileAppender's File option now accepts the values "System.out" or - "System.err". If one these values is suppiled in a configuration - file then the output is directed to the corresponding stream. - Moreover, the default constructor of FileAppender no longer sets - System.out as an output target nor does it define a default - layout. [*] - - - Added caller class (C), caller file name (F), caller line number - (L), caller method name (M) conversion specifiers to the - PatternLayout class. - - The category conversion specifier now takes an optional precision - modifier allowing the user to control the number of right most - components in the category name that will be printed. - - Corrected a bug occuring when the caller file name and line number - information were unavilable due to JIT compilation. In that case, - the PatternLayout would not properly use the rest of the available - location information. [*] - - The above enhancements and bug-fixes originate from comments by - Nelson Minar (nelson@monkey.org). - - March 23, 2000 - - - Release of version 0.8.2. - - - The SimpleLayout and TTCCLayout are replaced by the PatternLayout - in the log4j.jar file to keep its size small. These two layouts are - still part of the package. - - - The PatternLayout class is introduced. This new layout is - configurable using a conversion pattern which is parsed at - runtime. This allows the user to choose the output layout without - writing any code and only at a marginal performance cost compared - to the dedicated layouts such as SimpleLayout and TTCCLayout. The - PatternLayout also allows the user to determine minimum and maximum - field lengths. - - The PatternLayout was written by Jim Cakalic - (jim_cakalic@na.biomerieux.com). [*] - - - All internal components now use LoggingEvent instances to specifiy - logging information. - - - Corrected a problem with a missing variable initialization in - SyslogAppender. This caused NullPinterException to be thrown when - logging exceptions. - - Added a default constructor to SyslogAppender. The lack of this - constructor caused PropertyConfigurator to throw a - java.lang.InstantiationException when the appender type was set to - be SyslogAppender. - - Thanks to Yves Bossel (ybossel@opengets.cl) for accurately - identifying these bugs. - - Modified some other related option handling code in - SyslogAppender. [*] - - - Made NDC.get public access instead of default access. Thanks to - Y. J. Chun (monac@softonnet.com) for reporting this problem. [*] - - - PropertyConfigurator now parses the additivity option for - categories. [*] - - - Corrected the value of the ADDITIVITY_PREFIX constant to match the - documented value, that is "log4j.additivity". [**] - - - Corrected a really bad bug where System.out would be closed when - PropertyConfigurator.configure was called. Thanks to Christopher - Taylor (cstaylor@pacbell.net) for tracking and reporting this bug. [*] - - - The PropertyConfiguator now prints debug messages if the flag - "log4j.configDebug" is defined in the configuration - file. Previously, only if the system property "log4j.configDebug" - was set would debug messages be printed. A question by Shawn - Kircher (skircher@vninet.com) induced this change. [*] - - - In AbsoluteTimeDateFormat, DateTimeDateFormat and ISO8601DateFormat - the separator between the seconds and milliseconds has been changed - to comma from full stop, in order to be compliant with ISO8601's - preferred sign. Thanks to Jim Cakalic - (jim_cakalic@na.biomerieux.com) for pointing out this discrepancy - with the standard. [*] - - - Corrected a bug where RollingFileAppender would not work - properly on Windows systems. Thanks to Heinz Richter - (heinz.richter@ecmwf.int) for noting this problem. - - February 19, 2000 - - - Release of version 0.8.1. - - - Core classes are now independent of the format of the options - file. Configurable core classes implement the OptionHandler - interface. OptionHandlers allows configurators to learn the - relevant option names. The configurator feeds option values to the - OptionHandler which configures itself. - - As a result of these changes, the Init class has been broken down - to two separate classes: the BasicConfigurator and the - PropertiesConfigurator. [**] - - An XML configurator for 0.8.0 has been already written by - Christopher Taylor (cstaylor@pacbell.net). - - - Added multiple appender support per category. The appenders follow - the category hierarchy, i.e. a child category inherits the - appenders of its parents. - - - Added an assert() method to the Category class. Steven Marcus - (srnm@awaretechnologies.com) requested this addition. [*] - - - Atomatic stack printing is no longer supported. This was an unused - and unreliable feature which unnecessarily complicated the - code. [*] - - - log4j now emits a single warning message when no appender to write to - could be found. This is typically the case when the user forgets - to configure the log4j environment. This change was suggested by - Jim Cakalic (jim_cakalic@na.biomerieux.com). [*] - - - RollingFileAppender adds file roll over capability--implemented by - Heinz Richter (heinz.richter@ecmwf.int). [*] - - - Corrected a bug where a java.lang.NoClassDefFoundError would be - thrown because com.ibm.log4j.helpers.SyslogTracerPrintWriter was - not included in log4j.jar. Thanks to Jim Cakalic (jim_cakalic@na.biomerieux.com) - for signaling this bug. [*] - - February 9, 2000 - - - Release of version 0.8.0. - - - There has been an important API changes. The Log, NOPLog and ILog - classes have been removed. Their functionality has been migrated to - the Category class. [***] - - In this release, instead of writing - - ILog.debug(CAT, "Some message."); - - one will write - - CAT.debug("Some message."); - - Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> observed that - one could use the Category objects directly for logging. - - - It is no longer possible to instantiate Category objects directly. - Instead, one would use the factory method - Category.getInstance(String name). [***] - - There category instantiation code was moved to CateogryFactory - class. This class has package visibility and remains hidden from - the user. - - This stylistic improvement was suggested by Luke Blanshard - (luke@quiq.com). - - - The Init class offers methods to initialize the log4j - environment. The Init.flagAsShippedCode method replaces the NOPLog - class. - - - Changes in the documentation to reflect the API changes. - - - The NDC.cloneStack and inherit methods now tolerate null-stacks. [*] - - - January 29, 2000 - - - Release of version 0.7.5. - - - TTCCLayout now takes a java.text.DateFormat object as a - parameter. The task of formatting the date is delegated to this - object. - - Added four classes extending the java.text.DateFormat class. These - are RelativeTimeDateFormat, AbsoluteTimeDateFormat, - DateTimeDateFormat and ISO8601DateFormat classes. - - Thanks to Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> - for suggesting the ISO8601 date format. - - These four classes can be parametrized with a particular - TimeZone. The TTCCLayout class now accepts a new configuration file - option called "TimeZone". - - These four DateFormats are less malleable than the - java.text.SimpleDateFormat but they are also much faster. - - As a consequence of these changes, the setRelativeTime, - setDatePrinting methods in TTCCLayout have been removed along with - the associated configuration file options RelativeTime, - DatePrinting and TimePrinting. [**] - - The current code is inspired by code contributed by - Heinz Richter (heinz.richter@ecmwf.int). - - - The Log.emerg method has been deprecated. If you use statements of - EMERG priority, please use the Log.log form instead. [**] - - - Added getDepth and setMaxdepth methods to the NDC class. This makes - it easier to manage the nested context depth especially when - callees push but forget to pop. - - - Moved the documentation in com/ibm/log4j/package.html to - com/ibm/log4j/overview.html. Many users were failing to read the - com/ibm/log4j/package.html description due to the unfortunate - layout of the text. Hopefully more people will read the package - overview in its present location. - - - Added the com.ibm.log4j.net package for doing remote logging using - TCP sockets. This is still experimental code. - - - Added new debug, .., emerg methods that do not require a category - parameter. They assume the "root" category, that is the decision to - whether print or not is made by comparing the statement's priority - with the default priority. [*] - -January 21, 2000 - - - Release of version 0.7.4. - - - Added a new ILog.init method accepting an Appender and a - configuration file as parameters. - - - FileAppender's setWriter and setFile methods where not instantiating - a new tracer. This caused stack traces to be lost! SyslogAppender - had a similar problem. [*] - - - The FileAppender and SyslogAppender where not calling the layout's - readConfig method to set layout specific options. Thanks to Heinz - Richter (heinz.richter@ecmwf.int) for reporting this bug. [*] - - - Corrected a bug in Log.log() method where the appender was always - called with Priority.DEBUG. Thanks to Oliver Boehm - (Oliver.Boehm@abaxx.de) for reporting this bug. [*] - -January 14, 2000 - - - Release of version 0.7.3. - - - Added Syslog compatibility. One can now choose (at runtime) between - remote syslog logging or file logging. [*] - - Syslog logging performance, although not appalling, is significantly - slower than file logging. - - - Priority class was enriched with the previously missing priorities - NOTICE, ALERT and CRIT. The internal constants were also aligned with - the syslog counterparts. [*] - - - Added the Log.log method to support the new priorities. [*] - - - TracerPrintWriter is now an independent class instead of being a - nested top-level class in Tracer. [*] - - - A number of writers, namely the SyslogWriter, SyslogQuietWriter, - SyslogTracerPrintWriter, were added to the helper package. [*] - - - Log.force method was removed. The various Appender.doAppend - implementations take over its functionality. [*] - - - FileAppender and SyslogAppender now use QuietWriter. QuietWriter is - a FilterWriter which hides exceptions and instead emits a single - warning message to System.err. [*] - - - The layout is now an initialization parameter to the appender - type. Previously, the layout and the appender where independent - parameters to the Log constructor. [**] - - - Many small improvements and corrections in the documentation. - Syslog related documentation remains sparse. - - - ILog.init() and ILog.init(String configFile) have been changed to - call ILog.init(,,,) with "com.ibm.log4j.Log.class" as the first - parameter. This makes it easier for people to get familiar with log4j. [**] - - - Added missing files to the make directory. These files are useful - for those wishing to use the log4j make environment. Thanks to "Lee - Hall" <LHall@JavaFoundry.com> for reporting this omission. [*] - - Until recently the make environment failed to compile RMI stubs in - a single run. This nagging problem has been corrected thanks to - help from Thomas Eirich (IBM Zurich Research Lab). - -January 4, 2000 - - - Release of version 0.7.2. - - - Some users have been rightly complaining about the verbosity - TTCCLayout's date output. The full date output is now shortened to - "dd MMM YYYY HH:mm:ss.SSS" for example, "06 Nov 1994 08:49:37.459" - In addition, users may now choose to print only time information, - as in "08:49:37.459". [*] - - - The package now uses Writer instead of OutputStream as its output - target. This makes the log4j code smaller and easier to - understand at the cost of a slight performance degradation. As a - result of this change a few method names in FileAppender class were - changed. [**] - - - Preliminary experiments with SyslogAppedner and SyslogLayout show - that syslog compatibility is not far away. The difficultly is - adding syslog compatibility without making radical changes to the - current log4j architecture. - - - Corrected a bug in the NOPLog.createInstance method which always - created a Log singleton even if the system property "log4j.logType" - was set to NOPLog. Thanks to Robert Gottofrey - (Robert.Gottofrey@wdr.com) for reporting this bug and the - associated test case. - - - Removed the inconsistent "Layout" configuration option in - Log.readConfig(). This change should be transparent to most - users. [*/**] - -December 20, 1999 - - - Release of version 0.7.1. - - - The LogCreationManager class has been removed. Its functionality - has been transfered to the createInstance and getInstance methods - in the Log and NOPLog classes. The new way of creating instances is - both simpler and less error prone although just as flexible. [**] - - As a result of these changes, the init family of methods in the - ILog class have been adjusted to the new way of creating the log - singleton. - - - The Appender interface has been introduced. The method of writing a - log statement into an output stream can now be varied by using a - different Appender. The new FileAppender offers the same - functionality that was previously part of the Log class. [**] - - - Changed the time format used in TTCCLayout to be of the form "Day, - dd MMM YYYY HH:mm:ss.SSS GMT" for example, "Sun, 06 Nov 1994 - 22:49:37.459 GMT". This format is almost the same as the format - specified in RFC 1123 and also the format recommended in RFC - 2616. The only difference is the additional milliseconds - information. [*] - - - The layout specific options were not read from the configuration - file due to a missing instruction. Many thanks to Vikram Sridharan - (Vikram.Sridharan@alysis.com) to patiently pointing out this - omission to an unbelieving maintainer. [*] - -December 16, 1999 - - - Release of version 0.7.0. - - - Version 0.7.0 and above will be distributed under the IBM Public - License (IPL). The IPL is an approved open source license (see - http://www.opensource.org/licenses/ for a list). It grants similar - rights to the previous ALPHAWORKS license agreement, in particular, - the right to redistribute and to modify the package. - - - The Log class can now be parameterized with a Layout object. - Layouts determine the format of what is printed, where as the Log - class decides when to print and to where. [**] - - As a result of this modularization, the CGULog and NOPCGULog - classes no longer exists. CGULog class has been replaced with the - TTCCLayout (Time Thread Context Category). This should make it - easier to create new log output formats. - - Some time in the near future, the Log class will be further broken - down to allow different strategies for writing to output streams. - - - Renamed com.ibm.util.log hierarchy to to com.ibm.log4j. I wanted to - do this for some time. I feel release 0.7.0 was the last - opportunity to do so. I am sorry for the the trouble caused by this - change. [**/***] - - - New NDC class. This class implements nested diagnostic contexts as - suggested by Neil Harrison in the article "Patterns for Logging - Diagnostic Messages" part of the book "Pattern Languages of Program - Design 3" edited by Martin et al. Nested diagnostic contexts is a - nifty feature that was missing up to now. [*] - - The StressNDC test class seems to break JDK 1.2.2 beta on AIX. On - Linux and NT using sun's JDK 1.2.2 it seem to work OK. In any case, - tests done with StressNDC and associated perl script seem to - indicate that the NDC class is bug-free. - - - Corrected a date formatting bug in CGULog class where on some - environments the wrong month was printed. Thanks to Christopher - Williams (Christopher_Williams@mail.northgrum.com) for signaling - this bug. Also changed the month format from a number to a three - letter abbreviation such as "Jan", "Feb", ..., "Dec". The new - format is unambiguous regardless of local date format. [*] - -December 8, 1999 - - - Release of version 0.6.2. - - - Clearer documentation with still much room for improvement. - - - Corrected a bug in the Tracer class which always used the Unix line - separator instead of the system specific separator. Thanks to - Vikram Sridharan (Vikram.Sridharan@alysis.com) for singaling this - bug. [*] - - - Corrected a runaway comment which gulped the CGULog.readConfig - method. [*] - - - Added the init family of methods to the ILog class to ease the - setup of a basic logging environment. Thanks to Mark Donszelmann - (Mark.Donszelmann@cern.ch) for this enhancement. [*] - - - Just an hour after releasing version 0.6.1 detected and corrected a - bug where the Tracer class would correctly print Exception stack - trace but not the type of the Exception. Replaced the - distribution on www.zurich.ibm.com without changing the version - number. I hope nobody is using the intermediary (and buggy) release - of 0.6.1. [*] - -November 16, 1999 - - - Release of log4j version 0.6.1. - - - Better documentation with still much room for improvement. - - - For consistence sake, added setDefaultPriority and - getDefaultPriority methods to the Category class and deprecated - setDefaultPriority in the Log.class. [**] - - - Corrected a major bug where if two categories were homonyms the - second instance would not be properly initialized. - - - Increased the speed of Exception logging from about 4000 - microseconds to about 1000. It seems that for some people Exception - logging is performance critical. Improved implementation is a - variant of Nocolai's (XNH@crisplant.com) implementation. [*] - -November 9, 1999 - - - Release of log4j 0.6.0 with incomplete documentation. - - - Added a stress test program to debug the new Category class. It - turns out that the test program was as hard to get right as the - Category class. Given the favorable results of the stress test I am - quite confident that the new class is now bug free. This assumption - has been proven to be wrong. See above. - - - Created a new class called Category to manipulate categories - instead of plain Strings. The new class is just as easy to use. - However, the evaluation of whether to log or not to log is at least - 10 times faster. The NOP class performance remain unaffected by the - change. (You can't improve on the performance of an empty function - call.) - - Many thanks to Alex Blewitt "Alex.Blewitt@ioshq.com" for his - valuable comments. He was the first to observe that finding Strings - in a hash table was an expensive operation. - - This change will require some recoding on your part. See the FAQ - for more details. [***] - - - Modified the force in Log and CGULog method to use a byte[] buffer - instead of a StringBuffer. The old code was clearer but the new one - is at least 25% faster. [*] - - - Added regression testing. - - - We now enforce a policy where the OutputStream set by - setOutputStream is a user managed resource whereas the OutputStream - opened using setLogFile is the Log class' responsibility. - - The setLogFile method now closes any previous OutputStream if only - if opened through setLogFile. If the previous OutputStream was - opened by the user and set through setOutputStream the previous - OutputStream is untouched. - - Similarly, setOutputStream will close any previous OutputStream if - and only if it was opened using setLogFile. - - - Added a new method logOutputStreamExists to the Log class allowing - the programmer to check if there is already an opened stream before - trying to set a new one. A stream can be opened as a byproduct of - reading the configuration file. - - - Changed the behavior of the (private) Log.Append method in case of - failure to write to the OutputStream. - - Previously, in case of failure, we reverted to System.err. Now, we - emit a warning message and discard all future log messages. The - new behavior is consistent with our current unreliable logging - semantics. The change prevents an otherwise functional program - from failing because the terminal is flooded with logging messages. - - - Renamed the iLog to ILog to remain consistent with our class naming - scheme. The initial intention was to add ILog and deprecate - iLog. However, I am running CVS on a fat16 partition, causing - serious problems when files differ only in case. - - - Corrected a bug where the LogFileName was not remembered. Thanks to - Jens for signaling this bug. - -October 28, 1999 - - - Release of log4j v0.5a - - - Now the programmer can choose to truncate the log file instead of - always appending to it. This functionality was first requested and - intially implemented by "Jens Uwe Pipka" jens.pipka@gmx.de. [*] - - - setLogFile now opens the requested file instead of having the - Append function open it later. Cleaned up some related code in the - Append function. Although nobody has requested it, there is still - no method to close the log file. This is harder to implement - reliably than it sounds. [*] - - - Simplified setLogOutputStream so that it does no longer return the - previously set OutputStream. [*] - -October 27, 1999 - - - Released log4j v0.5 - - - Joe Walker (joe@eireneh.com) observed that the - LogCreationManager.getSingleton mechanism was cumbersome. There is - now a new class iLog (indirect Log) which hides the need to call - getSingleton. Performance testing on my 233Mhz Thinkpad shows that - this indirection has small performance impact on non-logged calls - in the order of 40 nanoseconds. The impact on logged calls is - negligible. [*] - - - Added a jar file to the distribution. The jar file contains only - the files you would need to use log but not other classes needed - for testing nor examples. - - - Corrected a bug where CGUNOPLog was not integrated to the Makefile. - - - Added new public methods isDebugEnabled and isInfoEnabled to allow - programmers to check whether a debug/info statement will be logged - without incurring the cost of message parameter construction. This - addition was suggested by Luke Blanshard Luke@quiq.com. [*] - - - Renamed the private method evaluate to isEnabled. Also made it - final with no apparent speed gains. In addition, made the - Log.force method public. [*] - - - New syntactic sugar debug, ..., emerg, methods to log objects. [*] - - - Modified the interface to deal with Throwables and not just - Exceptions. My thanks to Luke Blanshard for signaling this "bug". [*] - - - Added more tests to the LogPerformance class. In particular, to - test the influence of indirect debug calls. - - - Added a "make" mini-tutorial for those who want to modify the code. - - - License updated to standard alphaWorks license allowing - modifications to source code. However, this license explicitly - requires that modifications be communicated back to alphaWorks. - -October 15, 1999 - - - Initial availability on alphaWorks. - -Refer to the FAQ for the lineage of the package. - - diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index a7f0f5d502..620e09f250 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -4,206 +4,27 @@ [**] Changes that requiring little or no modification to existing client code. [***] Changes requiring important modifications to existing client code. - - [D] Changes affect a method or property which was previously marked as - deprecated. - - ??, 2005 - - Release of version 1.3alpha-7 - - - Chatty output about Logger creation or retrieval events is now - suppressed by default. They can be enabled by explicitly setting the - log4j.coreDebug system property. [*] - - - The log4j.debug system property no longer has any affect as all - log4j output is done through regular Logger objects. However, in - configuration file in properties format, the log4j.debug property will - cause PropertyConfigurator to *temporarily* output logs generated - during the configuration process. This is very similar to the way the - debug attribute works in configuration files in XML format. [*] - - - January 20th, 2005 - - Release of version 1.3alpha-6 - - - Fixed involuntary omission of DOMConfigrator (deprecated) in log4j-VERSION.jar. - - Added missing files in log4-oro.jar. - - The lengthy system property "log4j.repositorySelectorClass" was renamed as - "log4j.repositorySelector". - - January 19th, 2005 - - Release of version 1.3alpha-5 - - - Universal and Generic Logging Interface (UGLI) is now part of log4j. - UGLI allows variation in the logging API implementattion in a simple and - robust way. Log4j directly supports the interfaces defined by UGLI. - For more information see http://logging.apache.org/log4j/docs/ugli.html [*] - - - Log4j now ships with several jar files, one jar file per dependency. [*/**] - - - Fixed Bugzilla 15198: TelnetAppender: NullPointerException if - SocketHandler not initialized. [*] - - - Fixed Bugzilla 12112: CountingQuietWriter miscounts bytes. [*] - - - Fixed Bugzilla 18076: setting of firstTime in OnlyOnceErrorHandler. [*] - - - Added pattern conversion support for the Subject line for emails - generated by SMTPAppender. The set of patterns is the same as those - supported by PatternLayout. [*] - - Implemented Bugzilla 20985: charset support for SMTPAppender [**] - - - Implemented Bugzilla 20500: separate registry clearing from doConfigure in PropertyConfigurator - to allow to easier extension. [*] - - - Fixed Bugzilla 23912: unsafe access to BoundedFIFO in AsyncAppender. [*] - - - Changed converter register accessors in PatternParser to take/return Map instead - of HashMap, a cleaner abstraction allowing for different implementation types. [*] - - - Fixed Bugzilla 26658: modify build.xml chainsaw target with respect to crimson.jar [*] - - - Fixed Bugzilla 28682: NullPointerException in SocketHubAppender#cleanup. [*] - - - Fixed Bugzilla 28464: White space significant at end of line for PropertyConfigurator. [*] - - - Fixed Bugzilla 26117: Output encoding for TelnetAppender. [*] - November 25, 2004 + April 28th, 2005 - - Release of version 1.3alpha-3 - - - Classes are built with the javac debug setting on. - - Fixed unset activeFile bug in SlidingWindowRollingPolicy. - - November 25, 2004 + - Release of version 1.2.10 - - Release of version 1.3alpha-2 - - - The deprecated DOMConfigrator was mistakenly left as the default - configrator for XML files. This has been fixed and JoranConfigrator - now is the default configrator for XML files. - - November 24th, 2004 - - - Release of version 1.3alpha-1 - - - Log4j now uses itself for its own logging. For more details refer to + - Added support for the SLF4J project. The Logger class now + implements the ULogger interface defined by the SLF4J. See - http://www.qos.ch//logging/internalLogging.jsp - - - The Appender.requiresLayout() method is no longer needed. - - This method was only used by PropertConfigrurator and not - DOMConfigurator nor JoranConfigurator. It was never strictly necessary - and case the layout is *optional* for a given appender type, it causes - unwarranted error messages. - - This simplification will make it slightly easier to write appenders. - - - Added new printing methods message supporiting pattern parsing. These new forms - avoid superflous parameter construction and yield a significant performance - increase in the case of disavled log statements. [*] - - - Added new ListAppender & ListModelAppender classes to the org.apache.log4j.varia package. - These are rather simplistic Appender implementations that store LoggingEvents in - an internal buffer (java.util.List and a DefaultListModel respectively) which can - be useful in certain applications (such as a Swing GUI app etc). [*] - - - org.apache.log4j.HTMLLayout has been replaced with org.apache.log4j.html.HTMLLayout. - The new HTMLLayout admits a conversion pattern using the same syntax as - PatternLayout. Thus, the user can customize the content of columns in the HTML table - produced by HTMLLayout. Just as importantly, many visual aspects of the table can be - customized at row or even cell level with the help of a CSS file. - - The new HTMLLayout has been contributed by Steve Mactaggart. - - - Log4j now ships with JoranConfigurator, a powerful replacement for - DOMConfigurator. Joran bring a plethora of new capabilities. In - particular, it can be taught new parsing rules on the fly, even from - within the config file being processed. Moreover, with the help of - implicit actions, it can configure specialized sub-components of log4j - components. - - Many of the new components in version 1.3 can be configured thanks - to the new capabilitues found in JoranConfigurator. - - - Fixed bug #15585 relative to location information extraction on the AS400. The fix - was contributed by Patrice Kolata. [*] - - - Log4j will now automatically include stack traces for nested - exceptions. Log4j extends the automatic nested exception printing - available in JDK 1.4 to nested exceptions accessible through methods - named "getRootCause", "getNextException" and "getException", not just - "getCause" as in JDK 1.4. [*] - - - The location information extraction code has been refactored to use - a faster mechanism when running on JDK 1.4 or later. The new mechanism, contributed - by Martin Schulz, is at least twice as fast. - - See http://marc.theaimsgroup.com/?t=108473346700001&r=1&w=2 for more details. [*] + http://www.slf4j.org - - Made ignoresThrowable a settable property. The user can now force a layout - to ignore the throwable in the event even if the layout knows how to handle - exceptions. Conversely, an appender can be fooled to believe that a layout - handled the exception in the logging event by setting a layout's ignoresThrowable - property to false. [*] - - - The org.apache.log4j.db package replaces the old org.apache.log4j.jdbc - package. The new package supports most relational database systems - such as PostgreSQL, MySQL, Oracle, DB2 or MsSQL. It can also handle - retrieve connections using a JDBC driver class, a data source class or - JNDI. [*] - - - A sequenceNumber field has been added to LoggingEvent. This fields is useful when - checking for the equality of two logging events or when ordering them. [*] + for more detailed information. - - Log4j now has its own Scheduler. It allows jobs to be executed at a certain date - or even periodically. It only requires just one extra thread. [*] - - - Added the "isPristine" flag to LoggerRepository. As soon as a configurator - starts configuring a repository this flag is set to false. - - - Removed support for the deprecated property "log4j.configDebug". [**/D] - - - The new ContextJNDISelector allows for the possibility of managing - multiple logger hiearchies within the same application server while - only a single copy of log4j.jar is present in memory. - - - Added keys() method to the MDC class as requested by Don Isenor. - - - Certain operations on Loggers are now made using ReaderWriterLocks which - allows simultaneous read operations but only one write operation. This should - significantly improve logging throughput in heavily loaded server environments. - - - Rolling can now be triggered based on time or size as was already the case in - log4j 1.2. However, the new architecture allows for much more variation in the - timing of the rollover and the actions taken during rollover (i.e on the fly - compression, renaming, moving). The new architecture was suggested a long time - ago by James P. Cakalic. A similar design can be found in the Avalon Logkit - package. - - In order to avoid duplication, the old org.apache.log4j.RollingAppender - and org.apache.log4j.RollingAppender classes have been removed. [**] - - - LoggingEvent was extended to allow properties. Properties are meant to be set - by Layout and Appender classes as they output/process logging events. - Properties are per logging event where MDC values are per thread. - - - Another LoggingEvent constructor was added to allow instances to be reconstituted - when received from remote sources that do not use LoggingEvent as the transport - type (like XML for example). - - - Fixed bug #23096. NullAppender getInstance method is now declared as a static. - - - Fixed bug #10706. The %X pattern without a key no longer causes a NullPointer - exception, + - Fixed bug #34491 whereby the class o.a.log4j.or.jms.MessageRenderer + would not be compiled in the build.jms target. Bug reported by Andy + McBride. + + http://issues.apache.org/bugzilla/show_bug.cgi?id=34491 - - ADD: LIST OF CHAINSAW IMPROVEMENTS. + November 1st, 2004 - November 2nd, 2004 - - Release of version 1.2.9 Log4j version 1.2.9, is identical to version 1.2.8, except that @@ -218,7 +39,7 @@ preparing for log4j 1.3 at: http://www.qos.ch/logging/preparingFor13.jsp - + February 19th, 2003 - Release of version 1.2.8 @@ -230,7 +51,7 @@ - Fixed bug #12366 whereby various versions of Xerces would not parse log4j configuration scripts expressed in XML format. [*] - + - Fixed bug #14827. The "removes" buffer used in the flushBuffer() method of JDBCAppender is now cleared, solving the memory leak. Thanks to John Landers for reporting the bug and suggesting the fix. [*] diff --git a/docs/critique.html b/docs/critique.html deleted file mode 100644 index 55c2d704f6..0000000000 --- a/docs/critique.html +++ /dev/null @@ -1,294 +0,0 @@ -<HTML> -<document> - -<HEAD> -<title>JSR47 vs. log4j - - - - -
      -

      JSR47 vs. log4j

      -
      - -
      -

      I consider it quite distasteful to criticize other people's work, -especially in public. However, since the logging API included in JDK -1.4 will be considered by many as the "standard", I feel compelled to -react. I am not alone in my criticism of JSR47, Greg Davis has his own -set of comments. - -

      The JDK 1.4 logging API is a result of the JSR47 -effort, led by Graham Hamilton. - -

      Before delving into the details, some historical perspective is in -order. I am the founder of the log4j project. I participated in the -specification of the JSR47 API, although not as an expert. In 1999, I -was still working for IBM and could not join the experts group because -big blue had already Chris Barlock as a member in the JSR47 experts -group. Chris is the author of IBM's -logging toolkit for Java. - -

      On the surface, his toolkit has heavily influenced the JSR47 -API. In particular, the two share the same basic components, namely -loggers, levels, handlers and formatters. In log4j, these components -are called categories, priorities, appenders and layouts -respectively. Pairwise, they are identical in purpose. As such, the -terms logger and category, level and priority, handler and appender, -formatter and layout will be used interchangeably in the remainder of -this document. - -

      Even after a casual review it should be apparent that the log4j and -JSR47 APIs are very similar. For one, they are the only -logging APIs which are based on a named hierarchy. If you understand -one API, then understanding the concepts of the other should be a -breeze. There are differences however. - -

      On Parents and Children

      - -

      In JSR47, a parent logger knows about its children but not the -other way around. Children do not have links to their parent. For -example, the logger named "foo" knows about -"foo.bar1" and "foo.bar2". However, -"foo.bar1" has no links to its parent "foo". - -

      In log4j, it is exactly the other way around. A log4j category -contains a link to its parent but a parent does not have links to its -children. - -

      At first glance, this might look like a mundane implementation -detail but it is actually quite fundamental. - -

        -

      1. Configuration order matters - -

        In JSR47, when you set the level of a logger, say -wombat, JSR47 traverses the tree below -wombat. In other words, the levels for all the loggers -descending from wombat are overwritten. This can be a -very expensive operation for large trees. In particular, for the most -common case where one sets the level of the root logger. However, -performance is not the point I am trying to make. - -

        In log4j, changing the priority of a category involves the change -of a single field. Children categories dynamically inherit the -priority of their parent by traversing the hierarchy tree upwards. - -

        It follows that with JSR47 if you configure the level for logger -"foo.bar1" before configuring the level for "foo", then the latter -instruction will overwrite the first exactly as if the first -instruction for configuring "foo.bar1" had never -existed. Configuration order dependence is not a show stopper but -it is something that will bite you time and again. - -

        In contrast, in log4j categories can be configured in any -order. You never have to worry about configuration order. - -

      2. Limited inheritance - -

        In JSR47, a logger does not walk the hierarchy to inherit its level -but possesses a copy of it. - -

        Unfortunately, in the JSR47 API, handlers cannot be inherited -because it would be prohibitively expensive to let each logger to -contain a distinct Vector of all inherited handlers, especially in -large trees. - -

        To circumvent this problem by JSR47 defines global handlers. A -logger logs to global handlers and to the handlers attached to itself -directly. It does not inherit any handlers from the -hierarchy. - -

        In log4j, appenders are inherited additively from the hierarchy. A -category will log to the appenders attached to itself as well as the -appenders attached to its ancestors. This might not seem like much -until the day you need handler inheritance; probably a week after you -decide to adopt a logging API. - -

        Similarly, in log4j resource bundles are inherited from the -hierarchy. In JSR47, a resource bundle must be attached to -each logger individually. There is no resource bundle inheritance in -JSR47. In practice, this means that you have to choose between -internationalization and the benefits of the named logger -hierarchy. It's one or the other. This limitation is particularly -surprising because support for internationalization is advocated as -one of the primary advantages of the JSR47 API. - -

      - -

      Bogus Levels

      - -

      JSR 47 defines the levels ALL, SEVERE, -WARNING, INFO, CONFIG, -FINE, FINER, FINEST and -OFF. Experience shows that the levels ALL -and OFF are never needed. The SEVERE and -CONFIG levels are unique to JSR47. - -

      Having three debugging levels FINE, -FINER, FINEST could seem like a good -idea. However, you will soon discover that even when by yourself, it -is hard to decide when to use which level. It is plain impossible in -groups. - -

      Log4j in contrast has a limited but self-evident set of priorities: -FATAL, ERROR, WARN, -INFO and DEBUG. - -

      Both JSR47 and log4j allow the user to extend the set of -priorities. Log4j supports subclasses of priorities in configuration -files as well as across the wire. JSR47 does not. - -

      Limited functionality

      - -

      Log4j has appenders capable of logging to the console, to files, to -Unix Syslog daemons, to Microsoft NT EventLoggers, remote servers, to -JMS channels, automatically generate email etc. It can roll log files -by size or date and log asynchronously. - -

      JSR47 can log to the console, to files, to sockets and to a memory -buffer. - -

      Log4j has an extensible and powerful layout called the -PatternLayout. JSR47 offers the much weaker -SimpleFormatter as an alternative. - -

      Log4j supports configuration through property files as well as XML -documents. JSR47 currently admits only property files. Moreover, the -language of JSR47 configuration files is very weak. In particular, you -can only configure one instance of a given handler class. This -means that you can log to just one file at a time. - -

      Other differences

      - -

      There are many other details in which log4j differs from -JSR47. Even if the log4j core is small, the project contains a total -of over 30'000 lines of well-tested code. JSR47 contains about 5'000 -lines of code. - -

      Log4j has been around for a number of years, enjoys the support of -five active developers (committers) and is being used in thousands of -projects. Our site gets over 500 downloads each and every day, and the -numbers are on the rise. Log4j has been ported to C++ and -Python. Companies are also offering commercial products extending -log4j. - -

      Here is a short list of opensource projects or sites that are known -to use log4j. - -

      - - -

      By the way, log4j runs fine under JDK 1.1 and above. JSR 47 will -run under JDK 1.4 and only under JDK 1.4. Interestingly enough, no -package shipped with JDK 1.4 is using the JSR47 API. - -

      Brian R. Gilstrap has re-written JSR47 API to -run under JDK 1.2 and 1.3. He has also published an article -in JavaWorld. This is all very promising but since -java.util.logging is under the java.* -namespace, when running under JDK 1.3, you will systematically -encounter: -

      -Exception in thread "main" java.lang.ExceptionInInitializerError: java.lang.SecurityException: Prohibited package name: java.util.logging
      -        at java.lang.ClassLoader.defineClass(ClassLoader.java:477)
      -        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:111)
      -        at java.net.URLClassLoader.defineClass(URLClassLoader.java:248)
      -        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
      -        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
      -        at java.security.AccessController.doPrivileged(Native Method)
      -        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
      -        at java.lang.ClassLoader.loadClass(ClassLoader.java:297)
      -        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:286)
      -        at java.lang.ClassLoader.loadClass(ClassLoader.java:253)
      -        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:313)
      -
      - -

      Jochen Hiller had observed this problem in early 2001 when he -implemented the JSR47 API by wrapping log4j. - -

      Note that any third-party implementation using the -java.* or javax.* namespaces violates Sun's -trademark on Java. Without explicit permission from Sun, such software -remains under the threat of litigation. - -

      Error Handling

      - -In JSR 47 when an error occurs then either a -RunTimeException is thrown to the user or (in handlers -only) an internal field is set. In the first case, the -RunTimeException will cause your application to crash. In -the latter case, you can retrieve the last caught exception in the -handler by querying the getException method of that -handler. The former is totally unacceptable while the latter is -impractical. - -

      In log4j, under no circumstances are exceptions thrown at the -user. However, all appenders have an associated -ErrorHandler. This ErrorHandler is invoked -by the appender whenever a handler-specific error occurs. By default, -log4j appenders are associated with an -OnlyOnceErrorHandler which emits a message on the console -for the first error in an appender and ignoring all following errors. - -

      An ErrorHandler can implement an arbitrary error -handling policy. For example, after a failure to write to a database a -JDBCAppender can be redirected to fall back on a -FileAppender. This functionality is supported in XML -configuration files. You do not need to change a single line of client -code. - -

      But again who cares about errors, right? - -

      Performance

      - -

      Logging performance must be studied in three distinct cases: when -logging is turned off, when turned on but due to priority comparison -logic not enabled, and when actually logging. Please refer to the log4j manual for a more detailed -discussion of logging performance. - -

      When logging is turned on, log4j will be about two to three times -slower to decide whether a log statement is enabled or not. This is -due to the dynamic nature of log4j which requires it to walk the -hierarchy. To give you an idea about the figures involved, under JDK -1.4 beta, we are talking about 90 nanoseconds instead of 30 -nanoseconds on a 800Mhz Intel processor. In other words, one -million disabled logging requests will cost under a second in both -environments. - -

      In a shipped binary, you can turn off logging entirely and both -APIs will perform identically. Note that if one is not careful, the -cost of parameter construction before invoking a disabled log -statement will overwhelm any other performance consideration. -Regardless of the API you decide to use, logging statements should -never be placed in tight loops, for example, before or after an -element swap instruction in a sort algorithm. - -

      In log4j, caller localization information is optional whereas in -JSR47 it is always extracted. Since the extraction of caller -localization is a very slow operation, in the common case where caller -information is not needed, log4j will log the same information 4 to -100 times faster. - - - - diff --git a/docs/deepExtension.html b/docs/deepExtension.html deleted file mode 100644 index 05e0eb7cbb..0000000000 --- a/docs/deepExtension.html +++ /dev/null @@ -1,735 +0,0 @@ - - -Extending Log4J - - - - -

      -

      Adding Conversion Characters to PatternLayout

      - - "Paul Glezen" - - January 2001

      -
      - -
      -

      Abstract

      - -

      -This article describes a systematic way to extend the -log4j API to include -additional attributes formatted using the -PatternLayout -class. -

      -


      -

      Contents

      - -

      -


      -

      Introduction

      - -

      -This article assumes familiarity with the log4j -User Manual. It builds on fundamental -classes described in both the User Manual and the -Javadoc API. To assist in illustrating the -concepts, a simple case study will be developed along side the -explanations. The resulting classes may be used as a template -for your own extensions. Condensed (i.e. statements compressed, -comments removed) snippets of the case study code -are included in this document. - -

      The Case Study

      -The case study was developed in a CORBA environment in which the -following information for each log entry was needed. The letters in -parenthesis represent the corresponding character to be used by the -PatternLayout -class for formatting. - -

      -

        -
      • Host Name (h) - the IP address or hostname of the physical machine - on which the Category was running. -
      • Server Name (s) - The name of the application server process. In - this context, a server refers to a process that accepts requests - rather than referring to a machine. The term host refers to a - physical machine. Several servers may run on the same host. -
      • Component Name (b) - Rather than getting bogged down on what - constitutes a component, let's assume for the case study that a component - is a unit of software worth denoting in the logs. -
      • Version (v) - the version of the component from which the log entry - originated. -
      -

      -It seems odd to use "b" for the component name. Presently -PatternLayout -already defines both "C" and "c" for class name and category name respectively. - -

      A Peek Under the Hood

      -

      -In principle, if the steps described below are followed closely, there is -not a need to understand how the extended classes will be used by log4j. -But sometimes software development can be entirely unprincipled. You may -wish to extend log4j in a different manner than describe here or you may -make a mistake that requires knowledge of what is really going on. (Heaven -forbid there be a mistake in this document). In any case, it doesn't hurt -to get an idea of what's going on. -

      -The following describes a "typical" logging scenario in the un-extended log4j -case. -

      -

        -
      1. Application code invokes a log request on a -Category -object. Let's say the info method was invoked. -

        -

      2. The first thing info does is to check if logging has -been turned off entirely for the info level. If so, it returns -immediately. We'll assume for this scenario that logging has not -been turned off for the info level. -

        -

      3. Next info compares the -Priority -level for this category against Priority.INFO. Assuming -the priority warrants logging the message, the category instantiates a -LoggingEvent -object populated with information available for logging. -

        -

      4. The Category instance passes the LoggingEvent -instance to all its -Appender -implementations. -

        -

      5. Most (but not all) Appender implementations should have -an associated subclass of -Layout. -The Layout subclass is passed the LoggingEvent -instance and returns the event's information formatted in a -String according to the configuration of the Layout. -

        -When the Layout subclass is -PatternLayout, -the format of the event's information is determined by a character sequence -similar to the C language library's printf routine. -PatternLayout delegates the parsing of this character sequence to a -PatternParser -instance. -

        -When the PatternLayout was constructed, it created a -PatternParser to tokenize the character sequence. Upon -recognizing a token, the PatternParser constructs an appropriate -PatternConverter -subclass, passing it formatting information from the token. Often the -PatternConverter subclasses are implemented as static inner -classes of PatternParser. The parse method of -the PatternParser returns a linked list of these -PatternConverter subclasses. -

        -

      6. PatternLayout.format() passes the LoggingEvent -to each PatternConverter subclass in the linked list. Each link -in the list selects a particular item from the LoggingEvent, -converts this item to a String in the proper format and appends -it to a StringBuffer. -

        -

      7. The format method returns the resulting String -to the Appender for output. -
      -

      -The above discussing involved most of the classes that we must extend or -implement. -

      -

      -

      -


      -

      The Process

      -Below are steps required to add additional attributes available -for logging by extending log4j. This will allow you to specify -their output formats in the same manner as those provided by the -PatternLayout class. The steps are numbered for -reference only. It makes no difference in which order they are -followed. -

      -It's helpful if you know the attributes you wish to add and a -PatternLayout symbol for each one before you begin. Be -sure to consult the PatternLayout documentation to ensure -the symbols you select are not already in use. -

      -Before we dig in, I should give the standard lecture on comments. -If the log4j library were not well documented, it would be useless -to everyone but the log4j creators; likewise with your extensions. -Much like eating vegetables and saving the environment, we all agree -commenting code properly should be done. Yet it is often sacrificed -for more immediate pleasures. We all write code faster without -comments; especially those pesky Javadoc comments. But the reality -is that the utility of undocumented code fades exponentially with time. -

      -Since the log4j product comes with Javadoc comments together with -the documentation it produces, it makes sense to include Javadoc -comments in your extensions. By their very nature, logging tools -are strong candidates for reuse. They can only be independently -re-used if they are supported by strong documentation component. -

      -This all having been said, I have elected to remove most comments from -examples in the interest of space rather than including them to serve -as a nagging reminder. The reader is referred to the case study source -code files for a Javadoc version and a -Javadoc website -for more information on Javadoc conventions. - -

      1. Extending LoggingEvent

      - -Extending the LoggingEvent class should be one of the -trivial steps. All that is needed in the extension is the addition -of public data members representing the new attributes and a new -constructor to populate them. -

      - -
      -
      -import org.apache.log4j.Category;
      -import org.apache.log4j.Priority;
      -import org.apache.log4j.spi.LoggingEvent;
      -
      -public class AppServerLoggingEvent extends LoggingEvent
      -                                   implements java.io.Serializable 
      -{
      -   public String hostname;
      -   public String component;
      -   public String server;
      -   public String version;
      -   
      -   public AppServerLoggingEvent( String    fqnOfCategoryClass, 
      -                                 AppServerCategory  category, 
      -                                 Priority  priority, 
      -                                 Object    message, 
      -                                 Throwable throwable) 
      -   {
      -      super( fqnOfCategoryClass,
      -             category,
      -             priority,
      -             message,
      -             throwable );
      -
      -      hostname  = category.getHostname();
      -      component = category.getComponent();
      -      server    = category.getServer();
      -      version   = category.getVersion();
      -   }  
      -}
      -
      -
      -

      -The constructor demonstrates that in most cases, the Category -subclass will contain most of the information necessary to populate -the attributes of the LoggingEvent subclass. Extensions -to LoggingEvent seem no more than a collection of strings -with a constructor. Most of the work is done by the super class. - -

      2. Extending PatternLayout

      - -Extending the PatternLayout class should be another -simple matter. The extension to PatternLayout should -differ from its parent only in the creation of a -PatternParser instance. The extended -PatternLayout should create an extended -PatternParser class. Fortunately, this task in -PatternLayout is encapsulated within a single method. -

      -
      -
      -import org.apache.log4j.PatternParser;
      -import org.apache.log4j.PatternLayout;
      -
      -public class AppServerPatternLayout extends PatternLayout 
      -{
      -   public AppServerPatternLayout() 
      -   {
      -      this(DEFAULT_CONVERSION_PATTERN);
      -   }
      -
      -   public MyPatternLayout(String pattern) 
      -   {
      -      super(pattern);
      -   }
      -    
      -   public PatternParser createPatternParser(String pattern) 
      -   {
      -      PatternParser result;
      -      if ( pattern == null )
      -         result = new AppserverPatternParser( DEFAULT_CONVERSION_PATTERN );
      -      else
      -         result = new AppServerPatternParser ( pattern );
      -
      -      return result;
      -  }
      -}
      -
      -
      - -

      3. Extend PatternParser and PatternConverter

      - -Recall from our peek under the hood that the -PatternParser does much of its work in its -parse method. The PatternLayout object -instantiates a PatternParser object by passing it -the pattern string. The PatternLayout then invokes the -parse method of PatternParser to produce -a linked list of PatternConverter subclass instances. -It is this linked list of converters that is used to convert an -event instance into a string used by appenders. -

      -Our job will be to subclass PatternParser to properly -interpret formatting characters we wish to add. Fortunately, -PatternParser has been designed so that only the one -step in the parsing process differing for each formatting character -has to be overridden. The grunt work of parsing is still performed -by the PatternParser.parse() method. Only the -PatternParser.finalizeConverter method has to be -overridden. This is the method that decides which -PatternConverter to create based on a formatting -character. -

      -The extension to PatternParser, -AppServerPatternParser, is similar to its super class. -It uses -

        -
      • constants to identify the various formats -
      • a converter defined as private static inner-classes of - AppServerPatternParser. -
      • a finalizeConverter method which instantiates - the appropriate converter for a given format character. -
      -

      -AppServerPatternParser differs principally by -dedicating a separate converter type for each logging -attribute to be formatted. -Rather than placing switch logic in the converter, like its -parent class, each converter only converts one format character. -This means the decision of which converter subclass -to instantiate is made at layout instantiation time rather -than in a switch statement at logging time. -

      -It also differs in that the format constants are characters -rather than integers. -

      - -
      -
      -import org.apache.log4j.*;
      -import org.apache.log4j.helpers.FormattingInfo;
      -import org.apache.log4j.helpers.PatternConverter;
      -import org.apache.log4j.helpers.PatternParser;
      -import org.apache.log4j.spi.LoggingEvent;
      -
      -public class AppServerPatternParser extends PatternParser 
      -{
      -   static final char HOSTNAME_CHAR  = 'h';
      -   static final char SERVER_CHAR    = 's';
      -   static final char COMPONENT_CHAR = 'b';
      -   static final char VERSION_CHAR   = 'v';
      -
      -   public AppServerPatternParser(String pattern) 
      -   {
      -      super(pattern);
      -   }
      -    
      -   public void finalizeConverter(char formatChar) 
      -   {
      -      PatternConverter pc = null;
      -      switch( formatChar )
      -      {
      -         case HOSTNAME_CHAR:
      -            pc = new HostnamePatternConverter( formattingInfo );
      -            currentLiteral.setLength(0);
      -            addConverter( pc );
      -            break;
      -         case SERVER_CHAR:
      -            pc = new ServerPatternConverter( formattingInfo );
      -            currentLiteral.setLength(0);
      -            addConverter( pc );
      -            break;
      -         case COMPONENT_CHAR:
      -            pc = new ComponentPatternConverter( formattingInfo );
      -            currentLiteral.setLength(0);
      -            addConverter( pc );
      -            break;
      -         case VERSION_CHAR:
      -            pc = new VersionPatternConverter( formattingInfo );
      -            currentLiteral.setLength(0);
      -            addConverter( pc );
      -            break;
      -         default:
      -            super.finalizeConverter( formatChar );
      -      }
      -   }
      -  
      -   private static abstract class AppServerPatternConverter extends PatternConverter 
      -   {
      -      AppServerPatternConverter(FormattingInfo formattingInfo) 
      -      {
      -         super(formattingInfo);     
      -      }
      -
      -      public String convert(LoggingEvent event) 
      -      {
      -         String result = null;
      -         AppServerLoggingEvent appEvent = null;
      -
      -         if ( event instanceof AppServerLoggingEvent )
      -         {
      -            appEvent = (AppServerLoggingEvent) event;
      -            result = convert( appEvent );
      -         }
      -         return result;
      -      }
      -
      -      public abstract String convert( AppServerLoggingEvent event );
      -   }
      -
      -   private static class HostnamePatternConverter extends AppServerPatternConverter
      -   {
      -      HostnamePatternConverter( FormattingInfo formatInfo )
      -      {  super( formatInfo );  }
      -
      -      public String convert( AppServerLoggingEvent event )
      -      {  return event.hostname;  }
      -   }
      -
      -   private static class ServerPatternConverter extends AppServerPatternConverter
      -   {
      -      ServerPatternConverter( FormattingInfo formatInfo )
      -      {  super( formatInfo );  }
      -
      -      public String convert( AppServerLoggingEvent event )
      -      {  return event.server;  }
      -   }
      -
      -   private static class ComponentPatternConverter extends AppServerPatternConverter
      -   {
      -      ComponentPatternConverter( FormattingInfo formatInfo )
      -      {  super( formatInfo );  }
      -
      -      public String convert( AppServerLoggingEvent event )
      -      {  return event.component;  }
      -   }
      -
      -   private static class VersionPatternConverter extends AppServerPatternConverter
      -   {
      -      VersionPatternConverter( FormattingInfo formatInfo )
      -      {  super( formatInfo );  }
      -
      -      public String convert( AppServerLoggingEvent event )
      -      {  return event.version;  }
      -   }
      -}
      -
      -
      -

      -

      4. Extending Category

      -Extending Category and its factory will be more straight -forward than extending PatternParser and the converters. -The following tasks are involved in overridding -Category for our purposes. -

      -

        -
      • Add fields corresponding to the new attributes with their - corresponding getters and setters. -

        -

      • Override the constructor to accept or acquire information - about new attributes. -

        -

      • Override the forcedLog method to ensure that a - correctly populated instance of - AppServerLoggingEvent is instantiated rather than - the default LoggingEvent. -

        -

      • Override the getInstance method to use our - CategoryFactory (described in the next step). This will - require that we hold a static reference to our factory and provide a - way to initialize it. -
      -

      -Most of the code below is standard getter/setter verbage which has been -somewhat abbreviated. The notable parts are in bold. We add five more -attributes to Category: the four new logging attributes -plus a static AppServerCategoryFactory reference. This is -pre-initialized to an instance with attributes set to null as a -precautionary measure. Otherwise the getInstance method -will result in a null pointer exception if invoked before the -setFactory method. -

      -The getInstance method simply invokes its parent class -method that accepts a CategoryFactory reference in -addition to the category name. -

      -The forcedLog method follows closely the corresponding -parent class method. The most important difference is the instantiation -of the AppServerLoggingEvent. A minor yet necessary -difference is the use of the getRendererMap() method rather -than accessing the data member directory as in Category. -Category can do this because the rendererMap -is package level accessible. -

      -The setFactory method is provided to allow application code -to set the factory used in the getInstance method. -

      - -
      -
      -import org.apache.log4j.Priority;
      -import org.apache.log4j.Category;
      -import org.apache.log4j.spi.CategoryFactory;
      -import org.apache.log4j.spi.LoggingEvent;
      -
      -public class AppServerCategory extends Category
      -{
      -   protected String component;
      -   protected String hostname;
      -   protected String server;
      -   protected String version;
      -   private static CategoryFactory factory = 
      -                  new AppServerCategoryFactory(null, null, null);
      -
      -   protected  AppServerCategory( String categoryName,
      -                                 String hostname,
      -                                 String server,
      -                                 String component,
      -                                 String version )
      -   {
      -      super( categoryName );
      -      instanceFQN = "org.apache.log4j.examples.appserver.AppServerCategory";
      -      
      -      this.hostname  = hostname;
      -      this.server    = server;
      -      this.component = component;
      -      this.version   = version;
      -   }
      -
      -   public String getComponent()
      -   { return (component == null ) ? "" : result; }
      -
      -   public String getHostname()
      -   {  return ( hostname == null ) ? "" : hostname; }
      -
      -   public static Category getInstance(String name)
      -   {
      -      return Category.getInstance(name, factory);
      -   }
      -
      -   public String getServer()
      -   {  return ( server == null ) ? "" : server; }
      -
      -   public String getVersion()
      -   {  return ( version == null ) ? "" : version; }
      -
      -   protected void forcedLog( String    fqn, 
      -                             Priority  priority, 
      -                             Object    message, 
      -                             Throwable t) 
      -   {
      -      LoggingEvent event = new AppServerLoggingEvent(fqn, this, priority, message, t);
      -      callAppenders( event );
      -   }
      -
      -   public void setComponent(String componentName)
      -   { component = componentName; }
      -
      -   public static void setFactory(CategoryFactory factory)
      -   { AppServerCategory.factory = factory; }
      -
      -   public void setHostname(String hostname)
      -   { this.hostname = hostname; }
      -
      -   public void setServer(String serverName)
      -   { server = serverName; }
      -
      -   public void setVersion(String versionName)
      -   { version = versionName; }
      -}
      -
      -
      -

      - -

      5. Extending CategoryFactory

      - -The last step is to provide an implementation of the -CategoryFactory interface that will correctly -instantiate our AppServerCategory objects. It -will obtain the hostname of the machine on which it runs using the -java.net API. Aside from providing getters and -setters for the attributes introduced, the only method to -be implemented is the makeNewCategoryInstance. -

      -Below is a snippet from AppServerCategoryFactory -with getters, setters and comments removed. -

      - -
      -
      -import org.apache.log4j.Category;
      -import org.apache.log4j.spi.CategoryFactory;
      -import java.net.InetAddress;
      -import java.net.UnknownHostException;
      -
      -public class AppServerCategoryFactory implements CategoryFactory
      -{
      -   protected String hostname;
      -   protected String server;
      -   protected String component;
      -   protected String version;
      -   protected ResourceBundle messageBundle;
      -
      -   protected  AppServerCategoryFactory( String serverName,
      -                                        String componentName,
      -                                        String versionName )
      -   {
      -      try
      -      {
      -         hostname = java.net.InetAddress.getLocalHost().getHostName();
      -      }
      -      catch ( java.net.UnknownHostException uhe )
      -      {
      -         System.err.println("Could not determine local hostname.");
      -      }
      -
      -      server    = serverName;
      -      component = componentName;
      -      version   = versionName;
      -   }
      -
      -   public Category makeNewCategoryInstance(String name)
      -   {
      -       Category result = new AppServerCategory( name, 
      -                                                hostname, 
      -                                                server, 
      -                                                component, 
      -                                                version);
      -       return result;
      -   }
      -}
      -
      -
      -

      -


      -

      Usage

      -We now arrive at how to use what we have created. We must remember to -initialize log4j by creating an instance of -AppServerCategoryFactory and passing it to -AppServerCategory. Once done, we can obtain a -AppServerCategoryInstance anytime by using the static -getInstance method of AppServerCategory. -This will ensure that AppServerLoggingEvent instances -are generated by the category logging methods. -

      - -
      -
      -import org.apache.log4j.*;
      -import org.apache.log4j.appserver.AppServerCategory;
      -import org.apache.log4j.appserver.AppServerCategoryFactory;
      -import org.apache.log4j.appserver.AppServerPatternLayout;
      -
      -public class test
      -{
      -   private static String formatString = 
      -      "---------------------------------------------------%n" +
      -      "Time:      %d%n" +
      -      "Host:      %h%n" +
      -      "Server:    %s%n" +
      -      "Component: %b%n" +
      -      "Version:   %v%n" +
      -      "Priority:  %p%n" +
      -      "Thread Id: %t%n" +
      -      "Context:   %x%n" +
      -      "Message:   %m%n";
      -
      -   public static void main(String[] args)
      -   {
      -      AppServerCategoryFactory factory;
      -      factory = new AppServerCategoryFactory("MyServer", "MyComponent", "1.0");
      -      AppServerCategory.setFactory( factory );
      -      Category cat = AppServerCategory.getInstance("some.cat");
      -
      -      PatternLayout layout = new AppServerPatternLayout( formatString );
      -      cat.addAppender( new FileAppender( layout, System.out) );
      -
      -      cat.debug("This is a debug statement.");
      -      cat.info("This is an info statement.");
      -      cat.warn("This is a warning statement.");
      -      cat.error("This is an error statement.");
      -      cat.fatal("This is a fatal statement.");
      -   }
      -}
      -
      -
      -

      Configurators

      -There is one a word of caution concerning the use of configurators that -may create Category instances (such as - -PropertyConfigurator -and - -DOMConfigurator). Since these configurators do not -know about our extensions, any Category instances they -create will not be AppServerCategory instances. To -prevent this problem, any AppServerCategory that one -might want to be configured through a configurator should be -instantiated before the configure method is invoked. In this way, -the configurator will configure the AppServerCategory -that already exists rather than creating an instance of its super -class. -

      -The consequence of a configurator creating the super class by -mistake is merely that the extra attributes will not appear in -the log output. All other attributes are conveyed properly. -

      -


      -

      Further Enhancements

      -There are some other directions in which this log4j extension -may be enhanced: -

      -

        -
      1. The hostname attribute could incorportate a formatting convention - similar to that of class and category names whereby only a certain - number of the more significant components are displayed. But - whereas with class and category names, the most significant component - is on the right, with host names, it is on the left. -

        -

      2. Specifying a version number could be dangerous since programmers - are apt to change versions of the code without changing the - string constant in the code which specifies the version. Some - source control programs provide for insertion of a version number - into source. For those that don't, including the version number as - a constant is likely to lead to confusion later on. It would be - nice to see this short-coming addressed. - - diff --git a/docs/praise.html b/docs/praise.html deleted file mode 100755 index e6d10d0e9b..0000000000 --- a/docs/praise.html +++ /dev/null @@ -1,266 +0,0 @@ - - -Praise from log4j users - - - -

        Praise from log4j users

        - -
        -Log4J was named as a finalist in the "Most Useful New or Revised Java API/Technology" -category, and Tomcat 3.2 was named as a finalist in the "Most Innovative Java Product" category. -
        -

        JavaWorld, April 2001 - -


        -

        Log4j is an incredibly well designed and functional logging tool. I -caught the religion last summer and with every project I work on, most -everyone agrees it's a must know/have tool. Previously I was using -another Java logging library developed internally within my company -which I liked. I had no desire to learn another but did so for the -sake of due diligence. Log4j has the following features which set it -apart from others I have seen. - -

        Highly configurable - the ability to configure the -properties of your loggers (called Categories in log4j) from within a -property file is indispensible. This allows you to change the -characteristics of your logging without changing code. You can change -the logging level, the format of the output and the output targets -very easily. One can also use XML files (though I haven't). - -

        Unobtrusive - I'm finishing a project where we started using another -logging tool. The log statements were clumsily long and required using -predefined constants that were hard to remember. When writing the -initial code, "System.out.println" was so much easier to type that -people did this for tracing with the best of intentions to place -legitimate logging in later. You know the story. It never -happened. Log4j statements are shorter than "System.out.println" -statements. This encourages people to actually use it rather than -simply agreeing to. - -

        Easy configuration - With just one statement, log4j will -configure itself with a set of defaults that are useful until you get -around to actually writing your property file, XML file or -whatever. Like the point just made before, this allows log4j to be -used at the outset of coding rather than having to wait because you -haven't considered how you wish logging to be configured. The -application code itself does not have to know how logging will be -configured. - -

        Performance Concerns - Since Java does not use pre-processor -macros, most Java tracing is always compiled into the code. That means -that the decision to compile is made at runtime. There are times when -performance is so paramount that even checking whether to log is a -concern. There are other extremes where other delays make this -insignificant so that the performance is easily sacrificed for the -increased amount of information logged (such as method name, class -name and line number in source code). The log4j javadoc documentation -explains which information elements are quickly logged and which may -compromise performance. It also includes benchmarks that demonstrate -how fast certain statements are logged for a few sample machine -configurations. - -

        Hierarchical Categories - This is highly useful in component -based development. Each component has its own set of logging -categories. When individually tested, the properties of these -categories may be set however the developer wishes. When combined with -other components, the categories inherit the properties determined by -the integrator of the components. One can selectively elevate logging -priorities on one component without affecting the other -components. This is useful when you need a detailed trace from just a -single component without crowding the trace file with messages from -other components. All this can be done with property files - no change -in the code is required. - -

        Easily specified output format - Some Java and OO purist -disagree with me on this, but allowing one to use printf-style output -format specification is powerful, convenient and compact. Log4j -provides a Layout class with this capability. Of course, for those who -wish, you may implement the Layout interface yourself with something -"more OO". Naturally, the printf-style pattern can be specified in a -property file. - -

        Customization - Like other loggers, log4j is interface-based -making it possible to extend. Log4j supplies useful implementations -that are extended easily without having to implement the interface -from scratch. -

        - -

        Paul Glezen (pglezen at atdial.net), December 3rd, 2000 - -


        -This Java package is probably one of the best and most reliable packages -around, and really helps development and maintenance of quality software. -Thanks to all contributors who have made such a good work. -
        - -

        Denis Balazuc (denis.balazuc at trader.com), December 8th, 2000 - -


        This is just a quick note of thanks for publishing -your article in Javaworld. Log4j is really easy to use. While I was -initially skeptical of the idea, code like this makes me a believer in -the concept of Open Source. -
        - -

        Paul Hyndman (PaulHyndman at mynd.com), November 29th, 2000 - -


        -I just recently became aware of log4j and am just now begining to use -it. I want to thank you and the rest of the log4j development team for -making this functionality available. You are providing an outstanding -service to the development community. Please pass my regards on to the -other team members. -
        - -

        Rich Coco (racoco at celoxnetworks.com), November 16th, 2000 - - - -


        - -Just thought I'd let you know that I am using your log4j as a part of -an e-commerce application (www.consumerd.com). I am using -the XML configuration classes and have to say that I am most -impressed. -
        - -

        Richard King (Richard.King at capgemini.co.uk), October 25th, 2000 - -


        - -You should see what we've used log4j for at work... I put together -this Servlet that can interpret SOAP messages and invoke little -"handlers". Logging is pervasive through out the system, and the -handler developers can "create" their own Categories dynamically using -the getInstance method of Category. - -

        It's funny when I get an email from someone at work who's using the -toolkit with a "it didn't work" question, and I ask them to check out -the log... due to the coolness of log4j, they can track down their -mistake immediately. - -

        -

        Christopher Taylor (cstaylor at pacbell.net), September 2nd, 2000 - -


        -I am using log4j for a project I am currently working on. The -simplicity and ease with which new appenders can be written makes it -one of the best logging systems I have ever used. -
        - -

        Manish Balsara (manishb at aumsoft.com) August 28th, 2000 - -


        -Thank you for writing this incredibly effective piece of software. You -have made my and my team's lives much easier. -
        - -

        Guy Nirpaz, Java Architect (guyn at tantian.com) August -14th, 2000 - -


        -Thank you so much for developing such a -sleek package. I think it's going to be a part of many of my projects in -the future :) -
        - -

        Alice Nakajima (alice.t.nakajima at saic.com) May 10th, -2000 - - -


        -Thank you very much for your great work on log4j, which is really -powerful and flexible logging system. Log4j is now playing an -important role in our project. -
        - -

        Zeng Qiang (zeng.qiang at europeloan.com) April 26th, 2000 - -


        -
        Thank you and your team giving us a excellent tool to -help us to develop our Java applications. After evaluation, our team -is ready to use log4j as our eCare product's diagnostic strategy. -

        Jianbo Wang (jiwang at Daleen.com) April -25th, 2000 - -


        -
        -Was trying to use the log4j tracer ... great job, by the way ! - -

        Actually I'm evaluating the log4j package for use in our commercial -projects. We have our own tracer package which is by far less -powerfull and less configurable than yours. -

        -

        Joerg Palmer (Joerg.Palmer at Compart.net) April 14th, 2000 - - -


        -
        -Hooray, log4j! It's now all over my current project, and my colleagues -were pleasantly surprised at the ease of debugging. I gave them my -jarfile, it didn't work, I said "oh, just change this configuration -file" and presto, logging to a file. They're happy. -
        -

        Nelson Minar CTO, Popular Power, Inc. (nelson at popularpower.com) April 14th, 2000 - -


        -
        -I really dig your log4j package... just started using it on our linux -and os390 boxes for the java servlets we run in websphere. Still -trying to get the hang of it properly, but what I do have working is -working great. (Not to mention your makefile tutorial which has -improved my life significantly! :-) -
        -

        Anthony (ant at sanlam.co.za) April 13th, 2000 - - -


        -
        -Thanks for providing log4j: it's a very useful package. -
        -

        Andrew Harris (Andrew.Harris at capgemini.co.uk) April 10th, 2000 - -


        -
        -I just started using log4j v.0.8.1. It is quite what I was looking for. -

        So here is my "THANK YOU" to all the contributors. -I think I'll join the club. -

        -

        Avy Sharell (asharell at club-internet.fr) March 8th, 2000 - - -


        -
        -I just wanted to thank you for log4j which is a great piece of software! - -

        We are using it in the FREE e-democracy project -http://www.thecouch.org/free/ to provide an effective security audit -trail in our electronic voting software. -

        -

        Jason Kitcat (jeep at thecouch.org) March 29th, 2000 - - -


        -
        -Thanks for making log4j available. -I like the changes in v0.8 and am using it in all my java projects. -
        -

        Steven Marcus (srnm at awaretechnologies.com) February 19th, 2000 - -


        -
        -First congratulation for your great job on the Log mechanism log4j, -it's really valuable. -
        -

        Sebastien Sahuc (ssahuc at imediation.com) January 4th, 2000 - - -


        Just a few remarks to your log4j Logging-Tool. First -of all, in my opinion, it is exactly what many Java programmers need: -A small but very useful tool complementing the debugger ;-) The logs -help me to debug results generated on a distant client.

        Jens Uwe Pipka (jens.pipka at gmx.de) October 25th, 1999 - -


        - From 743e9182d8a36378ecb86eb4b156d70fbea848f0 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 29 Apr 2005 17:39:41 +0000 Subject: [PATCH 103/342] Minor chages. Preparing for 1.2.10 PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311333 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 3 +- docs/FAQ.html | 88 +++++++++++++++++++++++++++++++++++---------------- 2 files changed, 63 insertions(+), 28 deletions(-) diff --git a/build.xml b/build.xml index d0942cfc86..1a1a443b18 100644 --- a/build.xml +++ b/build.xml @@ -270,7 +270,7 @@ + includes="${stem}/net/JMS*.java, ${stem}/or/jms/*.java"> @@ -411,6 +411,7 @@ + diff --git a/docs/FAQ.html b/docs/FAQ.html index ad8e55e621..f2a9f67ede 100644 --- a/docs/FAQ.html +++ b/docs/FAQ.html @@ -83,7 +83,8 @@

        Frequently Asked Questions about log4j

    33. - +
      Question 1.6What documentation should I read to learn log4j?What documentation should I read to learn more about + log4j?
      @@ -92,6 +93,11 @@

      Frequently Asked Questions about log4j

      Question 1.7
      +
      Question 1.8 What does log output look like?
      + + +
      Question 1.9Why should I use log4j when JDK 1.4 already ships with a + logging API?

      @@ -317,7 +323,10 @@

      Frequently Asked Questions about log4j

    34. log4j is based on a named logger hierarchy.

    35. -
    36. log4j is fail-stop but not reliable.

    37. +
    38. log4j is fail-stop. However, altough it certainly + strives to ensure delivery, log4j does not guarantee that + each log statement will be delivered to its destination. +

    39. log4j is thread-safe.

    40. @@ -337,17 +346,16 @@

      Frequently Asked Questions about log4j

      remote Unix Syslog daemon, to a remote listener using JMS, to the NT EventLog or even send e-mail.

    41. -
    42. log4j uses 5 levels, namely DEBUG, INFO, WARN, ERROR and - FATAL. -

    43. +
    44. log4j uses 6 levels, namely TRACE, DEBUG, INFO, WARN, + ERROR and FATAL.

    45. The format of the log output can be easily changed by - extending the Layout class. -

    46. + extending the Layout + class.

    47. The target of the log output as well as the writing - strategy can be altered by implementations of the Appender - interface.

    48. + strategy can be altered by implementations of the + Appender interface.

    49. log4j supports multiple output appenders per logger.

    50. @@ -362,13 +370,14 @@

      Frequently Asked Questions about log4j

      See the examples/ directory.

      Make sure to read the short - manual. It is also recommended to you read The complete - log4j manual. Both documents were written by Ceki - Gülcü. + manual. It is also recommended to you read The complete + log4j manual which is much more detailed and up to + date. Both documents were written by Ceki Gülcü.

      @@ -419,6 +428,26 @@

      Frequently Asked Questions about log4j

      is the message of the statement.

      + + +

      + Although both APIs are conceptually similar, the log4j API is + significantly more flexible and offers many more features, too + numerous to be listed here. You will discover that the + additional features and flexibility turn out to be + indispensable in the context of a mission-critical + application. +

      + +

      The open and collaborative way in which log4j is developped + ensures that it continues to preserve and even widen its + competitive edge. At some point, input from bright developpers + from all over the world is bound to make a difference. +

      +
      Section 2. Using log4j
      @@ -507,9 +536,9 @@

      Frequently Asked Questions about log4j

      Better alternative based on message patterns

      -

      As of log4j version 1.3, there is a significantly more +

      As of log4j version 1.3, there exists a significantly more convenient alternative based on message patterns. Assuming - entry is a non-primitive object, you can write: + entry is an object, you can write:

      @@ -517,14 +546,17 @@

      Better alternative based on message patterns

      After evaluting whether to log or not, and only if the - decision is affirmative, the logger instace will format the - message and replace the '{}' pair with the string value of the - entry parameter within the message pattern. + decision is positive, will the logger instace format the + message and replace the '{}' pair with the string value of + entry. In other words, the paramerized form does + not incur the cost of parameter construction in case the log + statement is disabled.

      -

      Thus, the following two lines will yield the exact sane +

      Thus, the following two lines will yield the exact same output. However, the second form will perform at least 30 - times faster in case the logger is disabled for DEBUG. + (thirty) times faster in case of a disabled logging + statement.

      @@ -532,8 +564,8 @@

      Better alternative based on message patterns

      l.debug("The new entry is {}.", entry);

      -

      A 2 argument variant is also availalble. Thus, you can also - write: +

      A two argument variant is also availalble. For example, you + can write:

      l.debug("The new entry is {}. It replaces {}.", entry, oldEntry); @@ -1070,17 +1102,19 @@

      Better alternative based on message patterns

      + - -
  • diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index 293419bd71..7dcb3eff35 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -2,55 +2,56 @@ - Ceki Gulcu + Ceki Gulcu + Yoav Shapira Documentation - +
    - +

    With the exception of the complete manual, the following - documentation is included with the standard log4j distribution - and also browsable online: + documentation is included with the standard log4j distribution + and also browsable online:

    + +
    + +
    +
    +

  • Understanding + Classloaders: log4j in a J2EE Environment by Vikram Goyal +
  • +

    -

    If you would like your log4j-relateed article to be listed - here, then please send a note to the log4j-user@jakarta.apache.org - list. -

    +

  • Logging + für Java-Programme, Zu den Akten by Bernhard Bablok + in Linux Magazine, 04/2002. +
  • +

    + +

  • Instant logging: Harness the power of log4j with Jabber by Ruth Zamorano and Rafael Luque, in developerWorks 2003 +
  • +

    +

    +

  • Using Log4j in the Sun Java System Application Server by Matthew Litkey, Jay Galvin, and Marina Sum, from Sun. +
  • +

    + +

    +

  • Reporting + Application Errors by Email by Sean C. Sullivan, + 2004-09-24, published by O'Reilly. +
  • +

    + +
    - + +
    + +
    + + +
    +

    The following organisations offer log4j-related consultancy + and training services. Their inclusion on this page does + not imply endorsement by the Apache Software Foundation. +

    + + + + + +

    If you would like your log4j-related article or service + to be listed here, then please send a note to the log4j-user@logging.apache.org + list. +

    +
    + +
    diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index c6e4b3c23e..3cfc13fdc5 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -6,55 +6,45 @@ Download - - - -
    -

    log4j 1.2.8 is available in TAR.GZ format - or in ZIP - format. -

    - -

    As of release 1.2.8 log4j now searches for the file log4j.xml - as well as the file log4j.properties during - initialization. See the HISTORY file for - the firther details. -

    - -

    In addition to many performance improvements, bug fixes, and - other small enhancements, log4j 1.2 adds JMX support, Mapped - Diagnostic Contexts, JDBC logging, graphical log viewer - (chainsaw), and buffered IO capability. One important change - is the replacement of the Category class with - Logger class and the Priority class - with the Level class in order to facilitate - migrating from the JDK 1.4 logging API to log4j. -

    - -

    Version 1.2 is the 22nd major public release of log4j. All - changes except the removal of deprecated methods are backward - compatible such that log4j 1.2 can be considered a drop in - replacement for log4j 1.1.3. The only exception is the - renaming of the CategoryFactory class to - LoggerFactory class such that subclasses of - Category class must be modified and - recompiled. The recommended pattern for extending the - Logger class is wrapping. Moreover, we strongly - discourage casual users from subclassing the - Category or Logger classes. -

    - -

    We also maintain a list of earlier - versions of log4j for download, intended for the curious - paleontologist -- there seems to be quite a few of them! -

    - - -
    + + + +
    +

    Log4j is available + for download from a number of mirrors. Please + use these mirrors as they improve download time and save + bandwidth. +

    + +

    Log4j version 1.2.9, is identical to version 1.2.8, + except that several key methods have been deprecated in + preparation for version 1.3.0, the next major release of + log4j. These changes are intended to enforce the rule that + client code should never refer to the Category + class directly, but use the Logger class + instead. Similarly, client code should not refer to the + Priority class but to the Level + class instead. +

    + +

    See the document entitled preparing + for log4j 1.3 for a more detailed discussion. +

    + + + + +

    We also maintain earlier + versions of log4j for download, intended for the + curious paleontologist -- there seems to be quite a few + of them! +

    +
    + +
    @@ -64,15 +54,27 @@
    Chainsaw
    -
    Chainsaw is now integrated with log4j and ships with - the official distribution. Chainsaw is a graphical log - viewer and filter for the log4j package. It listens for LoggingEvent - objects sent using the SocketAppender - and displays them in a table. Chainsaw also supports loading - events from files in XMLLayout format. + href="chainsaw.html">Chainsaw v2 (NEW!) + +
    A new and improved version of the venerable Chainsaw + utility, now being written by the log4j development team is + getting closer to release. You can see screen shots of it and + install it and run over here +
    + + +
    DatedFileAppender
    + +
    DatedFileAppender works in the same manner as + the Tomcat FileLogger. Contrary to + DailyRollingFileAppender shipping with log4j, log + file names generated by DatedFileAppender always + contain today's date. While this distinction seems minor, it + means you can reliably copy, compress, remove or manipulate a + day's log file shortly after midnight. With the + DailyRollingFileAppender, a day's log file is not + renamed until the first message is logged some time after + midnight.
    @@ -86,7 +88,7 @@
    JDBCAppender + href="http://www.dankomannhaupt.de/projects/index.html">JDBCAppender
    A powerful JDBCAppender by Danko Mannhaupt @@ -95,9 +97,47 @@ log4j 1.2.
    + + +
    + Just4log +
    + +
    Just4Log is a library to enhance dynamically the + performance of various logging systems inside a java + application. Dynamically because the sourcecode in java is not + modified but rather the optimization occurs on the compiled + ByteCode files. +
    + + +
    log4Ant
    + +
    log4Ant includes a complete bridge to the Log4J logging systemfor a robust build monitoring system. + These Ant components let you capture, map, and send Ant log messages and stdio output through your Log4J installation. Contact contact@jware.info +
    + + +
    log4j400
    + +
    Log4J400 includes MessageQueue and DataQueue Appenders for + the AS/400 (aka IBM iSeries). +
    + + + +
    log4j2db
    + +
    This Project provides a set of EJBs to store Log4J events + (received via JMS appender) in a database. The main aim is to + provide a toolset for a centralized, data-center suitable + logging. +
    + -
    log4jME
    +
    log4jME
    Log4jME, or log4j MiniEdition, is based on the same code as log4j. However, as the name indicates the @@ -106,40 +146,39 @@ compatible with log4j standard edition. You can choose to upgrade to log4j standard edition at any time by replacing log4jME.jar with log4j.jar in your - classpath. + classpath. At this time, log4jME is only available through + CVS. +
    + + + +
    log4Unit
    + +
    Log4Unit is a JUnit extension + combining JUnit with Log4J. The intention is to create test + protocols for JUnit. + +

    JUnit is asymmetrical in the sense that it focusses on the + documentation of test failures and errors. Successful + execution of a test case is not further documented. In order + to obtain a test protocol that documents the initial settings, + the test case execution and its results, a logging component + is required. Log4J as the current de facto standard is + selected for this extension. +

    -
    LogWeb (commercial)
    +
    Log4Web (commercial)
    Log4Web is a J2EE web application, designed to web-enable system log files that have been generated by log4j.
    - -
    Lumbermill
    -
    Lumbermill is a Swing(tm) log processing and distribution - system for Log4j.
    - - - -
    - LogFactor5 - (commercial) -
    - -
    Another full-featured graphical log viewer. After a merger - and the subsequent change in business-orientation, the - owners of LogFactor5 have decided to donate their product to - the log4j project. -
    - - - +
    Log Tag
    @@ -149,6 +188,16 @@ +
    LogWeb
    + +
    LogWeb is a web interface for configuring log4j at runtime + within a servlet container. Every log4j feature of is + configurable through this interface. +
    + + + +
    SNMPTrapAppender
    @@ -161,13 +210,50 @@ +
    XpoLog +
    + +
    Log view and analysis application which enables web + browsing and analysis over logs. +
    + + +
    -
    +
    + +
    + +
    log4cxx
    +
    Log4cxx is a port to C++ of the log4j project.
    + + +
    log4net
    + +
    The .NET implementation of the popular log4j Java API + providing flexible and arbitrarily granular control over log + management and configuration.
    + + +
    log4php
    + +
    Log4Php is a PHP port of log4j framework. It supports xml configuration, + logging to files, stdout/err, syslog, socket, configurable + output layouts and logging levels.
    + +
    +
    + + +
    +
    log4c
    @@ -187,7 +273,10 @@
    log4cplus
    -
    A competing port to C++.
    +
    Log4cplus is a simple to use C++ logging API providing + thread-safe, flexible, and arbitrarily granular control over + log management and configuration. It is modeled after the Java + log4j API.
    @@ -209,13 +298,14 @@ enhanced, however the current release is stable and has been released to CPAN.
    - -
    log4net
    -
    The .NET implementation of the popular log4j Java API - providing flexible and arbitrarily granular control over log - management and configuration.
    + +
    log4LS
    + +
    Log4LS is a LotusScript library package and is used to get + logging statements to a Domino database, sent by mail or + written to a file. It is modeled after Jakarta log4j. +
    - + +

    If you would like your software to be listed here, then send a note to the log4j-user@jakarta.apache.org + href="mailto:log4j-user@logging.apache.org">log4j-user@logging.apache.org list.

    diff --git a/src/xdocs/earlier.xml b/src/xdocs/earlier.xml index f97feb4e96..f51c696068 100644 --- a/src/xdocs/earlier.xml +++ b/src/xdocs/earlier.xml @@ -12,27 +12,15 @@
    -

    BEWARE: For some reason Internet Explorer decides to - rename ".tar.gz" files as ".tar". You should rename the files back to +

    BEWARE:Certain Internet Explorer versions rename .tar.gz downloads + as .tar. You should rename the files back to tar.gz after the download completes.


    -
    -
    jakarta-log4j-1.0.4
    -
    - Download full package in TAR.GZ - format. -
    - -
    jakarta-log4j-1.1.3
    -
    - Download full package in TAR.GZ - format. -
    -
    - -
    + Log4j Archives + + diff --git a/src/xdocs/history.xml b/src/xdocs/history.xml index a59d7a6757..77f4483d27 100644 --- a/src/xdocs/history.xml +++ b/src/xdocs/history.xml @@ -17,20 +17,19 @@

    The project's official URL is http://jakarta.apache.org/log4j. + href="http://logging.apache.org/log4j">http://logging.apache.org/log4j.

    Many thanks to all the log4j users who keep sending us input - and sometimes even praise for our collective effort. The first - ancestor of log4j was written for the E.U. sponsored SEMPER project. N. Asokan, - Ceki Gülcü and Michael Steiner came up with the idea - of hierarchical loggers back in 1996. Their idea is still - at the heart of log4j. The package was considerably improved - over the years at the IBM Zurich Research - Laboratory. However, log4j is no longer associated nor - supported by IBM. + and sometimes even praise for our collective effort. The first + ancestor of log4j was written for the E.U. sponsored SEMPER project. N. Asokan, + Ceki Gülcü and Michael Steiner came up with the idea + of hierarchical loggers back in 1996. Their idea is still at the + heart of log4j. The package was considerably improved over the + years at the IBM Zurich + Research Laboratory. However, log4j is no longer associated + nor supported by IBM.

    Special thanks to M. Niksch from ZRL for his assistance on @@ -39,10 +38,7 @@ helpful in easing the move to Apache.

    -

    The log4j logo was designed and kindly donated by Cyberlab S.A. of Switzerland. +

    The log4j logo was designed and kindly donated by Cyberlab SA of Switzerland.

    diff --git a/src/xdocs/index.xml b/src/xdocs/index.xml index 73337c040c..f2b2a63024 100644 --- a/src/xdocs/index.xml +++ b/src/xdocs/index.xml @@ -56,7 +56,7 @@

    On an AMD Duron clocked at 800Mhz running JDK 1.3.1, it costs about 5 nanoseconds to determine if a logging statement should be logged or not. Actual logging is also quite fast, ranging - from 21 microseconds microseconds using the SimpleLayout, 37 + from 21 microseconds using the SimpleLayout, 37 microseconds using the TTCCLayout. The performance of the PatternLayout is almost as good as the dedicated layouts, except that it is much more flexible.

    diff --git a/src/xdocs/plan.xml b/src/xdocs/plan.xml index 7d240c8e77..a49d596a27 100644 --- a/src/xdocs/plan.xml +++ b/src/xdocs/plan.xml @@ -11,8 +11,8 @@

    The following paragragh was adapted from the Cactus - project's roadmap with the author's permission. + href="http://jakarta.apache.org/cactus/">Cactus project's + roadmap with the author's permission.

    Our users keep inventing better ways and adding new @@ -44,7 +44,7 @@ reliable product.

    - +
    @@ -63,8 +63,8 @@ as early is possible. It is strongly recommended to add a new test case with each new feature or component.

    -

    Existing Perl language based test cases are - gradually being migrated to junit (all-Java)based test +

    Existing Perl language based test cases have been + migrated to junit (all-Java)based test cases. The new tests are placed under the tests/ directory. It should be thus possible for participants in the project to understand @@ -91,14 +91,13 @@ are configured separately.

    -

    The support for extensible configuration files will be - based on the code in commons-digester authored by Craig - McClanahan and Scott Sanders. They graciously granted - permission for the modification of their code and its - inclusion in log4j.

    +

    The new JoranConfigurator being created by Ceki will be based on + a new 'module' know as Joran, which can convert XML files into other objects based + on rules. You can read more abouth Joran here +

    - + @@ -133,20 +132,35 @@ + + + + + + + - - + + @@ -157,19 +171,24 @@ extensions to XML configuration language mentioned above. - - + + - + - - + + @@ -189,8 +208,8 @@ scripts.

    - - + + @@ -232,169 +251,7 @@
    Label Cekidesign boardSignificantly progressed
    ? vaporware
    Plugins/Receivers +

    A Plugin framework has been designed and implemented.

    +

    All of the currently developed plugins are "Receivers", which can be thought of as the reverse of an appender; something + that accepts LoggingEvents from some external source. +

    +

    This has proven particulaly useful with the log4j ports, with the addition of the XML-based Receivers able to accept + LoggingEvents generated from other languages (see "Overture to other programming languages" below) +

    + +
    AllSignificantly progressed
    Improvements to Chainsaw -

    Visualisation and dynamic filtering of logging event is - bound to be a very important area of activity in the - future. A number of important improvements to chainsaw - have been suggested. +

    Chainsaw v2 development has now progressed to the point where the main developers of it + and many other members of the logging community are using it daily. It's still pre-alpha but only + because we keep thinking up things to add.

    Oliver Burnunder discusisonScott Deboy and Paul SmithSignificantly progressed
    ?not startedCekiCompleted, still testing
    Overture to other programming languagesIt is higly desriable to allow log4j ports in other languages - to access log4j services in a language independent way. -

    It is higly desriable to allow log4j ports in other languages + to access log4j services in a language independent way.

    + +

    The use of a standard XML format to represent a LoggingEvent has been established and many of the related logging projects from + non-Java languages have begun to support it. In fact, a number of the log4j ports have volunteered to join Apache!

    + +

    Scott Deboy has completed work to create a fex XML-based Receiver + classes that can accept logging events from an external source, and 'import' them into the local log4j environment.

    ?not startedCeki, Scott DeboySignificantly Progressed (if not completed)
    Kevin Steppenot startedCekiSignificantly Progressed
    - - - -
    -

    - Here is workplan for the 1.2 release. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    LabelCommentVolunteerStatus
    More test casesWe need more automated test cases to catch bugs as early - is possible.It is highly recommended to add a new test case - with each new feature or component.All committersongoing effort
    Removal of deprecated methodsDeprecated setOption and getOption - methods in appender and layouts should be removed.Cekidone
    JDBCAppender -

    We currently have two competing JDBCAppenders: one by - Thomas Fenner and the other by Kevin Steppe.

    - -

    Kevin Steppe stood up and did it.

    -
    Kevin Steppedone
    Log4j in appletsIn order to minimize network traffic, the size of log4j-core.jar - needs to be reduced to at most 50KB. - -

    Log4jME has been released. It's less than 20KB.

    -
    Cekidone
    Improved documentationLog4j documentation needs to be enhanced with configuration - examples and much more hand-holding.Cekiongoing effort
    Mapped Diagnostic ContextsMapped Diagnostic Contexts are similar to the NDC - except that the MDC is a string to string map instead of - a stack that the user sets when entering a special - context. The PatternLayout has to be - enhanced to support this by extending the %x pattern to - accept an argument. Here is an example: - -
    -    ConversionPattern=3D%d %p %c %x{server} %x{host} - %m%n
    -	    
    - - User code: -
    -    {
    -       MDC.put("server", "totoServer");
    -       MDC.put("host", "someHost");
    -	      
    -       logger.debug("Hello");
    -	      
    -    }
    -
    - will print: -
    2000-01-24 10:00:00,000 DEBUG totoServer someHost - Hello
    - -

    To make MDCs truly user friendly - ThreadLocal variables are required. This - will allow the MDC to be inherited by child - threads. ThreadLocal are only supported - under JDK 1.2 and above. In JDK 1.1, the MDC will not - work but won't harm the user application either.

    -
    Cekidone
    Enhanced variable substitution support in DOMConfiguratorCekidone
    FallbackErrorHandlerThe FallbackErrorHandler implements the ErrorHandler - interface such that a secondary appender may be - specified. This secondary appender takes over if the primary - appender fails for whatever reason. - -

    The DOMConfigurator needs to be extended to support the - FallbackErrorHandler

    - -
    Cekiimplemented, requires further testing
    Ensure backward compatibility of LoggingEvent - objectsTo avoid deployment problems we must ensure that - LoggingEvent objects are compatible between 1.2 and 1.1.3. - -

    Robert Bushman has proposed a very innovative way for - solving this problem. See - http://www.mail-archive.com/log4j-dev@jakarta.apache.org/msg01397.html - for further details. -

    -
    Cekiimplemented, manually tested, requires automated test cases
    -
    - + diff --git a/src/xdocs/stylesheets/project.xml b/src/xdocs/stylesheets/project.xml index 84432aacce..04bccb3cd2 100644 --- a/src/xdocs/stylesheets/project.xml +++ b/src/xdocs/stylesheets/project.xml @@ -1,29 +1,29 @@ - - + + Log4j project The log4j project - + + - + - - - - - - + + + + + From 4fdc3748f290170da686bb79e88406d4ed16265b Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Fri, 6 May 2005 05:37:07 +0000 Subject: [PATCH 105/342] Updated info for Mark Womack. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311337 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/contributors.xml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/xdocs/contributors.xml b/src/xdocs/contributors.xml index b8e202ba95..c855a1f0b4 100644 --- a/src/xdocs/contributors.xml +++ b/src/xdocs/contributors.xml @@ -139,17 +139,19 @@
  • Mark Womack - - - + + +

    Mark Womack has been developing software for over 12 - years. He has been developing in Java for the past 4 years, + + + - - -
    +

    Mark Womack has been developing software for over 13 + years. He has been developing in Java for the past 5 years, focusing on web application development. He has been an - active committer for the Apache Jakarta log4j project since + active committer for the Apache Logging Services log4j project since April 2002, contributing features for the upcoming v1.3 - release.

    + release. He is also a member of the Logging Services PMC.

    +
    From 50ba2b93ad731695f10d684fc6c363d81e5fdc5b Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Fri, 6 May 2005 06:00:25 +0000 Subject: [PATCH 106/342] Updated wording on 1.2.10 release. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311338 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 3612932e3b..fcc9bb3285 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -15,9 +15,9 @@ - Release of version 1.2.10 - - Version 1.2.10 was not following the accepted rules and process of the - log4j project and Logging Services Project and was recalled and removed. - Please do not use version 1.2.10. + - Version 1.2.10 was not released following the accepted rules and process of + the log4j project and Logging Services Project and was recalled and removed. + Please do not use version 1.2.10, it is not an official log4j release. November 1st, 2004 From 93a1eabd99bb215be03f310e72704880ae1b5e73 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Mon, 23 May 2005 00:38:05 +0000 Subject: [PATCH 107/342] Removing more slf4j stuff from main 1.2 branch. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311364 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/slf4j/LoggerFactory.java | 84 --------------- src/java/org/slf4j/LoggerFactoryAdapter.java | 60 ----------- src/java/org/slf4j/ULogger.java | 104 ------------------- 3 files changed, 248 deletions(-) delete mode 100644 src/java/org/slf4j/LoggerFactory.java delete mode 100644 src/java/org/slf4j/LoggerFactoryAdapter.java delete mode 100644 src/java/org/slf4j/ULogger.java diff --git a/src/java/org/slf4j/LoggerFactory.java b/src/java/org/slf4j/LoggerFactory.java deleted file mode 100644 index cf7ce74f7f..0000000000 --- a/src/java/org/slf4j/LoggerFactory.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2004-2005 SLF4J.ORG - * - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, and/or sell copies of the Software, and to permit persons - * to whom the Software is furnished to do so, provided that the above - * copyright notice(s) and this permission notice appear in all copies of - * the Software and that both the above copyright notice(s) and this - * permission notice appear in supporting documentation. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT - * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY - * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF - * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Except as contained in this notice, the name of a copyright holder - * shall not be used in advertising or otherwise to promote the sale, use - * or other dealings in this Software without prior written authorization - * of the copyright holder. - * - */ - -package org.slf4j; - -// WARNING -// WARNING Modifications MUST be made to the original file found at -// WARNING $SLF4J_HOME/src/filtered-java/org/slf4j/LoggerFactory.java -// WARNING - -/** - * The LoggerFactory can produce Loggers for various logging APIs, - * most notably for log4j, JDK 1.4 logging. Other implemenations such as - * {@link org.slf4j.impl.NOPLogger NOPLogger} and - * {@link org.slf4j.impl.SimpleLogger SimpleLogger} are also supported. - * - * @author Ceki Gülcü - */ -public class LoggerFactory { - static LoggerFactoryAdapter adapter; - - // - // WARNING Modify the original in - // $SLF4J_HOME/src/filtered-java/org/slf4j/ - - static { - String adapterClassStr = "org.slf4j.impl.Log4jLoggerFA"; - System.out.println("SLF4J built for "+adapterClassStr); - try { - adapter = new org.slf4j.impl.Log4jLoggerFA(); - } catch (Exception e) { - // unless there was a problem with the build or the JVM we will never - // get exceptions - System.err.println( - "Could not instantiate instance of class [" + adapterClassStr + "]"); - e.printStackTrace(); - } - } - - public static ULogger getLogger(String name) { - return adapter.getLogger(name); - } - - public static ULogger getLogger(String domainName, String subDomainName) { - return adapter.getLogger(domainName, subDomainName); - } - - public static ULogger getLogger(Class clazz) { - return adapter.getLogger(clazz.getName()); - } - - public static ULogger getLogger(Class clazz, String subDomainName) { - return adapter.getLogger(clazz.getName(), subDomainName); - } -} diff --git a/src/java/org/slf4j/LoggerFactoryAdapter.java b/src/java/org/slf4j/LoggerFactoryAdapter.java deleted file mode 100644 index 55b047e18c..0000000000 --- a/src/java/org/slf4j/LoggerFactoryAdapter.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2004-2005 SLF4J.ORG - * - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, and/or sell copies of the Software, and to permit persons - * to whom the Software is furnished to do so, provided that the above - * copyright notice(s) and this permission notice appear in all copies of - * the Software and that both the above copyright notice(s) and this - * permission notice appear in supporting documentation. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT - * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY - * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF - * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Except as contained in this notice, the name of a copyright holder - * shall not be used in advertising or otherwise to promote the sale, use - * or other dealings in this Software without prior written authorization - * of the copyright holder. - * - */ - -package org.slf4j; - -/** - * LoggerFactoryAdapter interface is used internally by {@link - * LoggerFactory}. - * - *

    Only developers wishing to write new UGLI adapters need to worry - * about this interface. - * - * @author Ceki Gülcü - * - */ -public interface LoggerFactoryAdapter { - - /** - * Return the appropriate named {@link ULogger} instance. - */ - public ULogger getLogger(String name); - - /** - * Return a {@link ULogger} instance in domain, subDomain. - * - * @param domain - * @param subDomain - * @return ULogger instance - */ - public ULogger getLogger(String domain, String subDomain); -} diff --git a/src/java/org/slf4j/ULogger.java b/src/java/org/slf4j/ULogger.java deleted file mode 100644 index 279178e635..0000000000 --- a/src/java/org/slf4j/ULogger.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 2004-2005 SLF4J.ORG - * - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, and/or sell copies of the Software, and to permit persons - * to whom the Software is furnished to do so, provided that the above - * copyright notice(s) and this permission notice appear in all copies of - * the Software and that both the above copyright notice(s) and this - * permission notice appear in supporting documentation. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT - * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY - * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF - * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Except as contained in this notice, the name of a copyright holder - * shall not be used in advertising or otherwise to promote the sale, use - * or other dealings in this Software without prior written authorization - * of the copyright holder. - * - */ - -package org.slf4j; - -/** - * - * The main user inteface to logging. It is expected that logging - * takes places through concerete implemetations of the ULogger - * interface. - * - * @author Ceki Gülcü - */ -public interface ULogger { - - /** - * Is the logger instance enabled for the DEBUG level? - * @return True if this ULogger is enabled for the DEBUG level, - * false otherwise. - */ - public boolean isDebugEnabled(); - - /** - * Log a message object with the DEBUG level. - * @param msg - the message object to be logged - */ - public void debug(Object msg); - - - /** - * Log a parameterized message object at the DEBUG level. - * - *

    This form is useful in avoiding the superflous object creation - * problem when invoking this method while it is disabled. - *

    - * @param parameterizedMsg - the parameterized message object - * @param param1 - the parameter - */ - public void debug(Object parameterizedMsg, Object param1); - - /** - * Log a parameterized message object at the DEBUG level. - * - *

    This form is useful in avoiding the superflous object creation - * problem when invoking this method while it is disabled. - *

    - * @param parameterizedMsg - the parameterized message object - * @param param1 - the first parameter - * @param param2 - the second parameter - */ - public void debug(String parameterizedMsg, Object param1, Object param2); - public void debug(Object msg, Throwable t); - - - public boolean isInfoEnabled(); - public void info(Object msg); - public void info(Object parameterizedMsg, Object param1); - public void info(String parameterizedMsg, Object param1, Object param2); - public void info(Object msg, Throwable t); - - - public boolean isWarnEnabled(); - public void warn(Object msg); - public void warn(Object parameterizedMsg, Object param1); - public void warn(String parameterizedMsg, Object param1, Object param2); - public void warn(Object msg, Throwable t); - - - public boolean isErrorEnabled(); - public void error(Object msg); - public void error(Object parameterizedMsg, Object param1); - public void error(String parameterizedMsg, Object param1, Object param2); - public void error(Object msg, Throwable t); - -} From 2d9790eb54d3156137713861a5c5105d40a60883 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Mon, 23 May 2005 02:03:35 +0000 Subject: [PATCH 108/342] Changed version number to 1.2.11rc1 in prep for release candidate. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311365 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 9e54f5971e..87916a0401 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + From 1cf2f9df43e3a717d230e9ba2bfc8a08d68bbab0 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Mon, 23 May 2005 02:18:37 +0000 Subject: [PATCH 109/342] Defined distribution directory property, and use through out targets. Modified clean target to remove entire dist dir, not just dist/classes. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311366 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/build.xml b/build.xml index 87916a0401..f00ea3c14e 100644 --- a/build.xml +++ b/build.xml @@ -32,11 +32,14 @@ + + + - + - + @@ -63,10 +66,10 @@ - + - + @@ -269,7 +272,7 @@ - + @@ -442,7 +445,7 @@ - + @@ -487,14 +490,14 @@ manifest.mf, INSTALL, LICENSE.txt, - dist/lib/log4j*.jar, - dist/classes/**, + ${dist.dir}/lib/log4j*.jar, + ${dist.dir}/classes/**, contribs/**" excludes="make/make.loc, **/*.bak, **/goEnv.bat, **/Makefile, **/goEnv.bat, docs/pub-support/*, - dist/classes/org/**, + ${dist.dir}/classes/org/**, src/java/org/apache/log4j/test/**/*, **/.#*"/> From ef8533d6c669647b9db34297fd9219e72f698c88 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Tue, 24 May 2005 05:06:25 +0000 Subject: [PATCH 110/342] Updates to Apache 2.0 license header in source files and LICENSE.txt. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311369 13f79535-47bb-0310-9956-ffa450edef68 --- LICENSE.txt | 250 ++++++++++++++---- contribs/CekiGulcu/AppenderTable.java | 19 +- contribs/EirikLygre/DailyFileAppender1.java | 19 +- contribs/JimMoore/LoggingOutputStream.java | 18 +- .../KevinSteppe/CompositeRollingAppender.java | 18 +- .../KitchingSimon/DatagramStringAppender.java | 19 +- .../KitchingSimon/DatagramStringWriter.java | 18 +- .../SingleLineTracerPrintWriter.java | 19 +- contribs/SvenReimers/gui/JListView.java | 19 +- contribs/SvenReimers/gui/JTableAppender.java | 19 +- .../SvenReimers/gui/TextPaneAppender.java | 19 +- .../gui/examples/TextPaneAppenderExample.java | 19 +- examples/MyPatternLayout.java | 19 +- examples/MyPatternParser.java | 19 +- examples/NumberCruncherClient.java | 19 +- examples/NumberCruncherServer.java | 19 +- .../InitUsingDefaultConfigurator.java | 18 +- .../InitUsingLog4JProperties.java | 18 +- .../InitUsingMultipleAppenders.java | 18 +- .../InitUsingPropertiesFile.java | 18 +- .../InitUsingXMLPropertiesFile.java | 18 +- .../CustomizedLogLevels.java | 18 +- .../UsingLogMonitorAdapter.java | 18 +- .../UsingSocketAppenders.java | 18 +- examples/subclass/MyLogger.java | 19 +- examples/subclass/MyLoggerFactory.java | 19 +- examples/subclass/MyLoggerTest.java | 19 +- src/java/org/apache/log4j/Appender.java | 19 +- .../org/apache/log4j/AppenderSkeleton.java | 19 +- src/java/org/apache/log4j/AsyncAppender.java | 19 +- .../org/apache/log4j/BasicConfigurator.java | 19 +- src/java/org/apache/log4j/Category.java | 19 +- src/java/org/apache/log4j/CategoryKey.java | 19 +- .../org/apache/log4j/ConsoleAppender.java | 19 +- .../log4j/DailyRollingFileAppender.java | 19 +- .../apache/log4j/DefaultCategoryFactory.java | 19 +- src/java/org/apache/log4j/FileAppender.java | 19 +- src/java/org/apache/log4j/HTMLLayout.java | 19 +- src/java/org/apache/log4j/Hierarchy.java | 19 +- src/java/org/apache/log4j/Layout.java | 19 +- src/java/org/apache/log4j/Level.java | 18 +- src/java/org/apache/log4j/LogManager.java | 19 +- src/java/org/apache/log4j/Logger.java | 19 +- src/java/org/apache/log4j/MDC.java | 18 +- src/java/org/apache/log4j/NDC.java | 18 +- src/java/org/apache/log4j/PatternLayout.java | 18 +- src/java/org/apache/log4j/Priority.java | 18 +- .../apache/log4j/PropertyConfigurator.java | 19 +- src/java/org/apache/log4j/ProvisionNode.java | 19 +- .../org/apache/log4j/RollingFileAppender.java | 19 +- src/java/org/apache/log4j/SimpleLayout.java | 18 +- src/java/org/apache/log4j/TTCCLayout.java | 18 +- src/java/org/apache/log4j/WriterAppender.java | 19 +- .../apache/log4j/chainsaw/ControlPanel.java | 19 +- .../apache/log4j/chainsaw/DetailPanel.java | 19 +- .../apache/log4j/chainsaw/EventDetails.java | 19 +- .../org/apache/log4j/chainsaw/ExitAction.java | 19 +- .../apache/log4j/chainsaw/LoadXMLAction.java | 19 +- .../log4j/chainsaw/LoggingReceiver.java | 19 +- src/java/org/apache/log4j/chainsaw/Main.java | 19 +- .../apache/log4j/chainsaw/MyTableModel.java | 19 +- .../apache/log4j/chainsaw/XMLFileHandler.java | 19 +- .../apache/log4j/config/PropertyGetter.java | 18 +- .../apache/log4j/config/PropertyPrinter.java | 18 +- .../apache/log4j/config/PropertySetter.java | 19 +- .../log4j/config/PropertySetterException.java | 19 +- .../log4j/helpers/AbsoluteTimeDateFormat.java | 19 +- .../log4j/helpers/AppenderAttachableImpl.java | 18 +- .../org/apache/log4j/helpers/BoundedFIFO.java | 18 +- .../log4j/helpers/CountingQuietWriter.java | 18 +- .../apache/log4j/helpers/CyclicBuffer.java | 18 +- .../org/apache/log4j/helpers/DateLayout.java | 18 +- .../log4j/helpers/DateTimeDateFormat.java | 19 +- .../apache/log4j/helpers/FileWatchdog.java | 18 +- .../apache/log4j/helpers/FormattingInfo.java | 18 +- .../log4j/helpers/ISO8601DateFormat.java | 18 +- src/java/org/apache/log4j/helpers/Loader.java | 19 +- src/java/org/apache/log4j/helpers/LogLog.java | 18 +- .../apache/log4j/helpers/NullEnumeration.java | 18 +- .../log4j/helpers/OnlyOnceErrorHandler.java | 18 +- .../apache/log4j/helpers/OptionConverter.java | 18 +- .../log4j/helpers/PatternConverter.java | 18 +- .../apache/log4j/helpers/PatternParser.java | 18 +- .../org/apache/log4j/helpers/QuietWriter.java | 18 +- .../log4j/helpers/RelativeTimeDateFormat.java | 19 +- .../log4j/helpers/SyslogQuietWriter.java | 18 +- .../apache/log4j/helpers/SyslogWriter.java | 18 +- .../apache/log4j/helpers/ThreadLocalMap.java | 18 +- .../org/apache/log4j/helpers/Transform.java | 19 +- .../log4j/jmx/AbstractDynamicMBean.java | 19 +- .../log4j/jmx/AppenderDynamicMBean.java | 19 +- .../log4j/jmx/HierarchyDynamicMBean.java | 19 +- .../apache/log4j/jmx/LayoutDynamicMBean.java | 19 +- .../org/apache/log4j/jmx/MethodUnion.java | 19 +- .../apache/log4j/lf5/AppenderFinalizer.java | 18 +- .../log4j/lf5/DefaultLF5Configurator.java | 18 +- .../org/apache/log4j/lf5/LF5Appender.java | 18 +- .../org/apache/log4j/lf5/Log4JLogRecord.java | 18 +- src/java/org/apache/log4j/lf5/LogLevel.java | 18 +- .../log4j/lf5/LogLevelFormatException.java | 18 +- src/java/org/apache/log4j/lf5/LogRecord.java | 18 +- .../org/apache/log4j/lf5/LogRecordFilter.java | 18 +- .../log4j/lf5/PassingLogRecordFilter.java | 18 +- .../org/apache/log4j/lf5/StartLogFactor5.java | 18 +- .../log4j/lf5/util/AdapterLogRecord.java | 18 +- .../log4j/lf5/util/DateFormatManager.java | 18 +- .../apache/log4j/lf5/util/LogFileParser.java | 18 +- .../log4j/lf5/util/LogMonitorAdapter.java | 18 +- .../org/apache/log4j/lf5/util/Resource.java | 18 +- .../apache/log4j/lf5/util/ResourceUtils.java | 18 +- .../apache/log4j/lf5/util/StreamUtils.java | 18 +- .../lf5/viewer/FilteredLogTableModel.java | 18 +- .../log4j/lf5/viewer/LF5SwingUtils.java | 18 +- .../log4j/lf5/viewer/LogBrokerMonitor.java | 18 +- .../log4j/lf5/viewer/LogFactor5Dialog.java | 18 +- .../lf5/viewer/LogFactor5ErrorDialog.java | 18 +- .../lf5/viewer/LogFactor5InputDialog.java | 18 +- .../lf5/viewer/LogFactor5LoadingDialog.java | 18 +- .../org/apache/log4j/lf5/viewer/LogTable.java | 18 +- .../log4j/lf5/viewer/LogTableColumn.java | 18 +- .../viewer/LogTableColumnFormatException.java | 18 +- .../log4j/lf5/viewer/LogTableModel.java | 18 +- .../log4j/lf5/viewer/LogTableRowRenderer.java | 18 +- .../viewer/TrackingAdjustmentListener.java | 18 +- .../CategoryAbstractCellEditor.java | 18 +- .../categoryexplorer/CategoryElement.java | 18 +- .../CategoryExplorerLogRecordFilter.java | 18 +- .../CategoryExplorerModel.java | 18 +- .../CategoryExplorerTree.java | 18 +- .../CategoryImmediateEditor.java | 18 +- .../viewer/categoryexplorer/CategoryNode.java | 18 +- .../categoryexplorer/CategoryNodeEditor.java | 18 +- .../CategoryNodeEditorRenderer.java | 18 +- .../CategoryNodeRenderer.java | 18 +- .../viewer/categoryexplorer/CategoryPath.java | 18 +- .../categoryexplorer/TreeModelAdapter.java | 18 +- .../configure/ConfigurationManager.java | 18 +- .../lf5/viewer/configure/MRUFileManager.java | 18 +- .../org/apache/log4j/net/JMSAppender.java | 19 +- src/java/org/apache/log4j/net/JMSSink.java | 19 +- .../org/apache/log4j/net/SMTPAppender.java | 19 +- .../apache/log4j/net/SimpleSocketServer.java | 19 +- .../org/apache/log4j/net/SocketAppender.java | 18 +- .../apache/log4j/net/SocketHubAppender.java | 19 +- src/java/org/apache/log4j/net/SocketNode.java | 18 +- .../org/apache/log4j/net/SocketServer.java | 19 +- .../org/apache/log4j/net/SyslogAppender.java | 19 +- .../org/apache/log4j/net/TelnetAppender.java | 19 +- src/java/org/apache/log4j/net/test/Loop.java | 19 +- .../org/apache/log4j/net/test/SMTPMin.java | 19 +- .../org/apache/log4j/net/test/SocketMin.java | 19 +- .../org/apache/log4j/net/test/SyslogMin.java | 19 +- .../apache/log4j/nt/NTEventLogAppender.java | 19 +- src/java/org/apache/log4j/nt/nteventlog.cpp | 18 +- src/java/org/apache/log4j/nt/test/NTMin.java | 19 +- .../org/apache/log4j/or/DefaultRenderer.java | 19 +- .../org/apache/log4j/or/ObjectRenderer.java | 19 +- src/java/org/apache/log4j/or/RendererMap.java | 19 +- .../apache/log4j/or/ThreadGroupRenderer.java | 19 +- .../apache/log4j/or/jms/MessageRenderer.java | 19 +- .../log4j/or/sax/AttributesRenderer.java | 19 +- .../log4j/performance/ListVsVector.java | 19 +- .../apache/log4j/performance/NOPWriter.java | 19 +- .../apache/log4j/performance/NewVsSetLen.java | 19 +- .../log4j/performance/NullAppender.java | 19 +- .../apache/log4j/performance/SystemTime.java | 19 +- .../apache/log4j/spi/AppenderAttachable.java | 19 +- .../org/apache/log4j/spi/Configurator.java | 19 +- src/java/org/apache/log4j/spi/ErrorCode.java | 19 +- .../org/apache/log4j/spi/ErrorHandler.java | 19 +- src/java/org/apache/log4j/spi/Filter.java | 19 +- .../log4j/spi/HierarchyEventListener.java | 19 +- .../org/apache/log4j/spi/LocationInfo.java | 19 +- .../org/apache/log4j/spi/LoggerFactory.java | 19 +- .../apache/log4j/spi/LoggerRepository.java | 19 +- .../org/apache/log4j/spi/LoggingEvent.java | 19 +- .../org/apache/log4j/spi/OptionHandler.java | 19 +- .../org/apache/log4j/spi/RootCategory.java | 19 +- .../log4j/spi/ThrowableInformation.java | 19 +- .../log4j/spi/TriggeringEventEvaluator.java | 19 +- .../apache/log4j/test/AsyncAppenderTest.java | 20 +- .../log4j/test/ConfigurationFileParsing.java | 19 +- src/java/org/apache/log4j/test/DRFATest.java | 19 +- .../org/apache/log4j/test/DelayedLoop.java | 19 +- src/java/org/apache/log4j/test/FQCNTest.java | 19 +- src/java/org/apache/log4j/test/Hello.java | 19 +- .../apache/log4j/test/PrintProperties.java | 18 +- src/java/org/apache/log4j/test/Shallow.java | 19 +- .../test/serialization/SerializationUT.java | 19 +- .../org/apache/log4j/varia/DenyAllFilter.java | 18 +- .../varia/ExternallyRolledFileAppender.java | 19 +- .../log4j/varia/FallbackErrorHandler.java | 18 +- .../apache/log4j/varia/LevelMatchFilter.java | 18 +- .../apache/log4j/varia/LevelRangeFilter.java | 19 +- .../org/apache/log4j/varia/NullAppender.java | 19 +- .../varia/ReloadingPropertyConfigurator.java | 18 +- src/java/org/apache/log4j/varia/Roller.java | 18 +- .../apache/log4j/varia/StringMatchFilter.java | 18 +- .../org/apache/log4j/xml/DOMConfigurator.java | 19 +- .../apache/log4j/xml/Log4jEntityResolver.java | 19 +- .../org/apache/log4j/xml/SAXErrorHandler.java | 19 +- src/java/org/apache/log4j/xml/XMLLayout.java | 19 +- .../org/apache/log4j/xml/test/DOMTest.java | 19 +- .../apache/log4j/AsyncAppenderTestCase.java | 19 +- .../java/org/apache/log4j/DRFATestCase.java | 19 +- .../log4j/HierarchyThresholdTestCase.java | 19 +- .../java/org/apache/log4j/LoggerTestCase.java | 19 +- .../org/apache/log4j/MinimumTestCase.java | 19 +- .../org/apache/log4j/MyPatternLayout.java | 19 +- .../org/apache/log4j/MyPatternParser.java | 19 +- .../apache/log4j/PatternLayoutTestCase.java | 19 +- .../java/org/apache/log4j/StressCategory.java | 19 +- .../java/org/apache/log4j/VectorAppender.java | 19 +- .../apache/log4j/customLogger/XLogger.java | 19 +- .../log4j/customLogger/XLoggerTestCase.java | 19 +- .../apache/log4j/defaultInit/TestCase1.java | 19 +- .../apache/log4j/defaultInit/TestCase2.java | 19 +- .../apache/log4j/defaultInit/TestCase3.java | 19 +- .../apache/log4j/defaultInit/TestCase4.java | 19 +- .../log4j/helpers/BoundedFIFOTestCase.java | 19 +- .../log4j/helpers/CyclicBufferTestCase.java | 19 +- .../log4j/helpers/PatternParserTestCase.java | 19 +- .../apache/log4j/net/ShortSocketServer.java | 19 +- .../log4j/net/SocketServerTestCase.java | 19 +- .../java/org/apache/log4j/or/ORTestCase.java | 19 +- .../apache/log4j/util/AbsoluteTimeFilter.java | 19 +- .../java/org/apache/log4j/util/Compare.java | 19 +- .../org/apache/log4j/util/ControlFilter.java | 19 +- .../java/org/apache/log4j/util/Filter.java | 19 +- .../org/apache/log4j/util/ISO8601Filter.java | 19 +- .../apache/log4j/util/LineNumberFilter.java | 19 +- .../apache/log4j/util/RelativeTimeFilter.java | 19 +- .../org/apache/log4j/util/Transformer.java | 19 +- .../log4j/util/UnexpectedFormatException.java | 19 +- .../log4j/util/XMLLineAttributeFilter.java | 19 +- .../apache/log4j/util/XMLTimestampFilter.java | 19 +- .../log4j/varia/LevelMatchFilterTestCase.java | 19 +- 237 files changed, 3415 insertions(+), 1228 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 007db57f8a..6279e5206d 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,48 +1,202 @@ -/* - * ============================================================================ - * The Apache Software License, Version 1.1 - * ============================================================================ - * - * Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. The end-user documentation included with the redistribution, if any, must - * include the following acknowledgment: "This product includes software - * developed by the Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, if - * and wherever such third-party acknowledgments normally appear. - * - * 4. The names "log4j" and "Apache Software Foundation" must not be used to - * endorse or promote products derived from this software without prior - * written permission. For written permission, please contact - * apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", nor may - * "Apache" appear in their name, without prior written permission of the - * Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- - * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * This software consists of voluntary contributions made by many individuals - * on behalf of the Apache Software Foundation. For more information on the - * Apache Software Foundation, please see . - * - */ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 1999-2005 The Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/contribs/CekiGulcu/AppenderTable.java b/contribs/CekiGulcu/AppenderTable.java index 3686327f87..383efce07b 100644 --- a/contribs/CekiGulcu/AppenderTable.java +++ b/contribs/CekiGulcu/AppenderTable.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ import org.apache.log4j.helpers.CyclicBuffer; diff --git a/contribs/EirikLygre/DailyFileAppender1.java b/contribs/EirikLygre/DailyFileAppender1.java index e72437747d..1f8c1da331 100644 --- a/contribs/EirikLygre/DailyFileAppender1.java +++ b/contribs/EirikLygre/DailyFileAppender1.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/contribs/JimMoore/LoggingOutputStream.java b/contribs/JimMoore/LoggingOutputStream.java index 053779f5d4..489de7ff09 100644 --- a/contribs/JimMoore/LoggingOutputStream.java +++ b/contribs/JimMoore/LoggingOutputStream.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ diff --git a/contribs/KevinSteppe/CompositeRollingAppender.java b/contribs/KevinSteppe/CompositeRollingAppender.java index 82f3709c52..4d2ace8d69 100644 --- a/contribs/KevinSteppe/CompositeRollingAppender.java +++ b/contribs/KevinSteppe/CompositeRollingAppender.java @@ -1,11 +1,19 @@ package org.apache.log4j; /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ import org.apache.log4j.RollingCalendar; diff --git a/contribs/KitchingSimon/DatagramStringAppender.java b/contribs/KitchingSimon/DatagramStringAppender.java index a532f9634c..e66cede1aa 100644 --- a/contribs/KitchingSimon/DatagramStringAppender.java +++ b/contribs/KitchingSimon/DatagramStringAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net; diff --git a/contribs/KitchingSimon/DatagramStringWriter.java b/contribs/KitchingSimon/DatagramStringWriter.java index 9f7f6bc5a6..37dd45eb7d 100644 --- a/contribs/KitchingSimon/DatagramStringWriter.java +++ b/contribs/KitchingSimon/DatagramStringWriter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.APL file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.net; diff --git a/contribs/KitchingSimon/SingleLineTracerPrintWriter.java b/contribs/KitchingSimon/SingleLineTracerPrintWriter.java index c47e0b943a..4b80fbfc61 100644 --- a/contribs/KitchingSimon/SingleLineTracerPrintWriter.java +++ b/contribs/KitchingSimon/SingleLineTracerPrintWriter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.helpers; diff --git a/contribs/SvenReimers/gui/JListView.java b/contribs/SvenReimers/gui/JListView.java index 42ce7ff729..ffd3beddb7 100644 --- a/contribs/SvenReimers/gui/JListView.java +++ b/contribs/SvenReimers/gui/JListView.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.gui; diff --git a/contribs/SvenReimers/gui/JTableAppender.java b/contribs/SvenReimers/gui/JTableAppender.java index 3197a1dc55..ed6e0af88b 100644 --- a/contribs/SvenReimers/gui/JTableAppender.java +++ b/contribs/SvenReimers/gui/JTableAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.gui; diff --git a/contribs/SvenReimers/gui/TextPaneAppender.java b/contribs/SvenReimers/gui/TextPaneAppender.java index 117c354725..841ef7c5b8 100644 --- a/contribs/SvenReimers/gui/TextPaneAppender.java +++ b/contribs/SvenReimers/gui/TextPaneAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.gui; diff --git a/contribs/SvenReimers/gui/examples/TextPaneAppenderExample.java b/contribs/SvenReimers/gui/examples/TextPaneAppenderExample.java index 2c297fdd66..5073c30a2f 100644 --- a/contribs/SvenReimers/gui/examples/TextPaneAppenderExample.java +++ b/contribs/SvenReimers/gui/examples/TextPaneAppenderExample.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.gui.examples; diff --git a/examples/MyPatternLayout.java b/examples/MyPatternLayout.java index 9116864f68..5775b5b3e6 100644 --- a/examples/MyPatternLayout.java +++ b/examples/MyPatternLayout.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package examples; diff --git a/examples/MyPatternParser.java b/examples/MyPatternParser.java index ea19c6af53..6255c06397 100644 --- a/examples/MyPatternParser.java +++ b/examples/MyPatternParser.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package examples; diff --git a/examples/NumberCruncherClient.java b/examples/NumberCruncherClient.java index 0d6e96bb26..c2c04fc181 100644 --- a/examples/NumberCruncherClient.java +++ b/examples/NumberCruncherClient.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package examples; diff --git a/examples/NumberCruncherServer.java b/examples/NumberCruncherServer.java index a5dde22737..da39d4a5b1 100644 --- a/examples/NumberCruncherServer.java +++ b/examples/NumberCruncherServer.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package examples; diff --git a/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java b/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java index e08906940b..8af4460bdf 100644 --- a/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java +++ b/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package examples.lf5.InitUsingDefaultConfigurator; diff --git a/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java b/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java index 2679d6de55..c05eeb40c4 100644 --- a/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java +++ b/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package examples.lf5.InitUsingLog4JProperties; diff --git a/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java b/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java index c3d7a31742..c026f0279b 100644 --- a/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java +++ b/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package examples.lf5.InitUsingMultipleAppenders; diff --git a/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java b/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java index 71abb94747..4125485637 100644 --- a/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java +++ b/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package examples.lf5.InitUsingPropertiesFile; diff --git a/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java b/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java index 8b21c98e3f..e46716f4fe 100644 --- a/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java +++ b/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package examples.lf5.InitUsingXMLPropertiesFile; diff --git a/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java b/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java index 832ed95842..fd63a99b1c 100644 --- a/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java +++ b/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package examples.lf5.UsingLogMonitorAdapter; diff --git a/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java b/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java index 04848592a0..77ae264e64 100644 --- a/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java +++ b/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package examples.lf5.UsingLogMonitorAdapter; diff --git a/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java b/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java index 427489013e..fcba9d5dc2 100644 --- a/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java +++ b/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package examples.lf5.UsingSocketAppenders; diff --git a/examples/subclass/MyLogger.java b/examples/subclass/MyLogger.java index 521dea5500..c57611e901 100644 --- a/examples/subclass/MyLogger.java +++ b/examples/subclass/MyLogger.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package examples.subclass; diff --git a/examples/subclass/MyLoggerFactory.java b/examples/subclass/MyLoggerFactory.java index 51fc50e497..14ffdc235e 100644 --- a/examples/subclass/MyLoggerFactory.java +++ b/examples/subclass/MyLoggerFactory.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package examples.subclass; diff --git a/examples/subclass/MyLoggerTest.java b/examples/subclass/MyLoggerTest.java index 5c69dea3de..996614fb2b 100644 --- a/examples/subclass/MyLoggerTest.java +++ b/examples/subclass/MyLoggerTest.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package examples.subclass; diff --git a/src/java/org/apache/log4j/Appender.java b/src/java/org/apache/log4j/Appender.java index aa8a3105df..665d0f9f97 100644 --- a/src/java/org/apache/log4j/Appender.java +++ b/src/java/org/apache/log4j/Appender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/AppenderSkeleton.java b/src/java/org/apache/log4j/AppenderSkeleton.java index d815fcdb69..cdccff975b 100644 --- a/src/java/org/apache/log4j/AppenderSkeleton.java +++ b/src/java/org/apache/log4j/AppenderSkeleton.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/AsyncAppender.java b/src/java/org/apache/log4j/AsyncAppender.java index 33bc061257..ba8d6b2774 100644 --- a/src/java/org/apache/log4j/AsyncAppender.java +++ b/src/java/org/apache/log4j/AsyncAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // Contibutors: Aaron Greenhouse // Thomas Tuft Muller diff --git a/src/java/org/apache/log4j/BasicConfigurator.java b/src/java/org/apache/log4j/BasicConfigurator.java index 7817965efc..211b39bcfb 100644 --- a/src/java/org/apache/log4j/BasicConfigurator.java +++ b/src/java/org/apache/log4j/BasicConfigurator.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // Contibutors: "Luke Blanshard" // "Mark DONSZELMANN" diff --git a/src/java/org/apache/log4j/Category.java b/src/java/org/apache/log4j/Category.java index d9d8f1f351..2d4850d1a1 100644 --- a/src/java/org/apache/log4j/Category.java +++ b/src/java/org/apache/log4j/Category.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // Contibutors: Alex Blewitt // Markus Oestreicher diff --git a/src/java/org/apache/log4j/CategoryKey.java b/src/java/org/apache/log4j/CategoryKey.java index b3c94ad3c5..e3fad5b0e8 100644 --- a/src/java/org/apache/log4j/CategoryKey.java +++ b/src/java/org/apache/log4j/CategoryKey.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/ConsoleAppender.java b/src/java/org/apache/log4j/ConsoleAppender.java index bd43ede034..e7487766fa 100644 --- a/src/java/org/apache/log4j/ConsoleAppender.java +++ b/src/java/org/apache/log4j/ConsoleAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/DailyRollingFileAppender.java b/src/java/org/apache/log4j/DailyRollingFileAppender.java index 50d1e9e75a..cea5038e30 100644 --- a/src/java/org/apache/log4j/DailyRollingFileAppender.java +++ b/src/java/org/apache/log4j/DailyRollingFileAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/src/java/org/apache/log4j/DefaultCategoryFactory.java b/src/java/org/apache/log4j/DefaultCategoryFactory.java index 1250084d3e..7e152939f4 100644 --- a/src/java/org/apache/log4j/DefaultCategoryFactory.java +++ b/src/java/org/apache/log4j/DefaultCategoryFactory.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/FileAppender.java b/src/java/org/apache/log4j/FileAppender.java index c1de794029..4153799a1a 100644 --- a/src/java/org/apache/log4j/FileAppender.java +++ b/src/java/org/apache/log4j/FileAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/HTMLLayout.java b/src/java/org/apache/log4j/HTMLLayout.java index 961c301770..0b15e0599e 100644 --- a/src/java/org/apache/log4j/HTMLLayout.java +++ b/src/java/org/apache/log4j/HTMLLayout.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/Hierarchy.java b/src/java/org/apache/log4j/Hierarchy.java index 5b605c1d45..e73afbf5a5 100644 --- a/src/java/org/apache/log4j/Hierarchy.java +++ b/src/java/org/apache/log4j/Hierarchy.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // WARNING This class MUST not have references to the Category or // WARNING RootCategory classes in its static initiliazation neither diff --git a/src/java/org/apache/log4j/Layout.java b/src/java/org/apache/log4j/Layout.java index b4b92c5e78..ee8cfe11e7 100644 --- a/src/java/org/apache/log4j/Layout.java +++ b/src/java/org/apache/log4j/Layout.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/Level.java b/src/java/org/apache/log4j/Level.java index 4bf4b00c9c..dbf4154298 100644 --- a/src/java/org/apache/log4j/Level.java +++ b/src/java/org/apache/log4j/Level.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ // Contributors: Kitching Simon diff --git a/src/java/org/apache/log4j/LogManager.java b/src/java/org/apache/log4j/LogManager.java index d01b99e1f2..311aa97826 100644 --- a/src/java/org/apache/log4j/LogManager.java +++ b/src/java/org/apache/log4j/LogManager.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/Logger.java b/src/java/org/apache/log4j/Logger.java index 61a36e318d..2a914aac0c 100644 --- a/src/java/org/apache/log4j/Logger.java +++ b/src/java/org/apache/log4j/Logger.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/MDC.java b/src/java/org/apache/log4j/MDC.java index 9fd93ffd8b..a12df2e3a2 100644 --- a/src/java/org/apache/log4j/MDC.java +++ b/src/java/org/apache/log4j/MDC.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/NDC.java b/src/java/org/apache/log4j/NDC.java index ee34b21091..408e75b30d 100644 --- a/src/java/org/apache/log4j/NDC.java +++ b/src/java/org/apache/log4j/NDC.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ // Contributors: Dan Milstein diff --git a/src/java/org/apache/log4j/PatternLayout.java b/src/java/org/apache/log4j/PatternLayout.java index a276f257e3..111adac462 100644 --- a/src/java/org/apache/log4j/PatternLayout.java +++ b/src/java/org/apache/log4j/PatternLayout.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/Priority.java b/src/java/org/apache/log4j/Priority.java index 61e82a4453..197b9ac155 100644 --- a/src/java/org/apache/log4j/Priority.java +++ b/src/java/org/apache/log4j/Priority.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ // Contributors: Kitching Simon diff --git a/src/java/org/apache/log4j/PropertyConfigurator.java b/src/java/org/apache/log4j/PropertyConfigurator.java index b6b99b6ac0..074637d4fe 100644 --- a/src/java/org/apache/log4j/PropertyConfigurator.java +++ b/src/java/org/apache/log4j/PropertyConfigurator.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // Contibutors: "Luke Blanshard" diff --git a/src/java/org/apache/log4j/ProvisionNode.java b/src/java/org/apache/log4j/ProvisionNode.java index 4faf539470..09ffdbfe83 100644 --- a/src/java/org/apache/log4j/ProvisionNode.java +++ b/src/java/org/apache/log4j/ProvisionNode.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/RollingFileAppender.java b/src/java/org/apache/log4j/RollingFileAppender.java index 89f680eb92..6b44da574b 100644 --- a/src/java/org/apache/log4j/RollingFileAppender.java +++ b/src/java/org/apache/log4j/RollingFileAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/src/java/org/apache/log4j/SimpleLayout.java b/src/java/org/apache/log4j/SimpleLayout.java index 8c58eeb91b..72a26d259c 100644 --- a/src/java/org/apache/log4j/SimpleLayout.java +++ b/src/java/org/apache/log4j/SimpleLayout.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/TTCCLayout.java b/src/java/org/apache/log4j/TTCCLayout.java index ceb526ac2c..99ce7374ab 100644 --- a/src/java/org/apache/log4j/TTCCLayout.java +++ b/src/java/org/apache/log4j/TTCCLayout.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ // Contributors: Christopher Williams diff --git a/src/java/org/apache/log4j/WriterAppender.java b/src/java/org/apache/log4j/WriterAppender.java index 456d35bd0d..a42b8072a8 100644 --- a/src/java/org/apache/log4j/WriterAppender.java +++ b/src/java/org/apache/log4j/WriterAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/src/java/org/apache/log4j/chainsaw/ControlPanel.java b/src/java/org/apache/log4j/chainsaw/ControlPanel.java index d9169e7100..a53f8988d4 100644 --- a/src/java/org/apache/log4j/chainsaw/ControlPanel.java +++ b/src/java/org/apache/log4j/chainsaw/ControlPanel.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.chainsaw; import java.awt.GridBagConstraints; diff --git a/src/java/org/apache/log4j/chainsaw/DetailPanel.java b/src/java/org/apache/log4j/chainsaw/DetailPanel.java index 9b28748776..2b5815c67c 100644 --- a/src/java/org/apache/log4j/chainsaw/DetailPanel.java +++ b/src/java/org/apache/log4j/chainsaw/DetailPanel.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.chainsaw; import java.awt.BorderLayout; diff --git a/src/java/org/apache/log4j/chainsaw/EventDetails.java b/src/java/org/apache/log4j/chainsaw/EventDetails.java index a0538e6dd9..da06bddc89 100644 --- a/src/java/org/apache/log4j/chainsaw/EventDetails.java +++ b/src/java/org/apache/log4j/chainsaw/EventDetails.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.chainsaw; import org.apache.log4j.Priority; diff --git a/src/java/org/apache/log4j/chainsaw/ExitAction.java b/src/java/org/apache/log4j/chainsaw/ExitAction.java index c8eda2a880..f1343c0759 100644 --- a/src/java/org/apache/log4j/chainsaw/ExitAction.java +++ b/src/java/org/apache/log4j/chainsaw/ExitAction.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.chainsaw; import java.awt.event.ActionEvent; diff --git a/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java b/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java index cc91139ae1..17d5796d88 100644 --- a/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java +++ b/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.chainsaw; import java.awt.event.ActionEvent; diff --git a/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java b/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java index 3cd3455335..be6df5797a 100644 --- a/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java +++ b/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.chainsaw; import java.io.EOFException; diff --git a/src/java/org/apache/log4j/chainsaw/Main.java b/src/java/org/apache/log4j/chainsaw/Main.java index 9dacd2868f..9426d06516 100644 --- a/src/java/org/apache/log4j/chainsaw/Main.java +++ b/src/java/org/apache/log4j/chainsaw/Main.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.chainsaw; import java.awt.BorderLayout; diff --git a/src/java/org/apache/log4j/chainsaw/MyTableModel.java b/src/java/org/apache/log4j/chainsaw/MyTableModel.java index b0d8898aaf..6f572ccf35 100644 --- a/src/java/org/apache/log4j/chainsaw/MyTableModel.java +++ b/src/java/org/apache/log4j/chainsaw/MyTableModel.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.chainsaw; import java.text.DateFormat; diff --git a/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java b/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java index 5944da3b1e..3e09f3da9e 100644 --- a/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java +++ b/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.chainsaw; import java.util.StringTokenizer; diff --git a/src/java/org/apache/log4j/config/PropertyGetter.java b/src/java/org/apache/log4j/config/PropertyGetter.java index bc88da1d2b..0354c3296b 100644 --- a/src/java/org/apache/log4j/config/PropertyGetter.java +++ b/src/java/org/apache/log4j/config/PropertyGetter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.config; diff --git a/src/java/org/apache/log4j/config/PropertyPrinter.java b/src/java/org/apache/log4j/config/PropertyPrinter.java index 77cdb5b626..8e19a704a0 100644 --- a/src/java/org/apache/log4j/config/PropertyPrinter.java +++ b/src/java/org/apache/log4j/config/PropertyPrinter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.config; diff --git a/src/java/org/apache/log4j/config/PropertySetter.java b/src/java/org/apache/log4j/config/PropertySetter.java index 8f6a15597b..6e080018b2 100644 --- a/src/java/org/apache/log4j/config/PropertySetter.java +++ b/src/java/org/apache/log4j/config/PropertySetter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // Contributors: Georg Lundesgaard diff --git a/src/java/org/apache/log4j/config/PropertySetterException.java b/src/java/org/apache/log4j/config/PropertySetterException.java index 3accdf308e..b4554b0770 100644 --- a/src/java/org/apache/log4j/config/PropertySetterException.java +++ b/src/java/org/apache/log4j/config/PropertySetterException.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.config; diff --git a/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java b/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java index c17bc8cf9e..ab9b44acb1 100644 --- a/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java +++ b/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java b/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java index d3d2680c2f..aba2751efc 100644 --- a/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java +++ b/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/BoundedFIFO.java b/src/java/org/apache/log4j/helpers/BoundedFIFO.java index 4ef8e4a3c2..865de6af56 100644 --- a/src/java/org/apache/log4j/helpers/BoundedFIFO.java +++ b/src/java/org/apache/log4j/helpers/BoundedFIFO.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ // Contributors: Mathias Bogaert diff --git a/src/java/org/apache/log4j/helpers/CountingQuietWriter.java b/src/java/org/apache/log4j/helpers/CountingQuietWriter.java index 26cf132d7e..cf440a181f 100644 --- a/src/java/org/apache/log4j/helpers/CountingQuietWriter.java +++ b/src/java/org/apache/log4j/helpers/CountingQuietWriter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/CyclicBuffer.java b/src/java/org/apache/log4j/helpers/CyclicBuffer.java index 91da4efa5f..e0a68010f4 100644 --- a/src/java/org/apache/log4j/helpers/CyclicBuffer.java +++ b/src/java/org/apache/log4j/helpers/CyclicBuffer.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/DateLayout.java b/src/java/org/apache/log4j/helpers/DateLayout.java index 9dba0c6b26..099eb16320 100644 --- a/src/java/org/apache/log4j/helpers/DateLayout.java +++ b/src/java/org/apache/log4j/helpers/DateLayout.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java b/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java index e4db3f3aa5..22a1ea769e 100644 --- a/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java +++ b/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/FileWatchdog.java b/src/java/org/apache/log4j/helpers/FileWatchdog.java index 4579fbe33a..33337516ea 100644 --- a/src/java/org/apache/log4j/helpers/FileWatchdog.java +++ b/src/java/org/apache/log4j/helpers/FileWatchdog.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ // Contributors: Mathias Bogaert diff --git a/src/java/org/apache/log4j/helpers/FormattingInfo.java b/src/java/org/apache/log4j/helpers/FormattingInfo.java index a8b5e41a38..9f17977e0e 100644 --- a/src/java/org/apache/log4j/helpers/FormattingInfo.java +++ b/src/java/org/apache/log4j/helpers/FormattingInfo.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java b/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java index b4edd13c53..033761c102 100644 --- a/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java +++ b/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/Loader.java b/src/java/org/apache/log4j/helpers/Loader.java index 4698ca602a..ac61276417 100644 --- a/src/java/org/apache/log4j/helpers/Loader.java +++ b/src/java/org/apache/log4j/helpers/Loader.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/LogLog.java b/src/java/org/apache/log4j/helpers/LogLog.java index 5c98715b0e..e93dca6c28 100644 --- a/src/java/org/apache/log4j/helpers/LogLog.java +++ b/src/java/org/apache/log4j/helpers/LogLog.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/NullEnumeration.java b/src/java/org/apache/log4j/helpers/NullEnumeration.java index b1e831909d..6516db0c3c 100644 --- a/src/java/org/apache/log4j/helpers/NullEnumeration.java +++ b/src/java/org/apache/log4j/helpers/NullEnumeration.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java b/src/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java index a793e09189..349e4b03d2 100644 --- a/src/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java +++ b/src/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/OptionConverter.java b/src/java/org/apache/log4j/helpers/OptionConverter.java index 00e7017864..e891421c6d 100644 --- a/src/java/org/apache/log4j/helpers/OptionConverter.java +++ b/src/java/org/apache/log4j/helpers/OptionConverter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/PatternConverter.java b/src/java/org/apache/log4j/helpers/PatternConverter.java index d8b7bdfeda..5c1fbd10fd 100644 --- a/src/java/org/apache/log4j/helpers/PatternConverter.java +++ b/src/java/org/apache/log4j/helpers/PatternConverter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/PatternParser.java b/src/java/org/apache/log4j/helpers/PatternParser.java index 1e78876ebe..8f63c7245c 100644 --- a/src/java/org/apache/log4j/helpers/PatternParser.java +++ b/src/java/org/apache/log4j/helpers/PatternParser.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/QuietWriter.java b/src/java/org/apache/log4j/helpers/QuietWriter.java index f000d0eef3..766cb4238d 100644 --- a/src/java/org/apache/log4j/helpers/QuietWriter.java +++ b/src/java/org/apache/log4j/helpers/QuietWriter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java b/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java index 85b6394e00..9c53b86572 100644 --- a/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java +++ b/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/SyslogQuietWriter.java b/src/java/org/apache/log4j/helpers/SyslogQuietWriter.java index 9e30777dc7..5faf168942 100644 --- a/src/java/org/apache/log4j/helpers/SyslogQuietWriter.java +++ b/src/java/org/apache/log4j/helpers/SyslogQuietWriter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/SyslogWriter.java b/src/java/org/apache/log4j/helpers/SyslogWriter.java index 50f52fe4d9..1bd268277c 100644 --- a/src/java/org/apache/log4j/helpers/SyslogWriter.java +++ b/src/java/org/apache/log4j/helpers/SyslogWriter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/ThreadLocalMap.java b/src/java/org/apache/log4j/helpers/ThreadLocalMap.java index 811314ba34..a83abfb7e9 100644 --- a/src/java/org/apache/log4j/helpers/ThreadLocalMap.java +++ b/src/java/org/apache/log4j/helpers/ThreadLocalMap.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/helpers/Transform.java b/src/java/org/apache/log4j/helpers/Transform.java index d02b63ed75..7633223b52 100644 --- a/src/java/org/apache/log4j/helpers/Transform.java +++ b/src/java/org/apache/log4j/helpers/Transform.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.helpers; diff --git a/src/java/org/apache/log4j/jmx/AbstractDynamicMBean.java b/src/java/org/apache/log4j/jmx/AbstractDynamicMBean.java index a9601e7ff2..2891a69ec3 100644 --- a/src/java/org/apache/log4j/jmx/AbstractDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/AbstractDynamicMBean.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.jmx; diff --git a/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java b/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java index 2b2aab0b45..a5ab45f5d1 100644 --- a/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.jmx; diff --git a/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java b/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java index 95097fd1e2..43795b077d 100644 --- a/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.jmx; diff --git a/src/java/org/apache/log4j/jmx/LayoutDynamicMBean.java b/src/java/org/apache/log4j/jmx/LayoutDynamicMBean.java index d9f4ac5f4d..d7fecdded7 100644 --- a/src/java/org/apache/log4j/jmx/LayoutDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/LayoutDynamicMBean.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.jmx; diff --git a/src/java/org/apache/log4j/jmx/MethodUnion.java b/src/java/org/apache/log4j/jmx/MethodUnion.java index f810d654f0..e2e6ded59a 100644 --- a/src/java/org/apache/log4j/jmx/MethodUnion.java +++ b/src/java/org/apache/log4j/jmx/MethodUnion.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.jmx; diff --git a/src/java/org/apache/log4j/lf5/AppenderFinalizer.java b/src/java/org/apache/log4j/lf5/AppenderFinalizer.java index a948b2fbc0..8ceefb8006 100644 --- a/src/java/org/apache/log4j/lf5/AppenderFinalizer.java +++ b/src/java/org/apache/log4j/lf5/AppenderFinalizer.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5; diff --git a/src/java/org/apache/log4j/lf5/DefaultLF5Configurator.java b/src/java/org/apache/log4j/lf5/DefaultLF5Configurator.java index 5932744712..fe4e000e43 100644 --- a/src/java/org/apache/log4j/lf5/DefaultLF5Configurator.java +++ b/src/java/org/apache/log4j/lf5/DefaultLF5Configurator.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5; diff --git a/src/java/org/apache/log4j/lf5/LF5Appender.java b/src/java/org/apache/log4j/lf5/LF5Appender.java index e27dbee258..b32e7b9692 100644 --- a/src/java/org/apache/log4j/lf5/LF5Appender.java +++ b/src/java/org/apache/log4j/lf5/LF5Appender.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5; diff --git a/src/java/org/apache/log4j/lf5/Log4JLogRecord.java b/src/java/org/apache/log4j/lf5/Log4JLogRecord.java index 1df491e5af..a2f7c7b9ef 100644 --- a/src/java/org/apache/log4j/lf5/Log4JLogRecord.java +++ b/src/java/org/apache/log4j/lf5/Log4JLogRecord.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5; diff --git a/src/java/org/apache/log4j/lf5/LogLevel.java b/src/java/org/apache/log4j/lf5/LogLevel.java index 82074f1230..e8723d47e7 100644 --- a/src/java/org/apache/log4j/lf5/LogLevel.java +++ b/src/java/org/apache/log4j/lf5/LogLevel.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5; diff --git a/src/java/org/apache/log4j/lf5/LogLevelFormatException.java b/src/java/org/apache/log4j/lf5/LogLevelFormatException.java index 384b829f51..fdabff118f 100644 --- a/src/java/org/apache/log4j/lf5/LogLevelFormatException.java +++ b/src/java/org/apache/log4j/lf5/LogLevelFormatException.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5; diff --git a/src/java/org/apache/log4j/lf5/LogRecord.java b/src/java/org/apache/log4j/lf5/LogRecord.java index b8ab25a199..5c7bf9707b 100644 --- a/src/java/org/apache/log4j/lf5/LogRecord.java +++ b/src/java/org/apache/log4j/lf5/LogRecord.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5; diff --git a/src/java/org/apache/log4j/lf5/LogRecordFilter.java b/src/java/org/apache/log4j/lf5/LogRecordFilter.java index 51fb78ee3e..0291b68fc2 100644 --- a/src/java/org/apache/log4j/lf5/LogRecordFilter.java +++ b/src/java/org/apache/log4j/lf5/LogRecordFilter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5; diff --git a/src/java/org/apache/log4j/lf5/PassingLogRecordFilter.java b/src/java/org/apache/log4j/lf5/PassingLogRecordFilter.java index 6424a0e2f1..8515769a77 100644 --- a/src/java/org/apache/log4j/lf5/PassingLogRecordFilter.java +++ b/src/java/org/apache/log4j/lf5/PassingLogRecordFilter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5; diff --git a/src/java/org/apache/log4j/lf5/StartLogFactor5.java b/src/java/org/apache/log4j/lf5/StartLogFactor5.java index 45d09e873e..e787cb33f5 100644 --- a/src/java/org/apache/log4j/lf5/StartLogFactor5.java +++ b/src/java/org/apache/log4j/lf5/StartLogFactor5.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5; diff --git a/src/java/org/apache/log4j/lf5/util/AdapterLogRecord.java b/src/java/org/apache/log4j/lf5/util/AdapterLogRecord.java index 6a834a7b61..20e615d04b 100644 --- a/src/java/org/apache/log4j/lf5/util/AdapterLogRecord.java +++ b/src/java/org/apache/log4j/lf5/util/AdapterLogRecord.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.util; diff --git a/src/java/org/apache/log4j/lf5/util/DateFormatManager.java b/src/java/org/apache/log4j/lf5/util/DateFormatManager.java index 18c7beba10..ea160e4a9a 100644 --- a/src/java/org/apache/log4j/lf5/util/DateFormatManager.java +++ b/src/java/org/apache/log4j/lf5/util/DateFormatManager.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.util; diff --git a/src/java/org/apache/log4j/lf5/util/LogFileParser.java b/src/java/org/apache/log4j/lf5/util/LogFileParser.java index 79bf721979..da2f224906 100644 --- a/src/java/org/apache/log4j/lf5/util/LogFileParser.java +++ b/src/java/org/apache/log4j/lf5/util/LogFileParser.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.util; diff --git a/src/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java b/src/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java index 1e568e51b0..270fda51a4 100644 --- a/src/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java +++ b/src/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.util; diff --git a/src/java/org/apache/log4j/lf5/util/Resource.java b/src/java/org/apache/log4j/lf5/util/Resource.java index 6ae81cfe67..d03566fe7a 100644 --- a/src/java/org/apache/log4j/lf5/util/Resource.java +++ b/src/java/org/apache/log4j/lf5/util/Resource.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.util; diff --git a/src/java/org/apache/log4j/lf5/util/ResourceUtils.java b/src/java/org/apache/log4j/lf5/util/ResourceUtils.java index 9c7ec62e1c..a834251a3e 100644 --- a/src/java/org/apache/log4j/lf5/util/ResourceUtils.java +++ b/src/java/org/apache/log4j/lf5/util/ResourceUtils.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.util; diff --git a/src/java/org/apache/log4j/lf5/util/StreamUtils.java b/src/java/org/apache/log4j/lf5/util/StreamUtils.java index d9e0a3dbcf..6a3cdbb103 100644 --- a/src/java/org/apache/log4j/lf5/util/StreamUtils.java +++ b/src/java/org/apache/log4j/lf5/util/StreamUtils.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.util; diff --git a/src/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java b/src/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java index f77a5bb4de..baa3fc4802 100644 --- a/src/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java +++ b/src/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java b/src/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java index 14c953a4d4..36e1a311b5 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java +++ b/src/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java b/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java index 438619e252..6ad5286938 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java b/src/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java index 0e5949e72c..61e65ed404 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java b/src/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java index c0cb85b156..5d8a63f269 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java b/src/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java index 8831d7e432..02e9e996d7 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java b/src/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java index 4ec70e2e61..2489576d8e 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTable.java b/src/java/org/apache/log4j/lf5/viewer/LogTable.java index 7f108516c5..9af517e0a8 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTable.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTable.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java b/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java index 8a17b3df73..63599a9c8d 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java b/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java index 5ccd95433c..92dec1e69e 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java b/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java index f48c0b4dbd..ef6e549965 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java b/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java index 1947977a82..d0fc48326d 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java b/src/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java index 8c14c79740..97e78f5795 100644 --- a/src/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java +++ b/src/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer; diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java index 47c20a5ab4..7e2aae9092 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.categoryexplorer; diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java index 54dc31a127..754dded388 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.categoryexplorer; diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java index 2b1b52e923..d34fb43167 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.categoryexplorer; diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java index 9d0c3fa364..54119e1281 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.categoryexplorer; diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java index a607cca3da..432a4a8def 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.categoryexplorer; diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java index 25a63e77ab..33866bf8c3 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.categoryexplorer; diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java index bc7b4a25d0..3ef0008c8f 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.categoryexplorer; diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java index 369032e0b5..541e150b85 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.categoryexplorer; diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java index 0b901cd624..d8508e24be 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.categoryexplorer; diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java index 4de68fffd9..0f47440948 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.categoryexplorer; diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java index f044c16f7c..bf73260e09 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.categoryexplorer; diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java index 4d548d4a28..32f64b063c 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.categoryexplorer; diff --git a/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java b/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java index 0fb1c26b3c..3487ef6076 100644 --- a/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java +++ b/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.configure; diff --git a/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java b/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java index 5e124ca7f2..ea78d1727c 100644 --- a/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java +++ b/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.lf5.viewer.configure; diff --git a/src/java/org/apache/log4j/net/JMSAppender.java b/src/java/org/apache/log4j/net/JMSAppender.java index a97adc47e0..ffcadff293 100644 --- a/src/java/org/apache/log4j/net/JMSAppender.java +++ b/src/java/org/apache/log4j/net/JMSAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net; diff --git a/src/java/org/apache/log4j/net/JMSSink.java b/src/java/org/apache/log4j/net/JMSSink.java index f55e62963a..e4e31d4d17 100644 --- a/src/java/org/apache/log4j/net/JMSSink.java +++ b/src/java/org/apache/log4j/net/JMSSink.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net; diff --git a/src/java/org/apache/log4j/net/SMTPAppender.java b/src/java/org/apache/log4j/net/SMTPAppender.java index 803824f7a5..deae238006 100644 --- a/src/java/org/apache/log4j/net/SMTPAppender.java +++ b/src/java/org/apache/log4j/net/SMTPAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net; diff --git a/src/java/org/apache/log4j/net/SimpleSocketServer.java b/src/java/org/apache/log4j/net/SimpleSocketServer.java index 2fddf06782..d15d880362 100644 --- a/src/java/org/apache/log4j/net/SimpleSocketServer.java +++ b/src/java/org/apache/log4j/net/SimpleSocketServer.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net; diff --git a/src/java/org/apache/log4j/net/SocketAppender.java b/src/java/org/apache/log4j/net/SocketAppender.java index ddb4145e61..fa8ced9e0a 100644 --- a/src/java/org/apache/log4j/net/SocketAppender.java +++ b/src/java/org/apache/log4j/net/SocketAppender.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ // Contributors: Dan MacDonald diff --git a/src/java/org/apache/log4j/net/SocketHubAppender.java b/src/java/org/apache/log4j/net/SocketHubAppender.java index bce55792c8..bad3ed7daa 100644 --- a/src/java/org/apache/log4j/net/SocketHubAppender.java +++ b/src/java/org/apache/log4j/net/SocketHubAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net; diff --git a/src/java/org/apache/log4j/net/SocketNode.java b/src/java/org/apache/log4j/net/SocketNode.java index 981689af19..c344eba8e5 100644 --- a/src/java/org/apache/log4j/net/SocketNode.java +++ b/src/java/org/apache/log4j/net/SocketNode.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.net; diff --git a/src/java/org/apache/log4j/net/SocketServer.java b/src/java/org/apache/log4j/net/SocketServer.java index b3f4d756a4..ae7f5f66db 100644 --- a/src/java/org/apache/log4j/net/SocketServer.java +++ b/src/java/org/apache/log4j/net/SocketServer.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net; diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/java/org/apache/log4j/net/SyslogAppender.java index a3fae197e8..e0e3cde85f 100644 --- a/src/java/org/apache/log4j/net/SyslogAppender.java +++ b/src/java/org/apache/log4j/net/SyslogAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net; diff --git a/src/java/org/apache/log4j/net/TelnetAppender.java b/src/java/org/apache/log4j/net/TelnetAppender.java index 7b203fe5d9..c089844108 100644 --- a/src/java/org/apache/log4j/net/TelnetAppender.java +++ b/src/java/org/apache/log4j/net/TelnetAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net; diff --git a/src/java/org/apache/log4j/net/test/Loop.java b/src/java/org/apache/log4j/net/test/Loop.java index a784f85976..4a2aee4ec8 100644 --- a/src/java/org/apache/log4j/net/test/Loop.java +++ b/src/java/org/apache/log4j/net/test/Loop.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net.test; diff --git a/src/java/org/apache/log4j/net/test/SMTPMin.java b/src/java/org/apache/log4j/net/test/SMTPMin.java index 0975ff000e..26f4ffaf5a 100644 --- a/src/java/org/apache/log4j/net/test/SMTPMin.java +++ b/src/java/org/apache/log4j/net/test/SMTPMin.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net.test; diff --git a/src/java/org/apache/log4j/net/test/SocketMin.java b/src/java/org/apache/log4j/net/test/SocketMin.java index 334afa66b1..162005ed2b 100644 --- a/src/java/org/apache/log4j/net/test/SocketMin.java +++ b/src/java/org/apache/log4j/net/test/SocketMin.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net.test; diff --git a/src/java/org/apache/log4j/net/test/SyslogMin.java b/src/java/org/apache/log4j/net/test/SyslogMin.java index 5bca2feb12..9221f1cf79 100644 --- a/src/java/org/apache/log4j/net/test/SyslogMin.java +++ b/src/java/org/apache/log4j/net/test/SyslogMin.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.net.test; diff --git a/src/java/org/apache/log4j/nt/NTEventLogAppender.java b/src/java/org/apache/log4j/nt/NTEventLogAppender.java index b4012394a7..d314f627ea 100644 --- a/src/java/org/apache/log4j/nt/NTEventLogAppender.java +++ b/src/java/org/apache/log4j/nt/NTEventLogAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.nt; diff --git a/src/java/org/apache/log4j/nt/nteventlog.cpp b/src/java/org/apache/log4j/nt/nteventlog.cpp index ba8453c161..b771b8a673 100644 --- a/src/java/org/apache/log4j/nt/nteventlog.cpp +++ b/src/java/org/apache/log4j/nt/nteventlog.cpp @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ #ifndef NtEventLogAppender_h diff --git a/src/java/org/apache/log4j/nt/test/NTMin.java b/src/java/org/apache/log4j/nt/test/NTMin.java index 6a463877a9..5c30760d57 100644 --- a/src/java/org/apache/log4j/nt/test/NTMin.java +++ b/src/java/org/apache/log4j/nt/test/NTMin.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.nt.test; diff --git a/src/java/org/apache/log4j/or/DefaultRenderer.java b/src/java/org/apache/log4j/or/DefaultRenderer.java index acf191d5a7..5acada45e9 100644 --- a/src/java/org/apache/log4j/or/DefaultRenderer.java +++ b/src/java/org/apache/log4j/or/DefaultRenderer.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.or; diff --git a/src/java/org/apache/log4j/or/ObjectRenderer.java b/src/java/org/apache/log4j/or/ObjectRenderer.java index 843bad4d06..32f089a7b5 100644 --- a/src/java/org/apache/log4j/or/ObjectRenderer.java +++ b/src/java/org/apache/log4j/or/ObjectRenderer.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.or; diff --git a/src/java/org/apache/log4j/or/RendererMap.java b/src/java/org/apache/log4j/or/RendererMap.java index e71bdd7d18..25cbb5ee78 100644 --- a/src/java/org/apache/log4j/or/RendererMap.java +++ b/src/java/org/apache/log4j/or/RendererMap.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.or; diff --git a/src/java/org/apache/log4j/or/ThreadGroupRenderer.java b/src/java/org/apache/log4j/or/ThreadGroupRenderer.java index 3f63860409..30a85d32b3 100644 --- a/src/java/org/apache/log4j/or/ThreadGroupRenderer.java +++ b/src/java/org/apache/log4j/or/ThreadGroupRenderer.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.or; diff --git a/src/java/org/apache/log4j/or/jms/MessageRenderer.java b/src/java/org/apache/log4j/or/jms/MessageRenderer.java index b1da5f8518..6460917bf1 100644 --- a/src/java/org/apache/log4j/or/jms/MessageRenderer.java +++ b/src/java/org/apache/log4j/or/jms/MessageRenderer.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.or.jms; diff --git a/src/java/org/apache/log4j/or/sax/AttributesRenderer.java b/src/java/org/apache/log4j/or/sax/AttributesRenderer.java index 73f006f8f7..0fd9bbdfab 100644 --- a/src/java/org/apache/log4j/or/sax/AttributesRenderer.java +++ b/src/java/org/apache/log4j/or/sax/AttributesRenderer.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.or.sax; diff --git a/src/java/org/apache/log4j/performance/ListVsVector.java b/src/java/org/apache/log4j/performance/ListVsVector.java index 6322d02a88..569893e50b 100644 --- a/src/java/org/apache/log4j/performance/ListVsVector.java +++ b/src/java/org/apache/log4j/performance/ListVsVector.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.performance; diff --git a/src/java/org/apache/log4j/performance/NOPWriter.java b/src/java/org/apache/log4j/performance/NOPWriter.java index 6876544b08..d35592832c 100644 --- a/src/java/org/apache/log4j/performance/NOPWriter.java +++ b/src/java/org/apache/log4j/performance/NOPWriter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.performance; diff --git a/src/java/org/apache/log4j/performance/NewVsSetLen.java b/src/java/org/apache/log4j/performance/NewVsSetLen.java index b69b80ea84..2927889ced 100644 --- a/src/java/org/apache/log4j/performance/NewVsSetLen.java +++ b/src/java/org/apache/log4j/performance/NewVsSetLen.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.performance; diff --git a/src/java/org/apache/log4j/performance/NullAppender.java b/src/java/org/apache/log4j/performance/NullAppender.java index 937c58a1dd..366b056ccb 100644 --- a/src/java/org/apache/log4j/performance/NullAppender.java +++ b/src/java/org/apache/log4j/performance/NullAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.performance; diff --git a/src/java/org/apache/log4j/performance/SystemTime.java b/src/java/org/apache/log4j/performance/SystemTime.java index 44bf68b196..3e0794c6b2 100644 --- a/src/java/org/apache/log4j/performance/SystemTime.java +++ b/src/java/org/apache/log4j/performance/SystemTime.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.performance; diff --git a/src/java/org/apache/log4j/spi/AppenderAttachable.java b/src/java/org/apache/log4j/spi/AppenderAttachable.java index 3b4cde3f11..b0ec94739c 100644 --- a/src/java/org/apache/log4j/spi/AppenderAttachable.java +++ b/src/java/org/apache/log4j/spi/AppenderAttachable.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/Configurator.java b/src/java/org/apache/log4j/spi/Configurator.java index d862a0e17e..ae4ba70d2c 100644 --- a/src/java/org/apache/log4j/spi/Configurator.java +++ b/src/java/org/apache/log4j/spi/Configurator.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/ErrorCode.java b/src/java/org/apache/log4j/spi/ErrorCode.java index d56cdf99c1..2e63f4d08e 100644 --- a/src/java/org/apache/log4j/spi/ErrorCode.java +++ b/src/java/org/apache/log4j/spi/ErrorCode.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/ErrorHandler.java b/src/java/org/apache/log4j/spi/ErrorHandler.java index 9eb70a2884..11a949344e 100644 --- a/src/java/org/apache/log4j/spi/ErrorHandler.java +++ b/src/java/org/apache/log4j/spi/ErrorHandler.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/Filter.java b/src/java/org/apache/log4j/spi/Filter.java index ffa564d38d..272e6ab18a 100644 --- a/src/java/org/apache/log4j/spi/Filter.java +++ b/src/java/org/apache/log4j/spi/Filter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/HierarchyEventListener.java b/src/java/org/apache/log4j/spi/HierarchyEventListener.java index 2837d1e1f0..d3162671e6 100644 --- a/src/java/org/apache/log4j/spi/HierarchyEventListener.java +++ b/src/java/org/apache/log4j/spi/HierarchyEventListener.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/LocationInfo.java b/src/java/org/apache/log4j/spi/LocationInfo.java index eb0d505aa4..68d73ee6d9 100644 --- a/src/java/org/apache/log4j/spi/LocationInfo.java +++ b/src/java/org/apache/log4j/spi/LocationInfo.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // Contributors: Mathias Rupprecht diff --git a/src/java/org/apache/log4j/spi/LoggerFactory.java b/src/java/org/apache/log4j/spi/LoggerFactory.java index 423deafc73..0326f68447 100644 --- a/src/java/org/apache/log4j/spi/LoggerFactory.java +++ b/src/java/org/apache/log4j/spi/LoggerFactory.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/LoggerRepository.java b/src/java/org/apache/log4j/spi/LoggerRepository.java index 11e468ff3a..e4d8243e71 100644 --- a/src/java/org/apache/log4j/spi/LoggerRepository.java +++ b/src/java/org/apache/log4j/spi/LoggerRepository.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/LoggingEvent.java b/src/java/org/apache/log4j/spi/LoggingEvent.java index 9170c3a8e6..071951f7ed 100644 --- a/src/java/org/apache/log4j/spi/LoggingEvent.java +++ b/src/java/org/apache/log4j/spi/LoggingEvent.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/OptionHandler.java b/src/java/org/apache/log4j/spi/OptionHandler.java index 9f952323eb..64f16e0af3 100644 --- a/src/java/org/apache/log4j/spi/OptionHandler.java +++ b/src/java/org/apache/log4j/spi/OptionHandler.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/RootCategory.java b/src/java/org/apache/log4j/spi/RootCategory.java index f83e0ec128..2f33f20b4b 100644 --- a/src/java/org/apache/log4j/spi/RootCategory.java +++ b/src/java/org/apache/log4j/spi/RootCategory.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/ThrowableInformation.java b/src/java/org/apache/log4j/spi/ThrowableInformation.java index c71457e106..7b9e6d7219 100644 --- a/src/java/org/apache/log4j/spi/ThrowableInformation.java +++ b/src/java/org/apache/log4j/spi/ThrowableInformation.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/TriggeringEventEvaluator.java b/src/java/org/apache/log4j/spi/TriggeringEventEvaluator.java index c6872fdb70..545a316e04 100644 --- a/src/java/org/apache/log4j/spi/TriggeringEventEvaluator.java +++ b/src/java/org/apache/log4j/spi/TriggeringEventEvaluator.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/test/AsyncAppenderTest.java b/src/java/org/apache/log4j/test/AsyncAppenderTest.java index b9a7107e90..743aee5b96 100644 --- a/src/java/org/apache/log4j/test/AsyncAppenderTest.java +++ b/src/java/org/apache/log4j/test/AsyncAppenderTest.java @@ -1,8 +1,18 @@ -/* Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/ConfigurationFileParsing.java b/src/java/org/apache/log4j/test/ConfigurationFileParsing.java index 8a0725f778..d5d85ed981 100644 --- a/src/java/org/apache/log4j/test/ConfigurationFileParsing.java +++ b/src/java/org/apache/log4j/test/ConfigurationFileParsing.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/DRFATest.java b/src/java/org/apache/log4j/test/DRFATest.java index 640845750e..b7d12ed698 100644 --- a/src/java/org/apache/log4j/test/DRFATest.java +++ b/src/java/org/apache/log4j/test/DRFATest.java @@ -1,8 +1,17 @@ -/* Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/DelayedLoop.java b/src/java/org/apache/log4j/test/DelayedLoop.java index 581235e513..0b3be60bd7 100644 --- a/src/java/org/apache/log4j/test/DelayedLoop.java +++ b/src/java/org/apache/log4j/test/DelayedLoop.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/FQCNTest.java b/src/java/org/apache/log4j/test/FQCNTest.java index 5b92ff328a..00dd5ee77c 100644 --- a/src/java/org/apache/log4j/test/FQCNTest.java +++ b/src/java/org/apache/log4j/test/FQCNTest.java @@ -1,8 +1,17 @@ -/* Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.APL file. +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/Hello.java b/src/java/org/apache/log4j/test/Hello.java index 02746a5b29..4b767aa95e 100644 --- a/src/java/org/apache/log4j/test/Hello.java +++ b/src/java/org/apache/log4j/test/Hello.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/PrintProperties.java b/src/java/org/apache/log4j/test/PrintProperties.java index b6bfc7d4a5..00d23b2548 100644 --- a/src/java/org/apache/log4j/test/PrintProperties.java +++ b/src/java/org/apache/log4j/test/PrintProperties.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/Shallow.java b/src/java/org/apache/log4j/test/Shallow.java index fc4bb33950..0dfa33e2b1 100644 --- a/src/java/org/apache/log4j/test/Shallow.java +++ b/src/java/org/apache/log4j/test/Shallow.java @@ -1,8 +1,17 @@ -/* Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ // NOTICE: Some tests are sensitive to line numbers! package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/serialization/SerializationUT.java b/src/java/org/apache/log4j/test/serialization/SerializationUT.java index 5bf529a298..68a52adbd9 100644 --- a/src/java/org/apache/log4j/test/serialization/SerializationUT.java +++ b/src/java/org/apache/log4j/test/serialization/SerializationUT.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ import junit.framework.TestCase; import junit.framework.TestSuite; diff --git a/src/java/org/apache/log4j/varia/DenyAllFilter.java b/src/java/org/apache/log4j/varia/DenyAllFilter.java index 9e59f4b33a..c86d7ab3b0 100644 --- a/src/java/org/apache/log4j/varia/DenyAllFilter.java +++ b/src/java/org/apache/log4j/varia/DenyAllFilter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.varia; diff --git a/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java b/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java index a48619ebe8..6c466ae5f8 100644 --- a/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java +++ b/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.varia; diff --git a/src/java/org/apache/log4j/varia/FallbackErrorHandler.java b/src/java/org/apache/log4j/varia/FallbackErrorHandler.java index 18ccb3d311..e6a79c6f02 100644 --- a/src/java/org/apache/log4j/varia/FallbackErrorHandler.java +++ b/src/java/org/apache/log4j/varia/FallbackErrorHandler.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.varia; diff --git a/src/java/org/apache/log4j/varia/LevelMatchFilter.java b/src/java/org/apache/log4j/varia/LevelMatchFilter.java index 1d47c4b053..f683440ded 100644 --- a/src/java/org/apache/log4j/varia/LevelMatchFilter.java +++ b/src/java/org/apache/log4j/varia/LevelMatchFilter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.varia; diff --git a/src/java/org/apache/log4j/varia/LevelRangeFilter.java b/src/java/org/apache/log4j/varia/LevelRangeFilter.java index faefb6febc..322bf81b58 100644 --- a/src/java/org/apache/log4j/varia/LevelRangeFilter.java +++ b/src/java/org/apache/log4j/varia/LevelRangeFilter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.varia; diff --git a/src/java/org/apache/log4j/varia/NullAppender.java b/src/java/org/apache/log4j/varia/NullAppender.java index d892ded3ff..40ed919a9f 100644 --- a/src/java/org/apache/log4j/varia/NullAppender.java +++ b/src/java/org/apache/log4j/varia/NullAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.varia; diff --git a/src/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java b/src/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java index 10ded93053..c6fe5af914 100644 --- a/src/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java +++ b/src/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.varia; diff --git a/src/java/org/apache/log4j/varia/Roller.java b/src/java/org/apache/log4j/varia/Roller.java index 8e96317f51..fb25ff39fc 100644 --- a/src/java/org/apache/log4j/varia/Roller.java +++ b/src/java/org/apache/log4j/varia/Roller.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.varia; diff --git a/src/java/org/apache/log4j/varia/StringMatchFilter.java b/src/java/org/apache/log4j/varia/StringMatchFilter.java index 457eddf31a..56b02d1f77 100644 --- a/src/java/org/apache/log4j/varia/StringMatchFilter.java +++ b/src/java/org/apache/log4j/varia/StringMatchFilter.java @@ -1,9 +1,17 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.varia; diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index 60ef03fd56..fe3862f8fb 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.xml; diff --git a/src/java/org/apache/log4j/xml/Log4jEntityResolver.java b/src/java/org/apache/log4j/xml/Log4jEntityResolver.java index 79707cbf83..b2a46cc57a 100644 --- a/src/java/org/apache/log4j/xml/Log4jEntityResolver.java +++ b/src/java/org/apache/log4j/xml/Log4jEntityResolver.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.xml; diff --git a/src/java/org/apache/log4j/xml/SAXErrorHandler.java b/src/java/org/apache/log4j/xml/SAXErrorHandler.java index 8c80db45e4..11255c8799 100644 --- a/src/java/org/apache/log4j/xml/SAXErrorHandler.java +++ b/src/java/org/apache/log4j/xml/SAXErrorHandler.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.xml; diff --git a/src/java/org/apache/log4j/xml/XMLLayout.java b/src/java/org/apache/log4j/xml/XMLLayout.java index de1db86fbe..20504e3792 100644 --- a/src/java/org/apache/log4j/xml/XMLLayout.java +++ b/src/java/org/apache/log4j/xml/XMLLayout.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // Contributors: Mathias Bogaert diff --git a/src/java/org/apache/log4j/xml/test/DOMTest.java b/src/java/org/apache/log4j/xml/test/DOMTest.java index b6c303ce19..6e0a673c9b 100644 --- a/src/java/org/apache/log4j/xml/test/DOMTest.java +++ b/src/java/org/apache/log4j/xml/test/DOMTest.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.APL file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.xml.test; diff --git a/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java b/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java index 7dafc0d9bf..ddd01989e0 100644 --- a/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java +++ b/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/tests/src/java/org/apache/log4j/DRFATestCase.java b/tests/src/java/org/apache/log4j/DRFATestCase.java index 82be49ae30..bb94769382 100644 --- a/tests/src/java/org/apache/log4j/DRFATestCase.java +++ b/tests/src/java/org/apache/log4j/DRFATestCase.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/tests/src/java/org/apache/log4j/HierarchyThresholdTestCase.java b/tests/src/java/org/apache/log4j/HierarchyThresholdTestCase.java index e522506e52..d354985c66 100644 --- a/tests/src/java/org/apache/log4j/HierarchyThresholdTestCase.java +++ b/tests/src/java/org/apache/log4j/HierarchyThresholdTestCase.java @@ -1,8 +1,17 @@ -/* Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j; diff --git a/tests/src/java/org/apache/log4j/LoggerTestCase.java b/tests/src/java/org/apache/log4j/LoggerTestCase.java index 6ffaf4ffe8..4bf1ad011e 100644 --- a/tests/src/java/org/apache/log4j/LoggerTestCase.java +++ b/tests/src/java/org/apache/log4j/LoggerTestCase.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/tests/src/java/org/apache/log4j/MinimumTestCase.java b/tests/src/java/org/apache/log4j/MinimumTestCase.java index 1055e588c5..102afd4e3b 100644 --- a/tests/src/java/org/apache/log4j/MinimumTestCase.java +++ b/tests/src/java/org/apache/log4j/MinimumTestCase.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/tests/src/java/org/apache/log4j/MyPatternLayout.java b/tests/src/java/org/apache/log4j/MyPatternLayout.java index c4cd9265b9..edb9c4127b 100644 --- a/tests/src/java/org/apache/log4j/MyPatternLayout.java +++ b/tests/src/java/org/apache/log4j/MyPatternLayout.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; import org.apache.log4j.helpers.PatternParser; diff --git a/tests/src/java/org/apache/log4j/MyPatternParser.java b/tests/src/java/org/apache/log4j/MyPatternParser.java index e8249861c6..e5328f632d 100644 --- a/tests/src/java/org/apache/log4j/MyPatternParser.java +++ b/tests/src/java/org/apache/log4j/MyPatternParser.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java index 2943d256de..197250ad68 100644 --- a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/tests/src/java/org/apache/log4j/StressCategory.java b/tests/src/java/org/apache/log4j/StressCategory.java index 05a6389eda..a99bd7f693 100644 --- a/tests/src/java/org/apache/log4j/StressCategory.java +++ b/tests/src/java/org/apache/log4j/StressCategory.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/tests/src/java/org/apache/log4j/VectorAppender.java b/tests/src/java/org/apache/log4j/VectorAppender.java index 146b8cfa33..14984ff9b8 100644 --- a/tests/src/java/org/apache/log4j/VectorAppender.java +++ b/tests/src/java/org/apache/log4j/VectorAppender.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/tests/src/java/org/apache/log4j/customLogger/XLogger.java b/tests/src/java/org/apache/log4j/customLogger/XLogger.java index ed3acd6568..56f7d6fa40 100644 --- a/tests/src/java/org/apache/log4j/customLogger/XLogger.java +++ b/tests/src/java/org/apache/log4j/customLogger/XLogger.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.customLogger; diff --git a/tests/src/java/org/apache/log4j/customLogger/XLoggerTestCase.java b/tests/src/java/org/apache/log4j/customLogger/XLoggerTestCase.java index 12be126474..9fa60b14d7 100644 --- a/tests/src/java/org/apache/log4j/customLogger/XLoggerTestCase.java +++ b/tests/src/java/org/apache/log4j/customLogger/XLoggerTestCase.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.customLogger; diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java index b228766479..d83e5f36af 100644 --- a/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.defaultInit; diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java index 35ed69d450..22488765b9 100644 --- a/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.defaultInit; diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java index e61af6d234..b275e822b7 100644 --- a/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.defaultInit; diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java index 19126d14b9..af36433f7d 100644 --- a/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.defaultInit; diff --git a/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java b/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java index 64a044026a..d83e0412f0 100644 --- a/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // // Log4j uses the JUnit framework for internal unit testing. JUnit diff --git a/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java b/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java index 76caa57473..0810676fec 100644 --- a/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // // Log4j uses the JUnit framework for internal unit testing. JUnit diff --git a/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java b/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java index f4f305877d..316ee9df8b 100644 --- a/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.helpers; diff --git a/tests/src/java/org/apache/log4j/net/ShortSocketServer.java b/tests/src/java/org/apache/log4j/net/ShortSocketServer.java index 33e0d56337..348706a8c8 100644 --- a/tests/src/java/org/apache/log4j/net/ShortSocketServer.java +++ b/tests/src/java/org/apache/log4j/net/ShortSocketServer.java @@ -1,8 +1,17 @@ -/* Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ diff --git a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java index d4c67cfb08..c8646771f6 100644 --- a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java +++ b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java @@ -1,8 +1,17 @@ -/* Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.apache.log4j.net; diff --git a/tests/src/java/org/apache/log4j/or/ORTestCase.java b/tests/src/java/org/apache/log4j/or/ORTestCase.java index f7b36454ae..2036c390fd 100644 --- a/tests/src/java/org/apache/log4j/or/ORTestCase.java +++ b/tests/src/java/org/apache/log4j/or/ORTestCase.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // // Log4j uses the JUnit framework for internal unit testing. JUnit diff --git a/tests/src/java/org/apache/log4j/util/AbsoluteTimeFilter.java b/tests/src/java/org/apache/log4j/util/AbsoluteTimeFilter.java index 82b5c02a05..633fa288ac 100644 --- a/tests/src/java/org/apache/log4j/util/AbsoluteTimeFilter.java +++ b/tests/src/java/org/apache/log4j/util/AbsoluteTimeFilter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; diff --git a/tests/src/java/org/apache/log4j/util/Compare.java b/tests/src/java/org/apache/log4j/util/Compare.java index 7cbd0dbed4..d0ba35e01e 100644 --- a/tests/src/java/org/apache/log4j/util/Compare.java +++ b/tests/src/java/org/apache/log4j/util/Compare.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; diff --git a/tests/src/java/org/apache/log4j/util/ControlFilter.java b/tests/src/java/org/apache/log4j/util/ControlFilter.java index 0809d167eb..00edb9e390 100644 --- a/tests/src/java/org/apache/log4j/util/ControlFilter.java +++ b/tests/src/java/org/apache/log4j/util/ControlFilter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; diff --git a/tests/src/java/org/apache/log4j/util/Filter.java b/tests/src/java/org/apache/log4j/util/Filter.java index 650c38161d..1adac84270 100644 --- a/tests/src/java/org/apache/log4j/util/Filter.java +++ b/tests/src/java/org/apache/log4j/util/Filter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; diff --git a/tests/src/java/org/apache/log4j/util/ISO8601Filter.java b/tests/src/java/org/apache/log4j/util/ISO8601Filter.java index 59eb5d5529..7b5a0c8b02 100644 --- a/tests/src/java/org/apache/log4j/util/ISO8601Filter.java +++ b/tests/src/java/org/apache/log4j/util/ISO8601Filter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; diff --git a/tests/src/java/org/apache/log4j/util/LineNumberFilter.java b/tests/src/java/org/apache/log4j/util/LineNumberFilter.java index 2b826b9c1e..9f77fbfa40 100644 --- a/tests/src/java/org/apache/log4j/util/LineNumberFilter.java +++ b/tests/src/java/org/apache/log4j/util/LineNumberFilter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; diff --git a/tests/src/java/org/apache/log4j/util/RelativeTimeFilter.java b/tests/src/java/org/apache/log4j/util/RelativeTimeFilter.java index 652b06d753..f3818145ad 100644 --- a/tests/src/java/org/apache/log4j/util/RelativeTimeFilter.java +++ b/tests/src/java/org/apache/log4j/util/RelativeTimeFilter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; diff --git a/tests/src/java/org/apache/log4j/util/Transformer.java b/tests/src/java/org/apache/log4j/util/Transformer.java index d5a38dc576..1e18cad06e 100644 --- a/tests/src/java/org/apache/log4j/util/Transformer.java +++ b/tests/src/java/org/apache/log4j/util/Transformer.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; diff --git a/tests/src/java/org/apache/log4j/util/UnexpectedFormatException.java b/tests/src/java/org/apache/log4j/util/UnexpectedFormatException.java index 03779958fe..73da477d64 100644 --- a/tests/src/java/org/apache/log4j/util/UnexpectedFormatException.java +++ b/tests/src/java/org/apache/log4j/util/UnexpectedFormatException.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; diff --git a/tests/src/java/org/apache/log4j/util/XMLLineAttributeFilter.java b/tests/src/java/org/apache/log4j/util/XMLLineAttributeFilter.java index 8edd2251e1..a16a4d9e50 100644 --- a/tests/src/java/org/apache/log4j/util/XMLLineAttributeFilter.java +++ b/tests/src/java/org/apache/log4j/util/XMLLineAttributeFilter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; diff --git a/tests/src/java/org/apache/log4j/util/XMLTimestampFilter.java b/tests/src/java/org/apache/log4j/util/XMLTimestampFilter.java index 6bd07da52b..1e44c77fc3 100644 --- a/tests/src/java/org/apache/log4j/util/XMLTimestampFilter.java +++ b/tests/src/java/org/apache/log4j/util/XMLTimestampFilter.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; diff --git a/tests/src/java/org/apache/log4j/varia/LevelMatchFilterTestCase.java b/tests/src/java/org/apache/log4j/varia/LevelMatchFilterTestCase.java index dbe9cc53db..31b5ee1a08 100644 --- a/tests/src/java/org/apache/log4j/varia/LevelMatchFilterTestCase.java +++ b/tests/src/java/org/apache/log4j/varia/LevelMatchFilterTestCase.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.varia; From cb26a433286b85029220c7f5957accdcb245f032 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Tue, 24 May 2005 05:19:33 +0000 Subject: [PATCH 111/342] Fix for #35032, issue #2. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311370 13f79535-47bb-0310-9956-ffa450edef68 --- INSTALL | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/INSTALL b/INSTALL index 6463df2958..e314bb16aa 100644 --- a/INSTALL +++ b/INSTALL @@ -7,9 +7,9 @@ Using log4j 2) Assuming you chose to extract the distribution in to the PATH_OF_YOUR_CHOICE, untarring the distribution file should create - a jakarta-log4j-VERSION directory, where VERSION is the log4j + a logging-log4j-VERSION directory, where VERSION is the log4j version number, under PATH_OF_YOUR_CHOICE. We will refer to the - directory PATH_OF_YOUR_CHOICE/jakarta-log4j-VERSION/ as $LOG4J_HOME/. + directory PATH_OF_YOUR_CHOICE/logging-log4j-VERSION/ as $LOG4J_HOME/. 3) Assuming you are using log4j version 1.2, add $LOG4J_HOME/dist/lib/log4j-1.2.jar to your CLASSPATH, @@ -115,14 +115,14 @@ Building log4j ============== Like most java appilicatios today, log4j relies on ANT as its build -tool. ANT is availale from "http://jakarta.apache.org/ant/". ANT +tool. ANT is availale from "http://ant.apache.org/". ANT requires a build file called build.xml which is part of this distribution. Required components from other projects are specified in the build.properties and example of which is supplied in the build.properties.sample file. In case of problems send an e-mail note to -log4j-user@jakarta.apache.org. Please do not directly e-mail any +log4j-user@logging.apache.org. Please do not directly e-mail any log4j developers. The answer to your question might be useful to other users. Moreover, there are many knowledgeable users on the log4j-user mailing lists who can quickly answer your questions. From 208702edadbb6ebd61bf0f1af5b9a3a07d377dc3 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Wed, 25 May 2005 02:21:49 +0000 Subject: [PATCH 112/342] Update to fix typos. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311373 13f79535-47bb-0310-9956-ffa450edef68 --- INSTALL | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/INSTALL b/INSTALL index e314bb16aa..f6ed902a70 100644 --- a/INSTALL +++ b/INSTALL @@ -114,8 +114,8 @@ Log4j is based on JDK 1.1 with the following additional requirements: Building log4j ============== -Like most java appilicatios today, log4j relies on ANT as its build -tool. ANT is availale from "http://ant.apache.org/". ANT +Like most Java applications today, log4j relies on ANT as its build +tool. ANT is available from "http://ant.apache.org/". ANT requires a build file called build.xml which is part of this distribution. Required components from other projects are specified in the build.properties and example of which is supplied in the From 04db981a9168d47813b3cf1935849f5ab97f115f Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Fri, 27 May 2005 03:27:57 +0000 Subject: [PATCH 113/342] Fix for #35032. Added license header to .java files that did not already have a license. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311380 13f79535-47bb-0310-9956-ffa450edef68 --- contribs/CekiGulcu/Transform.java | 15 +++++++++++++++ contribs/JamesHouse/LogTextPanel.java | 15 +++++++++++++++ contribs/JamesHouse/LogTextPanelExample.java | 15 +++++++++++++++ contribs/JamesHouse/TextPanelAppender.java | 15 +++++++++++++++ contribs/Jamie Tsao/JMSQueueAppender.java | 15 +++++++++++++++ contribs/KevinSteppe/JDBCTest.java | 15 +++++++++++++++ contribs/LeosLiterak/TempFileAppender.java | 19 +++++++++++++++++++ contribs/MarkDouglas/SocketNode2.java | 15 +++++++++++++++ contribs/MarkDouglas/SocketServer2.java | 15 +++++++++++++++ contribs/ThomasFenner/JDBCAppender.java | 15 +++++++++++++++ .../ThomasFenner/JDBCConnectionHandler.java | 15 +++++++++++++++ contribs/ThomasFenner/JDBCIDHandler.java | 15 +++++++++++++++ contribs/ThomasFenner/JDBCLogger.java | 15 +++++++++++++++ contribs/ThomasFenner/Log4JTest.java | 15 +++++++++++++++ contribs/ThomasFenner/code_example1.java | 15 +++++++++++++++ contribs/ThomasFenner/code_example2.java | 15 +++++++++++++++ .../VolkerMentzner/HTTPRequestHandler.java | 15 +++++++++++++++ .../VolkerMentzner/Log4jRequestHandler.java | 15 +++++++++++++++ .../VolkerMentzner/PluggableHTTPServer.java | 15 +++++++++++++++ .../VolkerMentzner/RootRequestHandler.java | 15 +++++++++++++++ .../UserDialogRequestHandler.java | 15 +++++++++++++++ examples/NumberCruncher.java | 15 +++++++++++++++ examples/Sort.java | 15 +++++++++++++++ examples/SortAlgo.java | 15 +++++++++++++++ examples/Trivial.java | 15 +++++++++++++++ examples/customLevel/XLevel.java | 15 +++++++++++++++ .../org/apache/log4j/jdbc/JDBCAppender.java | 15 +++++++++++++++ src/java/org/apache/log4j/jmx/Agent.java | 15 +++++++++++++++ .../apache/log4j/jmx/LoggerDynamicMBean.java | 15 +++++++++++++++ .../log4j/spi/DefaultRepositorySelector.java | 15 +++++++++++++++ .../org/apache/log4j/spi/RendererSupport.java | 15 +++++++++++++++ .../apache/log4j/spi/RepositorySelector.java | 15 +++++++++++++++ .../apache/log4j/test/CategoryWrapper.java | 15 +++++++++++++++ .../org/apache/log4j/test/DefaultInit.java | 15 +++++++++++++++ src/java/org/apache/log4j/test/Finalize.java | 15 +++++++++++++++ src/java/org/apache/log4j/test/MDCStress.java | 15 +++++++++++++++ .../apache/log4j/test/MultipleAppenders.java | 15 +++++++++++++++ .../org/apache/log4j/test/PatternTest.java | 15 +++++++++++++++ src/java/org/apache/log4j/test/ROFile.java | 15 +++++++++++++++ .../apache/log4j/test/ShortSocketServer.java | 15 +++++++++++++++ src/java/org/apache/log4j/test/SpacePad.java | 15 +++++++++++++++ .../log4j/test/StressAsyncAppender.java | 15 +++++++++++++++ .../apache/log4j/test/SysoutConfigurator.java | 15 +++++++++++++++ .../log4j/test/serialization/T/T113.java | 15 +++++++++++++++ .../log4j/test/serialization/T/T12.java | 15 +++++++++++++++ .../org/apache/log4j/varia/test/Loop.java | 15 +++++++++++++++ .../log4j/xml/examples/ReportParserError.java | 15 +++++++++++++++ .../apache/log4j/xml/examples/XMLSample.java | 15 +++++++++++++++ tests/src/java/org/apache/log4j/Last.java | 15 +++++++++++++++ .../helpers/OptionConverterTestCase.java | 15 +++++++++++++++ .../log4j/util/AbsoluteDateAndTimeFilter.java | 15 +++++++++++++++ .../log4j/varia/ErrorHandlerTestCase.java | 15 +++++++++++++++ .../apache/log4j/xml/CustomLevelTestCase.java | 15 +++++++++++++++ .../org/apache/log4j/xml/DOMTestCase.java | 15 +++++++++++++++ .../src/java/org/apache/log4j/xml/XLevel.java | 15 +++++++++++++++ .../apache/log4j/xml/XMLLayoutTestCase.java | 15 +++++++++++++++ 56 files changed, 844 insertions(+) diff --git a/contribs/CekiGulcu/Transform.java b/contribs/CekiGulcu/Transform.java index 3a20b3e789..c83752ec40 100644 --- a/contribs/CekiGulcu/Transform.java +++ b/contribs/CekiGulcu/Transform.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.xml; diff --git a/contribs/JamesHouse/LogTextPanel.java b/contribs/JamesHouse/LogTextPanel.java index db59e3d4c6..c1e7f01b67 100644 --- a/contribs/JamesHouse/LogTextPanel.java +++ b/contribs/JamesHouse/LogTextPanel.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.gui; diff --git a/contribs/JamesHouse/LogTextPanelExample.java b/contribs/JamesHouse/LogTextPanelExample.java index 74f1c3f6e1..42dd1cd032 100644 --- a/contribs/JamesHouse/LogTextPanelExample.java +++ b/contribs/JamesHouse/LogTextPanelExample.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.gui.examples; import javax.swing.*; diff --git a/contribs/JamesHouse/TextPanelAppender.java b/contribs/JamesHouse/TextPanelAppender.java index c4d45bc1b8..25e3614eb3 100644 --- a/contribs/JamesHouse/TextPanelAppender.java +++ b/contribs/JamesHouse/TextPanelAppender.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.gui; diff --git a/contribs/Jamie Tsao/JMSQueueAppender.java b/contribs/Jamie Tsao/JMSQueueAppender.java index aa475efb25..f90c0ae644 100644 --- a/contribs/Jamie Tsao/JMSQueueAppender.java +++ b/contribs/Jamie Tsao/JMSQueueAppender.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.spi.LoggingEvent; diff --git a/contribs/KevinSteppe/JDBCTest.java b/contribs/KevinSteppe/JDBCTest.java index 70ee1abe15..4948b380dd 100644 --- a/contribs/KevinSteppe/JDBCTest.java +++ b/contribs/KevinSteppe/JDBCTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.varia.test; diff --git a/contribs/LeosLiterak/TempFileAppender.java b/contribs/LeosLiterak/TempFileAppender.java index 74fe216f56..0a204f0e04 100644 --- a/contribs/LeosLiterak/TempFileAppender.java +++ b/contribs/LeosLiterak/TempFileAppender.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; import java.io.File; @@ -172,7 +187,11 @@ public void close() { * @since $Date$ * * $Log$ + * Revision 1.1.2.1 2005/05/27 03:27:54 mwomack + * Fix for #35032. Added license header to .java files that did not already have a license. + * * Revision 1.1 2001/04/20 17:38:31 ceki + * * Added LeosLiterak's TempFileAppender.java * */ diff --git a/contribs/MarkDouglas/SocketNode2.java b/contribs/MarkDouglas/SocketNode2.java index a868c92691..0a625ab9b1 100644 --- a/contribs/MarkDouglas/SocketNode2.java +++ b/contribs/MarkDouglas/SocketNode2.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.systemsunion.LoggingServer; diff --git a/contribs/MarkDouglas/SocketServer2.java b/contribs/MarkDouglas/SocketServer2.java index 97a5414331..2ab82fe0f5 100644 --- a/contribs/MarkDouglas/SocketServer2.java +++ b/contribs/MarkDouglas/SocketServer2.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.systemsunion.LoggingServer; diff --git a/contribs/ThomasFenner/JDBCAppender.java b/contribs/ThomasFenner/JDBCAppender.java index d82bb2023a..3e27e89209 100644 --- a/contribs/ThomasFenner/JDBCAppender.java +++ b/contribs/ThomasFenner/JDBCAppender.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /* * Copyright (C) The Apache Software Foundation. All rights reserved. diff --git a/contribs/ThomasFenner/JDBCConnectionHandler.java b/contribs/ThomasFenner/JDBCConnectionHandler.java index 535007c26d..581e88f1d0 100644 --- a/contribs/ThomasFenner/JDBCConnectionHandler.java +++ b/contribs/ThomasFenner/JDBCConnectionHandler.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /* * Copyright (C) The Apache Software Foundation. All rights reserved. diff --git a/contribs/ThomasFenner/JDBCIDHandler.java b/contribs/ThomasFenner/JDBCIDHandler.java index 2135f57707..f5edd2877b 100644 --- a/contribs/ThomasFenner/JDBCIDHandler.java +++ b/contribs/ThomasFenner/JDBCIDHandler.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /* * Copyright (C) The Apache Software Foundation. All rights reserved. diff --git a/contribs/ThomasFenner/JDBCLogger.java b/contribs/ThomasFenner/JDBCLogger.java index ef8bc93990..d3f4c26294 100644 --- a/contribs/ThomasFenner/JDBCLogger.java +++ b/contribs/ThomasFenner/JDBCLogger.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /* * Copyright (C) The Apache Software Foundation. All rights reserved. diff --git a/contribs/ThomasFenner/Log4JTest.java b/contribs/ThomasFenner/Log4JTest.java index d64e772fd4..fd02798f50 100644 --- a/contribs/ThomasFenner/Log4JTest.java +++ b/contribs/ThomasFenner/Log4JTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /** // Class JDBCAppender, writes messages into a database diff --git a/contribs/ThomasFenner/code_example1.java b/contribs/ThomasFenner/code_example1.java index d5e566da1e..41bc8cfea7 100644 --- a/contribs/ThomasFenner/code_example1.java +++ b/contribs/ThomasFenner/code_example1.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // Here is a code example to configure the JDBCAppender with a configuration-file diff --git a/contribs/ThomasFenner/code_example2.java b/contribs/ThomasFenner/code_example2.java index d799aaf357..668a361242 100644 --- a/contribs/ThomasFenner/code_example2.java +++ b/contribs/ThomasFenner/code_example2.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // Here is a code example to configure the JDBCAppender without a configuration-file diff --git a/contribs/VolkerMentzner/HTTPRequestHandler.java b/contribs/VolkerMentzner/HTTPRequestHandler.java index 1c5bad7423..276eba8e96 100644 --- a/contribs/VolkerMentzner/HTTPRequestHandler.java +++ b/contribs/VolkerMentzner/HTTPRequestHandler.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.psibt.framework.net; import java.io.*; diff --git a/contribs/VolkerMentzner/Log4jRequestHandler.java b/contribs/VolkerMentzner/Log4jRequestHandler.java index 7825dc61cc..096b0bb4bf 100644 --- a/contribs/VolkerMentzner/Log4jRequestHandler.java +++ b/contribs/VolkerMentzner/Log4jRequestHandler.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.psibt.framework.net; import java.io.*; diff --git a/contribs/VolkerMentzner/PluggableHTTPServer.java b/contribs/VolkerMentzner/PluggableHTTPServer.java index 25eb001d10..0e079a2c8d 100644 --- a/contribs/VolkerMentzner/PluggableHTTPServer.java +++ b/contribs/VolkerMentzner/PluggableHTTPServer.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.psibt.framework.net; import java.net.*; diff --git a/contribs/VolkerMentzner/RootRequestHandler.java b/contribs/VolkerMentzner/RootRequestHandler.java index b1483276ef..76fbabca11 100644 --- a/contribs/VolkerMentzner/RootRequestHandler.java +++ b/contribs/VolkerMentzner/RootRequestHandler.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.psibt.framework.net; import java.io.*; diff --git a/contribs/VolkerMentzner/UserDialogRequestHandler.java b/contribs/VolkerMentzner/UserDialogRequestHandler.java index 6b6205a5fb..57d100d7a9 100644 --- a/contribs/VolkerMentzner/UserDialogRequestHandler.java +++ b/contribs/VolkerMentzner/UserDialogRequestHandler.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /** * Title: PSI Java Framework: UserDialogRequestHandler

    * Copyright: PSI-BT AG

    diff --git a/examples/NumberCruncher.java b/examples/NumberCruncher.java index 3a6e85cec3..ff5e003c50 100644 --- a/examples/NumberCruncher.java +++ b/examples/NumberCruncher.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package examples; diff --git a/examples/Sort.java b/examples/Sort.java index a4a9ac8151..9f21a5c505 100644 --- a/examples/Sort.java +++ b/examples/Sort.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package examples; diff --git a/examples/SortAlgo.java b/examples/SortAlgo.java index 98a4b04402..aa579b0cea 100644 --- a/examples/SortAlgo.java +++ b/examples/SortAlgo.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package examples; diff --git a/examples/Trivial.java b/examples/Trivial.java index 9be452defb..36bc792a59 100644 --- a/examples/Trivial.java +++ b/examples/Trivial.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package examples; diff --git a/examples/customLevel/XLevel.java b/examples/customLevel/XLevel.java index 2977aebe59..9c5126eff0 100644 --- a/examples/customLevel/XLevel.java +++ b/examples/customLevel/XLevel.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package examples.customLevel; diff --git a/src/java/org/apache/log4j/jdbc/JDBCAppender.java b/src/java/org/apache/log4j/jdbc/JDBCAppender.java index c2ccaed6a8..b4c856600f 100644 --- a/src/java/org/apache/log4j/jdbc/JDBCAppender.java +++ b/src/java/org/apache/log4j/jdbc/JDBCAppender.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.jdbc; import org.apache.log4j.*; diff --git a/src/java/org/apache/log4j/jmx/Agent.java b/src/java/org/apache/log4j/jmx/Agent.java index 68de333c47..2da4bd84e5 100644 --- a/src/java/org/apache/log4j/jmx/Agent.java +++ b/src/java/org/apache/log4j/jmx/Agent.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.jmx; diff --git a/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java b/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java index ea3afd8398..27cd797f44 100644 --- a/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.jmx; diff --git a/src/java/org/apache/log4j/spi/DefaultRepositorySelector.java b/src/java/org/apache/log4j/spi/DefaultRepositorySelector.java index d3550148e5..c64b62fb2f 100644 --- a/src/java/org/apache/log4j/spi/DefaultRepositorySelector.java +++ b/src/java/org/apache/log4j/spi/DefaultRepositorySelector.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/src/java/org/apache/log4j/spi/RendererSupport.java b/src/java/org/apache/log4j/spi/RendererSupport.java index 6aef97300d..42e09f3e99 100644 --- a/src/java/org/apache/log4j/spi/RendererSupport.java +++ b/src/java/org/apache/log4j/spi/RendererSupport.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.spi; diff --git a/src/java/org/apache/log4j/spi/RepositorySelector.java b/src/java/org/apache/log4j/spi/RepositorySelector.java index 2d0818a0c0..2ef61ec2cf 100644 --- a/src/java/org/apache/log4j/spi/RepositorySelector.java +++ b/src/java/org/apache/log4j/spi/RepositorySelector.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/src/java/org/apache/log4j/test/CategoryWrapper.java b/src/java/org/apache/log4j/test/CategoryWrapper.java index 947a2ca7a9..9056315bb3 100644 --- a/src/java/org/apache/log4j/test/CategoryWrapper.java +++ b/src/java/org/apache/log4j/test/CategoryWrapper.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/DefaultInit.java b/src/java/org/apache/log4j/test/DefaultInit.java index 3f14f77dfa..0f95d95c0a 100644 --- a/src/java/org/apache/log4j/test/DefaultInit.java +++ b/src/java/org/apache/log4j/test/DefaultInit.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/Finalize.java b/src/java/org/apache/log4j/test/Finalize.java index 9e0f17c482..eb91b93c9a 100644 --- a/src/java/org/apache/log4j/test/Finalize.java +++ b/src/java/org/apache/log4j/test/Finalize.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/MDCStress.java b/src/java/org/apache/log4j/test/MDCStress.java index 315d0183ee..260e4c0415 100644 --- a/src/java/org/apache/log4j/test/MDCStress.java +++ b/src/java/org/apache/log4j/test/MDCStress.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/MultipleAppenders.java b/src/java/org/apache/log4j/test/MultipleAppenders.java index 505f368bf5..fbbaeeb2bb 100644 --- a/src/java/org/apache/log4j/test/MultipleAppenders.java +++ b/src/java/org/apache/log4j/test/MultipleAppenders.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/PatternTest.java b/src/java/org/apache/log4j/test/PatternTest.java index b6da2e6fb7..b4f12ff66e 100644 --- a/src/java/org/apache/log4j/test/PatternTest.java +++ b/src/java/org/apache/log4j/test/PatternTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/ROFile.java b/src/java/org/apache/log4j/test/ROFile.java index c6eeefddee..8fb8fb0c80 100644 --- a/src/java/org/apache/log4j/test/ROFile.java +++ b/src/java/org/apache/log4j/test/ROFile.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; import org.apache.log4j.PropertyConfigurator; diff --git a/src/java/org/apache/log4j/test/ShortSocketServer.java b/src/java/org/apache/log4j/test/ShortSocketServer.java index 5eb02cc2eb..a520898c73 100644 --- a/src/java/org/apache/log4j/test/ShortSocketServer.java +++ b/src/java/org/apache/log4j/test/ShortSocketServer.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; diff --git a/src/java/org/apache/log4j/test/SpacePad.java b/src/java/org/apache/log4j/test/SpacePad.java index 91a9989d5a..71c3242c47 100644 --- a/src/java/org/apache/log4j/test/SpacePad.java +++ b/src/java/org/apache/log4j/test/SpacePad.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; public class SpacePad { diff --git a/src/java/org/apache/log4j/test/StressAsyncAppender.java b/src/java/org/apache/log4j/test/StressAsyncAppender.java index 4f32ccbeab..cdbebca0cb 100644 --- a/src/java/org/apache/log4j/test/StressAsyncAppender.java +++ b/src/java/org/apache/log4j/test/StressAsyncAppender.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // Copyright 2000 Ceki Gulcu. All Rights Reserved. // See the LICENCE file for the terms of distribution. diff --git a/src/java/org/apache/log4j/test/SysoutConfigurator.java b/src/java/org/apache/log4j/test/SysoutConfigurator.java index 2007ce95e9..e356aab4d7 100644 --- a/src/java/org/apache/log4j/test/SysoutConfigurator.java +++ b/src/java/org/apache/log4j/test/SysoutConfigurator.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.test; import org.apache.log4j.spi.*; diff --git a/src/java/org/apache/log4j/test/serialization/T/T113.java b/src/java/org/apache/log4j/test/serialization/T/T113.java index 746123a884..3760637faa 100644 --- a/src/java/org/apache/log4j/test/serialization/T/T113.java +++ b/src/java/org/apache/log4j/test/serialization/T/T113.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ import java.io.*; diff --git a/src/java/org/apache/log4j/test/serialization/T/T12.java b/src/java/org/apache/log4j/test/serialization/T/T12.java index 9ccf3e1204..919ed0e9dc 100644 --- a/src/java/org/apache/log4j/test/serialization/T/T12.java +++ b/src/java/org/apache/log4j/test/serialization/T/T12.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ import java.io.*; diff --git a/src/java/org/apache/log4j/varia/test/Loop.java b/src/java/org/apache/log4j/varia/test/Loop.java index a43fdf5ab3..f56c0eca6e 100644 --- a/src/java/org/apache/log4j/varia/test/Loop.java +++ b/src/java/org/apache/log4j/varia/test/Loop.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.varia.test; diff --git a/src/java/org/apache/log4j/xml/examples/ReportParserError.java b/src/java/org/apache/log4j/xml/examples/ReportParserError.java index 8846e339f3..cdf3190e12 100644 --- a/src/java/org/apache/log4j/xml/examples/ReportParserError.java +++ b/src/java/org/apache/log4j/xml/examples/ReportParserError.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.xml.examples; diff --git a/src/java/org/apache/log4j/xml/examples/XMLSample.java b/src/java/org/apache/log4j/xml/examples/XMLSample.java index 91c4882aaa..292277e0bb 100644 --- a/src/java/org/apache/log4j/xml/examples/XMLSample.java +++ b/src/java/org/apache/log4j/xml/examples/XMLSample.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.xml.examples; diff --git a/tests/src/java/org/apache/log4j/Last.java b/tests/src/java/org/apache/log4j/Last.java index 635824d4b0..7d05e2bb2f 100644 --- a/tests/src/java/org/apache/log4j/Last.java +++ b/tests/src/java/org/apache/log4j/Last.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j; diff --git a/tests/src/java/org/apache/log4j/helpers/OptionConverterTestCase.java b/tests/src/java/org/apache/log4j/helpers/OptionConverterTestCase.java index 2110875855..ff829236c3 100644 --- a/tests/src/java/org/apache/log4j/helpers/OptionConverterTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/OptionConverterTestCase.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ // Log4j uses the JUnit framework for internal unit testing. JUnit // is available from "http://www.junit.org". diff --git a/tests/src/java/org/apache/log4j/util/AbsoluteDateAndTimeFilter.java b/tests/src/java/org/apache/log4j/util/AbsoluteDateAndTimeFilter.java index f611a5009d..8195f1eeca 100644 --- a/tests/src/java/org/apache/log4j/util/AbsoluteDateAndTimeFilter.java +++ b/tests/src/java/org/apache/log4j/util/AbsoluteDateAndTimeFilter.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; diff --git a/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java b/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java index 826602cf83..aa01e6dd48 100644 --- a/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java +++ b/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.varia; diff --git a/tests/src/java/org/apache/log4j/xml/CustomLevelTestCase.java b/tests/src/java/org/apache/log4j/xml/CustomLevelTestCase.java index 45fb9087f5..d234c2fccf 100644 --- a/tests/src/java/org/apache/log4j/xml/CustomLevelTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/CustomLevelTestCase.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.xml; diff --git a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java index b3991c6053..0ed720c766 100644 --- a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.xml; diff --git a/tests/src/java/org/apache/log4j/xml/XLevel.java b/tests/src/java/org/apache/log4j/xml/XLevel.java index af424256d4..8a415d4d35 100644 --- a/tests/src/java/org/apache/log4j/xml/XLevel.java +++ b/tests/src/java/org/apache/log4j/xml/XLevel.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.xml; diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java index 4bcfcd7f64..6a9111ed42 100644 --- a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.xml; From 656fa7b5da2fa7bd12b2fdb7c1f7f615151d003c Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Fri, 27 May 2005 05:05:51 +0000 Subject: [PATCH 114/342] Fix for #35032. Updated docs to not have chainsaw link. Updated to 1.2.11 information. General cleanup. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311381 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/contributors.xml | 14 +++------ src/xdocs/documentation.xml | 6 ---- src/xdocs/download.xml | 50 ++++++++++--------------------- src/xdocs/stylesheets/project.xml | 1 - 4 files changed, 19 insertions(+), 52 deletions(-) diff --git a/src/xdocs/contributors.xml b/src/xdocs/contributors.xml index c855a1f0b4..36f9cc7db2 100644 --- a/src/xdocs/contributors.xml +++ b/src/xdocs/contributors.xml @@ -145,20 +145,14 @@

    Mark Womack has been developing software for over 13 years. He has been developing in Java for the past 5 years, focusing on web application development. He has been an - active committer for the Apache Logging Services log4j project since - April 2002, contributing features for the upcoming v1.3 - release. He is also a member of the Logging Services PMC.

    + active committer for the log4j project since April 2002, contributing + features for the upcoming v1.3 release. He is also a member of the Logging + Services PMC.

  • - - - - - - diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index 7dcb3eff35..f2c618b438 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -36,12 +36,6 @@

    -

    -

  • - Chainsaw documentation, -
  • -

    -

  • project history, diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 3cfc13fdc5..822658cd4c 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -9,29 +9,27 @@ -
    -

    Log4j is +

    Log4j is available for download from a number of mirrors. Please use these mirrors as they improve download time and save bandwidth.

    -

    Log4j version 1.2.9, is identical to version 1.2.8, - except that several key methods have been deprecated in - preparation for version 1.3.0, the next major release of - log4j. These changes are intended to enforce the rule that - client code should never refer to the Category - class directly, but use the Logger class - instead. Similarly, client code should not refer to the - Priority class but to the Level - class instead. -

    - -

    See the document entitled preparing - for log4j 1.3 for a more detailed discussion. -

    +

    Log4j version 1.2.11, is identical to version 1.2.9, + except that the class org.apache.log4j.or.jms.MessageRenderer is now + explicitly contained in the 1.2.11.jar. In previous releases of the 1.2 + branch it was sometimes include and sometimes left out + (bug #34491). +

    + +

    The next major release of log4j will be version 1.3. It will contain + many new features and changes, and if you have written custom code, it may + need to be modified to work with it. Please see the document entitled preparing + for log4j 1.3 for a more detailed discussion. +

    @@ -51,17 +49,6 @@
    - - -
    Chainsaw v2 (NEW!)
    - -
    A new and improved version of the venerable Chainsaw - utility, now being written by the log4j development team is - getting closer to release. You can see screen shots of it and - install it and run over here -
    -
    DatedFileAppender
    @@ -79,13 +66,6 @@ - - -
    JDBCAppender diff --git a/src/xdocs/stylesheets/project.xml b/src/xdocs/stylesheets/project.xml index 04bccb3cd2..186d7fa1fa 100644 --- a/src/xdocs/stylesheets/project.xml +++ b/src/xdocs/stylesheets/project.xml @@ -11,7 +11,6 @@ - From e0dd1c49f266d5db3aa4d4c01f5d9802408aee9d Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Sat, 28 May 2005 01:49:54 +0000 Subject: [PATCH 115/342] Officially moving to 1.2.11rc2 for version number. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311382 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index f00ea3c14e..3a365d388e 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + From 27138352d413beb446b58e892046967b0a2ca667 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Thu, 2 Jun 2005 04:49:13 +0000 Subject: [PATCH 116/342] Cosmetic changes. Changes javac to use target attribute of 1.1. Per the Ant documentation: "Generate class files for specific VM version (e.g., 1.1 or 1.2). Note that the default value depends on the JVM that is running Ant. In particular, if you use JDK 1.4+ the generated classes will not be usable for a 1.1 Java VM unless you explicitly set this attribute to the value 1.1 (which is the default value for JDK 1.1 to 1.3). We highly recommend to always specify this attribute." git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311383 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 180 +++++++++++++++++++++++++++--------------------------- 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/build.xml b/build.xml index 3a365d388e..0b95996e23 100644 --- a/build.xml +++ b/build.xml @@ -178,44 +178,42 @@ + ${stem}/net/SMTPAppender.java, + ${stem}/net/JMS*.java, + ${stem}/jmx/*.java, + ${stem}/or/jms/*.java" + target="1.1" + deprecation="${deprecation}" + debug="on"> - - - + + + - + @@ -226,43 +224,46 @@ + ${stem}/xml/Transform.java" + target="1.1" + deprecation="${deprecation}" + classpath="${classpath}"> - + + destdir="${javac.dest}" + includes="${stem}/net/SMTPAppender.java" + target="1.1" + deprecation="${deprecation}"> - + - + @@ -329,28 +330,27 @@ + includes="${stem}/*.class, + ${stem}/xml/log4j.dtd, + ${stem}/config/*.class, + ${stem}/helpers/*.class, + ${stem}/spi/*.class, + ${stem}/net/*.class, + ${stem}/jdbc/*.class, + ${stem}/varia/*.class, + ${stem}/chainsaw/*.class, + ${stem}/lf5/**/*.class, + ${stem}/lf5/**/*.properties, + ${stem}/lf5/**/*.gif, + ${stem}/nt/*.class, + ${stem}/xml/*.class, + ${stem}/jmx/*.class, + ${stem}/or/*.class, + ${stem}/or/sax/*.class, + ${stem}/or/jms/*.class, + ${stem}/config/*.class" + excludes="**/UnitTest**" + manifest="${jar.dest}/manifest.mf"/> @@ -362,33 +362,33 @@ + destdir="${javadoc.dest}" + packagenames="org.apache.log4j, + org.apache.log4j.config, + org.apache.log4j.helpers, + org.apache.log4j.jmx, + org.apache.log4j.lf5, + org.apache.log4j.net, + org.apache.log4j.nt, + org.apache.log4j.or, + org.apache.log4j.jdbc, + org.apache.log4j.or.sax, + org.apache.log4j.or.jms, + org.apache.log4j.performance, + org.apache.log4j.spi, + org.apache.log4j.varia, + org.apache.log4j.chainsaw, + org.apache.log4j.xml, + org.apache.log4j.xml.examples" + version="true" + protected="true" + author="true" + use="true" + overview="${docs.dest}/overview.html" + doctitle="log4j version ${version}<br>API Specification" + windowtitle="Log4j Version ${version}" + header="<b>Log4j ${version}</b>" + bottom="Copyright 2000-2005 Apache Software Foundation."> From 5ebf3a5b63ad4ad372beb76bec53558f3a97a0df Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Fri, 3 Jun 2005 05:29:54 +0000 Subject: [PATCH 117/342] Changes to support running of unit tests under Ant 1.6.4. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311385 13f79535-47bb-0310-9956-ffa450edef68 --- tests/build.properties.sample | 9 +++++++++ tests/build.xml | 6 ++++-- tests/witness/customLogger.1 | 1 + tests/witness/dom.A1.1 | 6 ++++++ tests/witness/dom.A2.1 | 4 ++++ tests/witness/patternLayout.1 | 5 +++++ tests/witness/patternLayout.10 | 5 +++++ tests/witness/patternLayout.11 | 5 +++++ tests/witness/patternLayout.12 | 5 +++++ tests/witness/patternLayout.13 | 5 +++++ tests/witness/patternLayout.14 | 5 +++++ tests/witness/patternLayout.2 | 5 +++++ tests/witness/patternLayout.3 | 5 +++++ tests/witness/patternLayout.4 | 5 +++++ tests/witness/patternLayout.5 | 5 +++++ tests/witness/patternLayout.6 | 5 +++++ tests/witness/patternLayout.7 | 5 +++++ tests/witness/patternLayout.8 | 5 +++++ tests/witness/patternLayout.9 | 5 +++++ tests/witness/simple | 1 + tests/witness/socketServer.1 | 2 ++ tests/witness/socketServer.2 | 2 ++ tests/witness/socketServer.3 | 2 ++ tests/witness/socketServer.4 | 2 ++ tests/witness/socketServer.5 | 2 ++ tests/witness/socketServer.6 | 2 ++ tests/witness/socketServer.7 | 2 ++ tests/witness/socketServer.8 | 2 ++ tests/witness/ttcc | 1 + tests/witness/xmlLayout.1 | 4 ++++ tests/witness/xmlLayout.2 | 4 ++++ tests/witness/xmlLayout.null | 1 + 32 files changed, 121 insertions(+), 2 deletions(-) diff --git a/tests/build.properties.sample b/tests/build.properties.sample index 49128767a9..eedcd55417 100644 --- a/tests/build.properties.sample +++ b/tests/build.properties.sample @@ -1,4 +1,13 @@ jakarta.oro.jar=../../jakarta-oro-2.0.5/jakarta-oro-2.0.5.jar +xml-api.jar=../../xerces-2_6_2/xml-apis.jar +xml-impl.jar=../../erces-2_6_2/xercesImpl.jar deprecation=on # junit must be on the classpath! It can't be handled as a property. + +# The current test files require: +# Ant 1.6.4 running in +# Sun JDK 1.3 +# with jUnit 3.8.1 +# This is because of the format of the exceptions recorded in the test +# witness files is particular to these versions. diff --git a/tests/build.xml b/tests/build.xml index c89dc585a6..70ca49d4d0 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -23,7 +23,6 @@ - @@ -31,6 +30,8 @@ + + @@ -68,8 +69,9 @@ diff --git a/tests/witness/customLogger.1 b/tests/witness/customLogger.1 index 57095c1e46..e8c411a2aa 100644 --- a/tests/witness/customLogger.1 +++ b/tests/witness/customLogger.1 @@ -17,4 +17,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/dom.A1.1 b/tests/witness/dom.A1.1 index d8b3acceba..1c12b3cf5f 100644 --- a/tests/witness/dom.A1.1 +++ b/tests/witness/dom.A1.1 @@ -27,6 +27,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) DEBUG xml.DOMTestCase - Message 5 java.lang.Exception: Just testing @@ -42,6 +43,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) DEBUG root - Message 5 java.lang.Exception: Just testing @@ -57,6 +59,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR xml.DOMTestCase - Message 6 java.lang.Exception: Just testing @@ -72,6 +75,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR xml.DOMTestCase - Message 6 java.lang.Exception: Just testing @@ -87,6 +91,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR root - Message 6 java.lang.Exception: Just testing @@ -102,4 +107,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/dom.A2.1 b/tests/witness/dom.A2.1 index 6c84658d1c..969eef9b43 100644 --- a/tests/witness/dom.A2.1 +++ b/tests/witness/dom.A2.1 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] DEBUG root - Message 5 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 6 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR root - Message 6 java.lang.Exception: Just testing @@ -67,4 +70,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.1 b/tests/witness/patternLayout.1 index 52457f3e5c..2e2751fa94 100644 --- a/tests/witness/patternLayout.1 +++ b/tests/witness/patternLayout.1 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) INFO - Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) WARN - Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR - Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) FATAL - Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.10 b/tests/witness/patternLayout.10 index d10fb04360..f4944996cd 100644 --- a/tests/witness/patternLayout.10 +++ b/tests/witness/patternLayout.10 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.11 b/tests/witness/patternLayout.11 index c16da56f95..3845564a0b 100644 --- a/tests/witness/patternLayout.11 +++ b/tests/witness/patternLayout.11 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) INFO [main] log4j.PatternLayoutTestCase: Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) WARN [main] log4j.PatternLayoutTestCase: Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR [main] log4j.PatternLayoutTestCase: Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) FATAL [main] log4j.PatternLayoutTestCase: Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.12 b/tests/witness/patternLayout.12 index 5e84eb5338..258356ef25 100644 --- a/tests/witness/patternLayout.12 +++ b/tests/witness/patternLayout.12 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.13 b/tests/witness/patternLayout.13 index db6d8917b4..725409d294 100644 --- a/tests/witness/patternLayout.13 +++ b/tests/witness/patternLayout.13 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.14 b/tests/witness/patternLayout.14 index 5fb542d290..d8d1479bea 100644 --- a/tests/witness/patternLayout.14 +++ b/tests/witness/patternLayout.14 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) INFO 12 - Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) WARN 13 - Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR 14 - Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) FATAL 15 - Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.2 b/tests/witness/patternLayout.2 index b79c74fcb5..bc81dba279 100644 --- a/tests/witness/patternLayout.2 +++ b/tests/witness/patternLayout.2 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.3 b/tests/witness/patternLayout.3 index c48f7ab4ac..71ff0d5e08 100644 --- a/tests/witness/patternLayout.3 +++ b/tests/witness/patternLayout.3 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.4 b/tests/witness/patternLayout.4 index 732f208ebd..0cdcbf9727 100644 --- a/tests/witness/patternLayout.4 +++ b/tests/witness/patternLayout.4 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.5 b/tests/witness/patternLayout.5 index 20f52e9ee3..20110500a0 100644 --- a/tests/witness/patternLayout.5 +++ b/tests/witness/patternLayout.5 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.6 b/tests/witness/patternLayout.6 index acaf3a25e5..3d277f72e5 100644 --- a/tests/witness/patternLayout.6 +++ b/tests/witness/patternLayout.6 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.7 b/tests/witness/patternLayout.7 index 2f600070fc..294917770f 100644 --- a/tests/witness/patternLayout.7 +++ b/tests/witness/patternLayout.7 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.8 b/tests/witness/patternLayout.8 index eaf7c79cba..42a7b49342 100644 --- a/tests/witness/patternLayout.8 +++ b/tests/witness/patternLayout.8 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.9 b/tests/witness/patternLayout.9 index cbf6c1ec94..06f4877d2e 100644 --- a/tests/witness/patternLayout.9 +++ b/tests/witness/patternLayout.9 @@ -22,6 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase : Message 6 java.lang.Exception: Just testing @@ -37,6 +38,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase : Message 7 java.lang.Exception: Just testing @@ -52,6 +54,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase : Message 8 java.lang.Exception: Just testing @@ -67,6 +70,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase : Message 9 java.lang.Exception: Just testing @@ -82,4 +86,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/simple b/tests/witness/simple index a1fb1243d4..914229804c 100644 --- a/tests/witness/simple +++ b/tests/witness/simple @@ -35,5 +35,6 @@ java.lang.Exception: Just testing. at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) INFO - Messages should bear numbers 0 through 23. diff --git a/tests/witness/socketServer.1 b/tests/witness/socketServer.1 index 38a52de140..8782982da1 100644 --- a/tests/witness/socketServer.1 +++ b/tests/witness/socketServer.1 @@ -17,6 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR T1 [main] root Message 7 java.lang.Exception: Just testing @@ -32,4 +33,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.2 b/tests/witness/socketServer.2 index 3965164a58..d90aadcf88 100644 --- a/tests/witness/socketServer.2 +++ b/tests/witness/socketServer.2 @@ -17,6 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR T2 [main] ? (?:?) Message 7 java.lang.Exception: Just testing @@ -32,4 +33,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.3 b/tests/witness/socketServer.3 index 5a12cfccdc..5b64d4f979 100644 --- a/tests/witness/socketServer.3 +++ b/tests/witness/socketServer.3 @@ -17,6 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 7 java.lang.Exception: Just testing @@ -32,4 +33,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.4 b/tests/witness/socketServer.4 index c645732ea7..54eccbca1b 100644 --- a/tests/witness/socketServer.4 +++ b/tests/witness/socketServer.4 @@ -17,6 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR some T4 MDC-TEST4 [main] root - Message 7 java.lang.Exception: Just testing @@ -32,4 +33,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.5 b/tests/witness/socketServer.5 index dec6b0eb08..bdda8ae6f0 100644 --- a/tests/witness/socketServer.5 +++ b/tests/witness/socketServer.5 @@ -17,6 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR some5 T5 MDC-TEST5 [main] root - Message 7 java.lang.Exception: Just testing @@ -32,4 +33,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.6 b/tests/witness/socketServer.6 index 056383ce08..cfc3adb75a 100644 --- a/tests/witness/socketServer.6 +++ b/tests/witness/socketServer.6 @@ -17,6 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR some6 T6 client-test6 MDC-TEST6 [main] root - Message 7 java.lang.Exception: Just testing @@ -32,4 +33,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.7 b/tests/witness/socketServer.7 index 119757865c..898b179c6c 100644 --- a/tests/witness/socketServer.7 +++ b/tests/witness/socketServer.7 @@ -17,6 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR some7 T7 client-test7 MDC-TEST7 [main] root - Message 7 java.lang.Exception: Just testing @@ -32,4 +33,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.8 b/tests/witness/socketServer.8 index a3964faf50..dc497ee6e7 100644 --- a/tests/witness/socketServer.8 +++ b/tests/witness/socketServer.8 @@ -17,6 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR some8 T8 shortSocketServer MDC-TEST8 [main] root - Message 7 java.lang.Exception: Just testing @@ -32,4 +33,5 @@ java.lang.Exception: Just testing at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/ttcc b/tests/witness/ttcc index 976984de12..1c91f6b97c 100644 --- a/tests/witness/ttcc +++ b/tests/witness/ttcc @@ -35,5 +35,6 @@ java.lang.Exception: Just testing. at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO INF - Messages should bear numbers 0 through 23. diff --git a/tests/witness/xmlLayout.1 b/tests/witness/xmlLayout.1 index 4c36198923..892a1a21c3 100644 --- a/tests/witness/xmlLayout.1 +++ b/tests/witness/xmlLayout.1 @@ -57,6 +57,7 @@ at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> @@ -76,6 +77,7 @@ at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> @@ -95,6 +97,7 @@ at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> @@ -114,6 +117,7 @@ at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> diff --git a/tests/witness/xmlLayout.2 b/tests/witness/xmlLayout.2 index e181eb54e0..8306d1e31c 100644 --- a/tests/witness/xmlLayout.2 +++ b/tests/witness/xmlLayout.2 @@ -68,6 +68,7 @@ at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> @@ -88,6 +89,7 @@ at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> @@ -108,6 +110,7 @@ at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> @@ -128,6 +131,7 @@ at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> diff --git a/tests/witness/xmlLayout.null b/tests/witness/xmlLayout.null index a6b1c7fa94..fc33042819 100644 --- a/tests/witness/xmlLayout.null +++ b/tests/witness/xmlLayout.null @@ -20,6 +20,7 @@ at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) + at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> From 48c6b6cdfcc5a151984a68c06cac03a970460d51 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Fri, 3 Jun 2005 05:31:33 +0000 Subject: [PATCH 118/342] Officially moving to 1.2.11rc3 for version number. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311386 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 0b95996e23..64d15fe66d 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + From 587a0a009be284d75d14d0897622a63a41bea2ac Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Fri, 17 Jun 2005 05:08:33 +0000 Subject: [PATCH 119/342] Updated to iso-8859-1 encoding. Updated plan.xml to detail approved release roadmap. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311388 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/contactUs.xml | 4 +- src/xdocs/contributors.xml | 4 +- src/xdocs/documentation.xml | 4 +- src/xdocs/download.xml | 4 +- src/xdocs/earlier.xml | 4 +- src/xdocs/history.xml | 4 +- src/xdocs/index.xml | 4 +- src/xdocs/lf5/configuration.xml | 2 +- src/xdocs/lf5/examples.xml | 2 +- src/xdocs/lf5/faq.xml | 2 +- src/xdocs/lf5/features.xml | 2 +- src/xdocs/lf5/overview.xml | 2 +- src/xdocs/lf5/readingfiles.xml | 2 +- src/xdocs/lf5/trouble.xml | 2 +- src/xdocs/plan.xml | 139 ++++++++++++++++++++---------- src/xdocs/srtw.xml | 4 +- src/xdocs/stylesheets/lf5.xml | 2 +- src/xdocs/stylesheets/project.xml | 4 +- 18 files changed, 119 insertions(+), 72 deletions(-) diff --git a/src/xdocs/contactUs.xml b/src/xdocs/contactUs.xml index 42335a1825..38b92d6726 100644 --- a/src/xdocs/contactUs.xml +++ b/src/xdocs/contactUs.xml @@ -1,8 +1,8 @@ - + - Ceki Gulcu + Ceki Gülcü Contact us diff --git a/src/xdocs/contributors.xml b/src/xdocs/contributors.xml index 36f9cc7db2..fac8014fda 100644 --- a/src/xdocs/contributors.xml +++ b/src/xdocs/contributors.xml @@ -1,8 +1,8 @@ - + - Ceki Gulcu + Ceki Gülcü Log4j Contributors diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index f2c618b438..adf3a56b0e 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -1,8 +1,8 @@ - + - Ceki Gulcu + Ceki Gülcü Yoav Shapira Documentation diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 822658cd4c..724671c12e 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -1,8 +1,8 @@ - + - Ceki Gulcu + Ceki Gülcü Download diff --git a/src/xdocs/earlier.xml b/src/xdocs/earlier.xml index f51c696068..b537523125 100644 --- a/src/xdocs/earlier.xml +++ b/src/xdocs/earlier.xml @@ -1,8 +1,8 @@ - + - Ceki Gulcu + Ceki Gülcü Older distributions diff --git a/src/xdocs/history.xml b/src/xdocs/history.xml index 77f4483d27..ee3c1c2c9e 100644 --- a/src/xdocs/history.xml +++ b/src/xdocs/history.xml @@ -1,8 +1,8 @@ - + - Ceki Gulcu + Ceki Gülcü Project history diff --git a/src/xdocs/index.xml b/src/xdocs/index.xml index f2b2a63024..d6494c3b94 100644 --- a/src/xdocs/index.xml +++ b/src/xdocs/index.xml @@ -1,8 +1,8 @@ - + - Ceki Gulcu + Ceki Gülcü Introduction diff --git a/src/xdocs/lf5/configuration.xml b/src/xdocs/lf5/configuration.xml index ea38eabbf3..d01914d5c4 100644 --- a/src/xdocs/lf5/configuration.xml +++ b/src/xdocs/lf5/configuration.xml @@ -1,4 +1,4 @@ - + diff --git a/src/xdocs/lf5/examples.xml b/src/xdocs/lf5/examples.xml index 24c5f2d920..09c6b0ba6b 100644 --- a/src/xdocs/lf5/examples.xml +++ b/src/xdocs/lf5/examples.xml @@ -1,4 +1,4 @@ - + diff --git a/src/xdocs/lf5/faq.xml b/src/xdocs/lf5/faq.xml index 33bb853b80..7729b8fb5d 100644 --- a/src/xdocs/lf5/faq.xml +++ b/src/xdocs/lf5/faq.xml @@ -1,4 +1,4 @@ - + diff --git a/src/xdocs/lf5/features.xml b/src/xdocs/lf5/features.xml index a90dca72fb..149b7cdb52 100644 --- a/src/xdocs/lf5/features.xml +++ b/src/xdocs/lf5/features.xml @@ -1,4 +1,4 @@ - + diff --git a/src/xdocs/lf5/overview.xml b/src/xdocs/lf5/overview.xml index bfea0bb6fd..1222fc0ca8 100644 --- a/src/xdocs/lf5/overview.xml +++ b/src/xdocs/lf5/overview.xml @@ -1,4 +1,4 @@ - + diff --git a/src/xdocs/lf5/readingfiles.xml b/src/xdocs/lf5/readingfiles.xml index 9039bda156..5725828b8c 100644 --- a/src/xdocs/lf5/readingfiles.xml +++ b/src/xdocs/lf5/readingfiles.xml @@ -1,4 +1,4 @@ - + diff --git a/src/xdocs/lf5/trouble.xml b/src/xdocs/lf5/trouble.xml index a72db0c0aa..99daaf5d54 100644 --- a/src/xdocs/lf5/trouble.xml +++ b/src/xdocs/lf5/trouble.xml @@ -1,4 +1,4 @@ - + diff --git a/src/xdocs/plan.xml b/src/xdocs/plan.xml index a49d596a27..2a602a9587 100644 --- a/src/xdocs/plan.xml +++ b/src/xdocs/plan.xml @@ -1,47 +1,83 @@ - + - Ceki Gulcu - Release plan for log4j 1.3 + Ceki Gülcü + Mark Womack + Release roadmap for log4j -
    +
    -

    The following paragragh was adapted from the Cactus project's - roadmap with the author's permission. +

    The log4j committers have adopted a roadmap for future releases + of log4j. This page documents that roadmap and gives you an idea of what + to expect from future versions and timeframes for release.

    Our users keep inventing better ways and adding new - requirements. The downside is that our todo list keeps - growing. The upside is that there is plenty of work to go - around. If you are interested in participating, send an email - on the log4j-dev@ mailing list stating your interest. You'll - be promptly enrolled. We're always looking for help! Don't be - put off if in the "Volunteer" column already has a person - listed. Programming is fun, especially if it is done in a - team. + requirements. The downside is that our todo list keeps + growing. The upside is that there is plenty of work to go + around. If you are interested in participating, send an email + on the log4j-dev@ mailing list stating your interest. You'll + be promptly enrolled. We're always looking for help! Don't be + put off if in the "Volunteer" column already has a person + listed. Programming is fun, especially if it is done in a + team.

    -

    - -

    - -
    -
    - -

    The workplan for log4j 1.3 is not final. It is included here - to give you an idea of the future. The items are not listed in - any particular order. As always, there is no scheduled - release date. The lack of schedule suprises and disturbs some - people. Writing good software, like good cooking, takes - time. If we make you wait, it is to create a better and more - reliable product. +

    +

    Expected timeframe: End of July, 2005

    + +

    Version 1.2.12 is planned primarily as a bug fix release. It will be + addressing major bugs where the fixes do not require api changes. If you + have a bug or problem that you feel should be addressed, please make sure + that is reported in the log4j bug database and highlight it as a candidate + for the 1.2.12 release. +

    + +

    The log4j committers did decide to include one change in the 1.2 api + for the 1.2.12 release: adding the TRACE level as a level choice with + supporting methods to log messages for that level and check if the level + is enabled. The change is minor and should not cause problems with + existing deployments that use version 1.2.12 throughout. However, the + committers reserve the right to not include it if it appears to break too + much. +

    + +

    It is expected that version 1.2.12 will be the last release for the + 1.2 branch, the next major release being version 1.3. However, if a + critical bug fix is needed, another version will be released. +

    +
    + +
    +

    Expected timeframe: October, 2005

    + +

    The work for version 1.3 has been ongoing for a long time now, and it + is time to button it up and let others take it for a ride. Reviewing, + stablizing, and testing the 1.3 code for release is the major goal for + the log4j committers for this year. +

    + +

    Version 1.3 is going to contain some very extensive changes and new + features. You should expect a number of api changes. Early release + alpha versions have been available for a while, and the releases will be + accelerating as the committers review and cleanup the current code base + for release. As part of those releases, the committers plan to include + jDiff reports that will clearly outline the changes and additions to the + log4j code since the most recent 1.2.X release. This should help you in + seeing what might need to be reviewed or fixed in your own code related + to log4j. +

    + +

    Below is a table from previous documentation about the 1.3 work plan + and it is somewhat out of date. The committers will be updating this page + with more and better documentation about what has changed, what has been + reviewed, and what tasks remain as we work toward the 1.3 release.

    @@ -91,12 +127,14 @@ are configured separately.

    -

    The new JoranConfigurator being created by Ceki will be based on - a new 'module' know as Joran, which can convert XML files into other objects based - on rules. You can read more abouth Joran here +

    The new JoranConfigurator being created by Ceki Gülcü will be based on + a new 'module' know as Joran, which can convert XML files into other + objects based on rules. You can read more abouth Joran + here +

    - + @@ -111,7 +149,7 @@ href="http://www.jboss.org">JBoss fame.

    - + @@ -137,11 +175,14 @@ @@ -153,8 +194,10 @@ - + @@ -181,13 +224,16 @@ + classes that can accept logging events from an external source, and + 'import' them into the local log4j environment.

    - + @@ -208,7 +254,7 @@ scripts.

    - + @@ -218,7 +264,8 @@ - ", + result.substring(0, Layout.LINE_SEP.length() + 4)); + } +} diff --git a/tests/src/java/org/apache/log4j/LayoutTest.java b/tests/src/java/org/apache/log4j/LayoutTest.java new file mode 100644 index 0000000000..4743f42f2a --- /dev/null +++ b/tests/src/java/org/apache/log4j/LayoutTest.java @@ -0,0 +1,167 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j; + +import junit.framework.TestCase; + +import org.apache.log4j.spi.LoggingEvent; + + +/** + * Tests for Layout. + * + */ +public class LayoutTest extends TestCase { + /** + * Expected content type. + */ + private final String contentType; + + /** + * Expected value for ignoresThrowable. + */ + private final boolean ignoresThrowable; + + /** + * Expected value for header. + */ + private final String header; + + /** + * Expected value for footer. + */ + private final String footer; + + /** + * Construct a new instance of LayoutTest. + * @param testName test name. + */ + public LayoutTest(final String testName) { + super(testName); + contentType = "text/plain"; + ignoresThrowable = true; + header = null; + footer = null; + } + + /** + * Constructor for use by derived tests. + * @param testName name of test. + * @param expectedContentType expected value for getContentType(). + * @param expectedIgnoresThrowable expected value for ignoresThrowable(). + * @param expectedHeader expected value for getHeader(). + * @param expectedFooter expected value for getFooter(). + */ + protected LayoutTest( + final String testName, final String expectedContentType, + final boolean expectedIgnoresThrowable, final String expectedHeader, + final String expectedFooter) { + super(testName); + contentType = expectedContentType; + ignoresThrowable = expectedIgnoresThrowable; + header = expectedHeader; + footer = expectedFooter; + } + + /** + * Tests Layout.LINE_SEP. + */ + public void testLineSep() { + assertEquals(System.getProperty("line.separator"), Layout.LINE_SEP); + } + + /** + * Tests Layout.LINE_SEP. + */ + public void testLineSepLen() { + assertEquals(Layout.LINE_SEP.length(), Layout.LINE_SEP_LEN); + } + + /** + * Creates layout for test. + * @return new instance of Layout. + */ + protected Layout createLayout() { + return new MockLayout(); + } + + /** + * Tests getContentType. + */ + public void testGetContentType() { + assertEquals(contentType, createLayout().getContentType()); + } + + /** + * Tests ignoresThrowable. + */ + public void testIgnoresThrowable() { + assertEquals(ignoresThrowable, createLayout().ignoresThrowable()); + } + + /** + * Tests getHeader. + */ + public void testGetHeader() { + assertEquals(header, createLayout().getHeader()); + } + + /** + * Tests getFooter. + */ + public void testGetFooter() { + assertEquals(footer, createLayout().getFooter()); + } + + /** + * Tests format. + * @throws Exception derived tests, particular XMLLayoutTest, may throw exceptions. + */ + public void testFormat() throws Exception { + Logger logger = Logger.getLogger("org.apache.log4j.LayoutTest"); + LoggingEvent event = + new LoggingEvent( + "org.apache.log4j.Logger", logger, Level.INFO, "Hello, World", null); + String result = createLayout().format(event); + assertEquals("Mock", result); + } + + /** + * Concrete Layout class for tests. + */ + private static final class MockLayout extends Layout { + /** + * @{inheritDoc} + */ + public String format(final LoggingEvent event) { + return "Mock"; + } + + /** + * @{inheritDoc} + */ + public void activateOptions() { + } + + /** + * @{inheritDoc} + */ + public boolean ignoresThrowable() { + return true; + } + } +} diff --git a/tests/src/java/org/apache/log4j/PatternLayoutTest.java b/tests/src/java/org/apache/log4j/PatternLayoutTest.java new file mode 100644 index 0000000000..7371023595 --- /dev/null +++ b/tests/src/java/org/apache/log4j/PatternLayoutTest.java @@ -0,0 +1,141 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j; + +import org.apache.log4j.spi.LoggingEvent; + + +/** + * Test for PatternLayout. + * + * @author Curt Arnold + */ +public class PatternLayoutTest extends LayoutTest { + /** + * Construct new instance of PatternLayoutTest. + * + * @param testName test name. + */ + public PatternLayoutTest(final String testName) { + super(testName, "text/plain", true, null, null); + } + + /** + * @{inheritDoc} + */ + protected Layout createLayout() { + return new PatternLayout("[%t] %p %c - %m%n"); + } + + /** + * Tests format. + */ + public void testFormat() { + Logger logger = Logger.getLogger("org.apache.log4j.LayoutTest"); + LoggingEvent event = + new LoggingEvent( + "org.apache.log4j.Logger", logger, Level.INFO, "Hello, World", null); + PatternLayout layout = (PatternLayout) createLayout(); + String result = layout.format(event); + StringBuffer buf = new StringBuffer(100); + buf.append('['); + buf.append(event.getThreadName()); + buf.append("] "); + buf.append(event.getLevel().toString()); + buf.append(' '); + buf.append(event.getLoggerName()); + buf.append(" - "); + buf.append(event.getMessage()); + buf.append(System.getProperty("line.separator")); + assertEquals(buf.toString(), result); + } + + /** + * Tests getPatternFormat(). + */ + public void testGetPatternFormat() { + PatternLayout layout = (PatternLayout) createLayout(); + assertEquals("[%t] %p %c - %m%n", layout.getConversionPattern()); + } + + /** + * Tests DEFAULT_CONVERSION_PATTERN constant. + */ + public void testDefaultConversionPattern() { + assertEquals("%m%n", PatternLayout.DEFAULT_CONVERSION_PATTERN); + } + + /** + * Tests DEFAULT_CONVERSION_PATTERN constant. + */ + public void testTTCCConversionPattern() { + assertEquals( + "%r [%t] %p %c %x - %m%n", PatternLayout.TTCC_CONVERSION_PATTERN); + } + + /** + * Tests buffer downsizing code path. + */ + public void testFormatResize() { + Logger logger = Logger.getLogger("org.apache.log4j.xml.PatternLayoutTest"); + NDC.clear(); + + char[] msg = new char[2000]; + + for (int i = 0; i < msg.length; i++) { + msg[i] = 'A'; + } + + LoggingEvent event1 = + new LoggingEvent( + "org.apache.log4j.Logger", logger, Level.DEBUG, new String(msg), null); + PatternLayout layout = (PatternLayout) createLayout(); + String result = layout.format(event1); + LoggingEvent event2 = + new LoggingEvent( + "org.apache.log4j.Logger", logger, Level.WARN, "Hello, World", null); + result = layout.format(event2); + assertEquals("[", result.substring(0, 1)); + } + + /** + * Class to ensure that protected members are still available. + */ + private static final class DerivedPatternLayout extends PatternLayout { + /** + * Constructs a new instance of DerivedPatternLayout. + */ + public DerivedPatternLayout() { + } + + /** + * Get BUF_SIZE. + * @return return initial buffer size in characters. + */ + public int getBufSize() { + return BUF_SIZE; + } + + /** + * Get MAX_CAPACITY. + * @return maximum capacity in characters. + */ + public int getMaxCapacity() { + return MAX_CAPACITY; + } + } +} diff --git a/tests/src/java/org/apache/log4j/TTCCLayoutTest.java b/tests/src/java/org/apache/log4j/TTCCLayoutTest.java new file mode 100644 index 0000000000..73889fda54 --- /dev/null +++ b/tests/src/java/org/apache/log4j/TTCCLayoutTest.java @@ -0,0 +1,111 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j; + +import org.apache.log4j.helpers.DateLayoutTest; +import org.apache.log4j.spi.LoggingEvent; + + +/** + * Test for TTCCLayout. + * + * @author Curt Arnold + */ +public class TTCCLayoutTest extends DateLayoutTest { + /** + * Construct new instance of TTCCLayoutTest. + * + * @param testName test name. + */ + public TTCCLayoutTest(final String testName) { + super(testName, "text/plain", true, null, null); + } + + /** + * @{inheritDoc} + */ + protected Layout createLayout() { + return new TTCCLayout(); + } + + /** + * Tests format. + */ + public void testFormat() { + NDC.clear(); + NDC.push("NDC goes here"); + + Logger logger = Logger.getLogger("org.apache.log4j.LayoutTest"); + LoggingEvent event = + new LoggingEvent( + "org.apache.log4j.Logger", logger, Level.INFO, "Hello, World", null); + TTCCLayout layout = (TTCCLayout) createLayout(); + String result = layout.format(event); + NDC.pop(); + + StringBuffer buf = new StringBuffer(100); + layout.dateFormat(buf, event); + buf.append('['); + buf.append(event.getThreadName()); + buf.append("] "); + buf.append(event.getLevel().toString()); + buf.append(' '); + buf.append(event.getLoggerName()); + buf.append(' '); + buf.append("NDC goes here"); + buf.append(" - "); + buf.append(event.getMessage()); + buf.append(System.getProperty("line.separator")); + assertEquals(buf.toString(), result); + } + + /** + * Tests getThreadPrinting and setThreadPrinting. + */ + public void testGetSetThreadPrinting() { + TTCCLayout layout = new TTCCLayout(); + assertEquals(true, layout.getThreadPrinting()); + layout.setThreadPrinting(false); + assertEquals(false, layout.getThreadPrinting()); + layout.setThreadPrinting(true); + assertEquals(true, layout.getThreadPrinting()); + } + + /** + * Tests getCategoryPrefixing and setCategoryPrefixing. + */ + public void testGetSetCategoryPrefixing() { + TTCCLayout layout = new TTCCLayout(); + assertEquals(true, layout.getCategoryPrefixing()); + layout.setCategoryPrefixing(false); + assertEquals(false, layout.getCategoryPrefixing()); + layout.setCategoryPrefixing(true); + assertEquals(true, layout.getCategoryPrefixing()); + } + + /** + * Tests getContextPrinting and setContextPrinting. + */ + public void testGetSetContextPrinting() { + TTCCLayout layout = new TTCCLayout(); + assertEquals(true, layout.getContextPrinting()); + layout.setContextPrinting(false); + assertEquals(false, layout.getContextPrinting()); + layout.setContextPrinting(true); + assertEquals(true, layout.getContextPrinting()); + } +} diff --git a/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java b/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java new file mode 100644 index 0000000000..ae6cda0dc3 --- /dev/null +++ b/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java @@ -0,0 +1,254 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.helpers; + +import org.apache.log4j.Layout; +import org.apache.log4j.LayoutTest; +import org.apache.log4j.spi.LoggingEvent; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import java.util.TimeZone; + + +/** + * Tests for DateLayout. + * + */ +public class DateLayoutTest extends LayoutTest { + /** + * Construct a new instance of LayoutTest. + * @param testName test name. + */ + public DateLayoutTest(final String testName) { + super(testName); + } + + /** + * Constructor for use by derived tests. + * @param testName name of test. + * @param expectedContentType expected value for getContentType(). + * @param expectedIgnoresThrowable expected value for ignoresThrowable(). + * @param expectedHeader expected value for getHeader(). + * @param expectedFooter expected value for getFooter(). + */ + protected DateLayoutTest( + final String testName, final String expectedContentType, + final boolean expectedIgnoresThrowable, final String expectedHeader, + final String expectedFooter) { + super( + testName, expectedContentType, expectedIgnoresThrowable, expectedHeader, + expectedFooter); + } + + /** + * @{inheritDoc} + */ + protected Layout createLayout() { + return new MockLayout(); + } + + /** + * Tests DateLayout.NULL_DATE_FORMAT constant. + */ + public void testNullDateFormat() { + assertEquals("NULL", DateLayout.NULL_DATE_FORMAT); + } + + /** + * Tests DateLayout.RELATIVE constant. + */ + public void testRelativeTimeDateFormat() { + assertEquals("RELATIVE", DateLayout.RELATIVE_TIME_DATE_FORMAT); + } + + /** + * Tests DateLayout.DATE_FORMAT_OPTION constant. + * @deprecated since constant is deprecated + */ + public void testDateFormatOption() { + assertEquals("DateFormat", DateLayout.DATE_FORMAT_OPTION); + } + + /** + * Tests DateLayout.TIMEZONE_OPTION constant. + * @deprecated since constant is deprecated + */ + public void testTimeZoneOption() { + assertEquals("TimeZone", DateLayout.TIMEZONE_OPTION); + } + + /** + * Tests getOptionStrings(). + * @deprecated since getOptionStrings is deprecated. + * + */ + public void testGetOptionStrings() { + String[] options = ((DateLayout) createLayout()).getOptionStrings(); + assertEquals(2, options.length); + } + + /** + * Tests setting DateFormat through setOption method. + * @deprecated since setOption is deprecated. + */ + public void testSetOptionDateFormat() { + DateLayout layout = (DateLayout) createLayout(); + layout.setOption("dAtefOrmat", "foobar"); + assertEquals("FOOBAR", layout.getDateFormat()); + } + + /** + * Tests setting TimeZone through setOption method. + * @deprecated since setOption is deprecated. + */ + public void testSetOptionTimeZone() { + DateLayout layout = (DateLayout) createLayout(); + layout.setOption("tImezOne", "+05:00"); + assertEquals("+05:00", layout.getTimeZone()); + } + + /** + * Tests setDateFormat. + */ + public void testSetDateFormat() { + DateLayout layout = (DateLayout) createLayout(); + layout.setDateFormat("ABSOLUTE"); + assertEquals("ABSOLUTE", layout.getDateFormat()); + } + + /** + * Tests setTimeZone. + */ + public void testSetTimeZone() { + DateLayout layout = (DateLayout) createLayout(); + layout.setTimeZone("+05:00"); + assertEquals("+05:00", layout.getTimeZone()); + } + + /** + * Tests 2 parameter setDateFormat with null. + */ + public void testSetDateFormatNull() { + DateLayout layout = (DateLayout) createLayout(); + layout.setDateFormat((String) null, null); + } + + /** + * Tests 2 parameter setDateFormat with "NULL". + */ + public void testSetDateFormatNullString() { + DateLayout layout = (DateLayout) createLayout(); + layout.setDateFormat("NuLL", null); + } + + /** + * Tests 2 parameter setDateFormat with "RELATIVE". + */ + public void testSetDateFormatRelative() { + DateLayout layout = (DateLayout) createLayout(); + layout.setDateFormat("rElatIve", TimeZone.getDefault()); + } + + /** + * Tests 2 parameter setDateFormat with "ABSOLUTE". + */ + public void testSetDateFormatAbsolute() { + DateLayout layout = (DateLayout) createLayout(); + layout.setDateFormat("aBsolUte", TimeZone.getDefault()); + } + + /** + * Tests 2 parameter setDateFormat with "DATETIME". + */ + public void testSetDateFormatDateTime() { + DateLayout layout = (DateLayout) createLayout(); + layout.setDateFormat("dAte", TimeZone.getDefault()); + } + + /** + * Tests 2 parameter setDateFormat with "ISO8601". + */ + public void testSetDateFormatISO8601() { + DateLayout layout = (DateLayout) createLayout(); + layout.setDateFormat("iSo8601", TimeZone.getDefault()); + } + + /** + * Tests 2 parameter setDateFormat with "HH:mm:ss". + */ + public void testSetDateFormatSimple() { + DateLayout layout = (DateLayout) createLayout(); + layout.setDateFormat("HH:mm:ss", TimeZone.getDefault()); + } + + /** + * Tests activateOptions. + */ + public void testActivateOptions() { + DateLayout layout = (DateLayout) createLayout(); + layout.setDateFormat("HH:mm:ss"); + layout.setTimeZone("+05:00"); + layout.activateOptions(); + } + + /** + * Tests setDateFormat(DateFormat, TimeZone). + */ + public void testSetDateFormatWithFormat() { + DateFormat format = new SimpleDateFormat("HH:mm"); + DateLayout layout = (DateLayout) createLayout(); + layout.setDateFormat(format, TimeZone.getDefault()); + } + + /** + * Concrete Layout class for tests. + */ + private static final class MockLayout extends DateLayout { + /** + * Create new instance of MockLayout. + */ + public MockLayout() { + // + // checks that protected fields are properly initialized + assertNotNull(pos); + assertNotNull(date); + assertNull(dateFormat); + } + + /** + * @{inheritDoc} + */ + public String format(final LoggingEvent event) { + return "Mock"; + } + + /** + * @{inheritDoc} + */ + public void activateOptions() { + } + + /** + * @{inheritDoc} + */ + public boolean ignoresThrowable() { + return true; + } + } +} diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTest.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTest.java new file mode 100644 index 0000000000..a7fa2c4e13 --- /dev/null +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTest.java @@ -0,0 +1,310 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.xml; + +import org.apache.log4j.Layout; +import org.apache.log4j.LayoutTest; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.log4j.NDC; +import org.apache.log4j.spi.LoggingEvent; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +import org.xml.sax.InputSource; + +import java.io.Reader; +import java.io.StringReader; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + + +/** + * Test for XMLLayout. + * + * @author Curt Arnold + */ +public class XMLLayoutTest extends LayoutTest { + /** + * Construct new instance of XMLLayoutTest. + * + * @param testName test name. + */ + public XMLLayoutTest(final String testName) { + super(testName, "text/plain", false, null, null); + } + + /** + * @{inheritDoc} + */ + protected Layout createLayout() { + return new XMLLayout(); + } + + /** + * Parses the string as the body of an XML document and returns the document element. + * @param source source string. + * @return document element. + * @throws Exception if parser can not be constructed or source is not a valid XML document. + */ + private Element parse(final String source) throws Exception { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(false); + factory.setCoalescing(true); + + DocumentBuilder builder = factory.newDocumentBuilder(); + Reader reader = new StringReader(source); + Document doc = builder.parse(new InputSource(reader)); + + return doc.getDocumentElement(); + } + + /** + * Checks a log4j:event element against expectations. + * @param element element, may not be null. + * @param event event, may not be null. + */ + private void checkEventElement( + final Element element, final LoggingEvent event) { + assertEquals("log4j:event", element.getTagName()); + assertEquals( + "org.apache.log4j.xml.XMLLayoutTest", element.getAttribute("logger")); + assertEquals( + Long.toString(event.timeStamp), element.getAttribute("timestamp")); + assertEquals("INFO", element.getAttribute("level")); + assertEquals(event.getThreadName(), element.getAttribute("thread")); + } + + /** + * Checks a log4j:message element against expectations. + * @param element element, may not be null. + * @param message expected message. + */ + private void checkMessageElement( + final Element element, final String message) { + assertEquals("log4j:message", element.getTagName()); + + Node messageNode = element.getFirstChild(); + assertNotNull(messageNode); + assertEquals(Node.TEXT_NODE, messageNode.getNodeType()); + assertEquals(message, messageNode.getNodeValue()); + assertNull(messageNode.getNextSibling()); + } + + /** + * Checks a log4j:message element against expectations. + * @param element element, may not be null. + * @param message expected message. + */ + private void checkNDCElement(final Element element, final String message) { + assertEquals("log4j:NDC", element.getTagName()); + + Node messageNode = element.getFirstChild(); + assertNotNull(messageNode); + assertEquals(Node.TEXT_NODE, messageNode.getNodeType()); + assertEquals(message, messageNode.getNodeValue()); + assertNull(messageNode.getNextSibling()); + } + + /** + * Checks a log4j:throwable element against expectations. + * @param element element, may not be null. + * @param ex exception, may not be null. + */ + private void checkThrowableElement( + final Element element, final Exception ex) { + assertEquals("log4j:throwable", element.getTagName()); + + Node messageNode = element.getFirstChild(); + assertNotNull(messageNode); + assertEquals(Node.TEXT_NODE, messageNode.getNodeType()); + + String msg = ex.toString(); + assertEquals(msg, messageNode.getNodeValue().substring(0, msg.length())); + assertNull(messageNode.getNextSibling()); + } + + /** + * Tests formatted results. + * @throws Exception if parser can not be constructed or source is not a valid XML document. + */ + public void testFormat() throws Exception { + Logger logger = Logger.getLogger("org.apache.log4j.xml.XMLLayoutTest"); + LoggingEvent event = + new LoggingEvent( + "org.apache.log4j.Logger", logger, Level.INFO, "Hello, World", null); + XMLLayout layout = (XMLLayout) createLayout(); + String result = layout.format(event); + Element parsedResult = parse(result); + checkEventElement(parsedResult, event); + + int childElementCount = 0; + + for ( + Node node = parsedResult.getFirstChild(); node != null; + node = node.getNextSibling()) { + switch (node.getNodeType()) { + case Node.ELEMENT_NODE: + childElementCount++; + checkMessageElement((Element) node, "Hello, World"); + + break; + + case Node.COMMENT_NODE: + break; + + case Node.TEXT_NODE: + + // should only be whitespace + break; + + default: + fail("Unexpected node type"); + + break; + } + } + + assertEquals(1, childElementCount); + } + + /** + * Tests formatted results with an exception. + * @throws Exception if parser can not be constructed or source is not a valid XML document. + */ + public void testFormatWithException() throws Exception { + Logger logger = Logger.getLogger("org.apache.log4j.xml.XMLLayoutTest"); + Exception ex = new IllegalArgumentException("'foo' is not a valid name"); + LoggingEvent event = + new LoggingEvent( + "org.apache.log4j.Logger", logger, Level.INFO, "Hello, World", ex); + XMLLayout layout = (XMLLayout) createLayout(); + String result = layout.format(event); + Element parsedResult = parse(result); + checkEventElement(parsedResult, event); + + int childElementCount = 0; + + for ( + Node node = parsedResult.getFirstChild(); node != null; + node = node.getNextSibling()) { + switch (node.getNodeType()) { + case Node.ELEMENT_NODE: + childElementCount++; + + if (childElementCount == 1) { + checkMessageElement((Element) node, "Hello, World"); + } else { + checkThrowableElement((Element) node, ex); + } + + break; + + case Node.COMMENT_NODE: + break; + + case Node.TEXT_NODE: + + // should only be whitespace + break; + + default: + fail("Unexpected node type"); + + break; + } + } + + assertEquals(2, childElementCount); + } + + /** + * Tests formatted results with an exception. + * @throws Exception if parser can not be constructed or source is not a valid XML document. + */ + public void testFormatWithNDC() throws Exception { + Logger logger = Logger.getLogger("org.apache.log4j.xml.XMLLayoutTest"); + NDC.push("NDC goes here"); + + LoggingEvent event = + new LoggingEvent( + "org.apache.log4j.Logger", logger, Level.INFO, "Hello, World", null); + XMLLayout layout = (XMLLayout) createLayout(); + String result = layout.format(event); + NDC.pop(); + + Element parsedResult = parse(result); + checkEventElement(parsedResult, event); + + int childElementCount = 0; + + for ( + Node node = parsedResult.getFirstChild(); node != null; + node = node.getNextSibling()) { + switch (node.getNodeType()) { + case Node.ELEMENT_NODE: + childElementCount++; + + if (childElementCount == 1) { + checkMessageElement((Element) node, "Hello, World"); + } else { + checkNDCElement((Element) node, "NDC goes here"); + } + + break; + + case Node.COMMENT_NODE: + break; + + case Node.TEXT_NODE: + + // should only be whitespace + break; + + default: + fail("Unexpected node type"); + + break; + } + } + + assertEquals(2, childElementCount); + } + + /** + * Tests getLocationInfo and setLocationInfo. + */ + public void testGetSetLocationInfo() { + XMLLayout layout = new XMLLayout(); + assertEquals(false, layout.getLocationInfo()); + layout.setLocationInfo(true); + assertEquals(true, layout.getLocationInfo()); + layout.setLocationInfo(false); + assertEquals(false, layout.getLocationInfo()); + } + + /** + * Tests activateOptions(). + */ + public void testActivateOptions() { + XMLLayout layout = new XMLLayout(); + layout.activateOptions(); + } +} From 6191c71e3e1602a761d0b1a763d1c500f06db42f Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 30 Dec 2005 19:05:58 +0000 Subject: [PATCH 189/342] Bug 35452: Unit tests for Priority and Level 1.2/1.3 compatibility git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@360145 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/log4j/CategoryTest.java | 110 +++++++++++ .../java/org/apache/log4j/CoreTestSuite.java | 3 + .../org/apache/log4j/FileAppenderTest.java | 67 +++++-- .../src/java/org/apache/log4j/LevelTest.java | 123 ++++++++++++ .../java/org/apache/log4j/PriorityTest.java | 185 ++++++++++++++++++ .../apache/log4j/spi/LoggingEventTest.java | 33 ++++ 6 files changed, 505 insertions(+), 16 deletions(-) create mode 100644 tests/src/java/org/apache/log4j/CategoryTest.java create mode 100644 tests/src/java/org/apache/log4j/PriorityTest.java diff --git a/tests/src/java/org/apache/log4j/CategoryTest.java b/tests/src/java/org/apache/log4j/CategoryTest.java new file mode 100644 index 0000000000..3d39d7a81c --- /dev/null +++ b/tests/src/java/org/apache/log4j/CategoryTest.java @@ -0,0 +1,110 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j; + +import junit.framework.TestCase; + +import java.lang.reflect.Method; + + +/** + * Tests of Category. + * + * @author Curt Arnold + * @since 1.2.14 + */ +public class CategoryTest extends TestCase { + /** + * Constructs new instance of test. + * @param name test name. + */ + public CategoryTest(final String name) { + super(name); + } + + /** + * Tests Category.forcedLog. + */ + public void testForcedLog() { + MockCategory category = new MockCategory("org.example.foo"); + category.setAdditivity(false); + category.addAppender(new VectorAppender()); + category.info("Hello, World"); + } + + /** + * Tests that the return type of getChainedPriority is Priority. + * @throws Exception thrown if Category.getChainedPriority can not be found. + */ + public void testGetChainedPriorityReturnType() throws Exception { + Method method = Category.class.getMethod("getChainedPriority", null); + assertTrue(method.getReturnType() == Priority.class); + } + + /** + * Tests l7dlog(Priority, String, Throwable). + */ + public void testL7dlog() { + Logger logger = Logger.getLogger("org.example.foo"); + logger.setLevel(Level.ERROR); + Priority debug = Level.DEBUG; + logger.l7dlog(debug, "Hello, World", null); + } + + /** + * Tests l7dlog(Priority, String, Object[], Throwable). + */ + public void testL7dlog4Param() { + Logger logger = Logger.getLogger("org.example.foo"); + logger.setLevel(Level.ERROR); + Priority debug = Level.DEBUG; + logger.l7dlog(debug, "Hello, World", new Object[0], null); + } + + /** + * Tests setPriority(Priority). + * @deprecated + */ + public void testSetPriority() { + Logger logger = Logger.getLogger("org.example.foo"); + Priority debug = Level.DEBUG; + logger.setPriority(debug); + } + + /** + * Derived category to check method signature of forcedLog. + */ + private static class MockCategory extends Logger { + /** + * Create new instance of MockCategory. + * @param name category name + */ + public MockCategory(final String name) { + super(name); + repository = new Hierarchy(this); + } + + /** + * Request an info level message. + * @param msg message + */ + public void info(final String msg) { + Priority info = Level.INFO; + forcedLog(MockCategory.class.toString(), info, msg, null); + } + } +} diff --git a/tests/src/java/org/apache/log4j/CoreTestSuite.java b/tests/src/java/org/apache/log4j/CoreTestSuite.java index d20f33e159..51a0ac7ef2 100644 --- a/tests/src/java/org/apache/log4j/CoreTestSuite.java +++ b/tests/src/java/org/apache/log4j/CoreTestSuite.java @@ -34,6 +34,8 @@ public static Test suite() { TestSuite s = new TestSuite(); s.addTestSuite(LoggingEventTest.class); s.addTestSuite(org.apache.log4j.LevelTest.class); + s.addTestSuite(org.apache.log4j.PriorityTest.class); + s.addTestSuite(org.apache.log4j.CategoryTest.class); s.addTestSuite(org.apache.log4j.FileAppenderTest.class); s.addTestSuite(org.apache.log4j.LogManagerTest.class); s.addTestSuite(org.apache.log4j.helpers.LogLogTest.class); @@ -43,6 +45,7 @@ public static Test suite() { s.addTestSuite(org.apache.log4j.xml.XMLLayoutTest.class); s.addTestSuite(org.apache.log4j.HTMLLayoutTest.class); s.addTestSuite(org.apache.log4j.PatternLayoutTest.class); + s.addTestSuite(org.apache.log4j.spi.LoggingEventTest.class); return s; } } diff --git a/tests/src/java/org/apache/log4j/FileAppenderTest.java b/tests/src/java/org/apache/log4j/FileAppenderTest.java index a0ee2bdf1f..46302ca078 100644 --- a/tests/src/java/org/apache/log4j/FileAppenderTest.java +++ b/tests/src/java/org/apache/log4j/FileAppenderTest.java @@ -15,9 +15,13 @@ */ package org.apache.log4j; -import java.io.File; + import junit.framework.TestCase; +import java.io.File; + +import java.lang.reflect.Method; + /** * @@ -32,20 +36,51 @@ public class FileAppenderTest extends TestCase { * */ public void testDirectoryCreation() { - // - // known to fail on JDK 1.1 - if (!System.getProperty("java.version").startsWith("1.1.")) { - File newFile = new File("output/newdir/temp.log"); - newFile.delete(); - File newDir = new File("output/newdir"); - newDir.delete(); - - org.apache.log4j.FileAppender wa = new org.apache.log4j.FileAppender(); - wa.setFile("output/newdir/temp.log"); - wa.setLayout(new PatternLayout("%m%n")); - wa.activateOptions(); - - assertTrue(new File("output/newdir/temp.log").exists()); - } + // + // known to fail on JDK 1.1 + if (!System.getProperty("java.version").startsWith("1.1.")) { + File newFile = new File("output/newdir/temp.log"); + newFile.delete(); + + File newDir = new File("output/newdir"); + newDir.delete(); + + org.apache.log4j.FileAppender wa = new org.apache.log4j.FileAppender(); + wa.setFile("output/newdir/temp.log"); + wa.setLayout(new PatternLayout("%m%n")); + wa.activateOptions(); + + assertTrue(new File("output/newdir/temp.log").exists()); + } + } + + /** + * Tests that the return type of getThreshold is Priority. + * @throws Exception + */ + public void testGetThresholdReturnType() throws Exception { + Method method = FileAppender.class.getMethod("getThreshold", null); + assertTrue(method.getReturnType() == Priority.class); + } + + /** + * Tests getThreshold and setThreshold. + */ + public void testgetSetThreshold() { + FileAppender appender = new FileAppender(); + Priority debug = Level.DEBUG; + Priority all = Level.ALL; + assertNull(appender.getThreshold()); + appender.setThreshold(debug); + assertTrue(appender.getThreshold() == debug); + } + + /** + * Tests isAsSevereAsThreshold. + */ + public void testIsAsSevereAsThreshold() { + FileAppender appender = new FileAppender(); + Priority debug = Level.DEBUG; + assertTrue(appender.isAsSevereAsThreshold(debug)); } } diff --git a/tests/src/java/org/apache/log4j/LevelTest.java b/tests/src/java/org/apache/log4j/LevelTest.java index b9718115d2..64903eaa88 100644 --- a/tests/src/java/org/apache/log4j/LevelTest.java +++ b/tests/src/java/org/apache/log4j/LevelTest.java @@ -96,24 +96,147 @@ public CustomLevel() { } } + /** + * Tests Level.TRACE_INT. + */ public void testTraceInt() { assertEquals(5000, Level.TRACE_INT); } + /** + * Tests Level.TRACE. + */ public void testTrace() { assertEquals("TRACE", Level.TRACE.toString()); assertEquals(5000, Level.TRACE.toInt()); assertEquals(7, Level.TRACE.getSyslogEquivalent()); } + /** + * Tests Level.toLevel(Level.TRACE_INT). + */ public void testIntToTrace() { Level trace = Level.toLevel(5000); assertEquals("TRACE", trace.toString()); } + /** + * Tests Level.toLevel("TRACE"); + */ public void testStringToTrace() { Level trace = Level.toLevel("TRACE"); assertEquals("TRACE", trace.toString()); } + /** + * Tests that Level extends Priority. + */ + public void testLevelExtendsPriority() { + assertTrue(Priority.class.isAssignableFrom(Level.class)); + } + + /** + * Tests Level.OFF. + */ + public void testOFF() { + assertTrue(Level.OFF instanceof Level); + } + + /** + * Tests Level.FATAL. + */ + public void testFATAL() { + assertTrue(Level.FATAL instanceof Level); + } + + /** + * Tests Level.ERROR. + */ + public void testERROR() { + assertTrue(Level.ERROR instanceof Level); + } + + /** + * Tests Level.WARN. + */ + public void testWARN() { + assertTrue(Level.WARN instanceof Level); + } + + /** + * Tests Level.INFO. + */ + public void testINFO() { + assertTrue(Level.INFO instanceof Level); + } + + /** + * Tests Level.DEBUG. + */ + public void testDEBUG() { + assertTrue(Level.DEBUG instanceof Level); + } + + /** + * Tests Level.TRACE. + */ + public void testTRACE() { + assertTrue(Level.TRACE instanceof Level); + } + + /** + * Tests Level.ALL. + */ + public void testALL() { + assertTrue(Level.ALL instanceof Level); + } + + /** + * Tests Level.serialVersionUID. + */ + public void testSerialVersionUID() { + assertEquals(3491141966387921974L, Level.serialVersionUID); + } + + /** + * Tests Level.toLevel(Level.All_INT). + */ + public void testIntToAll() { + Level level = Level.toLevel(Level.ALL_INT); + assertEquals("ALL", level.toString()); + } + + /** + * Tests Level.toLevel(Level.FATAL_INT). + */ + public void testIntToFatal() { + Level level = Level.toLevel(Level.FATAL_INT); + assertEquals("FATAL", level.toString()); + } + + + /** + * Tests Level.toLevel(Level.OFF_INT). + */ + public void testIntToOff() { + Level level = Level.toLevel(Level.OFF_INT); + assertEquals("OFF", level.toString()); + } + + /** + * Tests Level.toLevel(17, Level.FATAL). + */ + public void testToLevelUnrecognizedInt() { + Level level = Level.toLevel(17, Level.FATAL); + assertEquals("FATAL", level.toString()); + } + + /** + * Tests Level.toLevel(null, Level.FATAL). + */ + public void testToLevelNull() { + Level level = Level.toLevel(null, Level.FATAL); + assertEquals("FATAL", level.toString()); + } + } diff --git a/tests/src/java/org/apache/log4j/PriorityTest.java b/tests/src/java/org/apache/log4j/PriorityTest.java new file mode 100644 index 0000000000..fe1105a712 --- /dev/null +++ b/tests/src/java/org/apache/log4j/PriorityTest.java @@ -0,0 +1,185 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j; + +import junit.framework.TestCase; + + +/** + * Tests of Priority. + * + * @author Curt Arnold + * @since 1.2.14 + */ +public class PriorityTest extends TestCase { + /** + * Constructs new instance of test. + * @param name test name. + */ + public PriorityTest(final String name) { + super(name); + } + + /** + * Tests Priority.OFF_INT. + */ + public void testOffInt() { + assertEquals(Integer.MAX_VALUE, Priority.OFF_INT); + } + + /** + * Tests Priority.FATAL_INT. + */ + public void testFatalInt() { + assertEquals(50000, Priority.FATAL_INT); + } + + /** + * Tests Priority.ERROR_INT. + */ + public void testErrorInt() { + assertEquals(40000, Priority.ERROR_INT); + } + + /** + * Tests Priority.WARN_INT. + */ + public void testWarnInt() { + assertEquals(30000, Priority.WARN_INT); + } + + /** + * Tests Priority.INFO_INT. + */ + public void testInfoInt() { + assertEquals(20000, Priority.INFO_INT); + } + + /** + * Tests Priority.DEBUG_INT. + */ + public void testDebugInt() { + assertEquals(10000, Priority.DEBUG_INT); + } + + /** + * Tests Priority.ALL_INT. + */ + public void testAllInt() { + assertEquals(Integer.MIN_VALUE, Priority.ALL_INT); + } + + /** + * Tests Priority.FATAL. + * @deprecated + */ + public void testFatal() { + assertTrue(Priority.FATAL instanceof Level); + } + + /** + * Tests Priority.ERROR. + * @deprecated + */ + public void testERROR() { + assertTrue(Priority.ERROR instanceof Level); + } + + /** + * Tests Priority.WARN. + * @deprecated + */ + public void testWARN() { + assertTrue(Priority.WARN instanceof Level); + } + + /** + * Tests Priority.INFO. + * @deprecated + */ + public void testINFO() { + assertTrue(Priority.INFO instanceof Level); + } + + /** + * Tests Priority.DEBUG. + * @deprecated + */ + public void testDEBUG() { + assertTrue(Priority.DEBUG instanceof Level); + } + + /** + * Tests Priority.equals(null). + * @deprecated + */ + public void testEqualsNull() { + assertFalse(Priority.DEBUG.equals(null)); + } + + /** + * Tests Priority.equals(Level.DEBUG). + * @deprecated + */ + public void testEqualsLevel() { + // + // this behavior violates the equals contract. + // + assertTrue(Priority.DEBUG.equals(Level.DEBUG)); + } + + /** + * Tests getAllPossiblePriorities(). + * @deprecated + */ + public void testGetAllPossiblePriorities() { + Priority[] priorities = Priority.getAllPossiblePriorities(); + assertEquals(5, priorities.length); + } + + /** + * Tests toPriority(String). + * @deprecated + */ + public void testToPriorityString() { + assertTrue(Priority.toPriority("DEBUG") == Level.DEBUG); + } + + /** + * Tests toPriority(int). + * @deprecated + */ + public void testToPriorityInt() { + assertTrue(Priority.toPriority(Priority.DEBUG_INT) == Level.DEBUG); + } + + /** + * Tests toPriority(String, Priority). + * @deprecated + */ + public void testToPriorityStringPriority() { + assertTrue(Priority.toPriority("foo", Priority.DEBUG) == Priority.DEBUG); + } + + /** + * Tests toPriority(int, Priority). + * @deprecated + */ + public void testToPriorityIntPriority() { + assertTrue(Priority.toPriority(17, Priority.DEBUG) == Priority.DEBUG); + } +} diff --git a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java index 00b7220ebf..961ca8ada9 100644 --- a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java +++ b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java @@ -24,6 +24,8 @@ import org.apache.log4j.NDC; import org.apache.log4j.spi.LocationInfo; import org.apache.log4j.util.SerializationTestHelper; +import org.apache.log4j.Priority; +import org.apache.log4j.Category; /** @@ -182,4 +184,35 @@ public void testDeserializationWithLocation() throws Exception { assertEquals("Hello, world.", event.getMessage()); assertEquals(Level.INFO, event.getLevel()); } + + /** + * Tests LoggingEvent.fqnOfCategoryClass. + */ + public void testFQNOfCategoryClass() { + Category root = Logger.getRootLogger(); + Priority info = Level.INFO; + String catName = Logger.class.toString(); + LoggingEvent event = + new LoggingEvent( + catName, root, info, "Hello, world.", null); + assertEquals(catName, event.fqnOfCategoryClass); + } + + /** + * Tests LoggingEvent.level. + * @deprecated + */ + public void testLevel() { + Category root = Logger.getRootLogger(); + Priority info = Level.INFO; + String catName = Logger.class.toString(); + LoggingEvent event = + new LoggingEvent( + catName, root, 0L, info, "Hello, world.", null); + Priority error = Level.ERROR; + event.level = error; + assertEquals(Level.ERROR, event.level); + } + + } From 25196c439d6abfb704664d229dce66e9f03e1d35 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 24 Jan 2006 19:11:19 +0000 Subject: [PATCH 190/342] Update ASL 1.1 notices to ASL 2.0 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@371984 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/util/Transformer.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/tests/src/java/org/apache/log4j/util/Transformer.java b/tests/src/java/org/apache/log4j/util/Transformer.java index e7f8b47fd0..61b63ce13e 100644 --- a/tests/src/java/org/apache/log4j/util/Transformer.java +++ b/tests/src/java/org/apache/log4j/util/Transformer.java @@ -1,9 +1,18 @@ /* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software - * License version 1.1, a copy of which has been included with this - * distribution in the LICENSE.txt file. */ + * Copyright 1999-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.log4j.util; From 6f30b2dfc269a7e1f973aba748dff91282603b5c Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 27 Jan 2006 19:09:05 +0000 Subject: [PATCH 191/342] Bug 37866: Drop use of mc in NTEventLogAppender.dll building git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@372949 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 29 ++++-- .../org/apache/log4j/nt/EventLogCategories.h | 90 ++++++++++++++++++ .../org/apache/log4j/nt/EventLogCategories.rc | 2 + src/java/org/apache/log4j/nt/MSG00001.bin | Bin 0 -> 192 bytes src/java/org/apache/log4j/nt/make.bat | 22 ----- 5 files changed, 111 insertions(+), 32 deletions(-) create mode 100644 src/java/org/apache/log4j/nt/EventLogCategories.h create mode 100644 src/java/org/apache/log4j/nt/EventLogCategories.rc create mode 100644 src/java/org/apache/log4j/nt/MSG00001.bin delete mode 100755 src/java/org/apache/log4j/nt/make.bat diff --git a/build.xml b/build.xml index c4d5f4b0de..87b98381a6 100644 --- a/build.xml +++ b/build.xml @@ -312,23 +312,32 @@ - + + + + + + + + + + + + + + - - - - - - - - + - + diff --git a/src/java/org/apache/log4j/nt/EventLogCategories.h b/src/java/org/apache/log4j/nt/EventLogCategories.h new file mode 100644 index 0000000000..478e5c0120 --- /dev/null +++ b/src/java/org/apache/log4j/nt/EventLogCategories.h @@ -0,0 +1,90 @@ +// +// Values are 32 bit values layed out as follows: +// +// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 +// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 +// +---+-+-+-----------------------+-------------------------------+ +// |Sev|C|R| Facility | Code | +// +---+-+-+-----------------------+-------------------------------+ +// +// where +// +// Sev - is the severity code +// +// 00 - Success +// 01 - Informational +// 10 - Warning +// 11 - Error +// +// C - is the Customer code flag +// +// R - is a reserved bit +// +// Facility - is the facility code +// +// Code - is the facility's status code +// +// +// Define the facility codes +// + + +// +// Define the severity codes +// + + +// +// MessageId: 0x0000C350L (No symbolic name defined) +// +// MessageText: +// +// Fatal +// + + +// +// MessageId: 0x00009C40L (No symbolic name defined) +// +// MessageText: +// +// Error +// + + +// +// MessageId: 0x00007530L (No symbolic name defined) +// +// MessageText: +// +// Warn +// + + +// +// MessageId: 0x00004E20L (No symbolic name defined) +// +// MessageText: +// +// Info +// + + +// +// MessageId: 0x00002710L (No symbolic name defined) +// +// MessageText: +// +// Debug +// + + +// +// MessageId: 0x00001000L (No symbolic name defined) +// +// MessageText: +// +// %1 +// + + diff --git a/src/java/org/apache/log4j/nt/EventLogCategories.rc b/src/java/org/apache/log4j/nt/EventLogCategories.rc new file mode 100644 index 0000000000..116522b7d4 --- /dev/null +++ b/src/java/org/apache/log4j/nt/EventLogCategories.rc @@ -0,0 +1,2 @@ +LANGUAGE 0x9,0x1 +1 11 MSG00001.bin diff --git a/src/java/org/apache/log4j/nt/MSG00001.bin b/src/java/org/apache/log4j/nt/MSG00001.bin new file mode 100644 index 0000000000000000000000000000000000000000..b05c1a3ef6378f270d91aa9e9c40d1d011711637 GIT binary patch literal 192 zcmZQ$00IFB_5o4q5F7(!EBHZh0g!D_3c)Qvw!<6mX$<)&>cSZk8H#}7$a-CYB1J%TMM!$xfa*$s II0q^Q0C-&!&;S4c literal 0 HcmV?d00001 diff --git a/src/java/org/apache/log4j/nt/make.bat b/src/java/org/apache/log4j/nt/make.bat deleted file mode 100755 index ce73dd6d0d..0000000000 --- a/src/java/org/apache/log4j/nt/make.bat +++ /dev/null @@ -1,22 +0,0 @@ -@echo off - -REM This batch file is not intended for general use. - -javah org.apache.log4j.nt.NTEventLogAppender -javah org.apache.log4j.Priority - -MC EventLogCategories.mc - -RC -r -fo EventLogCategories.res EventLogCategories.rc - -SET JDK=c:\java\jdk1.1.7B\ -rem SET JDK=c:\java\jdk1.3\ - -@echo "Compiling" -CL /nologo /I %JDK%\include /I %JDK%\include\win32 /MD /W3 /GX /O2 /FD /c /D "NDEBUG" -DWINVER=0x400 -D_DLL -DWIN32 /D "_WINDOWS" nteventlog.cpp - -REM - -@echo -@echo "Linking" -LINK /subsystem:windows /INCREMENTAL:NO /dll /out:"NTEventLogAppender.dll" nteventlog.OBJ advapi32.lib EventLogCategories.res From 1c4df3a3edc95bd41af81e929a0aef4ccca1c6bb Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 13 Mar 2006 17:10:31 +0000 Subject: [PATCH 192/342] Bug 35452: JDK 1.5 tweak git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@385600 13f79535-47bb-0310-9956-ffa450edef68 --- tests/src/java/org/apache/log4j/CategoryTest.java | 2 +- tests/src/java/org/apache/log4j/FileAppenderTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/src/java/org/apache/log4j/CategoryTest.java b/tests/src/java/org/apache/log4j/CategoryTest.java index 3d39d7a81c..bbc474a340 100644 --- a/tests/src/java/org/apache/log4j/CategoryTest.java +++ b/tests/src/java/org/apache/log4j/CategoryTest.java @@ -51,7 +51,7 @@ public void testForcedLog() { * @throws Exception thrown if Category.getChainedPriority can not be found. */ public void testGetChainedPriorityReturnType() throws Exception { - Method method = Category.class.getMethod("getChainedPriority", null); + Method method = Category.class.getMethod("getChainedPriority", (Class[]) null); assertTrue(method.getReturnType() == Priority.class); } diff --git a/tests/src/java/org/apache/log4j/FileAppenderTest.java b/tests/src/java/org/apache/log4j/FileAppenderTest.java index 46302ca078..0b7b433c69 100644 --- a/tests/src/java/org/apache/log4j/FileAppenderTest.java +++ b/tests/src/java/org/apache/log4j/FileAppenderTest.java @@ -59,7 +59,7 @@ public void testDirectoryCreation() { * @throws Exception */ public void testGetThresholdReturnType() throws Exception { - Method method = FileAppender.class.getMethod("getThreshold", null); + Method method = FileAppender.class.getMethod("getThreshold", (Class[]) null); assertTrue(method.getReturnType() == Priority.class); } From afdd1f301cece554ff406db15aef2a29798dda1a Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 28 Mar 2006 18:48:04 +0000 Subject: [PATCH 193/342] Bug 39135: Bad patterns in ISO8601DateFormat and DateTimeDateFormat git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@389573 13f79535-47bb-0310-9956-ffa450edef68 --- .../log4j/helpers/DateTimeDateFormat.java | 4 ++-- .../log4j/helpers/ISO8601DateFormat.java | 2 +- .../apache/log4j/helpers/DateLayoutTest.java | 22 +++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java b/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java index 22a1ea769e..2fe8aec8dc 100644 --- a/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java +++ b/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java @@ -24,7 +24,7 @@ import java.text.DateFormatSymbols; /** - Formats a {@link Date} in the format "dd MMM YYYY HH:mm:ss,SSS" for example, + Formats a {@link Date} in the format "dd MMM yyyy HH:mm:ss,SSS" for example, "06 Nov 1994 15:49:37,459". @author Ceki Gülcü @@ -47,7 +47,7 @@ public class DateTimeDateFormat extends AbsoluteTimeDateFormat { } /** - Appends to sbuf the date in the format "dd MMM YYYY + Appends to sbuf the date in the format "dd MMM yyyy HH:mm:ss,SSS" for example, "06 Nov 1994 08:49:37,459". @param sbuf the string buffer to write to diff --git a/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java b/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java index 033761c102..a8323d65f3 100644 --- a/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java +++ b/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java @@ -25,7 +25,7 @@ // Contributors: Arndt Schoenewald /** - Formats a {@link Date} in the format "YYYY-mm-dd HH:mm:ss,SSS" for example + Formats a {@link Date} in the format "yyyy-MM-dd HH:mm:ss,SSS" for example "1999-11-27 15:49:37,459".

    Refer to the Date: Wed, 5 Apr 2006 19:00:05 +0000 Subject: [PATCH 194/342] Bug 39135: Eliminated JDK 1.4 dependency on ISO and DateTimeDateFormat tests git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@391719 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/log4j/helpers/DateLayoutTest.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java b/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java index af9462fd46..5608a314ec 100644 --- a/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java +++ b/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java @@ -25,6 +25,7 @@ import java.util.TimeZone; import java.util.Date; +import java.util.Calendar; /** @@ -224,7 +225,10 @@ public void testSetDateFormatWithFormat() { */ public void testISO8601Format() { DateFormat format = new ISO8601DateFormat(); - String actual = format.format(new Date(-TimeZone.getDefault().getOffset(0))); + Calendar calendar = Calendar.getInstance(); + calendar.clear(); + calendar.set(1970, 0, 1, 0, 0, 0); + String actual = format.format(calendar.getTime()); assertEquals("1970-01-01 00:00:00,000", actual); } @@ -234,7 +238,10 @@ public void testISO8601Format() { */ public void testDateTimeFormat() { DateFormat format = new DateTimeDateFormat(); - String actual = format.format(new Date(-TimeZone.getDefault().getOffset(0))); + Calendar calendar = Calendar.getInstance(); + calendar.clear(); + calendar.set(1970, 0, 1, 0, 0, 0); + String actual = format.format(calendar.getTime()); assertEquals("01 Jan 1970 00:00:00,000", actual); } From 9e7809967ce5a511ee48f6069d4b5a14c3f877d8 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 29 Apr 2006 04:12:54 +0000 Subject: [PATCH 195/342] Bug 39023: o.a.l.DRFA, RFA and .varia.ERFA not compatibile git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@398081 13f79535-47bb-0310-9956-ffa450edef68 --- tests/build.xml | 18 +- tests/input/RFA1.properties | 12 + .../java/org/apache/log4j/DRFATestCase.java | 492 ++++++++++++------ .../java/org/apache/log4j/RFATestCase.java | 115 ++++ .../org/apache/log4j/varia/ERFATestCase.java | 136 +++++ 5 files changed, 603 insertions(+), 170 deletions(-) create mode 100644 tests/input/RFA1.properties create mode 100644 tests/src/java/org/apache/log4j/RFATestCase.java create mode 100644 tests/src/java/org/apache/log4j/varia/ERFATestCase.java diff --git a/tests/build.xml b/tests/build.xml index f5b1ff8070..09ae64862e 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -137,7 +137,7 @@ OptionConverter, BoundedFIFO, CyclicBuffer, OR, LevelMatchFilter, PatternParser, - PatternLayout, DRFA, NTEventLogAppender, Syslog"/> + PatternLayout, RFA, ERFA, DRFA, NTEventLogAppender, Syslog"/> @@ -363,6 +363,22 @@ + + + + + + + + + + + + + + + + diff --git a/tests/input/RFA1.properties b/tests/input/RFA1.properties new file mode 100644 index 0000000000..d4e3fa331c --- /dev/null +++ b/tests/input/RFA1.properties @@ -0,0 +1,12 @@ +log4j.rootLogger=DEBUG, testAppender +log4j.appender.testAppender=org.apache.log4j.RollingFileAppender +log4j.appender.testAppender.file=output/RFA-test1.log +log4j.appender.testAppender.Append=false +log4j.appender.testAppender.layout=org.apache.log4j.PatternLayout +log4j.appender.testAppender.layout.ConversionPattern=%m\n +log4j.appender.testAppender.maxFileSize=100 + +# Prevent internal log4j DEBUG messages from polluting the output. +log4j.logger.org.apache.log4j.PropertyConfigurator=INFO +log4j.logger.org.apache.log4j.config.PropertySetter=INFO +log4j.logger.org.apache.log4j.FileAppender=INFO diff --git a/tests/src/java/org/apache/log4j/DRFATestCase.java b/tests/src/java/org/apache/log4j/DRFATestCase.java index bb94769382..e32640f35a 100644 --- a/tests/src/java/org/apache/log4j/DRFATestCase.java +++ b/tests/src/java/org/apache/log4j/DRFATestCase.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. + * Copyright 1999-2006 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,103 +16,122 @@ package org.apache.log4j; -import java.util.Calendar; -import java.util.Date; -import java.util.TimeZone; - import junit.framework.TestCase; -import junit.framework.TestSuite; -import junit.framework.TestFailure; -import junit.framework.Test; -import org.apache.log4j.*; +import java.io.File; +import java.io.IOException; +import java.util.Calendar; +import java.util.TimeZone; +import java.util.Date; +import java.text.SimpleDateFormat; /** Exhaustive test of the DailyRollingFileAppender compute algorithm. - + @author Ceki Gülcü + @author Curt Arnold */ public class DRFATestCase extends TestCase { - public DRFATestCase(String name) { + /** + * Create new test. + * @param name test name. + */ + public DRFATestCase(final String name) { super(name); } + /** + * Reset configuration after every test. + */ + public void tearDown() { + LogManager.resetConfiguration(); + } + + /** + * Test prediction of check period. + */ public void testComputeCheckPeriod() { DailyRollingFileAppender drfa = new DailyRollingFileAppender(); drfa.setName("testComputeCheckPeriod"); drfa.setDatePattern("yyyy-MM-dd.'log'"); drfa.activateOptions(); - + int x = drfa.computeCheckPeriod(); int y = DailyRollingFileAppender.TOP_OF_DAY; - assertEquals(drfa.computeCheckPeriod(), - DailyRollingFileAppender.TOP_OF_DAY); + assertEquals(drfa.computeCheckPeriod(), + DailyRollingFileAppender.TOP_OF_DAY); drfa.setDatePattern("yyyy-MM-dd mm.'log'"); - assertEquals(drfa.computeCheckPeriod(), - DailyRollingFileAppender.TOP_OF_MINUTE); + assertEquals(drfa.computeCheckPeriod(), + DailyRollingFileAppender.TOP_OF_MINUTE); drfa.setDatePattern("yyyy-MM-dd a.'log'"); - assertEquals(drfa.computeCheckPeriod(), - DailyRollingFileAppender.HALF_DAY); + assertEquals(drfa.computeCheckPeriod(), + DailyRollingFileAppender.HALF_DAY); drfa.setDatePattern("yyyy-MM-dd HH.'log'"); - assertEquals(drfa.computeCheckPeriod(), - DailyRollingFileAppender.TOP_OF_HOUR); + assertEquals(drfa.computeCheckPeriod(), + DailyRollingFileAppender.TOP_OF_HOUR); drfa.setDatePattern("yyyy-MM.'log'"); - assertEquals(drfa.computeCheckPeriod(), - DailyRollingFileAppender.TOP_OF_MONTH); + assertEquals(drfa.computeCheckPeriod(), + DailyRollingFileAppender.TOP_OF_MONTH); drfa.setDatePattern("'log'HH'log'"); - assertEquals(drfa.computeCheckPeriod(), - DailyRollingFileAppender.TOP_OF_HOUR); + assertEquals(drfa.computeCheckPeriod(), + DailyRollingFileAppender.TOP_OF_HOUR); } + /** + * Test of RollingCalendar. + */ public - void testRC1() { + void testRC1() { RollingCalendar rc = new RollingCalendar(); rc.setType(DailyRollingFileAppender.TOP_OF_DAY); Calendar c = Calendar.getInstance(); // jan, mar, may, july, aug, oct, dec have 31 days - int [] M31 = {0,2,4,6,7,9,11}; + int [] M31 = {0,2,4,6,7,9,11}; for(int i = 0; i < M31.length; i ++) { for(int d = 1; d <=31; d++) { - for(int h = 0; h < 23; h++) { - c.clear(); - c.set(Calendar.YEAR, 20); - c.set(Calendar.MONTH, Calendar.JANUARY + M31[i]); - c.set(Calendar.DAY_OF_MONTH, d); - c.set(Calendar.HOUR_OF_DAY, h); - c.set(Calendar.MINUTE, 10); - c.set(Calendar.SECOND, 10); - c.set(Calendar.MILLISECOND, 88); - - c.setTime(rc.getNextCheckDate(c.getTime())); - if(d == 31) { - assertEquals(c.get(Calendar.MONTH),(Calendar.JANUARY+M31[i]+1)%12); - assertEquals(c.get(Calendar.DAY_OF_MONTH), 1); - } else { - assertEquals(c.get(Calendar.MONTH), Calendar.JANUARY+M31[i]); - assertEquals(c.get(Calendar.DAY_OF_MONTH), d+1); - } - assertEquals(c.get(Calendar.HOUR_OF_DAY), 0); - assertEquals(c.get(Calendar.MINUTE), 0); - assertEquals(c.get(Calendar.SECOND), 0); - assertEquals(c.get(Calendar.MILLISECOND), 0); - } + for(int h = 0; h < 23; h++) { + c.clear(); + c.set(Calendar.YEAR, 20); + c.set(Calendar.MONTH, Calendar.JANUARY + M31[i]); + c.set(Calendar.DAY_OF_MONTH, d); + c.set(Calendar.HOUR_OF_DAY, h); + c.set(Calendar.MINUTE, 10); + c.set(Calendar.SECOND, 10); + c.set(Calendar.MILLISECOND, 88); + + c.setTime(rc.getNextCheckDate(c.getTime())); + if(d == 31) { + assertEquals(c.get(Calendar.MONTH),(Calendar.JANUARY+M31[i]+1)%12); + assertEquals(c.get(Calendar.DAY_OF_MONTH), 1); + } else { + assertEquals(c.get(Calendar.MONTH), Calendar.JANUARY+M31[i]); + assertEquals(c.get(Calendar.DAY_OF_MONTH), d+1); + } + assertEquals(c.get(Calendar.HOUR_OF_DAY), 0); + assertEquals(c.get(Calendar.MINUTE), 0); + assertEquals(c.get(Calendar.SECOND), 0); + assertEquals(c.get(Calendar.MILLISECOND), 0); + } } } } + /** + * RollingCalendar test. + */ public - void testRC2() { + void testRC2() { RollingCalendar rc = new RollingCalendar(); rc.setType(DailyRollingFileAppender.TOP_OF_HOUR); @@ -121,67 +140,69 @@ void testRC2() { TimeZone tz = c.getTimeZone(); // jan, mar, may, july, aug, oct, dec have 31 days - int [] M31 = {0,2,4,6,7,9,11}; + int [] M31 = {0,2,4,6,7,9,11}; for(int i = 0; i < M31.length; i ++) { System.out.println("Month = "+(M31[i]+1)); for(int d = 1; d <= 31; d++) { - for(int h = 0; h < 23; h++) { - for(int m = 0; m <= 59; m++) { - c.clear(); - c.set(Calendar.YEAR, 20); - c.set(Calendar.MONTH, Calendar.JANUARY + M31[i]); - c.set(Calendar.DAY_OF_MONTH, d); - c.set(Calendar.HOUR_OF_DAY, h); - c.set(Calendar.MINUTE, m); - c.set(Calendar.SECOND, 12); - c.set(Calendar.MILLISECOND, 88); - - boolean dltState0 = c.getTimeZone().inDaylightTime(c.getTime()); - c.setTime(rc.getNextCheckDate(c.getTime())); - boolean dltState1 = c.getTimeZone().inDaylightTime(c.getTime()); - - assertEquals(c.get(Calendar.MILLISECOND), 0); - assertEquals(c.get(Calendar.SECOND), 0); - assertEquals(c.get(Calendar.MINUTE), 0); - - if(dltState0 == dltState1) { - assertEquals(c.get(Calendar.HOUR_OF_DAY), (h+1)%24); - } else { - // returning to standard time - if(dltState0) { - assertEquals(c.get(Calendar.HOUR_OF_DAY), h); - } else { // switching to day light saving time - //System.err.println("m="+m+", h="+h+", d="+d+", i="+i); - //if(h==2) { - // System.err.println(c); - //} - //assertEquals(c.get(Calendar.HOUR_OF_DAY), (h+2)%24); - } - } - - if(h == 23) { - assertEquals(c.get(Calendar.DAY_OF_MONTH), (d+1)%32); - if(d == 31) { - assertEquals(c.get(Calendar.MONTH), - (Calendar.JANUARY+M31[i]+1)%12); - } else { - assertEquals(c.get(Calendar.MONTH), - Calendar.JANUARY+M31[i]); - } - } else { - assertEquals(c.get(Calendar.DAY_OF_MONTH), d); - assertEquals(c.get(Calendar.MONTH), Calendar.JANUARY+M31[i]); - } - } - } + for(int h = 0; h < 23; h++) { + for(int m = 0; m <= 59; m++) { + c.clear(); + c.set(Calendar.YEAR, 20); + c.set(Calendar.MONTH, Calendar.JANUARY + M31[i]); + c.set(Calendar.DAY_OF_MONTH, d); + c.set(Calendar.HOUR_OF_DAY, h); + c.set(Calendar.MINUTE, m); + c.set(Calendar.SECOND, 12); + c.set(Calendar.MILLISECOND, 88); + + boolean dltState0 = c.getTimeZone().inDaylightTime(c.getTime()); + c.setTime(rc.getNextCheckDate(c.getTime())); + boolean dltState1 = c.getTimeZone().inDaylightTime(c.getTime()); + + assertEquals(c.get(Calendar.MILLISECOND), 0); + assertEquals(c.get(Calendar.SECOND), 0); + assertEquals(c.get(Calendar.MINUTE), 0); + + if(dltState0 == dltState1) { + assertEquals(c.get(Calendar.HOUR_OF_DAY), (h+1)%24); + } else { + // returning to standard time + if(dltState0) { + assertEquals(c.get(Calendar.HOUR_OF_DAY), h); + } else { // switching to day light saving time + //System.err.println("m="+m+", h="+h+", d="+d+", i="+i); + //if(h==2) { + // System.err.println(c); + //} + //assertEquals(c.get(Calendar.HOUR_OF_DAY), (h+2)%24); + } + } + + if(h == 23) { + assertEquals(c.get(Calendar.DAY_OF_MONTH), (d+1)%32); + if(d == 31) { + assertEquals(c.get(Calendar.MONTH), + (Calendar.JANUARY+M31[i]+1)%12); + } else { + assertEquals(c.get(Calendar.MONTH), + Calendar.JANUARY+M31[i]); + } + } else { + assertEquals(c.get(Calendar.DAY_OF_MONTH), d); + assertEquals(c.get(Calendar.MONTH), Calendar.JANUARY+M31[i]); + } + } + } } } } - + /** + * RollingCalendar test. + */ public - void testRC3() { + void testRC3() { RollingCalendar rc = new RollingCalendar(); rc.setType(DailyRollingFileAppender.TOP_OF_MINUTE); @@ -191,80 +212,213 @@ void testRC3() { Calendar c = Calendar.getInstance(); // jan, mar, may, july, aug, oct, dec have 31 days - int [] M31 = {2,9,0,4,6,7,11}; + int [] M31 = {2,9,0,4,6,7,11}; for(int i = 0; i < M31.length; i ++) { System.out.println("Month = "+(M31[i]+1)); for(int d = 1; d <= 31; d++) { - for(int h = 0; h < 23; h++) { - for(int m = 0; m < M.length; m++) { - for(int s = 0; s < S.length; s++) { - c.clear(); - c.set(Calendar.YEAR, 20); - c.set(Calendar.MONTH, Calendar.JANUARY + M31[i]); - c.set(Calendar.DAY_OF_MONTH, d); - c.set(Calendar.HOUR_OF_DAY, h); - c.set(Calendar.MINUTE, M[m]); - c.set(Calendar.SECOND, S[s]); - c.set(Calendar.MILLISECOND, 88); - c.add(Calendar.MILLISECOND, 1); - - boolean dltState0 = c.getTimeZone().inDaylightTime(c.getTime()); - - c.setTime(rc.getNextCheckDate(c.getTime())); - c.add(Calendar.MILLISECOND, 0); - boolean dltState1 = c.getTimeZone().inDaylightTime(c.getTime()); - - assertEquals(c.get(Calendar.MILLISECOND), 0); - assertEquals(c.get(Calendar.SECOND), 0); - assertEquals(c.get(Calendar.MINUTE), (M[m]+1)%60); - - if(M[m] == 59) { - if(dltState0 == dltState1) { - assertEquals(c.get(Calendar.HOUR_OF_DAY), (h+1)%24); - } - if(h == 23) { - assertEquals(c.get(Calendar.DAY_OF_MONTH), (d+1)%32); - if(d == 31) { - assertEquals(c.get(Calendar.MONTH), - (Calendar.JANUARY+M31[i]+1)%12); - } else { - assertEquals(c.get(Calendar.MONTH), - Calendar.JANUARY+M31[i]); - } - } else { - assertEquals(c.get(Calendar.DAY_OF_MONTH), d); - } - } else { - // allow discrepancies only if we are switching from std to dls time - if(c.get(Calendar.HOUR_OF_DAY) != h) { - c.add(Calendar.HOUR_OF_DAY, +1); - boolean dltState2 = c.getTimeZone().inDaylightTime(c.getTime()); - if(dltState1 == dltState2) { - fail("No switch"); - } - } - assertEquals(c.get(Calendar.DAY_OF_MONTH), d); - assertEquals(c.get(Calendar.MONTH), Calendar.JANUARY+M31[i]); - } - } - } - } + for(int h = 0; h < 23; h++) { + for(int m = 0; m < M.length; m++) { + for(int s = 0; s < S.length; s++) { + c.clear(); + c.set(Calendar.YEAR, 20); + c.set(Calendar.MONTH, Calendar.JANUARY + M31[i]); + c.set(Calendar.DAY_OF_MONTH, d); + c.set(Calendar.HOUR_OF_DAY, h); + c.set(Calendar.MINUTE, M[m]); + c.set(Calendar.SECOND, S[s]); + c.set(Calendar.MILLISECOND, 88); + c.add(Calendar.MILLISECOND, 1); + + boolean dltState0 = c.getTimeZone().inDaylightTime(c.getTime()); + + c.setTime(rc.getNextCheckDate(c.getTime())); + c.add(Calendar.MILLISECOND, 0); + boolean dltState1 = c.getTimeZone().inDaylightTime(c.getTime()); + + assertEquals(c.get(Calendar.MILLISECOND), 0); + assertEquals(c.get(Calendar.SECOND), 0); + assertEquals(c.get(Calendar.MINUTE), (M[m]+1)%60); + + if(M[m] == 59) { + if(dltState0 == dltState1) { + assertEquals(c.get(Calendar.HOUR_OF_DAY), (h+1)%24); + } + if(h == 23) { + assertEquals(c.get(Calendar.DAY_OF_MONTH), (d+1)%32); + if(d == 31) { + assertEquals(c.get(Calendar.MONTH), + (Calendar.JANUARY+M31[i]+1)%12); + } else { + assertEquals(c.get(Calendar.MONTH), + Calendar.JANUARY+M31[i]); + } + } else { + assertEquals(c.get(Calendar.DAY_OF_MONTH), d); + } + } else { + // allow discrepancies only if we are switching from std to dls time + if(c.get(Calendar.HOUR_OF_DAY) != h) { + c.add(Calendar.HOUR_OF_DAY, +1); + boolean dltState2 = c.getTimeZone().inDaylightTime(c.getTime()); + if(dltState1 == dltState2) { + fail("No switch"); + } + } + assertEquals(c.get(Calendar.DAY_OF_MONTH), d); + assertEquals(c.get(Calendar.MONTH), Calendar.JANUARY+M31[i]); + } + } + } + } } } } - - public - static - Test suite() { - TestSuite suite = new TestSuite(); - suite.addTest(new DRFATestCase("testComputeCheckPeriod")); - suite.addTest(new DRFATestCase("testRC1")); - suite.addTest(new DRFATestCase("testRC2")); - suite.addTest(new DRFATestCase("testRC3")); - return suite; - } - + /** + * Common test code for 3 parameter constructor. + * + * @throws IOException if IOException during test. + */ + public void test3Param(final String datePattern, + final String filename) throws IOException { + Layout layout = new SimpleLayout(); + DailyRollingFileAppender appender = + new DailyRollingFileAppender(layout, filename, datePattern); + assertEquals(datePattern, appender.getDatePattern()); + Logger root = Logger.getRootLogger(); + root.addAppender(appender); + root.info("Hello, World"); + assertTrue(new File(filename).exists()); + } + + /** + * Creates an appender with an unrecognized top-of-year pattern. + * + * @throws IOException if IOException during test. + */ + public void testTopOfYear() throws IOException { + try { + test3Param("'.'yyyy", "output/drfa_topOfYear.log"); + fail("Expected illegal state exception."); + } catch(IllegalStateException ex) { + assertNotNull(ex); + } + } + + /** + * Creates an appender with a top-of-month pattern. + * + * @throws IOException if IOException during test. + */ + public void testTopOfMonth() throws IOException { + test3Param("'.'yyyy-MM", "output/drfa_topOfMonth.log"); + } + + + /** + * Creates an appender with a top-of-week pattern. + * + * @throws IOException if IOException during test. + */ + public void testTopOfWeek() throws IOException { + test3Param("'.'yyyy-w", "output/drfa_topOfWeek.log"); + } + + /** + * Creates an appender with a top-of-day pattern. + * + * @throws IOException if IOException during test. + */ + public void testTopOfDay() throws IOException { + test3Param("'.'yyyy-MM-dd", "output/drfa_topOfDay.log"); + } + + + /** + * Creates an appender with a half day pattern. + * + * @throws IOException if IOException during test. + */ + public void testHalfDay() throws IOException { + test3Param("'.'yyyy-MM-dd-a", "output/drfa_halfDay.log"); + } + + /** + * Creates an appender with a top-of-hour pattern. + * + * @throws IOException if IOException during test. + */ + public void testTopOfHour() throws IOException { + test3Param("'.'yyyy-MM-dd-HH", "output/drfa_topOfHour.log"); + } + + /** + * Creates an appender with a top-of-day pattern. + * + * @throws IOException if IOException during test. + */ + public void testTopOfMinute() throws IOException { + test3Param("'.'yyyy-MM-dd-HH-mm", "output/drfa_topOfMinute.log"); + } + + /** + * Attempts to rollOver with no date pattern set. + * + * @throws IOException if IOException during test. + */ + public void testRolloverNoPattern() throws IOException { + Layout layout = new SimpleLayout(); + DailyRollingFileAppender appender = + new DailyRollingFileAppender(layout, "output/drfa_nopattern.log", null); + + VectorErrorHandler errorHandler = new VectorErrorHandler(); + appender.setErrorHandler(errorHandler); + appender.rollOver(); + assertEquals(1, errorHandler.size()); + assertEquals("Missing DatePattern option in rollOver().", + errorHandler.getMessage(0)); + } + + /** + * Tests rollOver with a minute periodicity. + * + * @throws IOException + * @throws InterruptedException + */ + public void testMinuteRollover() throws IOException, InterruptedException { + Layout layout = new SimpleLayout(); + String filename = "output/drfa_minuteRollover.log"; + String pattern = "'.'yyyy-MM-dd-HH-mm"; + + DailyRollingFileAppender appender = + new DailyRollingFileAppender(layout, + filename, + pattern); + Logger root = Logger.getRootLogger(); + root.addAppender(appender); + File firstFile = + new File(filename + new SimpleDateFormat(pattern).format(new Date())); + root.info("Hello, World"); + // + // create a file by that name so it has to be deleted + // on rollover + firstFile.createNewFile(); + assertTrue(firstFile.exists()); + assertEquals(0, firstFile.length()); + + Calendar cal = Calendar.getInstance(); + long now = cal.getTimeInMillis(); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 1); + cal.add(Calendar.MINUTE, 1); + long until = cal.getTimeInMillis(); + Thread.sleep(until - now); + root.info("Hello, World"); + assertTrue(firstFile.exists()); + assertTrue(firstFile.length() > 0); + + } + } diff --git a/tests/src/java/org/apache/log4j/RFATestCase.java b/tests/src/java/org/apache/log4j/RFATestCase.java new file mode 100644 index 0000000000..0a91cb14f4 --- /dev/null +++ b/tests/src/java/org/apache/log4j/RFATestCase.java @@ -0,0 +1,115 @@ +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j; + +import junit.framework.TestCase; + +import java.io.File; +import java.io.IOException; + +/** + * Test of RollingFileAppender. + * + * @author Curt Arnold + */ +public class RFATestCase extends TestCase { + + public RFATestCase(String name) { + super(name); + } + + public void tearDown() { + LogManager.resetConfiguration(); + } + + /** + * Test basic rolling functionality using property file configuration. + */ + public void test1() throws Exception { + Logger logger = Logger.getLogger(RFATestCase.class); + PropertyConfigurator.configure("input/RFA1.properties"); + + // Write exactly 10 bytes with each log + for (int i = 0; i < 25; i++) { + if (i < 10) { + logger.debug("Hello---" + i); + } else if (i < 100) { + logger.debug("Hello--" + i); + } + } + + assertTrue(new File("output/RFA-test1.log").exists()); + assertTrue(new File("output/RFA-test1.log.1").exists()); + } + + /** + * Test basic rolling functionality using API configuration. + */ + public void test2() throws Exception { + Logger logger = Logger.getLogger(RFATestCase.class); + Logger root = Logger.getRootLogger(); + PatternLayout layout = new PatternLayout("%m\n"); + org.apache.log4j.RollingFileAppender rfa = + new org.apache.log4j.RollingFileAppender(); + rfa.setName("ROLLING"); + rfa.setLayout(layout); + rfa.setAppend(false); + rfa.setMaxBackupIndex(3); + rfa.setMaximumFileSize(100); + rfa.setFile("output/RFA-test2.log"); + rfa.activateOptions(); + root.addAppender(rfa); + + // Write exactly 10 bytes with each log + for (int i = 0; i < 55; i++) { + if (i < 10) { + logger.debug("Hello---" + i); + } else if (i < 100) { + logger.debug("Hello--" + i); + } + } + + assertTrue(new File("output/RFA-test2.log").exists()); + assertTrue(new File("output/RFA-test2.log.1").exists()); + assertTrue(new File("output/RFA-test2.log.2").exists()); + assertTrue(new File("output/RFA-test2.log.3").exists()); + assertFalse(new File("output/RFA-test2.log.4").exists()); + } + + /** + * Tests 2 parameter constructor. + * @throws IOException if IOException during test. + */ + public void test2ParamConstructor() throws IOException { + SimpleLayout layout = new SimpleLayout(); + RollingFileAppender appender = + new RollingFileAppender(layout,"output/rfa_2param.log"); + assertEquals(1, appender.getMaxBackupIndex()); + assertEquals(10*1024*1024, appender.getMaximumFileSize()); + } + /** + * Tests 3 parameter constructor. + * @throws IOException if IOException during test. + */ + public void test3ParamConstructor() throws IOException { + SimpleLayout layout = new SimpleLayout(); + RollingFileAppender appender = + new RollingFileAppender(layout,"output/rfa_3param.log", false); + assertEquals(1, appender.getMaxBackupIndex()); + } + +} diff --git a/tests/src/java/org/apache/log4j/varia/ERFATestCase.java b/tests/src/java/org/apache/log4j/varia/ERFATestCase.java new file mode 100644 index 0000000000..da50a77661 --- /dev/null +++ b/tests/src/java/org/apache/log4j/varia/ERFATestCase.java @@ -0,0 +1,136 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.varia; +import junit.framework.TestCase; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.apache.log4j.PatternLayout; +import org.apache.log4j.RFATestCase; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; +import java.net.Socket; + +/** + * Test of ExternallyRolledFileAppender. + * + * @author Curt Arnold + */ +public class ERFATestCase extends TestCase { + + /** + * Create new instance of test. + * @param name test name. + */ + public ERFATestCase(final String name) { + super(name); + } + + /** + * Reset configuration after test. + */ + public void tearDown() { + LogManager.resetConfiguration(); + } + + /** + * Test ExternallyRolledFileAppender constructor. + */ + public void testConstructor() { + ExternallyRolledFileAppender appender = + new ExternallyRolledFileAppender(); + assertEquals(0, appender.getPort()); + } + + /** + * Send a message to the ERFA. + * @param port port number. + * @param msg message, may not be null. + * @param expectedResponse expected response, may not be null. + * @throws IOException thrown on IO error. + */ + void sendMessage(int port, final String msg, final String expectedResponse) throws IOException { + Socket socket = new Socket((String) null, port); + DataInputStream reader = new DataInputStream(socket.getInputStream()); + DataOutputStream writer = new DataOutputStream(socket.getOutputStream()); + writer.writeUTF(msg); + String response = reader.readUTF(); + assertEquals(expectedResponse, response); + reader.close(); + writer.close(); + socket.close(); + } + + /** + * Test externally triggered rollover. + * @throws IOException thrown on IO error. + */ + public void testRollover() throws IOException { + ExternallyRolledFileAppender erfa = + new ExternallyRolledFileAppender(); + + int port = 5500; + + Logger logger = Logger.getLogger(RFATestCase.class); + Logger root = Logger.getRootLogger(); + PatternLayout layout = new PatternLayout("%m\n"); + erfa.setLayout(layout); + erfa.setAppend(false); + erfa.setMaxBackupIndex(2); + erfa.setPort(port); + erfa.setFile("output/ERFA-test2.log"); + try { + erfa.activateOptions(); + } catch(SecurityException ex) { + return; + } + root.addAppender(erfa); + + + // Write exactly 10 bytes with each log + for (int i = 0; i < 55; i++) { + if (i < 10) { + logger.debug("Hello---" + i); + } else if (i < 100) { + logger.debug("Hello--" + i); + } + if ((i % 10) == 9) { + try { + sendMessage(port, "RollOver", "OK"); + } catch(SecurityException ex) { + return; + } + } + } + + try { + sendMessage(port, + "That's all folks.", + "Expecting [RollOver] string."); + } catch(SecurityException ex) { + return; + } + + + assertTrue(new File("output/ERFA-test2.log").exists()); + assertTrue(new File("output/ERFA-test2.log.1").exists()); + assertTrue(new File("output/ERFA-test2.log.2").exists()); + assertFalse(new File("output/ERFA-test2.log.3").exists()); + } +} From a1a4571ce0ba03993fdeb66e293fc1d2c5c37ab6 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 May 2006 20:00:36 +0000 Subject: [PATCH 196/342] Bug 38982: Add non-blocking option for AsyncAppender git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@407896 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/AsyncAppender.java | 685 +++++++++++++------ 1 file changed, 468 insertions(+), 217 deletions(-) diff --git a/src/java/org/apache/log4j/AsyncAppender.java b/src/java/org/apache/log4j/AsyncAppender.java index 0d102d788f..97081011e3 100644 --- a/src/java/org/apache/log4j/AsyncAppender.java +++ b/src/java/org/apache/log4j/AsyncAppender.java @@ -1,12 +1,12 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * + * Copyright 1999,2006 The Apache Software Foundation. + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -16,322 +16,573 @@ // Contibutors: Aaron Greenhouse // Thomas Tuft Muller - package org.apache.log4j; -import org.apache.log4j.spi.LoggingEvent; -import org.apache.log4j.helpers.BoundedFIFO; -import org.apache.log4j.spi.AppenderAttachable; import org.apache.log4j.helpers.AppenderAttachableImpl; -import org.apache.log4j.helpers.LogLog; +import org.apache.log4j.spi.AppenderAttachable; +import org.apache.log4j.spi.LoggingEvent; + +import java.text.MessageFormat; + +import java.util.ArrayList; import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + /** - The AsyncAppender lets users log events asynchronously. It uses a - bounded buffer to store logging events. + * The AsyncAppender lets users log events asynchronously. + *

    + *

    + * The AsyncAppender will collect the events sent to it and then dispatch them + * to all the appenders that are attached to it. You can attach multiple + * appenders to an AsyncAppender. + *

    + *

    + *

    + * The AsyncAppender uses a separate thread to serve the events in its buffer. + *

    + *

    + * Important note: The AsyncAppender can only be script + * configured using the {@link org.apache.log4j.xml.DOMConfigurator}. + *

    + * + * @author Ceki Gülcü + * @author Curt Arnold + * @since 0.9.1 + */ +public class AsyncAppender extends AppenderSkeleton + implements AppenderAttachable { + /** + * The default buffer size is set to 128 events. + */ + public static final int DEFAULT_BUFFER_SIZE = 128; -

    The AsyncAppender will collect the events sent to it and then - dispatch them to all the appenders that are attached to it. You can - attach multiple appenders to an AsyncAppender. + /** + * Event buffer, also used as monitor to protect itself and + * discardMap from simulatenous modifications. + */ + private final List buffer = new ArrayList(); -

    The AsyncAppender uses a separate thread to serve the events in - its bounded buffer. + /** + * Map of DiscardSummary objects keyed by logger name. + */ + private final Map discardMap = new HashMap(); -

    Refer to the results in {@link org.apache.log4j.performance.Logging} - for the impact of using this appender. + /** + * Buffer size. + */ + private int bufferSize = DEFAULT_BUFFER_SIZE; -

    Important note: The AsyncAppender can only - be script configured using the {@link - org.apache.log4j.xml.DOMConfigurator}. + /** Nested appenders. */ + AppenderAttachableImpl aai; - @author Ceki Gülcü - @since 0.9.1 */ -public class AsyncAppender extends AppenderSkeleton - implements AppenderAttachable { + /** + * Nested appenders. + */ + private final AppenderAttachableImpl appenders; - /** The default buffer size is set to 128 events. */ - public static final int DEFAULT_BUFFER_SIZE = 128; + /** + * Dispatcher. + */ + private final Thread dispatcher; - //static Category cat = Category.getInstance(AsyncAppender.class.getName()); + /** + * Should location info be included in dispatched messages. + */ + private boolean locationInfo = false; - BoundedFIFO bf = new BoundedFIFO(DEFAULT_BUFFER_SIZE); + /** + * Does appender block when buffer is full. + */ + private boolean blocking = true; - AppenderAttachableImpl aai; - Dispatcher dispatcher; - boolean locationInfo = false; + /** + * Create new instance. + */ + public AsyncAppender() { + appenders = new AppenderAttachableImpl(); + + // + // only set for compatibility + aai = appenders; - boolean interruptedWarningMessage = false; + dispatcher = + new Thread(new Dispatcher(this, buffer, discardMap, appenders)); - public AsyncAppender() { - // Note: The dispatcher code assumes that the aai is set once and - // for all. - aai = new AppenderAttachableImpl(); - dispatcher = new Dispatcher(bf, this); + // It is the user's responsibility to close appenders before + // exiting. + dispatcher.setDaemon(true); + + // set the dispatcher priority to lowest possible value + // dispatcher.setPriority(Thread.MIN_PRIORITY); + dispatcher.setName("Dispatcher-" + dispatcher.getName()); dispatcher.start(); } - - public void addAppender(Appender newAppender) { - synchronized(aai) { - aai.addAppender(newAppender); + /** + * Add appender. + * + * @param newAppender appender to add, may not be null. + */ + public void addAppender(final Appender newAppender) { + synchronized (appenders) { + appenders.addAppender(newAppender); } } - public void append(LoggingEvent event) { + /** + * {@inheritDoc} + */ + public void append(final LoggingEvent event) { // // if dispatcher thread has died then // append subsequent events synchronously // See bug 23021 - if (!dispatcher.isAlive()) { - synchronized(aai) { - aai.appendLoopOnAppenders(event); - } - return; + if ((dispatcher == null) || !dispatcher.isAlive() || (bufferSize <= 0)) { + synchronized (appenders) { + appenders.appendLoopOnAppenders(event); + } + + return; } + // Set the NDC and thread name for the calling thread as these // LoggingEvent fields were not set at event creation time. event.getNDC(); event.getThreadName(); // Get a copy of this thread's MDC. event.getMDCCopy(); - if(locationInfo) { + if (locationInfo) { event.getLocationInformation(); } - synchronized(bf) { - while(bf.isFull()) { - try { - //LogLog.debug("Waiting for free space in buffer, "+bf.length()); - bf.wait(); - } catch(InterruptedException e) { - if(!interruptedWarningMessage) { - interruptedWarningMessage = true; - LogLog.warn("AsyncAppender interrupted.", e); - } else { - LogLog.warn("AsyncAppender interrupted again."); - } - } - } - //cat.debug("About to put new event in buffer."); - bf.put(event); - if(bf.wasEmpty()) { - //cat.debug("Notifying dispatcher to process events."); - bf.notify(); + synchronized (buffer) { + while (true) { + int previousSize = buffer.size(); + + if (previousSize < bufferSize) { + buffer.add(event); + + // + // if buffer had been empty + // signal all threads waiting on buffer + // to check their conditions. + // + if (previousSize == 0) { + buffer.notifyAll(); + } + + break; + } + + // + // Following code is only reachable if buffer is full + // + // + // if blocking and thread is not already interrupted + // and not the dispatcher then + // wait for a buffer notification + boolean discard = true; + if (blocking + && !Thread.interrupted() + && Thread.currentThread() != dispatcher) { + try { + buffer.wait(); + discard = false; + } catch (InterruptedException e) { + // + // reset interrupt status so + // calling code can see interrupt on + // their next wait or sleep. + Thread.currentThread().interrupt(); + } + } + + // + // if blocking is false or thread has been interrupted + // add event to discard map. + // + if (discard) { + String loggerName = event.getLoggerName(); + DiscardSummary summary = (DiscardSummary) discardMap.get(loggerName); + + if (summary == null) { + summary = new DiscardSummary(event); + discardMap.put(loggerName, summary); + } else { + summary.add(event); + } + + break; + } } } } /** - Close this AsyncAppender by interrupting the - dispatcher thread which will process all pending events before - exiting. - */ + * Close this AsyncAppender by interrupting the dispatcher + * thread which will process all pending events before exiting. + */ public void close() { - synchronized(this) { - // avoid multiple close, otherwise one gets NullPointerException - if(closed) { - return; - } + /** + * Set closed flag and notify all threads to check their conditions. + * Should result in dispatcher terminating. + */ + synchronized (buffer) { closed = true; + buffer.notifyAll(); } - // The following cannot be synchronized on "this" because the - // dispatcher synchronizes with "this" in its while loop. If we - // did synchronize we would systematically get deadlocks when - // close was called. - dispatcher.close(); try { dispatcher.join(); - } catch(InterruptedException e) { - LogLog.error("Got an InterruptedException while waiting for the "+ - "dispatcher to finish.", e); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + org.apache.log4j.helpers.LogLog.error( + "Got an InterruptedException while waiting for the " + + "dispatcher to finish.", e); + } + + // + // close all attached appenders. + // + synchronized (appenders) { + Enumeration iter = appenders.getAllAppenders(); + + if (iter != null) { + while (iter.hasMoreElements()) { + Object next = iter.nextElement(); + + if (next instanceof Appender) { + ((Appender) next).close(); + } + } + } } - dispatcher = null; - bf = null; } + /** + * Get iterator over attached appenders. + * @return iterator or null if no attached appenders. + */ public Enumeration getAllAppenders() { - synchronized(aai) { - return aai.getAllAppenders(); + synchronized (appenders) { + return appenders.getAllAppenders(); } } - public Appender getAppender(String name) { - synchronized(aai) { - return aai.getAppender(name); + /** + * Get appender by name. + * + * @param name name, may not be null. + * @return matching appender or null. + */ + public Appender getAppender(final String name) { + synchronized (appenders) { + return appenders.getAppender(name); } } /** - Returns the current value of the LocationInfo option. - */ + * Gets whether the location of the logging request call + * should be captured. + * + * @return the current value of the LocationInfo option. + */ public boolean getLocationInfo() { return locationInfo; } /** - Is the appender passed as parameter attached to this category? + * Determines if specified appender is attached. + * @param appender appender. + * @return true if attached. */ - public boolean isAttached(Appender appender) { - return aai.isAttached(appender); + public boolean isAttached(final Appender appender) { + synchronized (appenders) { + return appenders.isAttached(appender); + } } - /** - The AsyncAppender does not require a layout. Hence, - this method always returns false. - */ + * {@inheritDoc} + */ public boolean requiresLayout() { return false; } + /** + * Removes and closes all attached appenders. + */ public void removeAllAppenders() { - synchronized(aai) { - aai.removeAllAppenders(); + synchronized (appenders) { + appenders.removeAllAppenders(); } } - - public void removeAppender(Appender appender) { - synchronized(aai) { - aai.removeAppender(appender); + /** + * Removes an appender. + * @param appender appender to remove. + */ + public void removeAppender(final Appender appender) { + synchronized (appenders) { + appenders.removeAppender(appender); } } - public void removeAppender(String name) { - synchronized(aai) { - aai.removeAppender(name); + /** + * Remove appender by name. + * @param name name. + */ + public void removeAppender(final String name) { + synchronized (appenders) { + appenders.removeAppender(name); } } /** - * The LocationInfo option takes a boolean value. By default, - * it is set to false which means there will be no effort to extract - * the location information related to the event. As a result, the - * event that will be ultimately logged will likely to contain the - * wrong location information (if present in the log format). - * - *

    Location information extraction is comparatively very slow and - * should be avoided unless performance is not a concern. - * */ - public void setLocationInfo(boolean flag) { + * The LocationInfo option takes a boolean value. By default, it is + * set to false which means there will be no effort to extract the location + * information related to the event. As a result, the event that will be + * ultimately logged will likely to contain the wrong location information + * (if present in the log format). + *

    + *

    + * Location information extraction is comparatively very slow and should be + * avoided unless performance is not a concern. + *

    + * @param flag true if location information should be extracted. + */ + public void setLocationInfo(final boolean flag) { locationInfo = flag; } - /** - * The BufferSize option takes a non-negative integer value. - * This integer value determines the maximum size of the bounded - * buffer. Increasing the size of the buffer is always - * safe. However, if an existing buffer holds unwritten elements, - * then decreasing the buffer size will result in event - * loss. Nevertheless, while script configuring the - * AsyncAppender, it is safe to set a buffer size smaller than the - * {@link #DEFAULT_BUFFER_SIZE default buffer size} because - * configurators guarantee that an appender cannot be used before - * being completely configured. - * */ - public void setBufferSize(int size) { - bf.resize(size); + * Sets the number of messages allowed in the event buffer + * before the calling thread is blocked (if blocking is true) + * or until messages are summarized and discarded. Changing + * the size will not affect messages already in the buffer. + * + * @param size buffer size, must be positive. + */ + public void setBufferSize(final int size) { + // + // log4j 1.2 would throw exception if size was negative + // and deadlock if size was zero. + // + if (size < 0) { + throw new java.lang.NegativeArraySizeException("size"); + } + + synchronized (buffer) { + // + // don't let size be zero. + // + bufferSize = (size < 1) ? 1 : size; + buffer.notifyAll(); + } } /** - Returns the current value of the BufferSize option. + * Gets the current buffer size. + * @return the current value of the BufferSize option. */ public int getBufferSize() { - return bf.getMaxSize(); + return bufferSize; } -} -// ------------------------------------------------------------------------------ -// ------------------------------------------------------------------------------ -// ---------------------------------------------------------------------------- -class Dispatcher extends Thread { + /** + * Sets whether appender should wait if there is no + * space available in the event buffer or immediately return. + * + * @param value true if appender should wait until available space in buffer. + */ + public void setBlocking(final boolean value) { + synchronized (buffer) { + blocking = value; + buffer.notifyAll(); + } + } - BoundedFIFO bf; - AppenderAttachableImpl aai; - boolean interrupted = false; - AsyncAppender container; + /** + * Gets whether appender should block calling thread when buffer is full. + * If false, messages will be counted by logger and a summary + * message appended after the contents of the buffer have been appended. + * + * @return true if calling thread will be blocked when buffer is full. + */ + public boolean getBlocking() { + return blocking; + } - Dispatcher(BoundedFIFO bf, AsyncAppender container) { - this.bf = bf; - this.container = container; - this.aai = container.aai; - // It is the user's responsibility to close appenders before - // exiting. - this.setDaemon(true); - // set the dispatcher priority to lowest possible value - this.setPriority(Thread.MIN_PRIORITY); - this.setName("Dispatcher-"+getName()); + /** + * Summary of discarded logging events for a logger. + */ + private static final class DiscardSummary { + /** + * First event of the highest severity. + */ + private LoggingEvent maxEvent; + + /** + * Total count of messages discarded. + */ + private int count; + + /** + * Create new instance. + * + * @param event event, may not be null. + */ + public DiscardSummary(final LoggingEvent event) { + maxEvent = event; + count = 1; + } - // set the dispatcher priority to MIN_PRIORITY plus or minus 2 - // depending on the direction of MIN to MAX_PRIORITY. - //+ (Thread.MAX_PRIORITY > Thread.MIN_PRIORITY ? 1 : -1)*2); + /** + * Add discarded event to summary. + * + * @param event event, may not be null. + */ + public void add(final LoggingEvent event) { + if (event.getLevel().toInt() > maxEvent.getLevel().toInt()) { + maxEvent = event; + } - } + count++; + } - void close() { - synchronized(bf) { - interrupted = true; - // We have a waiting dispacther if and only if bf.length is - // zero. In that case, we need to give it a death kiss. - if(bf.length() == 0) { - bf.notify(); - } + /** + * Create event with summary information. + * + * @return new event. + */ + public LoggingEvent createEvent() { + String msg = + MessageFormat.format( + "Discarded {0} messages due to full event buffer including: {1}", + new Object[] { new Integer(count), maxEvent.getMessage() }); + + return new LoggingEvent( + null, Logger.getLogger(maxEvent.getLoggerName()), maxEvent.getLevel(), msg, null); } } - - /** - The dispatching strategy is to wait until there are events in the - buffer to process. After having processed an event, we release - the monitor (variable bf) so that new events can be placed in the - buffer, instead of keeping the monitor and processing the remaining - events in the buffer. - -

    Other approaches might yield better results. - - */ - public void run() { - - //Category cat = Category.getInstance(Dispatcher.class.getName()); - - LoggingEvent event; - - while(true) { - synchronized(bf) { - if(bf.length() == 0) { - // Exit loop if interrupted but only if the the buffer is empty. - if(interrupted) { - //cat.info("Exiting."); - break; - } - try { - //LogLog.debug("Waiting for new event to dispatch."); - bf.wait(); - } catch(InterruptedException e) { - LogLog.error("The dispathcer should not be interrupted."); - break; - } - } - event = bf.get(); - if(bf.wasFull()) { - //LogLog.debug("Notifying AsyncAppender about freed space."); - bf.notify(); - } - } // synchronized - - // The synchronization on parent is necessary to protect against - // operations on the aai object of the parent - synchronized(container.aai) { - if(aai != null && event != null) { - aai.appendLoopOnAppenders(event); - } + * Event dispatcher. + */ + private static class Dispatcher implements Runnable { + /** + * Parent AsyncAppender. + */ + private final AsyncAppender parent; + + /** + * Event buffer. + */ + private final List buffer; + + /** + * Map of DiscardSummary keyed by logger name. + */ + private final Map discardMap; + + /** + * Wrapped appenders. + */ + private final AppenderAttachableImpl appenders; + + /** + * Create new instance of dispatcher. + * + * @param parent parent AsyncAppender, may not be null. + * @param buffer event buffer, may not be null. + * @param discardMap discard map, may not be null. + * @param appenders appenders, may not be null. + */ + public Dispatcher( + final AsyncAppender parent, final List buffer, final Map discardMap, + final AppenderAttachableImpl appenders) { + + this.parent = parent; + this.buffer = buffer; + this.appenders = appenders; + this.discardMap = discardMap; + } + + /** + * {@inheritDoc} + */ + public void run() { + boolean isActive = true; + + // + // if interrupted (unlikely), end thread + // + try { + // + // loop until the AsyncAppender is closed. + // + while (isActive) { + LoggingEvent[] events = null; + + // + // extract pending events while synchronized + // on buffer + // + synchronized (buffer) { + int bufferSize = buffer.size(); + isActive = !parent.closed; + + while ((bufferSize == 0) && isActive) { + buffer.wait(); + bufferSize = buffer.size(); + isActive = !parent.closed; + } + + if (bufferSize > 0) { + events = new LoggingEvent[bufferSize + discardMap.size()]; + buffer.toArray(events); + + // + // add events due to buffer overflow + // + int index = bufferSize; + + for ( + Iterator iter = discardMap.values().iterator(); + iter.hasNext();) { + events[index++] = ((DiscardSummary) iter.next()).createEvent(); + } + + // + // clear buffer and discard map + // + buffer.clear(); + discardMap.clear(); + + // + // allow blocked appends to continue + buffer.notifyAll(); + } + } + + // + // process events after lock on buffer is released. + // + if (events != null) { + for (int i = 0; i < events.length; i++) { + synchronized (appenders) { + appenders.appendLoopOnAppenders(events[i]); + } + } + } + } + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); } - } // while - - // close and remove all appenders - aai.removeAllAppenders(); + } } } From cb1cb6678944ebf08e21c73ca5655bea9db2f959 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 May 2006 20:08:34 +0000 Subject: [PATCH 197/342] Bug 38982: Add non-blocking option for AsyncAppender git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@407900 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/Dispatcher.java | 124 ++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 src/java/org/apache/log4j/Dispatcher.java diff --git a/src/java/org/apache/log4j/Dispatcher.java b/src/java/org/apache/log4j/Dispatcher.java new file mode 100644 index 0000000000..2ba2164d68 --- /dev/null +++ b/src/java/org/apache/log4j/Dispatcher.java @@ -0,0 +1,124 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j; + +import org.apache.log4j.helpers.AppenderAttachableImpl; +import org.apache.log4j.spi.LoggingEvent; + + +/** + * Obsolete AsyncAppender dispatcher provided for compatibility only. + * + * @deprecated Since 1.3. + */ +class Dispatcher extends Thread { + /** + * @deprecated + */ + private org.apache.log4j.helpers.BoundedFIFO bf; + private AppenderAttachableImpl aai; + private boolean interrupted = false; + AsyncAppender container; + + /** + * + * @param bf + * @param container + * @deprecated + */ + Dispatcher(org.apache.log4j.helpers.BoundedFIFO bf, AsyncAppender container) { + this.bf = bf; + this.container = container; + this.aai = container.aai; + + // It is the user's responsibility to close appenders before + // exiting. + this.setDaemon(true); + + // set the dispatcher priority to lowest possible value + this.setPriority(Thread.MIN_PRIORITY); + this.setName("Dispatcher-" + getName()); + + // set the dispatcher priority to MIN_PRIORITY plus or minus 2 + // depending on the direction of MIN to MAX_PRIORITY. + //+ (Thread.MAX_PRIORITY > Thread.MIN_PRIORITY ? 1 : -1)*2); + } + + void close() { + synchronized (bf) { + interrupted = true; + + // We have a waiting dispacther if and only if bf.length is + // zero. In that case, we need to give it a death kiss. + if (bf.length() == 0) { + bf.notify(); + } + } + } + + /** + * The dispatching strategy is to wait until there are events in the buffer + * to process. After having processed an event, we release the monitor + * (variable bf) so that new events can be placed in the buffer, instead of + * keeping the monitor and processing the remaining events in the buffer. + * + *

    + * Other approaches might yield better results. + *

    + */ + public void run() { + //Category cat = Category.getInstance(Dispatcher.class.getName()); + LoggingEvent event; + + while (true) { + synchronized (bf) { + if (bf.length() == 0) { + // Exit loop if interrupted but only if the the buffer is empty. + if (interrupted) { + //cat.info("Exiting."); + break; + } + + try { + //LogLog.debug("Waiting for new event to dispatch."); + bf.wait(); + } catch (InterruptedException e) { + break; + } + } + + event = bf.get(); + + if (bf.wasFull()) { + //LogLog.debug("Notifying AsyncAppender about freed space."); + bf.notify(); + } + } + + // synchronized + synchronized (container.aai) { + if ((aai != null) && (event != null)) { + aai.appendLoopOnAppenders(event); + } + } + } + + // while + // close and remove all appenders + aai.removeAllAppenders(); + } +} From d3d21476e2252b94d55e46d2e1aca362edf4b556 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 1 Aug 2006 19:03:25 +0000 Subject: [PATCH 198/342] Bug 15501: FallbackErrorHandler throws NPE if no loggers are set git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@427679 13f79535-47bb-0310-9956-ffa450edef68 --- .../log4j/varia/FallbackErrorHandler.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/java/org/apache/log4j/varia/FallbackErrorHandler.java b/src/java/org/apache/log4j/varia/FallbackErrorHandler.java index e6a79c6f02..2485311253 100644 --- a/src/java/org/apache/log4j/varia/FallbackErrorHandler.java +++ b/src/java/org/apache/log4j/varia/FallbackErrorHandler.java @@ -84,17 +84,18 @@ void error(String message, Exception e, int errorCode) { void error(String message, Exception e, int errorCode, LoggingEvent event) { LogLog.debug("FB: The following error reported: " + message, e); LogLog.debug("FB: INITIATING FALLBACK PROCEDURE."); - for(int i = 0; i < loggers.size(); i++) { - Logger l = (Logger) loggers.elementAt(i); - LogLog.debug("FB: Searching for ["+primary.getName()+"] in logger [" - +l.getName() + "]."); - //if(l.isAttached(primary)) { - LogLog.debug("FB: Replacing ["+primary.getName()+"] by [" - + backup.getName() + "] in logger ["+ l.getName() +"]."); - l.removeAppender(primary); - LogLog.debug("FB: Adding appender ["+backup.getName()+"] to logger " - + l.getName()); - l.addAppender(backup); + if (loggers != null) { + for(int i = 0; i < loggers.size(); i++) { + Logger l = (Logger) loggers.elementAt(i); + LogLog.debug("FB: Searching for ["+primary.getName()+"] in logger [" + +l.getName() + "]."); + LogLog.debug("FB: Replacing ["+primary.getName()+"] by [" + + backup.getName() + "] in logger ["+ l.getName() +"]."); + l.removeAppender(primary); + LogLog.debug("FB: Adding appender ["+backup.getName()+"] to logger " + + l.getName()); + l.addAppender(backup); + } } } From 9ee6769fb4cbe7c1bedae7589aad920a6eff0bee Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 1 Aug 2006 19:15:20 +0000 Subject: [PATCH 199/342] Bug 31003: RollingFileAppender, if removed, can cause null pointer exceptions git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@427681 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/RollingFileAppender.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/RollingFileAppender.java b/src/java/org/apache/log4j/RollingFileAppender.java index 6b44da574b..8901d28a9b 100644 --- a/src/java/org/apache/log4j/RollingFileAppender.java +++ b/src/java/org/apache/log4j/RollingFileAppender.java @@ -118,7 +118,9 @@ void rollOver() { File target; File file; - LogLog.debug("rolling over count=" + ((CountingQuietWriter) qw).getCount()); + if (qw != null) { + LogLog.debug("rolling over count=" + ((CountingQuietWriter) qw).getCount()); + } LogLog.debug("maxBackupIndex="+maxBackupIndex); // If maxBackups <= 0, then there is no file renaming to be done. From 2fe8e9d92a368e64c1690ac5b49ef636f4ea30c1 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 1 Aug 2006 19:38:29 +0000 Subject: [PATCH 200/342] Bug 35743: SyslogAppender throws NullPointerException upon misconfiguration git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@427691 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/helpers/SyslogWriter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/helpers/SyslogWriter.java b/src/java/org/apache/log4j/helpers/SyslogWriter.java index 1bd268277c..11072a8ad5 100644 --- a/src/java/org/apache/log4j/helpers/SyslogWriter.java +++ b/src/java/org/apache/log4j/helpers/SyslogWriter.java @@ -73,7 +73,7 @@ void write(String string) throws IOException { DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, SYSLOG_PORT); - if(this.ds != null) + if(this.ds != null && this.address != null) ds.send(packet); } From 1357be0fceb050ede4104ba64ea019f6b2889697 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 1 Aug 2006 20:05:11 +0000 Subject: [PATCH 201/342] Bug 36787: org.apache.log4j.lf5.util.DateFormatManager.setTimeZone assignment error git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@427704 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/lf5/util/DateFormatManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/lf5/util/DateFormatManager.java b/src/java/org/apache/log4j/lf5/util/DateFormatManager.java index ea160e4a9a..09d7e2a3b6 100644 --- a/src/java/org/apache/log4j/lf5/util/DateFormatManager.java +++ b/src/java/org/apache/log4j/lf5/util/DateFormatManager.java @@ -127,7 +127,7 @@ public synchronized TimeZone getTimeZone() { } public synchronized void setTimeZone(TimeZone timeZone) { - timeZone = timeZone; + _timeZone = timeZone; configure(); } From 2a115a82a7ca142a828750edecbca07e9fe712ef Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 1 Aug 2006 21:55:28 +0000 Subject: [PATCH 202/342] Bug 31507: Misspelling in HierarchyDynamicMBean git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@427758 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java b/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java index 43795b077d..3471e43ce0 100644 --- a/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java @@ -136,7 +136,7 @@ ObjectName addLoggerMBean(Logger logger) { false)); } catch(Exception e) { - log.error("Couls not add loggerMBean for ["+name+"]."); + log.error("Could not add loggerMBean for ["+name+"].", e); } return objectName; } From 13407f862f6f95b73fb3725f3de6fedfaed6b889 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 1 Aug 2006 22:05:59 +0000 Subject: [PATCH 203/342] Bug 38564: The documentation describes wrong the encoding field n WriterAppender git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@427763 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/WriterAppender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/WriterAppender.java b/src/java/org/apache/log4j/WriterAppender.java index a42b8072a8..4decf71b4a 100644 --- a/src/java/org/apache/log4j/WriterAppender.java +++ b/src/java/org/apache/log4j/WriterAppender.java @@ -54,7 +54,7 @@ public class WriterAppender extends AppenderSkeleton { protected boolean immediateFlush = true; /** - The encoding to use when opening an InputStream.

    The + The encoding to use when writing.

    The encoding variable is set to null by default which results in the utilization of the system's default encoding. */ From 018f7217d2a442cb3a095a54d33b03faf2a35357 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 1 Aug 2006 23:13:06 +0000 Subject: [PATCH 204/342] Bug 35123: Additivity not exported by PropertyPrinter git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@427788 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/config/PropertyPrinter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/java/org/apache/log4j/config/PropertyPrinter.java b/src/java/org/apache/log4j/config/PropertyPrinter.java index 8e19a704a0..d993561f7d 100644 --- a/src/java/org/apache/log4j/config/PropertyPrinter.java +++ b/src/java/org/apache/log4j/config/PropertyPrinter.java @@ -114,6 +114,9 @@ void printOptions(PrintWriter out, Logger cat) { if (appenderString != "") { out.println(catKey + "=" + appenderString); } + if (!cat.getAdditivity() && cat != Logger.getRootLogger()) { + out.println("log4j.additivity." + cat.getName() + "=false"); + } } protected From c72fe5ece25c77d93d3ed236cddd8a98a215b5a8 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 2 Aug 2006 03:35:07 +0000 Subject: [PATCH 205/342] Bug 40145: Pattern Layout - %r doesn't do what the documentation says git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@427875 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/PatternLayout.java | 4 ++-- src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/log4j/PatternLayout.java b/src/java/org/apache/log4j/PatternLayout.java index 111adac462..034431b038 100644 --- a/src/java/org/apache/log4j/PatternLayout.java +++ b/src/java/org/apache/log4j/PatternLayout.java @@ -230,8 +230,8 @@ number of right most components of the class name will be

    - + diff --git a/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java b/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java index 9c53b86572..ecb2e34a8f 100644 --- a/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java +++ b/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java @@ -23,7 +23,7 @@ /** Formats a {@link Date} by printing the number of milliseconds - elapsed since the start of the application. This is the fastest + elapsed since construction of the format. This is the fastest printing DateFormat in the package. @author Ceki Gülcü From 7d36034b59b57cc4471b28c2a82121f36dd45cfd Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 2 Aug 2006 04:20:01 +0000 Subject: [PATCH 206/342] Bug 40159: NullPointerException in org.apache.log4j.NDC.get git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@427881 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/NDC.java | 35 +++++++++++++++++++----------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/java/org/apache/log4j/NDC.java b/src/java/org/apache/log4j/NDC.java index 408e75b30d..b061293e13 100644 --- a/src/java/org/apache/log4j/NDC.java +++ b/src/java/org/apache/log4j/NDC.java @@ -124,6 +124,17 @@ public class NDC { // No instances allowed. private NDC() {} + + /** + * Get NDC stack for current thread. + * @return NDC stack for current thread. + */ + private static Stack getCurrentStack() { + if (ht != null) { + return (Stack) ht.get(Thread.currentThread()); + } + return null; + } /** @@ -138,7 +149,7 @@ private NDC() {} public static void clear() { - Stack stack = (Stack) ht.get(Thread.currentThread()); + Stack stack = getCurrentStack(); if(stack != null) stack.setSize(0); } @@ -161,11 +172,10 @@ given thread can supply the stack (i.e. diagnostic context) to a public static Stack cloneStack() { - Object o = ht.get(Thread.currentThread()); - if(o == null) + Stack stack = getCurrentStack(); + if(stack == null) return null; else { - Stack stack = (Stack) o; return (Stack) stack.clone(); } } @@ -206,7 +216,7 @@ void inherit(Stack stack) { static public String get() { - Stack s = (Stack) ht.get(Thread.currentThread()); + Stack s = getCurrentStack(); if(s != null && !s.isEmpty()) return ((DiagnosticContext) s.peek()).fullMessage; else @@ -222,7 +232,7 @@ String get() { public static int getDepth() { - Stack stack = (Stack) ht.get(Thread.currentThread()); + Stack stack = getCurrentStack(); if(stack == null) return 0; else @@ -232,6 +242,7 @@ int getDepth() { private static void lazyRemove() { + if (ht == null) return; // The synchronization on ht is necessary to prevent JDK 1.2.x from // throwing ConcurrentModificationExceptions at us. This sucks BIG-TIME. @@ -286,8 +297,7 @@ void lazyRemove() { public static String pop() { - Thread key = Thread.currentThread(); - Stack stack = (Stack) ht.get(key); + Stack stack = getCurrentStack(); if(stack != null && !stack.isEmpty()) return ((DiagnosticContext) stack.pop()).message; else @@ -307,8 +317,7 @@ String pop() { public static String peek() { - Thread key = Thread.currentThread(); - Stack stack = (Stack) ht.get(key); + Stack stack = getCurrentStack(); if(stack != null && !stack.isEmpty()) return ((DiagnosticContext) stack.peek()).message; else @@ -325,12 +334,12 @@ String peek() { public static void push(String message) { - Thread key = Thread.currentThread(); - Stack stack = (Stack) ht.get(key); + Stack stack = getCurrentStack(); if(stack == null) { DiagnosticContext dc = new DiagnosticContext(message, null); stack = new Stack(); + Thread key = Thread.currentThread(); ht.put(key, stack); stack.push(dc); } else if (stack.isEmpty()) { @@ -400,7 +409,7 @@ void foo() { static public void setMaxDepth(int maxDepth) { - Stack stack = (Stack) ht.get(Thread.currentThread()); + Stack stack = getCurrentStack(); if(stack != null && maxDepth < stack.size()) stack.setSize(maxDepth); } From cfc9ec4911b34740c1d4539a6eccd92db6d6bb9e Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 31 Aug 2006 04:48:55 +0000 Subject: [PATCH 207/342] Bug 39687: Enable configuring port for SyslogAppender git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@438792 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/log4j/helpers/SyslogWriter.java | 57 +++++++++++++++++-- .../org/apache/log4j/net/SyslogAppender.java | 6 +- .../apache/log4j/net/SyslogAppenderTest.java | 43 ++++++++++++++ 3 files changed, 99 insertions(+), 7 deletions(-) diff --git a/src/java/org/apache/log4j/helpers/SyslogWriter.java b/src/java/org/apache/log4j/helpers/SyslogWriter.java index 11072a8ad5..0ff910f0c0 100644 --- a/src/java/org/apache/log4j/helpers/SyslogWriter.java +++ b/src/java/org/apache/log4j/helpers/SyslogWriter.java @@ -24,6 +24,8 @@ import java.net.UnknownHostException; import java.net.SocketException; import java.io.IOException; +import java.net.URL; +import java.net.MalformedURLException; /** SyslogWriter is a wrapper around the java.net.DatagramSocket class @@ -34,20 +36,64 @@ public class SyslogWriter extends Writer { final int SYSLOG_PORT = 514; + /** + * Host string from last constructed SyslogWriter. + * @deprecated + */ static String syslogHost; private InetAddress address; + private final int port; private DatagramSocket ds; + /** + * Constructs a new instance of SyslogWriter. + * @param syslogHost host name, may not be null. A port + * may be specified by following the name or IPv4 literal address with + * a colon and a decimal port number. To specify a port with an IPv6 + * address, enclose the IPv6 address in square brackets before appending + * the colon and decimal port number. + */ public - SyslogWriter(String syslogHost) { + SyslogWriter(final String syslogHost) { this.syslogHost = syslogHost; + if (syslogHost == null) { + throw new NullPointerException("syslogHost"); + } + + String host = syslogHost; + int urlPort = -1; + + // + // If not an unbracketed IPv6 address then + // parse as a URL + // + if (host.indexOf("[") != -1 || host.indexOf(':') == host.lastIndexOf(':')) { + try { + URL url = new URL("http://" + host); + if (url.getHost() != null) { + host = url.getHost(); + // if host is a IPv6 literal, strip off the brackets + if(host.startsWith("[") && host.charAt(host.length() - 1) == ']') { + host = host.substring(1, host.length() - 1); + } + urlPort = url.getPort(); + } + } catch(MalformedURLException e) { + LogLog.error("Malformed URL: will attempt to interpret as InetAddress.", e); + } + } + + if (urlPort == -1) { + urlPort = SYSLOG_PORT; + } + port = urlPort; try { - this.address = InetAddress.getByName(syslogHost); + this.address = InetAddress.getByName(host); } catch (UnknownHostException e) { - LogLog.error("Could not find " + syslogHost + + LogLog.error("Could not find " + host + ". All logging will FAIL.", e); } @@ -56,9 +102,10 @@ public class SyslogWriter extends Writer { } catch (SocketException e) { e.printStackTrace(); - LogLog.error("Could not instantiate DatagramSocket to " + syslogHost + + LogLog.error("Could not instantiate DatagramSocket to " + host + ". All logging will FAIL.", e); } + } @@ -71,7 +118,7 @@ void write(char[] buf, int off, int len) throws IOException { void write(String string) throws IOException { byte[] bytes = string.getBytes(); DatagramPacket packet = new DatagramPacket(bytes, bytes.length, - address, SYSLOG_PORT); + address, port); if(this.ds != null && this.address != null) ds.send(packet); diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/java/org/apache/log4j/net/SyslogAppender.java index c7474d4895..335fc96aae 100644 --- a/src/java/org/apache/log4j/net/SyslogAppender.java +++ b/src/java/org/apache/log4j/net/SyslogAppender.java @@ -287,13 +287,15 @@ boolean requiresLayout() { /** The SyslogHost option is the name of the the syslog host - where log output should go. + where log output should go. A non-default port can be specified by + appending a colon and port number to a host name, + an IPv4 address or an IPv6 address enclosed in square brackets. WARNING If the SyslogHost is not set, then this appender will fail. */ public - void setSyslogHost(String syslogHost) { + void setSyslogHost(final String syslogHost) { this.sqw = new SyslogQuietWriter(new SyslogWriter(syslogHost), syslogFacility, errorHandler); //this.stp = new SyslogTracerPrintWriter(sqw); diff --git a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java index d5956b6ace..087767b99f 100644 --- a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java +++ b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java @@ -339,4 +339,47 @@ public void testAppend() { "Expected message from log4j unit test SyslogAppenderTest.testAppend.", e); assertEquals(0, errorHandler.size()); } + + /** + * Tests SyslogAppender with IPv6 address. + */ + public void testIPv6() { + SyslogAppender appender = new SyslogAppender(); + appender.setSyslogHost("::1"); + } + + /** + * Tests SyslogAppender with IPv6 address enclosed in square brackets. + */ + public void testIPv6InBrackets() { + SyslogAppender appender = new SyslogAppender(); + appender.setSyslogHost("[::1]"); + } + + /** + * Tests SyslogAppender with IPv6 address enclosed in square brackets + * followed by port specification. + */ + public void testIPv6AndPort() { + SyslogAppender appender = new SyslogAppender(); + appender.setSyslogHost("[::1]:1514"); + } + + /** + * Tests SyslogAppender with host name enclosed in square brackets + * followed by port specification. + */ + public void testHostNameAndPort() { + SyslogAppender appender = new SyslogAppender(); + appender.setSyslogHost("localhost:1514"); + } + + + /** + * Tests SyslogAppender with IPv4 address followed by port specification. + */ + public void testIPv4AndPort() { + SyslogAppender appender = new SyslogAppender(); + appender.setSyslogHost("127.0.0.1:1514"); + } } From 4ce217d0e7c3d91f096cd23e007657d27caf5b8a Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 31 Aug 2006 16:50:31 +0000 Subject: [PATCH 208/342] Bug 18246: Add cc and bcc addresses to SMTPAppender git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@438983 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/net/SMTPAppender.java | 81 +++++++++++++++++-- 1 file changed, 73 insertions(+), 8 deletions(-) diff --git a/src/java/org/apache/log4j/net/SMTPAppender.java b/src/java/org/apache/log4j/net/SMTPAppender.java index deae238006..2325f830ce 100644 --- a/src/java/org/apache/log4j/net/SMTPAppender.java +++ b/src/java/org/apache/log4j/net/SMTPAppender.java @@ -53,6 +53,14 @@ @since 1.0 */ public class SMTPAppender extends AppenderSkeleton { private String to; + /** + * Comma separated list of cc recipients. + */ + private String cc; + /** + * Comma separated list of bcc recipients. + */ + private String bcc; private String from; private String subject; private String smtpHost; @@ -100,18 +108,41 @@ void activateOptions() { msg = new MimeMessage(session); try { - if (from != null) - msg.setFrom(getAddress(from)); - else - msg.setFrom(); - - msg.setRecipients(Message.RecipientType.TO, parseAddress(to)); - if(subject != null) - msg.setSubject(subject); + addressMessage(msg); + if(subject != null) { + msg.setSubject(subject); + } } catch(MessagingException e) { LogLog.error("Could not activate SMTPAppender options.", e ); } } + + /** + * Address message. + * @param msg message, may not be null. + * @throws MessagingException thrown if error addressing message. + */ + protected void addressMessage(final Message msg) throws MessagingException { + if (from != null) { + msg.setFrom(getAddress(from)); + } else { + msg.setFrom(); + } + + if (to != null && to.length() > 0) { + msg.setRecipients(Message.RecipientType.TO, parseAddress(to)); + } + + //Add CC receipients if defined. + if (cc != null && cc.length() > 0) { + msg.setRecipients(Message.RecipientType.CC, parseAddress(cc)); + } + + //Add BCC receipients if defined. + if (bcc != null && bcc.length() > 0) { + msg.setRecipients(Message.RecipientType.BCC, parseAddress(bcc)); + } + } /** Perform SMTPAppender specific appending actions, mainly adding @@ -384,6 +415,40 @@ void setLocationInfo(boolean locationInfo) { boolean getLocationInfo() { return locationInfo; } + + /** + Set the cc recipient addresses. + @param addresses recipient addresses as comma separated string, may be null. + */ + public void setCc(final String addresses) { + this.cc = addresses; + } + + /** + Get the cc recipient addresses. + @return recipient addresses as comma separated string, may be null. + */ + public String getCc() { + return cc; + } + + /** + Set the bcc recipient addresses. + @param addresses recipient addresses as comma separated string, may be null. + */ + public void setBcc(final String addresses) { + this.bcc = addresses; + } + + /** + Get the bcc recipient addresses. + @return recipient addresses as comma separated string, may be null. + */ + public String getBcc() { + return bcc; + } + + } class DefaultEvaluator implements TriggeringEventEvaluator { From 8e3322455e704104854363125624898afdd2532e Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 31 Aug 2006 18:57:15 +0000 Subject: [PATCH 209/342] Bug 16922: MDC with SMTPAppender doesn't work git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@439011 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/net/SMTPAppender.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/java/org/apache/log4j/net/SMTPAppender.java b/src/java/org/apache/log4j/net/SMTPAppender.java index 2325f830ce..561b1b9880 100644 --- a/src/java/org/apache/log4j/net/SMTPAppender.java +++ b/src/java/org/apache/log4j/net/SMTPAppender.java @@ -157,6 +157,7 @@ void append(LoggingEvent event) { event.getThreadName(); event.getNDC(); + event.getMDCCopy(); if(locationInfo) { event.getLocationInformation(); } From 00ab707015606c5b4550739a6f36c00f869a3ef4 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 31 Aug 2006 19:30:27 +0000 Subject: [PATCH 210/342] Bug 24969: SMTPAppender should be able to do auth git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@439024 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/net/SMTPAppender.java | 89 +++++++++++++++++-- 1 file changed, 82 insertions(+), 7 deletions(-) diff --git a/src/java/org/apache/log4j/net/SMTPAppender.java b/src/java/org/apache/log4j/net/SMTPAppender.java index 561b1b9880..138bb1ddfb 100644 --- a/src/java/org/apache/log4j/net/SMTPAppender.java +++ b/src/java/org/apache/log4j/net/SMTPAppender.java @@ -28,6 +28,8 @@ import java.util.Date; import javax.mail.Session; +import javax.mail.Authenticator; +import javax.mail.PasswordAuthentication; import javax.mail.Transport; import javax.mail.Message; import javax.mail.MessagingException; @@ -64,6 +66,9 @@ public class SMTPAppender extends AppenderSkeleton { private String from; private String subject; private String smtpHost; + private String smtpUsername; + private String smtpPassword; + private boolean smtpDebug = false; private int bufferSize = 512; private boolean locationInfo = false; @@ -98,13 +103,7 @@ public class SMTPAppender extends AppenderSkeleton { recipient, from, etc. */ public void activateOptions() { - Properties props = new Properties (System.getProperties()); - if (smtpHost != null) - props.put("mail.smtp.host", smtpHost); - - - Session session = Session.getInstance(props, null); - //session.setDebug(true); + Session session = createSession(); msg = new MimeMessage(session); try { @@ -143,6 +142,32 @@ protected void addressMessage(final Message msg) throws MessagingException { msg.setRecipients(Message.RecipientType.BCC, parseAddress(bcc)); } } + + /** + * Create mail session. + * @param mail session, may not be null. + */ + protected Session createSession() { + Properties props = new Properties (System.getProperties()); + if (smtpHost != null) { + props.put("mail.smtp.host", smtpHost); + } + + Authenticator auth = null; + if(smtpPassword != null && smtpUsername != null) { + props.put("mail.smtp.auth", "true"); + auth = new Authenticator() { + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(smtpUsername, smtpPassword); + } + }; + } + Session session = Session.getInstance(props, auth); + if (smtpDebug) { + session.setDebug(smtpDebug); + } + return session; + } /** Perform SMTPAppender specific appending actions, mainly adding @@ -449,7 +474,57 @@ public String getBcc() { return bcc; } + /** + * The SmtpPassword option takes a string value which should be the password required to authenticate against + * the mail server. + * @param password password, may be null. + */ + public void setSMTPPassword(final String password) { + this.smtpPassword = password; + } + + /** + * The SmtpUsername option takes a string value which should be the username required to authenticate against + * the mail server. + * @param username user name, may be null. + */ + public void setSMTPUsername(final String username) { + this.smtpUsername = username; + } + + /** + * Setting the SmtpDebug option to true will cause the mail session to log its server interaction to stdout. + * This can be useful when debuging the appender but should not be used during production because username and + * password information is included in the output. + * @param debug debug flag. + */ + public void setSMTPDebug(final boolean debug) { + this.smtpDebug = debug; + } + /** + * Get SMTP password. + * @return SMTP password, may be null. + */ + public String getSMTPPassword() { + return smtpPassword; + } + + /** + * Get SMTP user name. + * @return SMTP user name, may be null. + */ + public String getSMTPUsername() { + return smtpUsername; + } + + /** + * Get SMTP debug. + * @return SMTP debug flag. + */ + public boolean getSMTPDebug() { + return smtpDebug; + } } class DefaultEvaluator implements TriggeringEventEvaluator { From 061ca3f5cc66d1e8ea94ba29c0bca07e6be7be39 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 31 Aug 2006 19:48:17 +0000 Subject: [PATCH 211/342] Bug 30294: SMTPAppender will not run within sandbox git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@439033 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/net/SMTPAppender.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/net/SMTPAppender.java b/src/java/org/apache/log4j/net/SMTPAppender.java index 138bb1ddfb..1841a520d2 100644 --- a/src/java/org/apache/log4j/net/SMTPAppender.java +++ b/src/java/org/apache/log4j/net/SMTPAppender.java @@ -148,7 +148,12 @@ protected void addressMessage(final Message msg) throws MessagingException { * @param mail session, may not be null. */ protected Session createSession() { - Properties props = new Properties (System.getProperties()); + Properties props = null; + try { + props = new Properties (System.getProperties()); + } catch(SecurityException ex) { + props = new Properties(); + } if (smtpHost != null) { props.put("mail.smtp.host", smtpHost); } From fd38178ce51ad40624799d7a0dab6e7bc6cf02fb Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 31 Aug 2006 20:00:36 +0000 Subject: [PATCH 212/342] Bug 38662: SMTPAppender does not output newlines between stack trace lines git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@439036 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/net/SMTPAppender.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/java/org/apache/log4j/net/SMTPAppender.java b/src/java/org/apache/log4j/net/SMTPAppender.java index 1841a520d2..231d363298 100644 --- a/src/java/org/apache/log4j/net/SMTPAppender.java +++ b/src/java/org/apache/log4j/net/SMTPAppender.java @@ -293,6 +293,7 @@ void sendBuffer() { if (s != null) { for(int j = 0; j < s.length; j++) { sbuf.append(s[j]); + sbuf.append(Layout.LINE_SEP); } } } From 99b6802805fef5f703473db69db4fea06b8f2b58 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 31 Aug 2006 20:44:44 +0000 Subject: [PATCH 213/342] Bug 37119: Space after log level causes default level to be used git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@439044 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/helpers/OptionConverter.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/java/org/apache/log4j/helpers/OptionConverter.java b/src/java/org/apache/log4j/helpers/OptionConverter.java index e891421c6d..7d9029a5af 100644 --- a/src/java/org/apache/log4j/helpers/OptionConverter.java +++ b/src/java/org/apache/log4j/helpers/OptionConverter.java @@ -182,6 +182,8 @@ significant for the class name part, if present. Level toLevel(String value, Level defaultValue) { if(value == null) return defaultValue; + + value = value.trim(); int hashIndex = value.indexOf('#'); if (hashIndex == -1) { From b66834002bd301db9f7f67334394d3e77583c6f6 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 1 Sep 2006 05:13:58 +0000 Subject: [PATCH 214/342] Bug 38559: Monthly logs not generated at midnight with DRFA git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@439184 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/DailyRollingFileAppender.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/java/org/apache/log4j/DailyRollingFileAppender.java b/src/java/org/apache/log4j/DailyRollingFileAppender.java index cea5038e30..48f4f030fb 100644 --- a/src/java/org/apache/log4j/DailyRollingFileAppender.java +++ b/src/java/org/apache/log4j/DailyRollingFileAppender.java @@ -421,6 +421,7 @@ public Date getNextCheckDate(Date now) { case DailyRollingFileAppender.TOP_OF_WEEK: this.set(Calendar.DAY_OF_WEEK, getFirstDayOfWeek()); this.set(Calendar.HOUR_OF_DAY, 0); + this.set(Calendar.MINUTE, 0); this.set(Calendar.SECOND, 0); this.set(Calendar.MILLISECOND, 0); this.add(Calendar.WEEK_OF_YEAR, 1); @@ -428,6 +429,7 @@ public Date getNextCheckDate(Date now) { case DailyRollingFileAppender.TOP_OF_MONTH: this.set(Calendar.DATE, 1); this.set(Calendar.HOUR_OF_DAY, 0); + this.set(Calendar.MINUTE, 0); this.set(Calendar.SECOND, 0); this.set(Calendar.MILLISECOND, 0); this.add(Calendar.MONTH, 1); From bc30ec810f4fb6c283b86c87fce780b48596164e Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 1 Sep 2006 20:52:43 +0000 Subject: [PATCH 215/342] Bug 40172: log4j 1.2.14 release git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@439473 13f79535-47bb-0310-9956-ffa450edef68 --- BRANCHES | 61 ------------------------------------------------ BUILD-INFO.txt | 2 +- INSTALL | 6 ++--- KEYS | 37 +++++++++++++++++++++++++++++ build.xml | 2 +- docs/HISTORY.txt | 33 ++++++++++++++++++++++++++ 6 files changed, 74 insertions(+), 67 deletions(-) delete mode 100644 BRANCHES diff --git a/BRANCHES b/BRANCHES deleted file mode 100644 index da0e39d1ab..0000000000 --- a/BRANCHES +++ /dev/null @@ -1,61 +0,0 @@ - -Given that log4j 1.3 is not likely to be released before a few months, -I have created a branch called v1_2-branch in our CVS repository. The -branch was created by issuing the following command: - -cvs -d :ext:ceki@cvs.apache.org:/home/cvs rtag -b -r v1_2final v1_2-branch jakarta-log4j - -Using the 1.2 branch, we can incorporate patches to log4j version 1.2 -while version 1.3 continues to be developed on the main trunk. For -example, we can officially release LogFactor5 (including -documentation) already in log4j 1.2.1. - -The command to access the v1_2-branch is: - -cvs -d XYZ checkout -r v1_2-branch jakarta-log4j - -where XYZ is the remote repository name, that is -":ext:ceki@cvs.apache.org:/home/cvs" for me. - -Alternatively, you can issue following update command from within any -existing work copy. - - cvs update -r v1_2-branch - -Working with branches is not completely trivial and requires a little -coordination between committers, in particular in relation with branch -merge operations. In order to avoid multiple merge conflicts, each -time we merge from the 1.2 branch to the main trunk, we should tag the -merged version on the 1.2 branch. Subsequent merges should use the tag -referring to the latest merged version of the branch. Also do not -forget to publicly announce a merge operation. - -I am suggesting that (1.2 -> trunk) merge operations be done in a -concerted manner. Before doing a merge you tell everyone that you are -going to do a merge, you execute the merge operation, and then tag the -merged version on the 1.2 branch, for example v_1_2_-merged-bug666 - -The *next* merge operation would be performed as - - cvs update -j v_1_2_-merged-bug666 -j v1_2-branch - -from within a working copy of the *trunk*. This merge operation would -obviously also need to be tagged. According to the CVS manual, this -procedure eliminates the side effects of merging already merged -changes. - -Bug fixes should and documentation improvements, should be made to the -1.2 branch, not the trunk. I'll take care of merging the changes to -the main trunk. - -If this sounds like mambo jumbo, I urge you to consult the CVS -documentation and experiment with branches before hitting the log4j -repository. Branches are not that complicated really although they -require slightly more discipline on the part of committers. Do not -hesitate to shout if you need help. - -If you have a better alternative for working with branches please let -us know. - --- -Ceki \ No newline at end of file diff --git a/BUILD-INFO.txt b/BUILD-INFO.txt index 67f07e33a1..85f2fdc8c0 100644 --- a/BUILD-INFO.txt +++ b/BUILD-INFO.txt @@ -1,7 +1,7 @@ This is the build information for the current log4j release. It contains the versions of tools and jars used to build this version of the log4j library. -Ant - v1.6.4; Available from http://ant.apache.org +Ant - v1.6.5; Available from http://ant.apache.org JDK - jdk1.3.1_16; Available from http://java.sun.com/j2se/1.3/index.jsp diff --git a/INSTALL b/INSTALL index f6ed902a70..a6f2c883c4 100644 --- a/INSTALL +++ b/INSTALL @@ -58,7 +58,7 @@ except test cases and classes from the "examples" and log4j dependencies ================== -Log4j is based on JDK 1.1 with the following additional requirements: +Log4j targets JDK 1.2 or later with the following additional requirements: ---------------------------- Package org.apache.log4j.xml @@ -73,8 +73,6 @@ Log4j is based on JDK 1.1 with the following additional requirements: parser. Compiling the DOMConfigurator requires the presence of a JAXP parser in the classpath. - Log4j is shipped with jaxp.jar and parser.jar files under the - build/lib/ directory. ------------ SMTPAppender @@ -104,7 +102,7 @@ Log4j is based on JDK 1.1 with the following additional requirements: JUnit testing framework ----------------------- - Log4j uses the JUnit framework version 3.7 for internal unit + Log4j uses the JUnit framework version 3.8.1 for internal unit testing. If you want to compile the source code in the tests/ directory, then you will need JUnit. JUnit is available from: diff --git a/KEYS b/KEYS index 163f0b86bf..d57054eca3 100644 --- a/KEYS +++ b/KEYS @@ -54,3 +54,40 @@ EQIABgUCQqoSPwAKCRASsodYDHxPBQ7wAKD4DO0Se4+SvSqUKDfxhI0lJTgK0gCg -----END PGP PUBLIC KEY BLOCK----- +pub 1024D/2E114322 2005-06-11 [expires: 2010-06-10] + Key fingerprint = A1A2 B554 6D43 31B2 A41E 1C07 BE16 C95D 2E11 4322 +uid Curt Arnold +sig 3 2E114322 2005-06-11 Curt Arnold +sub 2048g/209ECE57 2005-06-11 [expires: 2010-06-10] +sig 2E114322 2005-06-11 Curt Arnold + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.3 (Darwin) + +mQGiBEKrSNQRBAC4J7udOBoC5+gVxBaPAbjXfnq12l5Pau1WD+UothePNGjI2hOp ++Rnzikk3ISgyrjiX3A8ScZYbu3iXvMpF4zknkGLdmerpf4Gz9xGeushwun+UFaFL +MX5u7LWJo9wDKzbcJJit1j/qGEg/HRp5fnVYCh0/l4dLansL60NhxtYdxwCguu2e +wZMZFroaiIXqnce7+cGDRq8D/2HgKGtEJHY3z8OtUqncWbW+RAQqdcT0Z+bMB8o6 +0UCHxUoJrFS1lA62qU3kcZ8ACPoh9xDW4X47EgNPELX81alymTI5FdqiDK7RIwzE +JlOH/8JJgC6eSwiUXJ0cOJwpMonitcpMLouxuURuPSpfE5b1mQ1gFzN5MBL8xlZQ +8IO6A/9qWwyWyQBoJud0RDIsVRosdoSBZtw9PHsURgsqfNsS2NXTWK4HjxExw1KO +AXmRlALfrH8yAShy/AyiUrwlKHG2WPTe6Etygjlr4dIxqTiCOoi+qv+H8SXW4Qy3 +SnyozJ2RlKoYG0oDTbVMsPhOFdytHjConDLL9vS14j4kN9zWB7QgQ3VydCBBcm5v +bGQgPGNhcm5vbGRAYXBhY2hlLm9yZz6IZAQTEQIAJAUCQqtI1AIbAwUJCWYBgAYL +CQgHAwIDFQIDAxYCAQIeAQIXgAAKCRC+FsldLhFDIs5CAJ9roOB39ithHoCLaDJx +l14efLwgNgCfcDBYutNX5W627kCeheDqhQbTqTi5Ag0EQqtJBRAIAN8maiGIO44S +dc9Ep3CAm0aXDeR8IQ/F253WcMQtkFBjeHEDd6/+EFT52vswMI6ZJDVV/A7pe4VM +XAdNutFmUG2gy9OJOu8gMuO3jTCLxUXyQYNF/RasOAQJgc7q1N5QgKtXVH2InQ21 +vHvlHM1fVe4rYDPr4JL2lZHe0P8kTzeQ7jI5pQnfYRJmS8I5AMQYFOiM48Pd7Sbs +Wu/rym7ikcmKUe6ZE59hSioneVP31CDMNRxCAQJVS1mZxTozsAEoh+cvmRjOD1Es +0iXvu6Sfe8+sLRL+7CNUZgixE1UFbdnNxuZGlG9qs0LGP7hDWijT1/Y4SHz4ovXx +k0oocmFtiLcAAwcIAMbY7K99hLAFVaU2ukxCSp1TNPcD+IB3gtpRieKaZvBn/LGe +CO+fNAogkw537lmpLk4nI+JiP/xWohyJ9lyEpW7yD4c9AHKNjqvEWD5Bhpnw4qKJ +ohQSVQwEeJRsftY4D0jCP9xbgPiq5woBzHWNok3BVaHqLK0fd0/+KygnT+k6cR22 +Mus9RsEisXk9Oj5lvC0miDOWof4vk2Ll8/H3xt4CXAr13n5Yj2632HolOHrFUQXT +gwc9v5CNIihOQMEiXFxHh743qbsUZktjxeYH7r8wSCV93/QQ4qELiWoUzndpkCRT +lEKenucAv6f5qqZqG7pVW8S48T99HwzwqgFX5VOITwQYEQIADwUCQqtJBQIbDAUJ +CWYBgAAKCRC+FsldLhFDIjnoAJ9ECOIrTH3adnVLOkHZnewyp2ssxwCgtLjlwZ7/ +4QtL3W5Id3nKxPFiI+c= +=9ut1 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/build.xml b/build.xml index 87b98381a6..33130346c5 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index fc363d5933..73cd48d8ed 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -4,6 +4,39 @@ [**] Changes that requiring little or no modification to existing client code. [***] Changes requiring important modifications to existing client code. + + September 7th, 2006 + + - Release of version 1.2.14 + + - Rewrite of AsyncAppender to eliminate reported deadlocks (bugs 26224, 28006, 37904, 38137), + and to add an option to not block if the event queue becomes full (bug 38982). + + - Added support for specifying a port for SyslogAppender (bug 39687). + + - Added cc and bcc addresses to SMTPAppender (bug 18246) and password authentication (bug 24969). + + - Fixed following bugs: + 40159: NullPointerException in org.apache.log4j.NDC.get. + 36787: org.apache.log4j.lf5.util.DateFormatManager.setTimeZone assignment error. + 38559: Monthly logs not generated at midnight with DailyRollingFileAppender. + 40145: PatternLayout specifier %r is not consistent with documentation. + 37119: Space after log level causes default level to be used. + 39135: Bad patterns in ISO8601DateFormat and DateTimeDateFormat. + 39687: Enabling configuring port for SyslogAppender. + 35743: SyslogAppender throws NullPointerException upon misconfiguration. + 15501: FallbackErrorHandler throws NullPointerException if no loggers are set. + 38564: Bad documentation for WriterAppender.encoding. + 37866: NTEventLogAppender not build, tested and placed in distribution. + 38662: SMTPAppender does not output newlines between stack trace lines. + 30294: SMTPAppender will not run within sandbox. + 16922: MDC with SMTPAppender doesn't work. + 31507: Misspelling in HierarchyDynamicMBean. + 35123: Additivity not exported by PropertyPrinter. + 31003: RollingFileAppender, if removed, can cause NullPointerExceptions. + 38982: Add non-blocking option for AsyncAppender. + 23021: AsyncAppender blocks on thread death. + December 4th, 2005 From 609bc85e8c1ca1c321c7cf227b54d25378d42a1a Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 1 Sep 2006 21:21:48 +0000 Subject: [PATCH 216/342] Bug 38662: Missing import for Layout.LINE_SEP git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@439485 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/net/SMTPAppender.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/java/org/apache/log4j/net/SMTPAppender.java b/src/java/org/apache/log4j/net/SMTPAppender.java index 231d363298..694c069cf4 100644 --- a/src/java/org/apache/log4j/net/SMTPAppender.java +++ b/src/java/org/apache/log4j/net/SMTPAppender.java @@ -18,6 +18,7 @@ import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; +import org.apache.log4j.Layout; import org.apache.log4j.helpers.CyclicBuffer; import org.apache.log4j.helpers.OptionConverter; import org.apache.log4j.helpers.LogLog; From 85ddc4314dacedc0e1b78485f83babd04516f48c Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sun, 3 Sep 2006 21:01:11 +0000 Subject: [PATCH 217/342] Bug 40172: Update downloads page for log4j 1.2.14 release git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@439842 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 6 ++---- src/xdocs/download.xml | 40 ++++++++++++++++++++++++++++++---------- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 73cd48d8ed..b8ca32f04b 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,7 +5,7 @@ client code. [***] Changes requiring important modifications to existing client code. - September 7th, 2006 + September 8th, 2006 - Release of version 1.2.14 @@ -14,7 +14,7 @@ - Added support for specifying a port for SyslogAppender (bug 39687). - - Added cc and bcc addresses to SMTPAppender (bug 18246) and password authentication (bug 24969). + - Added cc and bcc addresses to SMTPAppender (bug 19125) and password authentication (bug 24969). - Fixed following bugs: 40159: NullPointerException in org.apache.log4j.NDC.get. @@ -23,7 +23,6 @@ 40145: PatternLayout specifier %r is not consistent with documentation. 37119: Space after log level causes default level to be used. 39135: Bad patterns in ISO8601DateFormat and DateTimeDateFormat. - 39687: Enabling configuring port for SyslogAppender. 35743: SyslogAppender throws NullPointerException upon misconfiguration. 15501: FallbackErrorHandler throws NullPointerException if no loggers are set. 38564: Bad documentation for WriterAppender.encoding. @@ -34,7 +33,6 @@ 31507: Misspelling in HierarchyDynamicMBean. 35123: Additivity not exported by PropertyPrinter. 31003: RollingFileAppender, if removed, can cause NullPointerExceptions. - 38982: Add non-blocking option for AsyncAppender. 23021: AsyncAppender blocks on thread death. diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 964df549ed..f270b82233 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -9,7 +9,7 @@ -
    +

    Log4j is available for download from a number of mirrors. Please @@ -17,16 +17,36 @@ bandwidth.

    -

    Log4j version 1.2.13 has two changes from version 1.2.12: +

    Changes in log4j 1.2.14:

      -
    • Bug #36800 : - Location related info now emitted for TRACE level log messages.
    • - -
    • Bug #37122 : - Console appender now behaves as before to fix - compatibility problem with JBoss introduced in 1.2.12 release due to fix - for bug 31056. Can still be configured to detect changes in the System.out - and System.err streams as needed by setting the follow property.
    • +
    • AsyncAppender was rewritten to eliminate reported deadlocks (bugs 26224, 28006, 37904, 38137), + and to add an option to not block if the event queue becomes full (bug 38982).
    • + +
    • SyslogAppender can now accept a port specification (bug 39687) in its syslogHost attribute.
    • + +
    • SMPTAppender can now accept cc and bcc addresses (bug 19125) and perform password authentication (bug 24969).
    • + +
    • The following bugs were fixed: +
        +
      • 40159: NullPointerException in org.apache.log4j.NDC.get. +
      • 36787: org.apache.log4j.lf5.util.DateFormatManager.setTimeZone assignment error. +
      • 38559: Monthly logs not generated at midnight with DailyRollingFileAppender. +
      • 40145: PatternLayout specifier %r is not consistent with documentation. +
      • 37119: Space after log level causes default level to be used. +
      • 39135: Bad patterns in ISO8601DateFormat and DateTimeDateFormat. +
      • 35743: SyslogAppender throws NullPointerException upon misconfiguration. +
      • 15501: FallbackErrorHandler throws NullPointerException if no loggers are set. +
      • 38564: Bad documentation for WriterAppender.encoding. +
      • 37866: NTEventLogAppender not build, tested and placed in distribution. +
      • 38662: SMTPAppender does not output newlines between stack trace lines. +
      • 30294: SMTPAppender will not run within sandbox. +
      • 16922: MDC with SMTPAppender doesn't work. +
      • 31507: Misspelling in HierarchyDynamicMBean. +
      • 35123: Additivity not exported by PropertyPrinter. +
      • 31003: RollingFileAppender, if removed, can cause NullPointerExceptions. +
      • 23021: AsyncAppender blocks on thread death. +
      +

    From da9693439c63dba7466aa95d0cacd62592c7abbc Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 5 Sep 2006 05:19:49 +0000 Subject: [PATCH 218/342] Bug 40412: NOTICE file added to distribution and jar git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@440263 13f79535-47bb-0310-9956-ffa450edef68 --- LICENSE.txt => LICENSE | 0 NOTICE | 2 ++ build.xml | 7 +++++-- docs/HISTORY.txt | 1 + src/xdocs/download.xml | 1 + 5 files changed, 9 insertions(+), 2 deletions(-) rename LICENSE.txt => LICENSE (100%) create mode 100644 NOTICE diff --git a/LICENSE.txt b/LICENSE similarity index 100% rename from LICENSE.txt rename to LICENSE diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000000..3f59805ce4 --- /dev/null +++ b/NOTICE @@ -0,0 +1,2 @@ +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). diff --git a/build.xml b/build.xml index 33130346c5..0c597e321b 100644 --- a/build.xml +++ b/build.xml @@ -445,7 +445,9 @@ ${stem}/or/jms/*.class, ${stem}/config/*.class" excludes="**/UnitTest**" - manifest="${jar.dest}/manifest.mf"/> + manifest="${jar.dest}/manifest.mf"> + + @@ -615,7 +617,8 @@ build.properties.sample, manifest.mf, INSTALL, - LICENSE.txt, + LICENSE, + NOTICE, ${dist.dir}/lib/log4j*.jar, ${dist.dir}/lib/NTEventLogAppender.dll, ${dist.dir}/classes/**, diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index b8ca32f04b..bed0cf4cf3 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -34,6 +34,7 @@ 35123: Additivity not exported by PropertyPrinter. 31003: RollingFileAppender, if removed, can cause NullPointerExceptions. 23021: AsyncAppender blocks on thread death. + 40412: NOTICE file added to distribution and jars. December 4th, 2005 diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index f270b82233..734a9d87df 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -45,6 +45,7 @@
  • 35123: Additivity not exported by PropertyPrinter.
  • 31003: RollingFileAppender, if removed, can cause NullPointerExceptions.
  • 23021: AsyncAppender blocks on thread death. +
  • 40412: NOTICE file added to distribution and jar.
  • From be63a408f62799af84cc3ed83812086e568db920 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 5 Sep 2006 06:19:54 +0000 Subject: [PATCH 219/342] Bug 39023: JDK 1.3 and Windows tweaks to DRFATestCase git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@440273 13f79535-47bb-0310-9956-ffa450edef68 --- tests/src/java/org/apache/log4j/DRFATestCase.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/src/java/org/apache/log4j/DRFATestCase.java b/tests/src/java/org/apache/log4j/DRFATestCase.java index e32640f35a..71d018baf4 100644 --- a/tests/src/java/org/apache/log4j/DRFATestCase.java +++ b/tests/src/java/org/apache/log4j/DRFATestCase.java @@ -409,11 +409,11 @@ public void testMinuteRollover() throws IOException, InterruptedException { assertEquals(0, firstFile.length()); Calendar cal = Calendar.getInstance(); - long now = cal.getTimeInMillis(); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 1); + long now = cal.getTime().getTime(); + cal.set(Calendar.SECOND, 3); + cal.set(Calendar.MILLISECOND, 0); cal.add(Calendar.MINUTE, 1); - long until = cal.getTimeInMillis(); + long until = cal.getTime().getTime(); Thread.sleep(until - now); root.info("Hello, World"); assertTrue(firstFile.exists()); From 8bb0e4522b1d7d7fd1e0f3a8c31d7580826cba5c Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 13 Sep 2006 19:47:05 +0000 Subject: [PATCH 220/342] Bug 40378: Chainsaw of log4j 1.2 does not show TRACE level git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@443096 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/chainsaw/ControlPanel.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/log4j/chainsaw/ControlPanel.java b/src/java/org/apache/log4j/chainsaw/ControlPanel.java index a53f8988d4..711dbcaffa 100644 --- a/src/java/org/apache/log4j/chainsaw/ControlPanel.java +++ b/src/java/org/apache/log4j/chainsaw/ControlPanel.java @@ -29,6 +29,7 @@ import javax.swing.event.DocumentListener; import org.apache.log4j.Logger; import org.apache.log4j.Priority; +import org.apache.log4j.Level; /** * Represents the controls for filtering, pausing, exiting, etc. @@ -91,9 +92,15 @@ class ControlPanel extends JPanel { c.anchor = GridBagConstraints.WEST; c.gridy = 0; - final Priority[] allPriorities = Priority.getAllPossiblePriorities(); + final Level[] allPriorities = new Level[] {Level.FATAL, + Level.ERROR, + Level.WARN, + Level.INFO, + Level.DEBUG, + Level.TRACE }; + final JComboBox priorities = new JComboBox(allPriorities); - final Priority lowest = allPriorities[allPriorities.length - 1]; + final Level lowest = allPriorities[allPriorities.length - 1]; priorities.setSelectedItem(lowest); aModel.setPriorityFilter(lowest); gridbag.setConstraints(priorities, c); From de6ed52b0c0c48667042f754851f2b3016f43c9d Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 13 Sep 2006 19:56:51 +0000 Subject: [PATCH 221/342] Bug 40501: TRACE level missing in short introduction to log4j git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@443100 13f79535-47bb-0310-9956-ffa450edef68 --- docs/manual.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/manual.html b/docs/manual.html index db910d5526..6c1b0cf76e 100644 --- a/docs/manual.html +++ b/docs/manual.html @@ -170,6 +170,7 @@

    Logger hierarchy

    public static Logger getLogger(String name); // printing methods: + public void trace(Object message); public void debug(Object message); public void info(Object message); public void warn(Object message); @@ -186,6 +187,7 @@

    Logger hierarchy

    Loggers may be assigned levels. The set of possible levels, that is +TRACE, DEBUG, INFO, WARN, From d56480ebfd21286caa5ab70f53891da21e481abe Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 13 Sep 2006 20:13:12 +0000 Subject: [PATCH 222/342] Bug 40172: log4j 1.2.14 release git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@443106 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 6 ++++-- src/xdocs/download.xml | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index bed0cf4cf3..7c7a6f6439 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,7 +5,7 @@ client code. [***] Changes requiring important modifications to existing client code. - September 8th, 2006 + September 18th, 2006 - Release of version 1.2.14 @@ -35,7 +35,9 @@ 31003: RollingFileAppender, if removed, can cause NullPointerExceptions. 23021: AsyncAppender blocks on thread death. 40412: NOTICE file added to distribution and jars. - + 40378: Chainsaw of log4j 1.2 does not show TRACE level. + 40501: TRACE level missing in short introduction to log4j. + December 4th, 2005 diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 734a9d87df..ff4adafb09 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -46,6 +46,8 @@

  • 31003: RollingFileAppender, if removed, can cause NullPointerExceptions.
  • 23021: AsyncAppender blocks on thread death.
  • 40412: NOTICE file added to distribution and jar. +
  • 40378: Chainsaw of log4j 1.2 does not show TRACE level. +
  • 40501: TRACE level missing in short introduction to log4j.
  • From ad1ce1c7fef635f62b4ac90d75261d2404ef55ce Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 13 Sep 2006 22:16:06 +0000 Subject: [PATCH 223/342] Bug 37960: Update site generation to Velocity 1.4 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@443145 13f79535-47bb-0310-9956-ffa450edef68 --- build.properties.sample | 10 +- build.xml | 13 +- docs/HISTORY.txt | 1 + docs/css/site.css | 140 +++++++++++++++ src/xdocs/download.xml | 3 +- src/xdocs/stylesheets/site.vsl | 318 +++++++++++++++++++++++++++++++++ 6 files changed, 474 insertions(+), 11 deletions(-) create mode 100644 docs/css/site.css create mode 100755 src/xdocs/stylesheets/site.vsl diff --git a/build.properties.sample b/build.properties.sample index a6efc67d55..d295517007 100644 --- a/build.properties.sample +++ b/build.properties.sample @@ -32,6 +32,10 @@ jndi.jar=${lib.home.dir}/jndi-1_2_1/lib/jndi.jar # Required to run Checkstyle. Available from http://checkstyle.sf.net checkstyle.jar=${lib.home.dir}/checkstyle-2.2/checkstyle-all-2.2.jar -# The templates for the creation of the web-pages are inherited -# from the parent project. -logging-site=../logging-site \ No newline at end of file +# Velocity's Anakia task is used in the generation of the documentation +# download from http://jakarta.apache.org +velocity.jar=${lib.home.dir}/velocity-1.4/velocity-dep-1.4.jar +# Velocity's Anakia task requires JDOM, +# but Velocity 1.4 is not compatible with JDOM 1.0, but beta 8 works okay +# download for http://www.jdom.org/dist/binary/archive +jdom.jar=${lib.home.dir}/jdom-b8/build/jdom.jar diff --git a/build.xml b/build.xml index 0c597e321b..c2dd5e539f 100644 --- a/build.xml +++ b/build.xml @@ -89,9 +89,8 @@ - - - + + @@ -538,10 +537,10 @@ - + AnakiaTask is not present! Please check to make sure that velocity.jar is in your classpath. - + @@ -561,7 +560,7 @@ - + + templatePath="${xdocs.src}/stylesheets"> diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 7c7a6f6439..015a50eb9a 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -37,6 +37,7 @@ 40412: NOTICE file added to distribution and jars. 40378: Chainsaw of log4j 1.2 does not show TRACE level. 40501: TRACE level missing in short introduction to log4j. + 37960: Update site generation to velocity 1.4 and remove dependency on logging/site project. December 4th, 2005 diff --git a/docs/css/site.css b/docs/css/site.css new file mode 100644 index 0000000000..149f6c0dd7 --- /dev/null +++ b/docs/css/site.css @@ -0,0 +1,140 @@ + +H1, H2, H3 { + color: #101099; +} + +A:link, A:visited { + text-decoration: none; + color: #006699; +} + +A:link:hover { + text-decoration: underline; +} + +.centercol { + margin-top: 120px; + margin-left: 210px; + margin-right:210px; + max-width: 800px; +} + +.leftcol { + position: absolute; + left: 10px; + top: 130px; + width: 190px; +} + +.banner { + position: absolute; + left: 10px; + top: 10px; + height: 130px; + width: 1000px; +} + +.menu_header, .menu_item { +/* width: 190px; */ + font-family: "trebuchet MS", Arial, Helvetica, sans-serif; + font-size: smaller; +} + +.menu_header { + border:1px solid #AAAAAA; + background: #CCCCCC; + padding-left: 1ex; +} + +.menu_item:hover { + background: #DDD; +} + +.menu_item { + background: #EEEEEE; + padding-left: 2ex; + border-top: 0px solid #AAAAAA; + border-right: 1px solid #AAAAAA; + border-bottom:1px solid #AAAAAA; + border-left: 1px solid #AAAAAA; +} + +.source { + border-top: 1px solid #DDDDDD; + border-bottom: 1px solid #DDDDDD; + background:#eee; + font-family: Courier, "MS Courier New", Prestige, Everson Monocourrier, monospace; + font-size: smaller; + padding-bottom: 0.5ex; + padding-top: 0.5ex; + padding-left: 2ex; +} + +table.ls { + background: #FFFFFF; +} +table.ls td { + background: #f4f4f4; + vertical-align: top; + padding-bottom: 1ex; +} + +table.ls th { + background: #E4E4E4; +} + +.index-faqSection { + font-size: larger; + padding-left: 0em; + font-weight: bolder; +} +.index-question { + padding-left: 1em; +} + +.faqSection { + font-size: larger; + font-weight: bolder; +} + +.question { + font-weight: bolder; +} + +/* this class is used for screen output placed in
     tags */
    +.screen_output {
    +  padding-left:  1em;
    +  padding-right: 1em;
    +  border-top:   1px solid #AAAAAA;
    +  border-right: 1px solid #AAAAAA;
    +  border-bottom:1px solid #AAAAAA;
    +  border-left:  1px solid #AAAAAA;
    +}
    +
    +
    +.big {
    +  font-size: larger;
    +  font-weight: bold;
    +}
    +
    +.small {
    +  font-size: smaller;
    +}
    +
    +.red {
    +  color: #AA0000;
    +}
    +
    +.msg_title {
    +  padding-left:  1ex;
    +  padding-right: 1ex;
    +  font-family: Courier, "MS Courier New", Prestige, Everson Monocourrier, monospace;
    +  border:   1px solid #AAAAAA;
    +  background: #DDDDFF;
    +
    +}
    +
    +.msg_meaning {
    +  padding-left:  1em;
    +  padding-right: 1em;
    +}
    diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml
    index ff4adafb09..eb5678d658 100644
    --- a/src/xdocs/download.xml
    +++ b/src/xdocs/download.xml
    @@ -47,7 +47,8 @@
            
  • 23021: AsyncAppender blocks on thread death.
  • 40412: NOTICE file added to distribution and jar.
  • 40378: Chainsaw of log4j 1.2 does not show TRACE level. -
  • 40501: TRACE level missing in short introduction to log4j. +
  • 40501: TRACE level missing in short introduction to log4j. +
  • 37960: Update site generation to velocity 1.4 and remove dependency on logging/site project.
  • diff --git a/src/xdocs/stylesheets/site.vsl b/src/xdocs/stylesheets/site.vsl new file mode 100755 index 0000000000..bfd12ba0f0 --- /dev/null +++ b/src/xdocs/stylesheets/site.vsl @@ -0,0 +1,318 @@ + + + + + ## Defined variables + #set ($bodybg = "#ffffff") + #set ($bodyfg = "#000000") + #set ($bodylink = "#525D76") + + #set ($titlebg = "#FFFFFF") + #set ($titlefg = "#2222AA") + + #set ($bannerbg = "#FFFFFF") + #set ($bannerfg = "#2222AA") + + #set ($subbannerbg = "#828DA6") + #set ($subbannerfg = "#ffffff") + + +#document() + + +## This is where the macro's live + +#macro ( projectanchor $name $value ) + #if ($value.startsWith("http://")) + $name + #else + $name + #end +#end + +#macro ( metaauthor $author $email ) + + +#end + +#macro ( image $value ) +#if ($value.getAttributeValue("width")) +#set ($width=$value.getAttributeValue("width")) +#end +#if ($value.getAttributeValue("height")) +#set ($height=$value.getAttributeValue("height")) +#end +#if ($value.getAttributeValue("align")) +#set ($align=$value.getAttributeValue("align")) +#end + +#end + +## ============================================ +## subsection macro +## ============================================ +#macro ( subsection $subsection) +

    $subsection.getAttributeValue("name")

    + #foreach ( $items in $subsection.getChildren() ) + #if ($items.getName().equals("img")) + #image ($items) + #elseif ($items.getName().equals("source")) + #source ($items) + ## #elseif ($items.getName().equals("table")) + ## #table ($items) + #else + $items + #end + #end +#end + +## =================================== +## titleSection macro +## =================================== +#macro ( titleSection $titleSection) + $titleSection.getAttributeValue("name") +#end + +## ================================ +## section macro +## ================================ +#macro ( section $section) +

    $section.getAttributeValue("name")

    + #foreach ( $items in $section.getChildren() ) + #if ($items.getName().equals("img")) + #image ($items) + #elseif ($items.getName().equals("source")) + #source ($items) + ##elseif ($items.getName().equals("table")) + ## #table ($items) + #elseif ($items.getName().equals("subsection")) + #subsection ($items) + #else + $items + #end + #end +#end + +## =================================== +## make navigation bar +## =================================== + +#macro ( makeNavigationBar ) + +
    + #set ($menus = $project.getChild("body").getChildren("menu")) + #foreach ( $menu in $menus ) + + #foreach ($item in $menu.getChildren() ) + #set ($name = $item.getAttributeValue("name")) + + #end + #end +
    + +#end + +## ==================================== +## getProjectImage +## ==================================== +#macro (getProjectImage) + ##
    CekiCeki Gülcü Significantly progressed
    CekiCeki Gülcü design board

    A Plugin framework has been designed and implemented.

    -

    All of the currently developed plugins are "Receivers", which can be thought of as the reverse of an appender; something +

    All of the currently developed plugins are "Receivers", which can be + thought of as the reverse of an appender; something that accepts LoggingEvents from some external source.

    -

    This has proven particulaly useful with the log4j ports, with the addition of the XML-based Receivers able to accept - LoggingEvents generated from other languages (see "Overture to other programming languages" below) +

    This has proven particulaly useful with the log4j ports, with the + addition of the XML-based Receivers able to accept + LoggingEvents generated from other languages (see "Overture to other + programming languages" below)

    Improvements to Chainsaw -

    Chainsaw v2 development has now progressed to the point where the main developers of it - and many other members of the logging community are using it daily. It's still pre-alpha but only +

    Chainsaw v2 development has now progressed + to the point where the main developers of it + and many other members of the logging community are using it daily. It's + still pre-alpha but only because we keep thinking up things to add.

    @@ -171,7 +214,7 @@ extensions to XML configuration language mentioned above.
    CekiCeki Gülcü Completed, still testing

    It is higly desriable to allow log4j ports in other languages to access log4j services in a language independent way.

    -

    The use of a standard XML format to represent a LoggingEvent has been established and many of the related logging projects from - non-Java languages have begun to support it. In fact, a number of the log4j ports have volunteered to join Apache!

    +

    The use of a standard XML format to represent a LoggingEvent has been + established and many of the related logging projects from + non-Java languages have begun to support it. In fact, a number of the + log4j ports have volunteered to join Apache!

    Scott Deboy has completed work to create a fex XML-based Receiver - classes that can accept logging events from an external source, and 'import' them into the local log4j environment.

    Ceki, Scott DeboyCeki Gülcü, Scott Deboy Significantly Progressed (if not completed)
    CekiCeki Gülcü Significantly Progressed
    Redesign of configure and watch architecture in configuratorsThis is a very useful feature and the current architecture is not very good. + This is a very useful feature and the current architecture is not + very good.

    Contributions have been received by Mark Womack and others.

    diff --git a/src/xdocs/srtw.xml b/src/xdocs/srtw.xml index 2c6ba837da..2f1de5b1c8 100644 --- a/src/xdocs/srtw.xml +++ b/src/xdocs/srtw.xml @@ -1,8 +1,8 @@ - + - Ceki Gulcu + Ceki Gülcü Is JSR47 reinventing the wheel? diff --git a/src/xdocs/stylesheets/lf5.xml b/src/xdocs/stylesheets/lf5.xml index f0952e7cf4..de5263e7e8 100644 --- a/src/xdocs/stylesheets/lf5.xml +++ b/src/xdocs/stylesheets/lf5.xml @@ -1,4 +1,4 @@ - + diff --git a/src/xdocs/stylesheets/project.xml b/src/xdocs/stylesheets/project.xml index 186d7fa1fa..875c81d6d4 100644 --- a/src/xdocs/stylesheets/project.xml +++ b/src/xdocs/stylesheets/project.xml @@ -1,4 +1,4 @@ - + @@ -11,7 +11,7 @@ - + From 809881c77d08ce6740850d27f3bd9814d53ff5ca Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Sun, 19 Jun 2005 00:12:10 +0000 Subject: [PATCH 120/342] Fixing Ceki's author tag to use the not@disclosed email address he prefers. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311397 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/contactUs.xml | 2 +- src/xdocs/contributors.xml | 2 +- src/xdocs/documentation.xml | 2 +- src/xdocs/download.xml | 2 +- src/xdocs/earlier.xml | 2 +- src/xdocs/history.xml | 2 +- src/xdocs/index.xml | 2 +- src/xdocs/plan.xml | 4 ++-- src/xdocs/srtw.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/xdocs/contactUs.xml b/src/xdocs/contactUs.xml index 38b92d6726..a88d9c0f59 100644 --- a/src/xdocs/contactUs.xml +++ b/src/xdocs/contactUs.xml @@ -2,7 +2,7 @@ - Ceki Gülcü + Ceki Gülcü Contact us diff --git a/src/xdocs/contributors.xml b/src/xdocs/contributors.xml index fac8014fda..0d9f333a12 100644 --- a/src/xdocs/contributors.xml +++ b/src/xdocs/contributors.xml @@ -2,7 +2,7 @@ - Ceki Gülcü + Ceki Gülcü Log4j Contributors diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index adf3a56b0e..1db56eab95 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -2,7 +2,7 @@ - Ceki Gülcü + Ceki Gülcü Yoav Shapira Documentation diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 724671c12e..553d13e2aa 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -2,7 +2,7 @@ - Ceki Gülcü + Ceki Gülcü Download diff --git a/src/xdocs/earlier.xml b/src/xdocs/earlier.xml index b537523125..8edc59a419 100644 --- a/src/xdocs/earlier.xml +++ b/src/xdocs/earlier.xml @@ -2,7 +2,7 @@ - Ceki Gülcü + Ceki Gülcü Older distributions diff --git a/src/xdocs/history.xml b/src/xdocs/history.xml index ee3c1c2c9e..fbe5480d4b 100644 --- a/src/xdocs/history.xml +++ b/src/xdocs/history.xml @@ -2,7 +2,7 @@ - Ceki Gülcü + Ceki Gülcü Project history diff --git a/src/xdocs/index.xml b/src/xdocs/index.xml index d6494c3b94..2915668e0e 100644 --- a/src/xdocs/index.xml +++ b/src/xdocs/index.xml @@ -2,7 +2,7 @@ - Ceki Gülcü + Ceki Gülcü Introduction diff --git a/src/xdocs/plan.xml b/src/xdocs/plan.xml index 2a602a9587..c8cb45ebbb 100644 --- a/src/xdocs/plan.xml +++ b/src/xdocs/plan.xml @@ -2,8 +2,8 @@ - Ceki Gülcü - Mark Womack + Ceki Gülcü + Mark Womack Release roadmap for log4j diff --git a/src/xdocs/srtw.xml b/src/xdocs/srtw.xml index 2f1de5b1c8..a1ef8c5ed2 100644 --- a/src/xdocs/srtw.xml +++ b/src/xdocs/srtw.xml @@ -2,7 +2,7 @@ - Ceki Gülcü + Ceki Gülcü Is JSR47 reinventing the wheel? From 563a85d908970051f3b3a1385e0d6a17e8f478a4 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Sun, 19 Jun 2005 00:18:27 +0000 Subject: [PATCH 121/342] Changing to official 1.2.11 version number. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311399 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/HISTORY.txt | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/build.xml b/build.xml index 64d15fe66d..e8814b3998 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index fcc9bb3285..0bc7a3f5d3 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,11 +5,13 @@ client code. [***] Changes requiring important modifications to existing client code. - Current cvs v1_2-branch (1.2.11 prerelease) - + June 18th, 2005 + + - Release of version 1.2.11 + - Fixed bug #34491 whereby the class o.a.log4j.or.jms.MessageRenderer would not be compiled in the build.jms target. Bug reported by Andy - McBride. http://issues.apache.org/bugzilla/show_bug.cgi?id=34491 + McBride. http://issues.apache.org/bugzilla/show_bug.cgi?id=34491 [*] April 28th, 2005 From 5562259444539a22ee39ebfa94144ec915ee5d79 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Tue, 21 Jun 2005 20:58:21 +0000 Subject: [PATCH 122/342] Adding a KEYS file for public keys used for signing releases, per Apache standards. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311400 13f79535-47bb-0310-9956-ffa450edef68 --- KEYS | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 KEYS diff --git a/KEYS b/KEYS new file mode 100644 index 0000000000..163f0b86bf --- /dev/null +++ b/KEYS @@ -0,0 +1,56 @@ +This file contains the PGP&GPG keys of various Apache developers. +Please don't use them for email unless you have to. Their main +purpose is code signing. + +Apache users: pgp < KEYS +Apache developers: + (pgpk -ll && pgpk -xa ) >> this file. + or + (gpg --fingerprint --list-sigs + && gpg --armor --export ) >> this file. + +Apache developers: please ensure that your key is also available via the +PGP keyservers (such as pgpkeys.mit.edu). + + +Type bits /keyID Date User ID +pub 1024D/0C7C4F05 2005/06/10 Mark Dwayne Womack + Mark Dwayne Womack + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Key Server 0.9.6 + +mQGiBEKqEj8RBADR8e9Xl0kFJqv8SspvDP8kUsivBxWVZz+HVKf0pL2wOie0LfsF +E0Y3dI7k0k8i8KXtWYmHY3dpJGLUaruqIRxPFen/No56Q7udlK5hj7vKEUb46krx +sLgik1s+WX8+61Yu5cLuGdqnfwRGuNV7uf3JF1Q78VXIyUlS4BFMXGtqjwCg//s6 +1m7N3p8AtIgma+U13rEkq9cEAJ6l9eEPgOdRx53nKkCgkVpDxxhpbg90STQ1s94f +rZIc+y5LN7FEERiQSiXvuzCwxiritiv+03sqdjYicxYZux+aladi0mHDIdgZkrAP +MrRJ+8AKs7jv+WXcyaJcja8h3IZLShszgUM6uCW4Wr8mzZ+ns/65ihe4A/jS/Gu+ +cD44A/9doNrvOnNXPD+N/R9ME3zS6FY8d5F6f8oxZOEsMll/AG1HhOR4yxOmZMOl ++ZTg9AacHWMtTkjbs6JkT6uA8+tU+txoYjofkaGcJgq/SQYen89ifXZXVkUMWjqL +ioUUKCsu4OQPnH5k3jCQp7DrkpDAgIBGZ5F3QGaYsrkVjxNoE7QnTWFyayBEd2F5 +bmUgV29tYWNrIDxtd29tYWNrQGFwYWNoZS5vcmc+iEYEEBECAAYFAkKwy1kACgkQ +vhbJXS4RQyKOYQCfddSBIMCd3kaFPvL90/piH/QIdIgAnRwG83V+KMRltnPRclDH +IcTI5unMiQBOBBARAgAOBQJCqhI/BAsDAgECGQEACgkQErKHWAx8TwWGeACgnN9d +jKDT2mjBKnApaDkMzmAaMvMAoKEcdBBCx62RPNIEBnxZ6zAxH244tC1NYXJrIER3 +YXluZSBXb21hY2sgPG1hcmt3b21hY2tAd29tYWNrbmV0LmNvbT6IRgQQEQIABgUC +QrDLXgAKCRC+FsldLhFDIgvLAJ9VsCFN6uBcObkb+UCN70ukHH5VWQCdEjPNvKCs +c4+FGbTTsEoabhoNhsuJAEsEEBECAAsFAkKqFqUECwMCAQAKCRASsodYDHxPBeU1 +AKDUIGqVzFZDXgK8PcLW8OlL2dXRmgCgwwxRkgpzuKNMnkphSZNend3VdJa5Ag0E +QqoSPxAIAPZCV7cIfwgXcqK61qlC8wXo+VMROU+28W65Szgg2gGnVqMU6Y9AVfPQ +B8bLQ6mUrfdMZIZJ+AyDvWXpF9Sh01D49Vlf3HZSTz09jdvOmeFXklnN/biudE/F +/Ha8g8VHMGHOfMlm/xX5u/2RXscBqtNbno2gpXI61Brwv0YAWCvl9Ij9WE5J280g +tJ3kkQc2azNsOA1FHQ98iLMcfFstjvbzySPAQ/ClWxiNjrtVjLhdONM0/XwXV0Oj +HRhs3jMhLLUq/zzhsSlAGBGNfISnCnLWhsQDGcgHKXrKlQzZlp+r0ApQmwJG0wg9 +ZqRdQZ+cfL2JSyIZJrqrol7DVekyCzsAAgIH/2A8l4YFI5dYs5ZV3OgspEh0Qa/N +qd/JiVWBdygI77zp9TEgUtFBPDItEjmJq8sgnao0Cd5d68l9c+PQJ1xr4fOpdug0 +YmYUgIaKutha3SSNRbD+T0WYmtTO5A4wxbsF3hYU7fvBJrt8gnO4tx6KAn/O2rRk +wPfNTZ1EdnKttZDM2Mz4OiK0SsQ9mS7zP+HPx3kzdl1Oj0Vk2tUElD1R1hVjLa/o +v5YgJCrwSD7RfCZAOEoPxXXN6StCqW1zT6HgcSR0clM5BC+ZyBJzczzD9I5+TrlH +d3ISaCOuP5NeYQdTsQ446bjiNk7LT25gNHF6U6WjmLQ3lXCz4kNoBG6fiOKIRgQY +EQIABgUCQqoSPwAKCRASsodYDHxPBQ7wAKD4DO0Se4+SvSqUKDfxhI0lJTgK0gCg +0lICv0KXT6PKyTndK+lr6K2AL4o= +=GKga +-----END PGP PUBLIC KEY BLOCK----- + + From e21c36f5726823c924845021799a2b3a7637c204 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 27 Jun 2005 19:40:19 +0000 Subject: [PATCH 123/342] Bug 33519: log4j 1.2 unit tests fail on later JVMs and Ant git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311409 13f79535-47bb-0310-9956-ffa450edef68 --- tests/.cvsignore | 7 +- .../org/apache/log4j/MinimumTestCase.java | 16 ++- .../apache/log4j/PatternLayoutTestCase.java | 118 +++++++++++++----- .../log4j/customLogger/XLoggerTestCase.java | 7 +- .../log4j/net/SocketServerTestCase.java | 50 ++++++-- .../apache/log4j/util/SunReflectFilter.java | 6 +- .../org/apache/log4j/util/Transformer.java | 23 ++-- .../org/apache/log4j/xml/DOMTestCase.java | 20 ++- .../apache/log4j/xml/XMLLayoutTestCase.java | 42 +++++-- tests/witness/customLogger.1 | 3 - tests/witness/dom.A1.1 | 18 --- tests/witness/dom.A2.1 | 12 -- tests/witness/patternLayout.1 | 15 --- tests/witness/patternLayout.10 | 15 --- tests/witness/patternLayout.11 | 15 --- tests/witness/patternLayout.12 | 15 --- tests/witness/patternLayout.13 | 15 --- tests/witness/patternLayout.14 | 15 --- tests/witness/patternLayout.2 | 15 --- tests/witness/patternLayout.3 | 15 --- tests/witness/patternLayout.4 | 15 --- tests/witness/patternLayout.5 | 15 --- tests/witness/patternLayout.6 | 15 --- tests/witness/patternLayout.7 | 15 --- tests/witness/patternLayout.8 | 15 --- tests/witness/patternLayout.9 | 15 --- tests/witness/simple | 3 - tests/witness/socketServer.1 | 6 - tests/witness/socketServer.2 | 6 - tests/witness/socketServer.3 | 6 - tests/witness/socketServer.4 | 6 - tests/witness/socketServer.5 | 6 - tests/witness/socketServer.6 | 6 - tests/witness/socketServer.7 | 6 - tests/witness/socketServer.8 | 6 - tests/witness/ttcc | 3 - tests/witness/xmlLayout.1 | 12 -- tests/witness/xmlLayout.2 | 12 -- tests/witness/xmlLayout.null | 3 - 39 files changed, 209 insertions(+), 404 deletions(-) diff --git a/tests/.cvsignore b/tests/.cvsignore index e3fa3d38fb..6c44436611 100644 --- a/tests/.cvsignore +++ b/tests/.cvsignore @@ -1,8 +1,3 @@ -goEnv -build.properties output classes -lib -coverage -log4j.db* - +build.properties diff --git a/tests/src/java/org/apache/log4j/MinimumTestCase.java b/tests/src/java/org/apache/log4j/MinimumTestCase.java index 102afd4e3b..e38c02bace 100644 --- a/tests/src/java/org/apache/log4j/MinimumTestCase.java +++ b/tests/src/java/org/apache/log4j/MinimumTestCase.java @@ -68,7 +68,11 @@ public void simple() throws Exception { root.addAppender(appender); common(); - Transformer.transform("output/simple", FILTERED, new LineNumberFilter()); + Transformer.transform( + "output/simple", FILTERED, + new Filter[] { new LineNumberFilter(), + new SunReflectFilter(), + new JunitTestRunnerFilter() }); assertTrue(Compare.compare(FILTERED, "witness/simple")); } @@ -82,9 +86,13 @@ public void ttcc() throws Exception { ControlFilter cf1 = new ControlFilter(new String[]{TTCC_PAT, TTCC2_PAT, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform("output/ttcc", FILTERED, new Filter[] {cf1, - new LineNumberFilter(), - new AbsoluteDateAndTimeFilter()}); + Transformer.transform( + "output/ttcc", FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), + new AbsoluteDateAndTimeFilter(), + new SunReflectFilter(), new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/ttcc")); } diff --git a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java index 197250ad68..17352b76ef 100644 --- a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java @@ -34,6 +34,8 @@ import org.apache.log4j.util.AbsoluteTimeFilter; import org.apache.log4j.util.RelativeTimeFilter; import org.apache.log4j.util.AbsoluteDateAndTimeFilter; +import org.apache.log4j.util.SunReflectFilter; +import org.apache.log4j.util.JunitTestRunnerFilter; public class PatternLayoutTestCase extends TestCase { @@ -85,7 +87,12 @@ public void tearDown() { public void test1() throws Exception { PropertyConfigurator.configure("input/patternLayout1.properties"); common(); - Transformer.transform(TEMP, FILTERED, new LineNumberFilter()); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + new LineNumberFilter(), new SunReflectFilter(), + new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.1")); } @@ -94,9 +101,12 @@ public void test2() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT1, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, - new LineNumberFilter(), - new ISO8601Filter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new ISO8601Filter(), + new SunReflectFilter(), new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.2")); } @@ -105,8 +115,12 @@ public void test3() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT1, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, new LineNumberFilter(), - new ISO8601Filter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new ISO8601Filter(), + new SunReflectFilter(), new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.3")); } @@ -117,9 +131,12 @@ public void test4() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT2, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, - new LineNumberFilter(), - new AbsoluteDateAndTimeFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new AbsoluteDateAndTimeFilter(), + new SunReflectFilter(), new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.4")); } @@ -128,9 +145,12 @@ public void test5() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT2, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, - new LineNumberFilter(), - new AbsoluteDateAndTimeFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new AbsoluteDateAndTimeFilter(), + new SunReflectFilter(), new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.5")); } @@ -140,9 +160,12 @@ public void test6() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT3, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, - new LineNumberFilter(), - new AbsoluteTimeFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new AbsoluteTimeFilter(), + new SunReflectFilter(), new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.6")); } @@ -152,9 +175,12 @@ public void test7() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT3, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, - new LineNumberFilter(), - new AbsoluteTimeFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new AbsoluteTimeFilter(), + new SunReflectFilter(), new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.7")); } @@ -163,9 +189,12 @@ public void test8() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT4, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, - new LineNumberFilter(), - new RelativeTimeFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new RelativeTimeFilter(), + new SunReflectFilter(), new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.8")); } @@ -174,7 +203,12 @@ public void test9() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT5, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new SunReflectFilter(), + new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.9")); } @@ -183,8 +217,12 @@ public void test10() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT6, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, - new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new SunReflectFilter(), + new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.10")); } @@ -193,8 +231,12 @@ public void test11() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT11a, PAT11b, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, - new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new SunReflectFilter(), + new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.11")); } @@ -203,8 +245,12 @@ public void test12() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT12, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, - new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new SunReflectFilter(), + new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.12")); } @@ -213,8 +259,12 @@ public void test13() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT13, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, - new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new SunReflectFilter(), + new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.13")); } @@ -223,8 +273,12 @@ public void test14() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT14, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf1, - new LineNumberFilter(), }); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + cf1, new LineNumberFilter(), new SunReflectFilter(), + new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/patternLayout.14")); } diff --git a/tests/src/java/org/apache/log4j/customLogger/XLoggerTestCase.java b/tests/src/java/org/apache/log4j/customLogger/XLoggerTestCase.java index 9fa60b14d7..e26fd62226 100644 --- a/tests/src/java/org/apache/log4j/customLogger/XLoggerTestCase.java +++ b/tests/src/java/org/apache/log4j/customLogger/XLoggerTestCase.java @@ -61,7 +61,12 @@ void common(int number) throws Exception { Exception e = new Exception("Just testing"); logger.debug("Message " + ++i, e); - Transformer.transform("output/temp", FILTERED, new LineNumberFilter()); + Transformer.transform( + "output/temp", FILTERED, + new Filter[] { + new LineNumberFilter(), new SunReflectFilter(), + new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/customLogger."+number)); } diff --git a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java index c8646771f6..451e849c64 100644 --- a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java +++ b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java @@ -116,7 +116,11 @@ public void test1() throws Exception { ControlFilter cf = new ControlFilter(new String[]{PAT1, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); assertTrue(Compare.compare(FILTERED, "witness/socketServer.1")); } @@ -136,7 +140,11 @@ public void test2() throws Exception { ControlFilter cf = new ControlFilter(new String[]{PAT2, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); assertTrue(Compare.compare(FILTERED, "witness/socketServer.2")); } @@ -155,7 +163,11 @@ public void test3() throws Exception { ControlFilter cf = new ControlFilter(new String[]{PAT3, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); assertTrue(Compare.compare(FILTERED, "witness/socketServer.3")); } @@ -177,7 +189,11 @@ public void test4() throws Exception { ControlFilter cf = new ControlFilter(new String[]{PAT4, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); assertTrue(Compare.compare(FILTERED, "witness/socketServer.4")); } @@ -211,7 +227,12 @@ public void test5() throws Exception { ControlFilter cf = new ControlFilter(new String[]{PAT5, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); + assertTrue(Compare.compare(FILTERED, "witness/socketServer.5")); } @@ -238,7 +259,12 @@ public void test6() throws Exception { ControlFilter cf = new ControlFilter(new String[]{PAT6, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); + assertTrue(Compare.compare(FILTERED, "witness/socketServer.6")); } @@ -261,7 +287,11 @@ public void test7() throws Exception { ControlFilter cf = new ControlFilter(new String[]{PAT7, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); assertTrue(Compare.compare(FILTERED, "witness/socketServer.7")); } @@ -282,7 +312,11 @@ public void test8() throws Exception { ControlFilter cf = new ControlFilter(new String[]{PAT8, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP, FILTERED, new Filter[] {cf, new LineNumberFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); assertTrue(Compare.compare(FILTERED, "witness/socketServer.8")); } diff --git a/tests/src/java/org/apache/log4j/util/SunReflectFilter.java b/tests/src/java/org/apache/log4j/util/SunReflectFilter.java index 141f5a7926..2ddd733797 100644 --- a/tests/src/java/org/apache/log4j/util/SunReflectFilter.java +++ b/tests/src/java/org/apache/log4j/util/SunReflectFilter.java @@ -32,8 +32,10 @@ public String filter(String in) { } if (util.match("/at sun.reflect/", in)) { return null; - } else { - return in; } + if (util.match("/\\(Method.java:.*\\)/", in)) { + return util.substitute("s/\\(Method.java:.*\\)/(Native Method)/", in); + } + return in; } } diff --git a/tests/src/java/org/apache/log4j/util/Transformer.java b/tests/src/java/org/apache/log4j/util/Transformer.java index 1e18cad06e..e7f8b47fd0 100644 --- a/tests/src/java/org/apache/log4j/util/Transformer.java +++ b/tests/src/java/org/apache/log4j/util/Transformer.java @@ -1,18 +1,9 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software + * License version 1.1, a copy of which has been included with this + * distribution in the LICENSE.txt file. */ package org.apache.log4j.util; @@ -39,7 +30,9 @@ void transform(String in, String out, Filter[] filters) throws FileNotFoundExcep for(int i = 0; i < filters.length; i++) { line = filters[i].filter(line); } - output.println(line); + if(line != null) { + output.println(line); + } } } diff --git a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java index 0ed720c766..2bc3ea33e7 100644 --- a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java @@ -28,6 +28,8 @@ import org.apache.log4j.util.ISO8601Filter; import org.apache.log4j.util.Transformer; import org.apache.log4j.util.Compare; +import org.apache.log4j.util.SunReflectFilter; +import org.apache.log4j.util.JunitTestRunnerFilter; public class DOMTestCase extends TestCase { @@ -77,11 +79,19 @@ public void test1() throws Exception { ControlFilter cf2 = new ControlFilter(new String[]{TEST1_2_PAT, EXCEPTION1, EXCEPTION2, EXCEPTION3}); - Transformer.transform(TEMP_A1, FILTERED_A1, new Filter[] {cf1, - new LineNumberFilter()}); - - Transformer.transform(TEMP_A2, FILTERED_A2, new Filter[] {cf2, - new LineNumberFilter(), new ISO8601Filter()}); + Transformer.transform( + TEMP_A1, FILTERED_A1, + new Filter[] { + cf1, new LineNumberFilter(), new SunReflectFilter(), + new JunitTestRunnerFilter() + }); + + Transformer.transform( + TEMP_A2, FILTERED_A2, + new Filter[] { + cf2, new LineNumberFilter(), new ISO8601Filter(), + new SunReflectFilter(), new JunitTestRunnerFilter() + }); assertTrue(Compare.compare(FILTERED_A1, "witness/dom.A1.1")); assertTrue(Compare.compare(FILTERED_A2, "witness/dom.A2.1")); diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java index 6a9111ed42..cd28732b3f 100644 --- a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java @@ -31,6 +31,8 @@ import org.apache.log4j.util.LineNumberFilter; import org.apache.log4j.util.Transformer; import org.apache.log4j.util.Compare; +import org.apache.log4j.util.JunitTestRunnerFilter; +import org.apache.log4j.util.SunReflectFilter; public class XMLLayoutTestCase extends TestCase { @@ -57,8 +59,14 @@ public void basic() throws Exception { XMLLayout xmlLayout = new XMLLayout(); root.addAppender(new FileAppender(xmlLayout, TEMP, false)); common(); - Transformer.transform(TEMP, FILTERED, new Filter[] {new LineNumberFilter(), - new XMLTimestampFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + new LineNumberFilter(), + new XMLTimestampFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.1")); } @@ -67,9 +75,15 @@ public void locationInfo() throws Exception { xmlLayout.setLocationInfo(true); root.addAppender(new FileAppender(xmlLayout, TEMP, false)); common(); - Transformer.transform(TEMP, FILTERED, new Filter[] {new LineNumberFilter(), - new XMLTimestampFilter(), - new XMLLineAttributeFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + new LineNumberFilter(), + new XMLTimestampFilter(), + new XMLLineAttributeFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() + }); assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.2")); } @@ -80,6 +94,16 @@ public void testCDATA() throws Exception { logger.debug("Message with embedded hi]]>."); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { + new LineNumberFilter(), + new XMLTimestampFilter(), + new XMLLineAttributeFilter(), + new SunReflectFilter(), + new JunitTestRunnerFilter() + + }); Transformer.transform(TEMP, FILTERED, new Filter[] {new LineNumberFilter(), new XMLTimestampFilter(), new XMLLineAttributeFilter()}); @@ -93,8 +117,12 @@ public void testNull() throws Exception { logger.debug(null); Exception e = new Exception((String) null); logger.debug("hi", e); - Transformer.transform(TEMP, FILTERED, new Filter[] {new LineNumberFilter(), - new XMLTimestampFilter()}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { new LineNumberFilter(), + new XMLTimestampFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter()}); assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.null")); } diff --git a/tests/witness/customLogger.1 b/tests/witness/customLogger.1 index e8c411a2aa..d16e1e707d 100644 --- a/tests/witness/customLogger.1 +++ b/tests/witness/customLogger.1 @@ -16,6 +16,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/dom.A1.1 b/tests/witness/dom.A1.1 index 1c12b3cf5f..76a167444c 100644 --- a/tests/witness/dom.A1.1 +++ b/tests/witness/dom.A1.1 @@ -26,9 +26,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) DEBUG xml.DOMTestCase - Message 5 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) @@ -42,9 +39,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) DEBUG root - Message 5 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) @@ -58,9 +52,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) @@ -74,9 +65,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) @@ -90,9 +78,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR root - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) @@ -106,6 +91,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/dom.A2.1 b/tests/witness/dom.A2.1 index 969eef9b43..3eea03b621 100644 --- a/tests/witness/dom.A2.1 +++ b/tests/witness/dom.A2.1 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] DEBUG root - Message 5 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR root - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) @@ -69,6 +60,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.1 b/tests/witness/patternLayout.1 index 2e2751fa94..b382407bf5 100644 --- a/tests/witness/patternLayout.1 +++ b/tests/witness/patternLayout.1 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) INFO - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) WARN - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) FATAL - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.10 b/tests/witness/patternLayout.10 index f4944996cd..6a7fd416d5 100644 --- a/tests/witness/patternLayout.10 +++ b/tests/witness/patternLayout.10 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.11 b/tests/witness/patternLayout.11 index 3845564a0b..c8f5d9e85a 100644 --- a/tests/witness/patternLayout.11 +++ b/tests/witness/patternLayout.11 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) INFO [main] log4j.PatternLayoutTestCase: Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) WARN [main] log4j.PatternLayoutTestCase: Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR [main] log4j.PatternLayoutTestCase: Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) FATAL [main] log4j.PatternLayoutTestCase: Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.12 b/tests/witness/patternLayout.12 index 258356ef25..247d057490 100644 --- a/tests/witness/patternLayout.12 +++ b/tests/witness/patternLayout.12 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.13 b/tests/witness/patternLayout.13 index 725409d294..a7a5a7fb92 100644 --- a/tests/witness/patternLayout.13 +++ b/tests/witness/patternLayout.13 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.14 b/tests/witness/patternLayout.14 index d8d1479bea..93b666e617 100644 --- a/tests/witness/patternLayout.14 +++ b/tests/witness/patternLayout.14 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) INFO 12 - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) WARN 13 - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR 14 - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) FATAL 15 - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.2 b/tests/witness/patternLayout.2 index bc81dba279..a4f04acd2c 100644 --- a/tests/witness/patternLayout.2 +++ b/tests/witness/patternLayout.2 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.3 b/tests/witness/patternLayout.3 index 71ff0d5e08..cd1319d2f7 100644 --- a/tests/witness/patternLayout.3 +++ b/tests/witness/patternLayout.3 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.4 b/tests/witness/patternLayout.4 index 0cdcbf9727..a2bd38d8ac 100644 --- a/tests/witness/patternLayout.4 +++ b/tests/witness/patternLayout.4 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.5 b/tests/witness/patternLayout.5 index 20110500a0..b73cf4ae46 100644 --- a/tests/witness/patternLayout.5 +++ b/tests/witness/patternLayout.5 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.6 b/tests/witness/patternLayout.6 index 3d277f72e5..af2879e437 100644 --- a/tests/witness/patternLayout.6 +++ b/tests/witness/patternLayout.6 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.7 b/tests/witness/patternLayout.7 index 294917770f..37bb203b03 100644 --- a/tests/witness/patternLayout.7 +++ b/tests/witness/patternLayout.7 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.8 b/tests/witness/patternLayout.8 index 42a7b49342..c59322ab5e 100644 --- a/tests/witness/patternLayout.8 +++ b/tests/witness/patternLayout.8 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/patternLayout.9 b/tests/witness/patternLayout.9 index 06f4877d2e..3c2d4fee8e 100644 --- a/tests/witness/patternLayout.9 +++ b/tests/witness/patternLayout.9 @@ -21,9 +21,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO rnLayoutTestCase : Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -37,9 +34,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] WARN rnLayoutTestCase : Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -53,9 +47,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] ERROR rnLayoutTestCase : Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -69,9 +60,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] FATAL rnLayoutTestCase : Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) @@ -85,6 +73,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/simple b/tests/witness/simple index 914229804c..cdefeb7a96 100644 --- a/tests/witness/simple +++ b/tests/witness/simple @@ -34,7 +34,4 @@ java.lang.Exception: Just testing. at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) INFO - Messages should bear numbers 0 through 23. diff --git a/tests/witness/socketServer.1 b/tests/witness/socketServer.1 index 8782982da1..51221b8834 100644 --- a/tests/witness/socketServer.1 +++ b/tests/witness/socketServer.1 @@ -16,9 +16,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR T1 [main] root Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) @@ -32,6 +29,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.2 b/tests/witness/socketServer.2 index d90aadcf88..3f36acbbf2 100644 --- a/tests/witness/socketServer.2 +++ b/tests/witness/socketServer.2 @@ -16,9 +16,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR T2 [main] ? (?:?) Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) @@ -32,6 +29,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.3 b/tests/witness/socketServer.3 index 5b64d4f979..eb65c95176 100644 --- a/tests/witness/socketServer.3 +++ b/tests/witness/socketServer.3 @@ -16,9 +16,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) @@ -32,6 +29,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.4 b/tests/witness/socketServer.4 index 54eccbca1b..700b69dd00 100644 --- a/tests/witness/socketServer.4 +++ b/tests/witness/socketServer.4 @@ -16,9 +16,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR some T4 MDC-TEST4 [main] root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) @@ -32,6 +29,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.5 b/tests/witness/socketServer.5 index bdda8ae6f0..941c40818f 100644 --- a/tests/witness/socketServer.5 +++ b/tests/witness/socketServer.5 @@ -16,9 +16,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR some5 T5 MDC-TEST5 [main] root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) @@ -32,6 +29,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.6 b/tests/witness/socketServer.6 index cfc3adb75a..61e9f6987a 100644 --- a/tests/witness/socketServer.6 +++ b/tests/witness/socketServer.6 @@ -16,9 +16,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR some6 T6 client-test6 MDC-TEST6 [main] root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) @@ -32,6 +29,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.7 b/tests/witness/socketServer.7 index 898b179c6c..2ed8dcd259 100644 --- a/tests/witness/socketServer.7 +++ b/tests/witness/socketServer.7 @@ -16,9 +16,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR some7 T7 client-test7 MDC-TEST7 [main] root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) @@ -32,6 +29,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/socketServer.8 b/tests/witness/socketServer.8 index dc497ee6e7..1a4323c4fc 100644 --- a/tests/witness/socketServer.8 +++ b/tests/witness/socketServer.8 @@ -16,9 +16,6 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ERROR some8 T8 shortSocketServer MDC-TEST8 [main] root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) @@ -32,6 +29,3 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) diff --git a/tests/witness/ttcc b/tests/witness/ttcc index 1c91f6b97c..007c3ff31e 100644 --- a/tests/witness/ttcc +++ b/tests/witness/ttcc @@ -34,7 +34,4 @@ java.lang.Exception: Just testing. at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) [main] INFO INF - Messages should bear numbers 0 through 23. diff --git a/tests/witness/xmlLayout.1 b/tests/witness/xmlLayout.1 index 892a1a21c3..24ff74cfab 100644 --- a/tests/witness/xmlLayout.1 +++ b/tests/witness/xmlLayout.1 @@ -56,9 +56,6 @@ at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> @@ -76,9 +73,6 @@ at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> @@ -96,9 +90,6 @@ at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> @@ -116,9 +107,6 @@ at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> diff --git a/tests/witness/xmlLayout.2 b/tests/witness/xmlLayout.2 index 8306d1e31c..f2f3a165d8 100644 --- a/tests/witness/xmlLayout.2 +++ b/tests/witness/xmlLayout.2 @@ -67,9 +67,6 @@ at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> @@ -88,9 +85,6 @@ at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> @@ -109,9 +103,6 @@ at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> @@ -130,9 +121,6 @@ at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> diff --git a/tests/witness/xmlLayout.null b/tests/witness/xmlLayout.null index fc33042819..f0ee4d70bb 100644 --- a/tests/witness/xmlLayout.null +++ b/tests/witness/xmlLayout.null @@ -19,9 +19,6 @@ at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:XXX) - at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:XXX) ]]> From f9f4673d62927465699b39c34ee617703cb953da Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 30 Jun 2005 23:16:59 +0000 Subject: [PATCH 124/342] Bug 35568: Remove stray imports in log4j 1.2 unit tests git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311410 13f79535-47bb-0310-9956-ffa450edef68 --- tests/build.xml | 11 +++++++---- .../java/org/apache/log4j/AsyncAppenderTestCase.java | 2 +- tests/src/java/org/apache/log4j/VectorAppender.java | 2 -- .../java/org/apache/log4j/defaultInit/TestCase1.java | 1 - .../java/org/apache/log4j/defaultInit/TestCase2.java | 1 - .../java/org/apache/log4j/defaultInit/TestCase3.java | 1 - .../java/org/apache/log4j/defaultInit/TestCase4.java | 1 - 7 files changed, 8 insertions(+), 11 deletions(-) diff --git a/tests/build.xml b/tests/build.xml index 70ca49d4d0..031ef1a28a 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -22,6 +22,7 @@ + @@ -72,7 +73,8 @@ destdir="./classes" deprecation="${deprecation}" target="1.1" - debug="on"> + debug="on" + excludes="${excludes}"> @@ -97,12 +99,13 @@ + CyclicBuffer, OR, + LevelMatchFilter, PatternParser, + PatternLayout, DRFA"/> diff --git a/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java b/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java index ddd01989e0..c24c51a823 100644 --- a/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java +++ b/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java @@ -23,7 +23,7 @@ import java.util.Vector; import org.apache.log4j.*; -import org.apache.log4j.performance.NullAppender; +import org.apache.log4j.varia.NullAppender; /** A superficial but general test of log4j. diff --git a/tests/src/java/org/apache/log4j/VectorAppender.java b/tests/src/java/org/apache/log4j/VectorAppender.java index 14984ff9b8..ca2d191af3 100644 --- a/tests/src/java/org/apache/log4j/VectorAppender.java +++ b/tests/src/java/org/apache/log4j/VectorAppender.java @@ -19,9 +19,7 @@ import java.util.Vector; import org.apache.log4j.Layout; import org.apache.log4j.spi.LoggingEvent; -import org.apache.log4j.spi.LocationInfo; import org.apache.log4j.helpers.OptionConverter; -import org.apache.log4j.helpers.DateLayout; import org.apache.log4j.helpers.Transform; import org.apache.log4j.helpers.LogLog; diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java index d83e5f36af..e20339d29f 100644 --- a/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java @@ -23,7 +23,6 @@ import java.util.Vector; import org.apache.log4j.*; -import org.apache.log4j.performance.NullAppender; public class TestCase1 extends TestCase { diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java index 22488765b9..b80f83075d 100644 --- a/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java @@ -24,7 +24,6 @@ import java.util.Enumeration; import org.apache.log4j.*; -import org.apache.log4j.performance.NullAppender; public class TestCase2 extends TestCase { diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java index b275e822b7..eec2051463 100644 --- a/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java @@ -24,7 +24,6 @@ import java.util.Enumeration; import org.apache.log4j.*; -import org.apache.log4j.performance.NullAppender; public class TestCase3 extends TestCase { diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java index af36433f7d..35503d4bb8 100644 --- a/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java @@ -24,7 +24,6 @@ import java.util.Enumeration; import org.apache.log4j.*; -import org.apache.log4j.performance.NullAppender; public class TestCase4 extends TestCase { From b94a27628b5d83dd974192ae3e6378cd2edf707c Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 1 Jul 2005 04:38:34 +0000 Subject: [PATCH 125/342] Bug 35572: Add test coverage analysis to v1_2branch git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311411 13f79535-47bb-0310-9956-ffa450edef68 --- tests/.cvsignore | 2 ++ tests/build.properties.sample | 16 +++++------ tests/build.xml | 54 +++++++++++++++++++++++++++++++++-- 3 files changed, 61 insertions(+), 11 deletions(-) diff --git a/tests/.cvsignore b/tests/.cvsignore index 6c44436611..d67211993a 100644 --- a/tests/.cvsignore +++ b/tests/.cvsignore @@ -1,3 +1,5 @@ output classes build.properties +coverage +log4j.db* diff --git a/tests/build.properties.sample b/tests/build.properties.sample index eedcd55417..0956638889 100644 --- a/tests/build.properties.sample +++ b/tests/build.properties.sample @@ -1,13 +1,11 @@ -jakarta.oro.jar=../../jakarta-oro-2.0.5/jakarta-oro-2.0.5.jar -xml-api.jar=../../xerces-2_6_2/xml-apis.jar -xml-impl.jar=../../erces-2_6_2/xercesImpl.jar +# +# by default assume that all necessary dependencies +# are relative to the user's home directory +# +lib.home.dir=${user.home} +jakarta.oro.jar=${lib.home.dir}/jakarta-oro-2.0.8/jakarta-oro-2.0.8.jar +clover.jar="${lib.home.dir}/clover-1.3.8/lib/clover.jar deprecation=on # junit must be on the classpath! It can't be handled as a property. -# The current test files require: -# Ant 1.6.4 running in -# Sun JDK 1.3 -# with jUnit 3.8.1 -# This is because of the format of the exceptions recorded in the test -# witness files is particular to these versions. diff --git a/tests/build.xml b/tests/build.xml index 031ef1a28a..402f425462 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -33,6 +33,7 @@ + @@ -64,11 +65,28 @@ + + + + + + + + + + + + + + + + - + + - + @@ -328,5 +346,37 @@ + + + + + + + + + + clover.jar must be in the classpath and should also be + placed in the lib directory. A version of clover + (http://www.cenqua.com/clover) for use with ASF projects + is available from the committers/donated-licenses/clover module + in the SVN repository. + + + + + + + + + + + + + + + + + From ac180bc598e60dec68bb16a7102a6d3c9b062deb Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 14 Jul 2005 19:31:51 +0000 Subject: [PATCH 126/342] Bug 31056: Apply fix to v1.2 branch git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311418 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/ConsoleAppender.java | 117 +++++++++++++----- 1 file changed, 89 insertions(+), 28 deletions(-) diff --git a/src/java/org/apache/log4j/ConsoleAppender.java b/src/java/org/apache/log4j/ConsoleAppender.java index e7487766fa..555bc0562d 100644 --- a/src/java/org/apache/log4j/ConsoleAppender.java +++ b/src/java/org/apache/log4j/ConsoleAppender.java @@ -16,7 +16,8 @@ package org.apache.log4j; -import java.io.OutputStreamWriter; +import java.io.IOException; +import java.io.OutputStream; import org.apache.log4j.helpers.LogLog; /** @@ -25,6 +26,7 @@ * default target is System.out. * * @author Ceki Gülcü + * @author Curt Arnold * @since 1.1 */ public class ConsoleAppender extends WriterAppender { @@ -34,25 +36,29 @@ public class ConsoleAppender extends WriterAppender { protected String target = SYSTEM_OUT; /** - The default constructor does nothing. - */ + * Constructs an unconfigured appender. + */ public ConsoleAppender() { } + /** + * Creates a configured appender. + * + * @param layout layout, may not be null. + */ public ConsoleAppender(Layout layout) { this(layout, SYSTEM_OUT); } + /** + * Creates a configured appender. + * @param layout layout, may not be null. + * @param targetStr target, either "System.err" or "System.out". + */ public ConsoleAppender(Layout layout, String target) { - this.layout = layout; - - if (SYSTEM_OUT.equals(target)) { - setWriter(new OutputStreamWriter(System.out)); - } else if (SYSTEM_ERR.equalsIgnoreCase(target)) { - setWriter(new OutputStreamWriter(System.err)); - } else { - targetWarn(target); - } + setLayout(layout); + setTarget(target); + activateOptions(); } /** @@ -89,22 +95,77 @@ void targetWarn(String val) { LogLog.warn("Using previously set target, System.out by default."); } - public - void activateOptions() { - if(target.equals(SYSTEM_OUT)) { - setWriter(new OutputStreamWriter(System.out)); - } else { - setWriter(new OutputStreamWriter(System.err)); - } - } - /** - * This method overrides the parent {@link - * WriterAppender#closeWriter} implementation to do nothing because - * the console stream is not ours to close. - * */ - protected - final - void closeWriter() { + * Prepares the appender for use. + */ + public void activateOptions() { + if (target.equals(SYSTEM_ERR)) { + setWriter(createWriter(new SystemErrStream())); + } else { + setWriter(createWriter(new SystemOutStream())); + } + + super.activateOptions(); } + + /** + * An implementation of OutputStream that redirects to the + * current System.err. + * + */ + private static class SystemErrStream extends OutputStream { + public SystemErrStream() { + } + + public void close() { + } + + public void flush() { + System.err.flush(); + } + + public void write(final byte[] b) throws IOException { + System.err.write(b); + } + + public void write(final byte[] b, final int off, final int len) + throws IOException { + System.err.write(b, off, len); + } + + public void write(final int b) throws IOException { + System.err.write(b); + } + } + + /** + * An implementation of OutputStream that redirects to the + * current System.out. + * + */ + private static class SystemOutStream extends OutputStream { + public SystemOutStream() { + } + + public void close() { + } + + public void flush() { + System.out.flush(); + } + + public void write(final byte[] b) throws IOException { + System.out.write(b); + } + + public void write(final byte[] b, final int off, final int len) + throws IOException { + System.out.write(b, off, len); + } + + public void write(final int b) throws IOException { + System.out.write(b); + } + } + } From beb5178a99ef0b6ae8d264adc6f3ba64373ecffe Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 14 Jul 2005 21:23:55 +0000 Subject: [PATCH 127/342] Bug 23705: Parse gets confused with external entities git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311419 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/xml/DOMConfigurator.java | 109 ++++++++++++------ tests/input/xml/DOMTest4.xml | 29 +++++ tests/input/xml/DOMTest4_A1.xml | 9 ++ tests/input/xml/DOMTest4_A2.xml | 7 ++ .../org/apache/log4j/xml/DOMTestCase.java | 38 ++++-- tests/witness/dom.A1.4 | 93 +++++++++++++++ tests/witness/dom.A2.4 | 62 ++++++++++ 7 files changed, 304 insertions(+), 43 deletions(-) create mode 100644 tests/input/xml/DOMTest4.xml create mode 100644 tests/input/xml/DOMTest4_A1.xml create mode 100644 tests/input/xml/DOMTest4_A2.xml create mode 100644 tests/witness/dom.A1.4 create mode 100644 tests/witness/dom.A2.4 diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index fe3862f8fb..3b3c1149b7 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -29,7 +29,8 @@ import org.apache.log4j.config.PropertySetter; import org.xml.sax.InputSource; -import java.io.FileInputStream; +import org.xml.sax.SAXException; +import java.io.File; import java.io.InputStream; import java.io.Reader; import java.io.IOException; @@ -584,34 +585,37 @@ void configureAndWatch(String configFilename, long delay) { xdog.setDelay(delay); xdog.start(); } + + private interface ParseAction { + Document parse(final DocumentBuilder parser) throws SAXException, IOException; + } + public - void doConfigure(String filename, LoggerRepository repository) { - FileInputStream fis = null; - try { - fis = new FileInputStream(filename); - doConfigure(fis, repository); - } catch(IOException e) { - LogLog.error("Could not open ["+filename+"].", e); - } finally { - if (fis != null) { - try { - fis.close(); - } catch(java.io.IOException e) { - LogLog.error("Could not close ["+filename+"].", e); - } - } - } + void doConfigure(final String filename, LoggerRepository repository) { + ParseAction action = new ParseAction() { + public Document parse(final DocumentBuilder parser) throws SAXException, IOException { + return parser.parse(new File(filename)); + } + public String toString() { + return "file [" + filename + "]"; + } + }; + doConfigure(action, repository); } public - void doConfigure(URL url, LoggerRepository repository) { - try { - doConfigure(url.openStream(), repository); - } catch(IOException e) { - LogLog.error("Could not open ["+url+"].", e); - } + void doConfigure(final URL url, LoggerRepository repository) { + ParseAction action = new ParseAction() { + public Document parse(final DocumentBuilder parser) throws SAXException, IOException { + return parser.parse(url.toString()); + } + public String toString() { + return "url [" + url.toString() + "]"; + } + }; + doConfigure(action, repository); } /** @@ -620,9 +624,19 @@ void doConfigure(URL url, LoggerRepository repository) { */ public - void doConfigure(InputStream inputStream, LoggerRepository repository) + void doConfigure(final InputStream inputStream, LoggerRepository repository) throws FactoryConfigurationError { - doConfigure(new InputSource(inputStream), repository); + ParseAction action = new ParseAction() { + public Document parse(final DocumentBuilder parser) throws SAXException, IOException { + InputSource inputSource = new InputSource(inputStream); + inputSource.setSystemId("dummy://log4j.dtd"); + return parser.parse(inputSource); + } + public String toString() { + return "input stream [" + inputStream.toString() + "]"; + } + }; + doConfigure(action, repository); } /** @@ -631,9 +645,19 @@ void doConfigure(InputStream inputStream, LoggerRepository repository) */ public - void doConfigure(Reader reader, LoggerRepository repository) + void doConfigure(final Reader reader, LoggerRepository repository) throws FactoryConfigurationError { - doConfigure(new InputSource(reader), repository); + ParseAction action = new ParseAction() { + public Document parse(final DocumentBuilder parser) throws SAXException, IOException { + InputSource inputSource = new InputSource(reader); + inputSource.setSystemId("dummy://log4j.dtd"); + return parser.parse(inputSource); + } + public String toString() { + return "reader [" + reader.toString() + "]"; + } + }; + doConfigure(action, repository); } /** @@ -642,8 +666,25 @@ void doConfigure(Reader reader, LoggerRepository repository) */ protected - void doConfigure(InputSource inputSource, LoggerRepository repository) + void doConfigure(final InputSource inputSource, LoggerRepository repository) throws FactoryConfigurationError { + if (inputSource.getSystemId() == null) { + inputSource.setSystemId("dummy://log4j.dtd"); + } + ParseAction action = new ParseAction() { + public Document parse(final DocumentBuilder parser) throws SAXException, IOException { + return parser.parse(inputSource); + } + public String toString() { + return "input source [" + inputSource.toString() + "]"; + } + }; + doConfigure(action, repository); + } + + + private final void doConfigure(final ParseAction action, final LoggerRepository repository) + throws FactoryConfigurationError { DocumentBuilderFactory dbf = null; this.repository = repository; try { @@ -665,17 +706,13 @@ void doConfigure(InputSource inputSource, LoggerRepository repository) DocumentBuilder docBuilder = dbf.newDocumentBuilder(); docBuilder.setErrorHandler(new SAXErrorHandler()); - docBuilder.setEntityResolver(new Log4jEntityResolver()); - // we change the system ID to a valid URI so that Crimson won't - // complain. Indeed, "log4j.dtd" alone is not a valid URI which - // causes Crimson to barf. The Log4jEntityResolver only cares - // about the "log4j.dtd" ending. - inputSource.setSystemId("dummy://log4j.dtd"); - Document doc = docBuilder.parse(inputSource); + docBuilder.setEntityResolver(new Log4jEntityResolver()); + + Document doc = action.parse(docBuilder); parse(doc.getDocumentElement()); } catch (Exception e) { // I know this is miserable... - LogLog.error("Could not parse input source ["+inputSource+"].", e); + LogLog.error("Could not parse "+ action.toString() + ".", e); } } diff --git a/tests/input/xml/DOMTest4.xml b/tests/input/xml/DOMTest4.xml new file mode 100644 index 0000000000..29ce949833 --- /dev/null +++ b/tests/input/xml/DOMTest4.xml @@ -0,0 +1,29 @@ + + + +]> + + + &a1; + &a2; + + + + + + + + + + + + + + + + + + + + diff --git a/tests/input/xml/DOMTest4_A1.xml b/tests/input/xml/DOMTest4_A1.xml new file mode 100644 index 0000000000..cd408ae08f --- /dev/null +++ b/tests/input/xml/DOMTest4_A1.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/tests/input/xml/DOMTest4_A2.xml b/tests/input/xml/DOMTest4_A2.xml new file mode 100644 index 0000000000..302f0d88ab --- /dev/null +++ b/tests/input/xml/DOMTest4_A2.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java index 2bc3ea33e7..aa1b503ba4 100644 --- a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java @@ -96,6 +96,37 @@ cf2, new LineNumberFilter(), new ISO8601Filter(), assertTrue(Compare.compare(FILTERED_A1, "witness/dom.A1.1")); assertTrue(Compare.compare(FILTERED_A2, "witness/dom.A2.1")); } + + /** + * Tests processing of external entities in XML file. + */ + public void test4() throws Exception { + DOMConfigurator.configure("input/xml/DOMTest4.xml"); + common(); + + ControlFilter cf1 = new ControlFilter(new String[]{TEST1_1A_PAT, TEST1_1B_PAT, + EXCEPTION1, EXCEPTION2, EXCEPTION3}); + + ControlFilter cf2 = new ControlFilter(new String[]{TEST1_2_PAT, + EXCEPTION1, EXCEPTION2, EXCEPTION3}); + + Transformer.transform( + TEMP_A1 + ".4", FILTERED_A1 + ".4", + new Filter[] { + cf1, new LineNumberFilter(), new SunReflectFilter(), + new JunitTestRunnerFilter() + }); + + Transformer.transform( + TEMP_A2 + ".4", FILTERED_A2 + ".4", + new Filter[] { + cf2, new LineNumberFilter(), new ISO8601Filter(), + new SunReflectFilter(), new JunitTestRunnerFilter() + }); + + assertTrue(Compare.compare(FILTERED_A1 + ".4", "witness/dom.A1.4")); + assertTrue(Compare.compare(FILTERED_A2 + ".4", "witness/dom.A2.4")); + } void common() { int i = -1; @@ -123,11 +154,4 @@ void common() { root.error("Message " + i, e); } - - public static Test suite() { - TestSuite suite = new TestSuite(); - suite.addTest(new DOMTestCase("test1")); - return suite; - } - } diff --git a/tests/witness/dom.A1.4 b/tests/witness/dom.A1.4 new file mode 100644 index 0000000000..4e79edfaef --- /dev/null +++ b/tests/witness/dom.A1.4 @@ -0,0 +1,93 @@ +DEBUG xml.DOMTestCase - Message 0 +DEBUG xml.DOMTestCase - Message 0 +DEBUG root - Message 0 +INFO xml.DOMTestCase - Message 1 +INFO xml.DOMTestCase - Message 1 +INFO root - Message 1 +WARN xml.DOMTestCase - Message 2 +WARN xml.DOMTestCase - Message 2 +WARN root - Message 2 +ERROR xml.DOMTestCase - Message 3 +ERROR xml.DOMTestCase - Message 3 +ERROR root - Message 3 +FATAL xml.DOMTestCase - Message 4 +FATAL xml.DOMTestCase - Message 4 +FATAL root - Message 4 +DEBUG xml.DOMTestCase - Message 5 +java.lang.Exception: Just testing + at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) + at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) +DEBUG xml.DOMTestCase - Message 5 +java.lang.Exception: Just testing + at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) + at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) +DEBUG root - Message 5 +java.lang.Exception: Just testing + at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) + at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) +ERROR xml.DOMTestCase - Message 6 +java.lang.Exception: Just testing + at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) + at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) +ERROR xml.DOMTestCase - Message 6 +java.lang.Exception: Just testing + at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) + at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) +ERROR root - Message 6 +java.lang.Exception: Just testing + at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) + at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) diff --git a/tests/witness/dom.A2.4 b/tests/witness/dom.A2.4 new file mode 100644 index 0000000000..19dac364e4 --- /dev/null +++ b/tests/witness/dom.A2.4 @@ -0,0 +1,62 @@ + [main] DEBUG org.apache.log4j.xml.DOMTestCase - Message 0 + [main] DEBUG root - Message 0 + [main] INFO org.apache.log4j.xml.DOMTestCase - Message 1 + [main] INFO root - Message 1 + [main] WARN org.apache.log4j.xml.DOMTestCase - Message 2 + [main] WARN root - Message 2 + [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 3 + [main] ERROR root - Message 3 + [main] FATAL org.apache.log4j.xml.DOMTestCase - Message 4 + [main] FATAL root - Message 4 + [main] DEBUG org.apache.log4j.xml.DOMTestCase - Message 5 +java.lang.Exception: Just testing + at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) + at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + [main] DEBUG root - Message 5 +java.lang.Exception: Just testing + at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) + at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 6 +java.lang.Exception: Just testing + at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) + at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + [main] ERROR root - Message 6 +java.lang.Exception: Just testing + at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) + at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) + at java.lang.reflect.Method.invoke(Native Method) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) From 8e3299ead65f8e5f0b2e02007fab83d78a6d3442 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 14 Jul 2005 23:51:37 +0000 Subject: [PATCH 128/342] Bug 35516: Add jdiff target to build.xml on 1.2 branch git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311422 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/build.xml b/build.xml index e8814b3998..a865690ff8 100644 --- a/build.xml +++ b/build.xml @@ -396,9 +396,30 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + From 0b7fec7068ed12ad5153f11c5412a4893f0372e0 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 15 Jul 2005 00:07:00 +0000 Subject: [PATCH 129/342] Bug 31056: Restore final closeWriter on 1.2 branch git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311423 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/ConsoleAppender.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/java/org/apache/log4j/ConsoleAppender.java b/src/java/org/apache/log4j/ConsoleAppender.java index 555bc0562d..c0b6530b8a 100644 --- a/src/java/org/apache/log4j/ConsoleAppender.java +++ b/src/java/org/apache/log4j/ConsoleAppender.java @@ -107,6 +107,16 @@ public void activateOptions() { super.activateOptions(); } + + /** + * {@inheritDoc} + */ + protected + final + void closeWriter() { + super.closeWriter(); + } + /** * An implementation of OutputStream that redirects to the From 6854c564b4ed6a50a1dde9ef037c0d12925ba8e6 Mon Sep 17 00:00:00 2001 From: No Author Date: Mon, 18 Jul 2005 17:08:47 +0000 Subject: [PATCH 130/342] This commit was manufactured by cvs2svn to create branch 'v1_2-branch'. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311425 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/log4j/CoreTestSuite.java | 44 +++++ .../src/java/org/apache/log4j/LevelTest.java | 92 +++++++++ .../apache/log4j/spi/LoggingEventTest.java | 185 ++++++++++++++++++ .../log4j/util/SerializationTestHelper.java | 146 ++++++++++++++ tests/witness/serialization/exception.bin | Bin 0 -> 1990 bytes tests/witness/serialization/info.bin | Bin 0 -> 60 bytes tests/witness/serialization/location.bin | Bin 0 -> 630 bytes tests/witness/serialization/mdc.bin | Bin 0 -> 514 bytes tests/witness/serialization/ndc.bin | Bin 0 -> 494 bytes tests/witness/serialization/simple.bin | Bin 0 -> 484 bytes 10 files changed, 467 insertions(+) create mode 100644 tests/src/java/org/apache/log4j/CoreTestSuite.java create mode 100644 tests/src/java/org/apache/log4j/LevelTest.java create mode 100644 tests/src/java/org/apache/log4j/spi/LoggingEventTest.java create mode 100644 tests/src/java/org/apache/log4j/util/SerializationTestHelper.java create mode 100644 tests/witness/serialization/exception.bin create mode 100644 tests/witness/serialization/info.bin create mode 100644 tests/witness/serialization/location.bin create mode 100644 tests/witness/serialization/mdc.bin create mode 100644 tests/witness/serialization/ndc.bin create mode 100644 tests/witness/serialization/simple.bin diff --git a/tests/src/java/org/apache/log4j/CoreTestSuite.java b/tests/src/java/org/apache/log4j/CoreTestSuite.java new file mode 100644 index 0000000000..0071eb88e5 --- /dev/null +++ b/tests/src/java/org/apache/log4j/CoreTestSuite.java @@ -0,0 +1,44 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.log4j; + +import junit.framework.Test; +import junit.framework.TestSuite; +import org.apache.log4j.spi.LoggingEventTest; + + +/** + * Suite of log4j class level unit tests. + * + * @author Curt Arnold + * @since 1.3 + */ +public class CoreTestSuite { + /** + * Constructs test suite. + * @return test suite + */ + public static Test suite() { + TestSuite s = new TestSuite(); + s.addTestSuite(LoggingEventTest.class); + s.addTestSuite(org.apache.log4j.pattern.NameAbbreviatorTest.class); + s.addTestSuite(org.apache.log4j.pattern.PatternParserTest.class); + s.addTestSuite(org.apache.log4j.rolling.helper.FileNamePatternTestCase.class); + s.addTestSuite(org.apache.log4j.pattern.FormattingInfoTest.class); + s.addTestSuite(org.apache.log4j.LevelTest.class); + return s; + } +} diff --git a/tests/src/java/org/apache/log4j/LevelTest.java b/tests/src/java/org/apache/log4j/LevelTest.java new file mode 100644 index 0000000000..96a359394a --- /dev/null +++ b/tests/src/java/org/apache/log4j/LevelTest.java @@ -0,0 +1,92 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j; + +import junit.framework.TestCase; + +import org.apache.log4j.util.SerializationTestHelper; + + +/** + * Tests of Level. + * + * @author Curt Arnold + * @since 1.3 + */ +public class LevelTest extends TestCase { + /** + * Constructs new instance of test. + * @param name test name. + */ + public LevelTest(final String name) { + super(name); + } + + /** + * Serialize Level.INFO and check against witness. + * @throws Exception if exception during test. + * + */ + public void testSerializeINFO() throws Exception { + int[] skip = new int[] { }; + SerializationTestHelper.assertSerializationEquals( + "witness/serialization/info.bin", Level.INFO, skip, Integer.MAX_VALUE); + } + + /** + * Deserialize witness and see if resolved to Level.INFO. + * @throws Exception if exception during test. + */ + public void testDeserializeINFO() throws Exception { + Object obj = + SerializationTestHelper.deserializeStream( + "witness/serialization/info.bin"); + assertTrue(obj instanceof Level); + assertTrue(obj == Level.INFO); + } + + /** + * Tests that a custom level can be serialized and deserialized + * and is not resolved to a stock level. + * + * @throws Exception if exception during test. + */ + public void testCustomLevelSerialization() throws Exception { + CustomLevel custom = new CustomLevel(); + Object obj = SerializationTestHelper.serializeClone(custom); + assertTrue(obj instanceof CustomLevel); + + CustomLevel clone = (CustomLevel) obj; + assertEquals(Level.INFO.level, clone.level); + assertEquals(Level.INFO.levelStr, clone.levelStr); + assertEquals(Level.INFO.syslogEquivalent, clone.syslogEquivalent); + } + + /** + * Custom level to check that custom levels are + * serializable, but not resolved to a plain Level. + */ + private static class CustomLevel extends Level { + /** + * Create an instance of CustomLevel. + */ + public CustomLevel() { + super( + Level.INFO.level, Level.INFO.levelStr, Level.INFO.syslogEquivalent); + } + } +} diff --git a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java new file mode 100644 index 0000000000..3615db3945 --- /dev/null +++ b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java @@ -0,0 +1,185 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.spi; + +import junit.framework.TestCase; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.log4j.MDC; +import org.apache.log4j.NDC; +import org.apache.log4j.spi.location.LocationInfo; +import org.apache.log4j.util.SerializationTestHelper; + + +/** + * Tests LoggingEvent. + * + * @author Curt Arnold + * @since 1.3 + */ +public class LoggingEventTest extends TestCase { + /** + * Create LoggingEventTest. + * + * @param name test name. + */ + public LoggingEventTest(final String name) { + super(name); + } + + /** + * Serialize a simple logging event and check it against + * a witness. + * @throws Exception if exception during test. + */ + public void testSerializationSimple() throws Exception { + Logger root = Logger.getRootLogger(); + LoggingEvent event = + new LoggingEvent( + root.getClass().getName(), root, Level.INFO, "Hello, world.", null); + event.prepareForDeferredProcessing(); + + int[] skip = new int[] { 358, 359, 360, 361, 362 }; + SerializationTestHelper.assertSerializationEquals( + "witness/serialization/simple.bin", event, skip, Integer.MAX_VALUE); + } + + /** + * Serialize a logging event with an exception and check it against + * a witness. + * @throws Exception if exception during test. + * + */ + public void testSerializationWithException() throws Exception { + Logger root = Logger.getRootLogger(); + Exception ex = new Exception("Don't panic"); + LoggingEvent event = + new LoggingEvent( + root.getClass().getName(), root, Level.INFO, "Hello, world.", ex); + event.prepareForDeferredProcessing(); + + int[] skip = new int[] { 358, 359, 360, 361, 362, 600, 734, 735, 1511 }; + SerializationTestHelper.assertSerializationEquals( + "witness/serialization/exception.bin", event, skip, 1089); + } + + /** + * Serialize a logging event with an exception and check it against + * a witness. + * @throws Exception if exception during test. + * + */ + public void testSerializationWithLocation() throws Exception { + Logger root = Logger.getRootLogger(); + LoggingEvent event = + new LoggingEvent( + root.getClass().getName(), root, Level.INFO, "Hello, world.", null); + LocationInfo info = event.getLocationInformation(); + event.prepareForDeferredProcessing(); + + int[] skip = new int[] { 354, 355, 356, 357, 358, 359, 360, 361, 362 }; + SerializationTestHelper.assertSerializationEquals( + "witness/serialization/location.bin", event, skip, Integer.MAX_VALUE); + } + + /** + * Serialize a logging event with ndc. + * @throws Exception if exception during test. + * + */ + public void testSerializationNDC() throws Exception { + Logger root = Logger.getRootLogger(); + NDC.push("ndc test"); + + LoggingEvent event = + new LoggingEvent( + root.getClass().getName(), root, Level.INFO, "Hello, world.", null); + event.prepareForDeferredProcessing(); + + int[] skip = new int[] { 354, 355, 356, 357, 358, 359, 360, 361, 362 }; + SerializationTestHelper.assertSerializationEquals( + "witness/serialization/ndc.bin", event, skip, Integer.MAX_VALUE); + } + + /** + * Serialize a logging event with mdc. + * @throws Exception if exception during test. + * + */ + public void testSerializationMDC() throws Exception { + Logger root = Logger.getRootLogger(); + MDC.put("mdckey", "mdcvalue"); + + LoggingEvent event = + new LoggingEvent( + root.getClass().getName(), root, Level.INFO, "Hello, world.", null); + event.prepareForDeferredProcessing(); + + int[] skip = new int[] { 354, 355, 356, 357, 358, 359, 360, 361, 362 }; + SerializationTestHelper.assertSerializationEquals( + "witness/serialization/mdc.bin", event, skip, Integer.MAX_VALUE); + } + + /** + * Deserialize a simple logging event. + * @throws Exception if exception during test. + * + */ + public void testDeserializationSimple() throws Exception { + Object obj = + SerializationTestHelper.deserializeStream( + "witness/serialization/simple.bin"); + assertTrue(obj instanceof LoggingEvent); + + LoggingEvent event = (LoggingEvent) obj; + assertEquals("Hello, world.", event.getMessage()); + assertEquals(Level.INFO, event.getLevel()); + } + + /** + * Deserialize a logging event with an exception. + * @throws Exception if exception during test. + * + */ + public void testDeserializationWithException() throws Exception { + Object obj = + SerializationTestHelper.deserializeStream( + "witness/serialization/exception.bin"); + assertTrue(obj instanceof LoggingEvent); + + LoggingEvent event = (LoggingEvent) obj; + assertEquals("Hello, world.", event.getMessage()); + assertEquals(Level.INFO, event.getLevel()); + } + + /** + * Deserialize a logging event with an exception. + * @throws Exception if exception during test. + * + */ + public void testDeserializationWithLocation() throws Exception { + Object obj = + SerializationTestHelper.deserializeStream( + "witness/serialization/location.bin"); + assertTrue(obj instanceof LoggingEvent); + + LoggingEvent event = (LoggingEvent) obj; + assertEquals("Hello, world.", event.getMessage()); + assertEquals(Level.INFO, event.getLevel()); + } +} diff --git a/tests/src/java/org/apache/log4j/util/SerializationTestHelper.java b/tests/src/java/org/apache/log4j/util/SerializationTestHelper.java new file mode 100644 index 0000000000..e01c747707 --- /dev/null +++ b/tests/src/java/org/apache/log4j/util/SerializationTestHelper.java @@ -0,0 +1,146 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.util; + +import junit.framework.TestCase; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + + +/** + * Utiities for serialization tests. + * + * @author Curt Arnold + */ +public class SerializationTestHelper { + /** + * Private constructor. + */ + private SerializationTestHelper() { + } + + /** + * Creates a clone by serializing object and + * deserializing byte stream. + * @param obj object to serialize and deserialize. + * @return clone + * @throws IOException on IO error. + * @throws ClassNotFoundException if class not found. + */ + public static Object serializeClone(final Object obj) + throws IOException, ClassNotFoundException { + ByteArrayOutputStream memOut = new ByteArrayOutputStream(); + ObjectOutputStream objOut = new ObjectOutputStream(memOut); + objOut.writeObject(obj); + objOut.close(); + + ByteArrayInputStream src = new ByteArrayInputStream(memOut.toByteArray()); + ObjectInputStream objIs = new ObjectInputStream(src); + + return objIs.readObject(); + } + + /** + * Deserializes a specified file. + * @param witness serialization file, may not be null. + * @return deserialized object. + * @throws Exception thrown on IO or deserialization exception. + */ + public static Object deserializeStream(final String witness) + throws Exception { + FileInputStream fileIs = new FileInputStream(witness); + ObjectInputStream objIs = new ObjectInputStream(fileIs); + + return objIs.readObject(); + } + + /** + * Checks the serialization of an object against an file + * containing the expected serialization. + * + * @param witness name of file containing expected serialization. + * @param obj object to be serialized. + * @param skip positions in serialized stream that should not be compared. + * @param endCompare position to stop comparison. + * @throws Exception thrown on IO or serialization exception. + */ + public static void assertSerializationEquals( + final String witness, final Object obj, final int[] skip, + final int endCompare) throws Exception { + ByteArrayOutputStream memOut = new ByteArrayOutputStream(); + ObjectOutputStream objOut = new ObjectOutputStream(memOut); + objOut.writeObject(obj); + objOut.close(); + + assertStreamEquals(witness, memOut.toByteArray(), skip, endCompare); + } + + /** + * Asserts the serialized form of an object. + * @param witness file name of expected serialization. + * @param actual byte array of actual serialization. + * @param skip positions to skip comparison. + * @param endCompare position to stop comparison. + * @throws IOException thrown on IO or serialization exception. + */ + public static void assertStreamEquals( + final String witness, final byte[] actual, final int[] skip, + final int endCompare) throws IOException { + File witnessFile = new File(witness); + + if (witnessFile.exists()) { + int skipIndex = 0; + byte[] expected = new byte[actual.length]; + FileInputStream is = new FileInputStream(witnessFile); + int bytesRead = is.read(expected); + is.close(); + TestCase.assertEquals(bytesRead, actual.length); + + int endScan = actual.length; + + if (endScan > endCompare) { + endScan = endCompare; + } + + for (int i = 0; i < endScan; i++) { + if ((skipIndex < skip.length) && (skip[skipIndex] == i)) { + skipIndex++; + } else { + if (expected[i] != actual[i]) { + TestCase.assertEquals( + "Difference at offset " + i, expected[i], actual[i]); + } + } + } + } else { + // + // if the file doesn't exist then + // assume that we are setting up and need to write it + FileOutputStream os = new FileOutputStream(witnessFile); + os.write(actual); + os.close(); + TestCase.fail("Writing witness file " + witness); + } + } +} diff --git a/tests/witness/serialization/exception.bin b/tests/witness/serialization/exception.bin new file mode 100644 index 0000000000000000000000000000000000000000..8749a64d6e4bd03244d295527cabd7e8ed53c260 GIT binary patch literal 1990 zcmb7F%}*RR6gM9|gg{WzD9R<$R&CTpNxbax6^L3&0JWe6H9%V>NKwqpWAHL#JDxYN zZKOy!^wfW)?Jb8~D)nFJUyxI(9(rk{9;-gv16g1p$sSf-@B4kd=kfgfH~S#B>?3Ux zE{uqFfTubcZ}Hqn-qcAVRkFAT3Sa;8;$uAje727bJYW}995uDxEzBA`E~JHcnO(?f z2`YlsBHIGH%+8_AU>!wfnrtu<2#L1euZj$iU23+(o~WflCAD?5q;ZF8QcYD-t0lFq zk=<;Pr&{n-^PXztiB_Sg*6gSzbRSuI%$~BICL1tT8?Y!LM>ZU!3Y2MWMHs3awxD7l z&nuAUB7p-G?pP49Gg$5n(T?61TPXxbH@Z98=&Z7tk8r1LSo!H?tf%+KpMI?(>$h5? zG1TviE4g>YN^Cq^Wsy*yKTZbdvC2oQ-#`zYYWtpQJcDcBw`bCy}FWhGVCRA2jTE0?8@m8#tJc1h|+~gY^LK_R|=ekxX1(wH}79nET2>q?Q{`#X& zw-KEhq&r5oxJ3?ai0JOpinrWpY4D{O#PT<^oJ;6cQ4${8^rRDR=4YD8QP^_Woo1#Q z1bpODyu}O!Yoj}(AzXud!tldg8FMztDeKXi&|%l8hwmWK;65w8+ALE04BeJ=yy+qY jk>ztL_J355)Odku7ry!a0`4;JLN`_)aW83RWBz$-6TuTC$%g!$Do*9UY_ZQ88ZVzML{_q1B0Ie P0|Nsa1B<7hn|}oWI;{{E literal 0 HcmV?d00001 diff --git a/tests/witness/serialization/location.bin b/tests/witness/serialization/location.bin new file mode 100644 index 0000000000000000000000000000000000000000..18e900b8869fa6664cf5f582285c45d709312318 GIT binary patch literal 630 zcmZvZJx|;~5QgWtikjd}t34)7_>#*KZH%pMc8b0Ub=DakvC3Qo zGqGY!$zQfqh71c)M_s7UD4T{y?B$Lv$rzH9CcAIXh+!iVrf|p<4wyn=lGQL2My0fz zt_spQ{DMjZ4d=N^-cRe;LW)%C*(L(LPh*k1e4_PCj7pLlq^eg4zDx%)W{CuVjmcAQC+mZiqE79GiNvpnNsB9OT^~uW#(|qwqf=8xP%cDACnNwadd4|Q3)1CLZbauU3(YnttyNAZm#!`>GNdl>!DQySattHq04<^6Q-2eap literal 0 HcmV?d00001 diff --git a/tests/witness/serialization/mdc.bin b/tests/witness/serialization/mdc.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec569b7407b7b2bbf8325922bf340457091fba37 GIT binary patch literal 514 zcmZvYKTpFz48>jAA}9q^2IeBf0wr14kYGSafI~8{dW%2}ZsM zBO41y%(!Vm9q?p5J?s6RA3va)IoKc@*uP{a8T;bVB(8+asktGBRv=9Ngvl?Md|{GpV)BC-w_KM6=??Cp6hO^7vgkO$ zjA3;Wm2;x~b7jT3>d-_e%;%V8D#qU{zICXgG2m2L7KH|?qj5sC^FPtmtjncEh5ez0 z=~Mwqa}RIZ&kPku#Fk+}Seq<#^7+R26W$olyK;zvSbzOK*xl;Bmy0eTrB*q`kTr%~9$kwnPSS31Wb!}1AgO|9mDoQ^!fNL6BrlXlY%e*miAtMmW> literal 0 HcmV?d00001 diff --git a/tests/witness/serialization/ndc.bin b/tests/witness/serialization/ndc.bin new file mode 100644 index 0000000000000000000000000000000000000000..294197062aef62856a529741e9c39e8879958462 GIT binary patch literal 494 zcmZvYKTiTd5XA?V6o+c$Z?HxKWynp)T)8#>A;e~3;@;nB!RP2_kKhLH}>rl|Sz<9U}i zo=%ETzJj_Ae2?g6VlHt!i7WhHm|S6!DL1*^l3TWmf;5IZD0omdmJC{s zFlDIaQ4@}0x1)?WYZi5Y!rZ|$RU!Uv@zA0Q7JxrWRTP@3L5w-k!T&`4WtUB|3az<; zpH~7XtlYouKQfdo5gUdzVQsL`$>r;dOE?QWr*9DjvGVeDe7HAyD`s7MN{q6K$uev& kbvgahCCkht1z^rlJ;ykvW@AP+4jhS0RHU=-Zo|yK0b)9(Bme*a literal 0 HcmV?d00001 diff --git a/tests/witness/serialization/simple.bin b/tests/witness/serialization/simple.bin new file mode 100644 index 0000000000000000000000000000000000000000..c4434a47c04693a0a69fd0007848164c10ff5bba GIT binary patch literal 484 zcmZvYF;4g!cR{j<3w6OHg z*x6`e?cN<43b&fPd6W0Oef)s+#K0~Y=?E?SF**^+qluH~(D6vhP|33yD*pO>-Q&%d zlQLAVps51iBf3fTB~H`OV9 Date: Mon, 18 Jul 2005 17:08:47 +0000 Subject: [PATCH 131/342] Bug 26433: Level serialization and event serialization tests for 1.2 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311426 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/Level.java | 60 +++++++++++++++++- src/java/org/apache/log4j/Priority.java | 19 ++++-- tests/build.xml | 11 +++- .../java/org/apache/log4j/CoreTestSuite.java | 4 -- .../apache/log4j/spi/LoggingEventTest.java | 22 +++---- tests/witness/serialization/exception.bin | Bin 1990 -> 1843 bytes tests/witness/serialization/location.bin | Bin 630 -> 465 bytes tests/witness/serialization/mdc.bin | Bin 514 -> 508 bytes tests/witness/serialization/ndc.bin | Bin 494 -> 409 bytes tests/witness/serialization/simple.bin | Bin 484 -> 399 bytes 10 files changed, 94 insertions(+), 22 deletions(-) diff --git a/src/java/org/apache/log4j/Level.java b/src/java/org/apache/log4j/Level.java index dbf4154298..9414e59fee 100644 --- a/src/java/org/apache/log4j/Level.java +++ b/src/java/org/apache/log4j/Level.java @@ -18,6 +18,11 @@ // Nicholas Wolff package org.apache.log4j; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamException; +import java.io.Serializable; /** Defines the minimum set of levels recognized by the system, that is @@ -31,7 +36,7 @@ @author Ceki Gülcü */ -public class Level extends Priority { +public class Level extends Priority implements Serializable { /** @@ -72,6 +77,11 @@ public class Level extends Priority { turn on all logging. */ final static public Level ALL = new Level(ALL_INT, "ALL", 7); + /** + * Serialization version id. + */ + static final long serialVersionUID = 3491141966387921974L; + /** Instantiate a Level object. */ @@ -144,4 +154,52 @@ Level toLevel(String sArg, Level defaultLevel) { if(s.equals("OFF")) return Level.OFF; return defaultLevel; } + + /** + * Custom deserialization of Level. + * @param s serialization stream. + * @throws IOException if IO exception. + * @throws ClassNotFoundException if class not found. + */ + private void readObject(final ObjectInputStream s) throws IOException, ClassNotFoundException { + s.defaultReadObject(); + level = s.readInt(); + syslogEquivalent = s.readInt(); + levelStr = s.readUTF(); + if (levelStr == null) { + levelStr = ""; + } + } + + /** + * Serialize level. + * @param s serialization stream. + * @throws IOException if exception during serialization. + */ + private void writeObject(final ObjectOutputStream s) throws IOException { + s.defaultWriteObject(); + s.writeInt(level); + s.writeInt(syslogEquivalent); + s.writeUTF(levelStr); + } + + /** + * Resolved deserialized level to one of the stock instances. + * May be overriden in classes derived from Level. + * @return resolved object. + * @throws ObjectStreamException if exception during resolution. + */ + private Object readResolve() throws ObjectStreamException { + // + // if the deserizalized object is exactly an instance of Level + // + if (getClass() == Level.class) { + return toLevel(level); + } + // + // extension of Level can't substitute stock item + // + return this; + } + } diff --git a/src/java/org/apache/log4j/Priority.java b/src/java/org/apache/log4j/Priority.java index 197b9ac155..fb3a9bd9ec 100644 --- a/src/java/org/apache/log4j/Priority.java +++ b/src/java/org/apache/log4j/Priority.java @@ -17,7 +17,7 @@ // Contributors: Kitching Simon package org.apache.log4j; - + /** Refrain from using this class directly, use the {@link Level} class instead. @@ -25,9 +25,9 @@ @author Ceki Gülcü */ public class Priority { - int level; - String levelStr; - int syslogEquivalent; + transient int level; + transient String levelStr; + transient int syslogEquivalent; public final static int OFF_INT = Integer.MAX_VALUE; public final static int FATAL_INT = 50000; @@ -63,7 +63,16 @@ public class Priority { */ final static public Priority DEBUG = new Level(DEBUG_INT, "DEBUG", 7); - + + /** + * Default constructor for deserialization. + */ + protected Priority() { + level = DEBUG_INT; + levelStr = "DEBUG"; + syslogEquivalent = 7; + } + /** Instantiate a level object. */ diff --git a/tests/build.xml b/tests/build.xml index 402f425462..3de966972a 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -116,7 +116,7 @@ - + + + + + + + + diff --git a/tests/src/java/org/apache/log4j/CoreTestSuite.java b/tests/src/java/org/apache/log4j/CoreTestSuite.java index 0071eb88e5..4bbe576437 100644 --- a/tests/src/java/org/apache/log4j/CoreTestSuite.java +++ b/tests/src/java/org/apache/log4j/CoreTestSuite.java @@ -34,10 +34,6 @@ public class CoreTestSuite { public static Test suite() { TestSuite s = new TestSuite(); s.addTestSuite(LoggingEventTest.class); - s.addTestSuite(org.apache.log4j.pattern.NameAbbreviatorTest.class); - s.addTestSuite(org.apache.log4j.pattern.PatternParserTest.class); - s.addTestSuite(org.apache.log4j.rolling.helper.FileNamePatternTestCase.class); - s.addTestSuite(org.apache.log4j.pattern.FormattingInfoTest.class); s.addTestSuite(org.apache.log4j.LevelTest.class); return s; } diff --git a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java index 3615db3945..702180d22d 100644 --- a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java +++ b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java @@ -22,7 +22,7 @@ import org.apache.log4j.Logger; import org.apache.log4j.MDC; import org.apache.log4j.NDC; -import org.apache.log4j.spi.location.LocationInfo; +import org.apache.log4j.spi.LocationInfo; import org.apache.log4j.util.SerializationTestHelper; @@ -52,9 +52,9 @@ public void testSerializationSimple() throws Exception { LoggingEvent event = new LoggingEvent( root.getClass().getName(), root, Level.INFO, "Hello, world.", null); - event.prepareForDeferredProcessing(); +// event.prepareForDeferredProcessing(); - int[] skip = new int[] { 358, 359, 360, 361, 362 }; + int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( "witness/serialization/simple.bin", event, skip, Integer.MAX_VALUE); } @@ -71,9 +71,9 @@ public void testSerializationWithException() throws Exception { LoggingEvent event = new LoggingEvent( root.getClass().getName(), root, Level.INFO, "Hello, world.", ex); - event.prepareForDeferredProcessing(); +// event.prepareForDeferredProcessing(); - int[] skip = new int[] { 358, 359, 360, 361, 362, 600, 734, 735, 1511 }; + int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( "witness/serialization/exception.bin", event, skip, 1089); } @@ -90,9 +90,9 @@ public void testSerializationWithLocation() throws Exception { new LoggingEvent( root.getClass().getName(), root, Level.INFO, "Hello, world.", null); LocationInfo info = event.getLocationInformation(); - event.prepareForDeferredProcessing(); +// event.prepareForDeferredProcessing(); - int[] skip = new int[] { 354, 355, 356, 357, 358, 359, 360, 361, 362 }; + int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( "witness/serialization/location.bin", event, skip, Integer.MAX_VALUE); } @@ -109,9 +109,9 @@ public void testSerializationNDC() throws Exception { LoggingEvent event = new LoggingEvent( root.getClass().getName(), root, Level.INFO, "Hello, world.", null); - event.prepareForDeferredProcessing(); +// event.prepareForDeferredProcessing(); - int[] skip = new int[] { 354, 355, 356, 357, 358, 359, 360, 361, 362 }; + int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( "witness/serialization/ndc.bin", event, skip, Integer.MAX_VALUE); } @@ -128,9 +128,9 @@ public void testSerializationMDC() throws Exception { LoggingEvent event = new LoggingEvent( root.getClass().getName(), root, Level.INFO, "Hello, world.", null); - event.prepareForDeferredProcessing(); +// event.prepareForDeferredProcessing(); - int[] skip = new int[] { 354, 355, 356, 357, 358, 359, 360, 361, 362 }; + int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( "witness/serialization/mdc.bin", event, skip, Integer.MAX_VALUE); } diff --git a/tests/witness/serialization/exception.bin b/tests/witness/serialization/exception.bin index 8749a64d6e4bd03244d295527cabd7e8ed53c260..87b0c1db0c1a8ef8549de536c0b05783dc91c697 100644 GIT binary patch delta 480 zcmX@cznO1>nU-j7O0si)L8VWAes*a=P-IQN6oX)1N;0b0#7M_LWuN?_bp6DF z#N>=r{ha)ClPvw>f=qp%{N%)v%=|phytI649|m@)nI#OOK3R!niTb4_nK}9%iNzTu ziAg!BKo!hD(+e5u7#Jsh%oSi{Rg-7EUc$gql%HQxP*5=W2;&q+;mMIqtxVixN^~lVMw& ziE4(jQ{5J(adn>@F?xK)JpcUSrh=?&wMJu7%ck5cce8xo0?_>U&xiHJx%Qt@0giNH zgcYbQvY8?9=2O3s8}qH~7UX^HU3=60vVT5OUztbtv47`RZ-4l|{a$@k;A}fn5;;PS zndJNAx|=BlmdBck%22~et<`FEVtjH3$%0FT(CNrFx5y!fh@7?J1v21UF^JY@qBoC0 z;Q%<)?7411U3Oxx+N3Bf{%^Aq(80qu*if<@pTh*4fIU0N`bFYN(;lb9e>qgh1xvK! z;0-$hUZmY~s`LSk1-d2JLkl8Fn<_3|RGw$(hx!+P)x{6rzabG)4e=gvOSO4-_dByD F{|k!30JZ=C diff --git a/tests/witness/serialization/location.bin b/tests/witness/serialization/location.bin index 18e900b8869fa6664cf5f582285c45d709312318..c7988504f2bc04379f08f8bf435369cda26fe436 100644 GIT binary patch delta 224 zcmeyya*=t0nU-j7O0si)L8VWAes*a=P-IQN6oX)1N;0b0#7M_LWuN?_bp6DF z#N>=r{ha)ClPvw>f=qp%{N%)v%=|phytI649|m@)nI#OOK3R!niTb4_nK}9%iNzTu ziAg!BKo!hD(+e5u7#Jsh%nf2>Rg?dFwSIR27Xx20keQm7oa$Gao0M8KF~N~hXR;on zm_tr}a$-qlexAM$l;N3|mT&FDzzj5`kfDx&(T9PnpeVl}wWuUBwYY?V-zO`vEK$F- zBr`|fH?hEa;-_2*1|VQ&U|?iw?OqpN!oX6LpI=g3#Go~~fKjv_W`Q2E1#f5We&{uE zX$=ztiw^^5a!z7#v0q|tD%3)bw9K4TBtBP8W**exFel}vmSp6oz|~X~lrS*bgCsc- zL;=tZf?((Bft;%sQk0qsbTZGuZ+5z>SesW?-W`3S$URu7j4+A^Y%n}AspRB~PME%l|%p84>#Nv#S z#H5^5pbBQ7>4gk+42%;$=0-BIswuvFSi-HwLbp{KOQu#N?9vB2Na+l8mC%;*9*9l!^j-2L=#eE$0A|?2}J2N^5cetx_mS mEiNfx;Ppt&$;sDID9FfcN;-qYGq!oX6LpI=f?!oUGELZJkxskn$i5Tr{Fq)RWP zC^Z$Rljqh0HUr{pa1{> diff --git a/tests/witness/serialization/ndc.bin b/tests/witness/serialization/ndc.bin index 294197062aef62856a529741e9c39e8879958462..7f434550e903e7c162be8781a711edeb44b9fa2e 100644 GIT binary patch delta 168 zcmaFIJd=5XnU-j7O0si)L8VWAes*a=P-IQN6oX)1N;0b0#7M_LWuN?_bp6DF z#N>=r{ha)ClPvw>f=qp%{N%)v%=|phytI649|m@)nI#OOK3R!niTb4_nK}9%iNzTu ziAg!BKo!hD(+e5u7#Jsh%#~tfRa0y=En#3O%Fiz;C@5jz0Lm(qq!yPIR27Xx20keQm7oa$Gao0M8KF~N~hXR;on zm_tr}a$-qlexAM$l;N3|mT&FDzzj5`kfDx&(T9PnpeVl}wWuUBwYY?V-zO`vEK$F- zBr`|fH?hEa;-}nt1|VQzU|?iwy{EOVgn^|fKfk1)gnUYqC@3fg+QPt4QNqCMk(!f} QucJ_&UzC$Fxr0#<0IRN3SpWb4 diff --git a/tests/witness/serialization/simple.bin b/tests/witness/serialization/simple.bin index c4434a47c04693a0a69fd0007848164c10ff5bba..c31f3cffb7f9c5fe717e8fd4235853f7af2182a9 100644 GIT binary patch delta 158 zcmaFD+|NA0OiMI3CD}Q@pwcHlKfAObD7COOvnVwsia{_hB^gz0Vx(iBvQK_dx_)9o zVsb{ReolV6NtS+bL8iV>esW?-W`3S$URu7j4+A^Y%n}AspRB~PME%l|%p84>#Nv#S r#H5^5pbBQ7>4gk+42%;$<_a*fs>!_ODPdqK%Fiz;C@7eGgi!$iqJuXR delta 226 zcmeBYe!@J#Oj$55CD|uGKfAObD7COOvnVyii-E5g$V|;kPW3CzO-e1AnBd5$Gg*&O z%poT~Ik6-&KTqEW%J9rf%eVGnU Date: Thu, 21 Jul 2005 22:11:21 +0000 Subject: [PATCH 132/342] Bug 35691: XMLLayout should escape lt and gt in classnames git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311428 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/xml/XMLLayout.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/xml/XMLLayout.java b/src/java/org/apache/log4j/xml/XMLLayout.java index 20504e3792..8162a4d0df 100644 --- a/src/java/org/apache/log4j/xml/XMLLayout.java +++ b/src/java/org/apache/log4j/xml/XMLLayout.java @@ -144,7 +144,7 @@ public String format(LoggingEvent event) { if(locationInfo) { LocationInfo locationInfo = event.getLocationInformation(); buf.append(" Date: Fri, 22 Jul 2005 17:59:03 +0000 Subject: [PATCH 133/342] This commit was manufactured by cvs2svn to create branch 'v1_2-branch'. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311432 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/FileAppenderTest.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 tests/src/java/org/apache/log4j/FileAppenderTest.java diff --git a/tests/src/java/org/apache/log4j/FileAppenderTest.java b/tests/src/java/org/apache/log4j/FileAppenderTest.java new file mode 100644 index 0000000000..622ec89f83 --- /dev/null +++ b/tests/src/java/org/apache/log4j/FileAppenderTest.java @@ -0,0 +1,68 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j; +import java.io.File; + + +/** + * + * Test if WriterAppender honors the Appender contract. + * + * @author Ceki Gülcü + * @author Curt Arnold + */ +public class FileAppenderTest extends AbstractAppenderTest { + protected AppenderSkeleton getAppender() { + return new FileAppender(); + } + + protected AppenderSkeleton getConfiguredAppender() { + FileAppender wa = new FileAppender(); + wa.setFile("output/temp"); + wa.setLayout(new DummyLayout()); + return wa; + } + + public void testPartiallyConfiguredAppender() { + FileAppender wa1 = new FileAppender(); + wa1.setFile("output/temp"); + assertFalse(wa1.isActive()); + + FileAppender wa2 = new FileAppender(); + wa2.setLayout(new DummyLayout()); + assertFalse(wa2.isActive()); + } + + /** + * Tests that any necessary directories are attempted to + * be created if they don't exist. See bug 9150. + * + */ + public void testDirectoryCreation() { + File newFile = new File("output/newdir/temp.log"); + newFile.delete(); + File newDir = new File("output/newdir"); + newDir.delete(); + + FileAppender wa = new FileAppender(); + wa.setFile("output/newdir/temp.log"); + wa.setLayout(new DummyLayout()); + wa.activateOptions(); + + assertTrue(new File("output/newdir/temp.log").exists()); + } +} From 2b6dc1113c8d76046535e3d188723fe12ec1a7f2 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 22 Jul 2005 18:57:02 +0000 Subject: [PATCH 134/342] Bug 35052: Problem with String.intern() in CategoryKey git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311436 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/CategoryKey.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/log4j/CategoryKey.java b/src/java/org/apache/log4j/CategoryKey.java index e3fad5b0e8..e6be750149 100644 --- a/src/java/org/apache/log4j/CategoryKey.java +++ b/src/java/org/apache/log4j/CategoryKey.java @@ -17,7 +17,8 @@ package org.apache.log4j; /** - CategoryKey is heavily used internally to accelerate hash table searches. + CategoryKey is a wrapper for String that apparently accellerated + hash table lookup in early JVM's. @author Ceki Gülcü */ class CategoryKey { @@ -26,7 +27,7 @@ class CategoryKey { int hashCache; CategoryKey(String name) { - this.name = name.intern(); + this.name = name; hashCache = name.hashCode(); } @@ -43,7 +44,7 @@ boolean equals(Object rArg) { return true; if(rArg != null && CategoryKey.class == rArg.getClass()) - return name == ((CategoryKey)rArg ).name; + return name.equals(((CategoryKey)rArg ).name); else return false; } From 20f6194cf1a2082449b9b89994e4355548263ab7 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 22 Jul 2005 18:57:40 +0000 Subject: [PATCH 135/342] Bug 23021: AsyncAppender blocks on thread death git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311437 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/AsyncAppender.java | 10 ++++ .../apache/log4j/AsyncAppenderTestCase.java | 51 ++++++++++++++++--- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/java/org/apache/log4j/AsyncAppender.java b/src/java/org/apache/log4j/AsyncAppender.java index ba8d6b2774..0d102d788f 100644 --- a/src/java/org/apache/log4j/AsyncAppender.java +++ b/src/java/org/apache/log4j/AsyncAppender.java @@ -78,6 +78,16 @@ public void addAppender(Appender newAppender) { } public void append(LoggingEvent event) { + // + // if dispatcher thread has died then + // append subsequent events synchronously + // See bug 23021 + if (!dispatcher.isAlive()) { + synchronized(aai) { + aai.appendLoopOnAppenders(event); + } + return; + } // Set the NDC and thread name for the calling thread as these // LoggingEvent fields were not set at event creation time. event.getNDC(); diff --git a/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java b/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java index c24c51a823..56b1d0466f 100644 --- a/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java +++ b/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java @@ -105,13 +105,50 @@ public void test3() { assertTrue(vectorAppender.isClosed()); } + private static class NullPointerAppender extends AppenderSkeleton { + public NullPointerAppender() { + } - public static Test suite() { - TestSuite suite = new TestSuite(); - suite.addTest(new AsyncAppenderTestCase("closeTest")); - suite.addTest(new AsyncAppenderTestCase("test2")); - suite.addTest(new AsyncAppenderTestCase("test3")); - return suite; - } + /** + This method is called by the {@link org.apache.log4j.AppenderSkeleton#doAppend} + method. + + */ + public void append(org.apache.log4j.spi.LoggingEvent event) { + throw new NullPointerException(); + } + + public void close() { + } + + public boolean requiresLayout() { + return false; + } + } + + + /** + * Tests that a bad appender will switch async back to sync. + * See bug 23021 + * @since 1.2.12 + * @throws Exception thrown if Thread.sleep is interrupted + */ + public void testBadAppender() throws Exception { + Appender nullPointerAppender = new NullPointerAppender(); + AsyncAppender asyncAppender = new AsyncAppender(); + asyncAppender.addAppender(nullPointerAppender); + asyncAppender.setBufferSize(5); + asyncAppender.activateOptions(); + Logger root = Logger.getRootLogger(); + root.addAppender(nullPointerAppender); + try { + root.info("Message"); + Thread.sleep(10); + root.info("Message"); + fail("Should have thrown exception"); + } catch(NullPointerException ex) { + + } + } } From ae95c5dfc8c398aa4359a95bf02f02cfcb49f68c Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 22 Jul 2005 18:59:45 +0000 Subject: [PATCH 136/342] Bug 9150: No check in FileAppender if parent-path exists git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311438 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/FileAppender.java | 23 +++++++++++++- .../java/org/apache/log4j/CoreTestSuite.java | 1 + .../org/apache/log4j/FileAppenderTest.java | 31 +++---------------- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/java/org/apache/log4j/FileAppender.java b/src/java/org/apache/log4j/FileAppender.java index 4153799a1a..1657e0265a 100644 --- a/src/java/org/apache/log4j/FileAppender.java +++ b/src/java/org/apache/log4j/FileAppender.java @@ -20,6 +20,8 @@ import java.io.Writer; import java.io.FileOutputStream; import java.io.BufferedWriter; +import java.io.FileNotFoundException; +import java.io.File; import org.apache.log4j.spi.ErrorCode; import org.apache.log4j.helpers.QuietWriter; @@ -279,7 +281,26 @@ void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize } reset(); - Writer fw = createWriter(new FileOutputStream(fileName, append)); + FileOutputStream ostream = null; + try { + // + // attempt to create file + // + ostream = new FileOutputStream(fileName, append); + } catch(FileNotFoundException ex) { + // + // if parent directory does not exist then + // attempt to create it and try to create file + // see bug 9150 + // + File parentDir = new File(new File(fileName).getParent()); + if(!parentDir.exists() && parentDir.mkdirs()) { + ostream = new FileOutputStream(fileName, append); + } else { + throw ex; + } + } + Writer fw = createWriter(ostream); if(bufferedIO) { fw = new BufferedWriter(fw, bufferSize); } diff --git a/tests/src/java/org/apache/log4j/CoreTestSuite.java b/tests/src/java/org/apache/log4j/CoreTestSuite.java index 4bbe576437..088659837d 100644 --- a/tests/src/java/org/apache/log4j/CoreTestSuite.java +++ b/tests/src/java/org/apache/log4j/CoreTestSuite.java @@ -35,6 +35,7 @@ public static Test suite() { TestSuite s = new TestSuite(); s.addTestSuite(LoggingEventTest.class); s.addTestSuite(org.apache.log4j.LevelTest.class); + s.addTestSuite(org.apache.log4j.FileAppenderTest.class); return s; } } diff --git a/tests/src/java/org/apache/log4j/FileAppenderTest.java b/tests/src/java/org/apache/log4j/FileAppenderTest.java index 622ec89f83..0799de08f1 100644 --- a/tests/src/java/org/apache/log4j/FileAppenderTest.java +++ b/tests/src/java/org/apache/log4j/FileAppenderTest.java @@ -16,37 +16,16 @@ package org.apache.log4j; import java.io.File; +import junit.framework.TestCase; /** * - * Test if WriterAppender honors the Appender contract. + * FileAppender tests. * - * @author Ceki Gülcü * @author Curt Arnold */ -public class FileAppenderTest extends AbstractAppenderTest { - protected AppenderSkeleton getAppender() { - return new FileAppender(); - } - - protected AppenderSkeleton getConfiguredAppender() { - FileAppender wa = new FileAppender(); - wa.setFile("output/temp"); - wa.setLayout(new DummyLayout()); - return wa; - } - - public void testPartiallyConfiguredAppender() { - FileAppender wa1 = new FileAppender(); - wa1.setFile("output/temp"); - assertFalse(wa1.isActive()); - - FileAppender wa2 = new FileAppender(); - wa2.setLayout(new DummyLayout()); - assertFalse(wa2.isActive()); - } - +public class FileAppenderTest extends TestCase { /** * Tests that any necessary directories are attempted to * be created if they don't exist. See bug 9150. @@ -58,9 +37,9 @@ public void testDirectoryCreation() { File newDir = new File("output/newdir"); newDir.delete(); - FileAppender wa = new FileAppender(); + org.apache.log4j.FileAppender wa = new org.apache.log4j.FileAppender(); wa.setFile("output/newdir/temp.log"); - wa.setLayout(new DummyLayout()); + wa.setLayout(new PatternLayout("%m%n")); wa.activateOptions(); assertTrue(new File("output/newdir/temp.log").exists()); From 251d01eb96b04951362b8f1aaa78b01d34c5b598 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 22 Jul 2005 19:03:23 +0000 Subject: [PATCH 137/342] Bug 35711: Add TRACE level to 1.2 api git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311439 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/Level.java | 16 ++- src/java/org/apache/log4j/Logger.java | 55 +++++++++++ .../src/java/org/apache/log4j/LevelTest.java | 23 ++++- .../java/org/apache/log4j/LoggerTestCase.java | 98 ++++++++++++++----- 4 files changed, 164 insertions(+), 28 deletions(-) diff --git a/src/java/org/apache/log4j/Level.java b/src/java/org/apache/log4j/Level.java index 9414e59fee..f1efb3c8d8 100644 --- a/src/java/org/apache/log4j/Level.java +++ b/src/java/org/apache/log4j/Level.java @@ -38,6 +38,11 @@ */ public class Level extends Priority implements Serializable { + /** + * TRACE level integer value. + * @since 1.2.12 + */ + public static final int TRACE_INT = 5000; /** The OFF has the highest possible rank and is @@ -72,6 +77,14 @@ public class Level extends Priority implements Serializable { application. */ final static public Level DEBUG = new Level(DEBUG_INT, "DEBUG", 7); + /** + * The TRACE Level designates finer-grained + * informational events than the DEBUGALL has the lowest possible rank and is intended to turn on all logging. */ @@ -127,6 +140,7 @@ Level toLevel(int val, Level defaultLevel) { case ERROR_INT: return Level.ERROR; case FATAL_INT: return Level.FATAL; case OFF_INT: return OFF; + case TRACE_INT: return Level.TRACE; default: return defaultLevel; } } @@ -146,12 +160,12 @@ Level toLevel(String sArg, Level defaultLevel) { if(s.equals("ALL")) return Level.ALL; if(s.equals("DEBUG")) return Level.DEBUG; - //if(s.equals("FINE")) return Level.FINE; if(s.equals("INFO")) return Level.INFO; if(s.equals("WARN")) return Level.WARN; if(s.equals("ERROR")) return Level.ERROR; if(s.equals("FATAL")) return Level.FATAL; if(s.equals("OFF")) return Level.OFF; + if(s.equals("TRACE")) return Level.TRACE; return defaultLevel; } diff --git a/src/java/org/apache/log4j/Logger.java b/src/java/org/apache/log4j/Logger.java index 2a914aac0c..f8467319d5 100644 --- a/src/java/org/apache/log4j/Logger.java +++ b/src/java/org/apache/log4j/Logger.java @@ -17,6 +17,7 @@ package org.apache.log4j; import org.apache.log4j.spi.LoggerFactory; +import org.apache.log4j.Level; /** @@ -154,4 +155,58 @@ Logger getLogger(String name, LoggerFactory factory) { return LogManager.getLogger(name, factory); } + /** + * Log a message object with the {@link org.apache.log4j.Level#TRACE TRACE} level. + * + * @param message the message object to log. + * @see #debug(Object) for an explanation of the logic applied. + * @since 1.2.12 + */ + public void trace(Object message) { + if (repository.isDisabled(Level.TRACE_INT)) { + return; + } + + if (Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel())) { + forcedLog(FQCN, Level.TRACE, message, null); + } + } + + /** + * Log a message object with the TRACE level including the + * stack trace of the {@link Throwable}t passed as parameter. + * + *

    + * See {@link #debug(Object)} form for more detailed information. + *

    + * + * @param message the message object to log. + * @param t the exception to log, including its stack trace. + * @since 1.2.12 + */ + public void trace(Object message, Throwable t) { + if (repository.isDisabled(Level.TRACE_INT)) { + return; + } + + if (Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel())) { + forcedLog(FQCN, Level.TRACE, message, t); + } + } + + /** + * Check whether this category is enabled for the TRACE Level. + * @since 1.2.12 + * + * @return boolean - true if this category is enabled for level + * TRACE, false otherwise. + */ + public boolean isTraceEnabled() { + if (repository.isDisabled(Level.TRACE_INT)) { + return false; + } + + return Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel()); + } + } diff --git a/tests/src/java/org/apache/log4j/LevelTest.java b/tests/src/java/org/apache/log4j/LevelTest.java index 96a359394a..abf9438cdc 100644 --- a/tests/src/java/org/apache/log4j/LevelTest.java +++ b/tests/src/java/org/apache/log4j/LevelTest.java @@ -25,7 +25,7 @@ * Tests of Level. * * @author Curt Arnold - * @since 1.3 + * @since 1.2.12 */ public class LevelTest extends TestCase { /** @@ -89,4 +89,25 @@ public CustomLevel() { Level.INFO.level, Level.INFO.levelStr, Level.INFO.syslogEquivalent); } } + + public void testTraceInt() { + assertEquals(5000, Level.TRACE_INT); + } + + public void testTrace() { + assertEquals("TRACE", Level.TRACE.toString()); + assertEquals(5000, Level.TRACE.toInt()); + assertEquals(7, Level.TRACE.getSyslogEquivalent()); + } + + public void testIntToTrace() { + Level trace = Level.toLevel(5000); + assertEquals("TRACE", trace.toString()); + } + + public void testStringToTrace() { + Level trace = Level.toLevel("TRACE"); + assertEquals("TRACE", trace.toString()); + } + } diff --git a/tests/src/java/org/apache/log4j/LoggerTestCase.java b/tests/src/java/org/apache/log4j/LoggerTestCase.java index 4bf1ad011e..9dfa303b91 100644 --- a/tests/src/java/org/apache/log4j/LoggerTestCase.java +++ b/tests/src/java/org/apache/log4j/LoggerTestCase.java @@ -16,15 +16,15 @@ package org.apache.log4j; -import org.apache.log4j.*; -import org.apache.log4j.spi.*; - import junit.framework.TestCase; -import junit.framework.TestSuite; -import junit.framework.Test; +import org.apache.log4j.spi.LoggingEvent; +import org.apache.log4j.spi.RootLogger; +import org.apache.log4j.spi.LoggerRepository; + import java.util.Enumeration; -import java.util.ResourceBundle; import java.util.Locale; +import java.util.ResourceBundle; +import java.util.Vector; /** Used for internal unit testing the Logger class. @@ -326,30 +326,76 @@ void testHierarchy1() { Logger a1 = h.getLogger("a"); assertSame(a0, a1); - - - - } - public - static - Test suite() { - TestSuite suite = new TestSuite(); - suite.addTest(new LoggerTestCase("testAppender1")); - suite.addTest(new LoggerTestCase("testAppender2")); - suite.addTest(new LoggerTestCase("testAdditivity1")); - suite.addTest(new LoggerTestCase("testAdditivity2")); - suite.addTest(new LoggerTestCase("testAdditivity3")); - suite.addTest(new LoggerTestCase("testDisable1")); - suite.addTest(new LoggerTestCase("testRB1")); - suite.addTest(new LoggerTestCase("testRB2")); - suite.addTest(new LoggerTestCase("testRB3")); - suite.addTest(new LoggerTestCase("testExists")); - suite.addTest(new LoggerTestCase("testHierarchy1")); - return suite; + /** + * Tests logger.trace(Object). + * @since 1.2.12 + */ + public void testTrace() { + VectorAppender appender = new VectorAppender(); + appender.activateOptions(); + Logger root = Logger.getRootLogger(); + root.addAppender(appender); + root.setLevel(Level.INFO); + + Logger tracer = Logger.getLogger("com.example.Tracer"); + tracer.setLevel(Level.TRACE); + + tracer.trace("Message 1"); + root.trace("Discarded Message"); + root.trace("Discarded Message"); + + Vector msgs = appender.getVector(); + assertEquals(1, msgs.size()); + LoggingEvent event = (LoggingEvent) msgs.get(0); + assertEquals(Level.TRACE, event.getLevel()); + assertEquals("Message 1", event.getMessage()); } + /** + * Tests logger.trace(Object, Exception). + * @since 1.2.12 + */ + public void testTraceWithException() { + VectorAppender appender = new VectorAppender(); + appender.activateOptions(); + Logger root = Logger.getRootLogger(); + root.addAppender(appender); + root.setLevel(Level.INFO); + + Logger tracer = Logger.getLogger("com.example.Tracer"); + tracer.setLevel(Level.TRACE); + NullPointerException ex = new NullPointerException(); + + tracer.trace("Message 1", ex); + root.trace("Discarded Message", ex); + root.trace("Discarded Message", ex); + + Vector msgs = appender.getVector(); + assertEquals(1, msgs.size()); + LoggingEvent event = (LoggingEvent) msgs.get(0); + assertEquals(Level.TRACE, event.getLevel()); + assertEquals("Message 1", event.getMessage()); + } + + /** + * Tests isTraceEnabled. + * @since 1.2.12 + */ + public void testIsTraceEnabled() { + VectorAppender appender = new VectorAppender(); + appender.activateOptions(); + Logger root = Logger.getRootLogger(); + root.addAppender(appender); + root.setLevel(Level.INFO); + + Logger tracer = Logger.getLogger("com.example.Tracer"); + tracer.setLevel(Level.TRACE); + + assertTrue(tracer.isTraceEnabled()); + assertFalse(root.isTraceEnabled()); + } static private class CountingAppender extends AppenderSkeleton { From 49fa01e08510d0a93250f803557ca6cb03f376ed Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 22 Jul 2005 20:09:23 +0000 Subject: [PATCH 138/342] Bug 35831 log4j 1.2 does not build with JDK 1.5 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311441 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 25 +++++++++++++++---- tests/build.xml | 1 + .../apache/log4j/spi/LoggingEventTest.java | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/build.xml b/build.xml index a865690ff8..3c2ad40d5d 100644 --- a/build.xml +++ b/build.xml @@ -124,11 +124,20 @@ - - - - - + + + + + + + + + + + + + + @@ -191,6 +200,7 @@ ${stem}/jmx/*.java, ${stem}/or/jms/*.java" target="1.1" + source="1.3" deprecation="${deprecation}" debug="on"> @@ -211,6 +221,7 @@ classpath="${classpath}" excludes="misc/*" target="1.1" + source="1.3" deprecation="${deprecation}" debug="on"/> @@ -229,6 +240,7 @@ excludes="${stem}/xml/examples/doc-files/**.java, ${stem}/xml/Transform.java" target="1.1" + source="1.3" deprecation="${deprecation}" classpath="${classpath}"> @@ -242,6 +254,7 @@ destdir="${javac.dest}" includes="${stem}/net/SMTPAppender.java" target="1.1" + source="1.3" deprecation="${deprecation}"> @@ -252,6 +265,7 @@ destdir="${javac.dest}" includes="${stem}/net/JMS*.java, ${stem}/or/jms/*.java" target="1.1" + source="1.3" deprecation="${deprecation}"> @@ -263,6 +277,7 @@ includes="${stem}/jmx/*.java" excludes="${stem}/jmx/T.java" target="1.1" + source="1.3" deprecation="${deprecation}"> diff --git a/tests/build.xml b/tests/build.xml index 3de966972a..00cdc1bce9 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -91,6 +91,7 @@ destdir="./classes" deprecation="${deprecation}" target="1.1" + source="1.3" debug="on" excludes="${excludes}"> diff --git a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java index 702180d22d..70800ed3cb 100644 --- a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java +++ b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java @@ -75,7 +75,7 @@ public void testSerializationWithException() throws Exception { int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( - "witness/serialization/exception.bin", event, skip, 1089); + "witness/serialization/exception.bin", event, skip, 945); } /** From d3aeccce36e4f6ffde787e2ff80e4290a0566819 Mon Sep 17 00:00:00 2001 From: Jacob Kjome Date: Sat, 23 Jul 2005 06:44:46 +0000 Subject: [PATCH 139/342] migrate getNext/setNext methods from 1.3 to 1.2.11 to provide a migration path from the public "next" variable git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311444 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/spi/Filter.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/java/org/apache/log4j/spi/Filter.java b/src/java/org/apache/log4j/spi/Filter.java index 272e6ab18a..091b696db5 100644 --- a/src/java/org/apache/log4j/spi/Filter.java +++ b/src/java/org/apache/log4j/spi/Filter.java @@ -62,6 +62,8 @@ public abstract class Filter implements OptionHandler { /** Points to the next filter in the filter chain. + + @deprecated As of 1.2.11, use {@link #getNext} and {@link #setNext} instead */ public Filter next; @@ -105,4 +107,18 @@ void activateOptions() { public int decide(LoggingEvent event); + /** + * Set the next filter pointer. + */ + public void setNext(Filter next) { + this.next = next; + } + + /** + * Return the pointer to the next filter; + */ + public Filter getNext() { + return next; + } + } From 8c20bd91db852455585ce7ce8455b7896a668c72 Mon Sep 17 00:00:00 2001 From: Jacob Kjome Date: Sat, 23 Jul 2005 06:51:35 +0000 Subject: [PATCH 140/342] whoops, I meant 1.2.12 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311446 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/spi/Filter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/spi/Filter.java b/src/java/org/apache/log4j/spi/Filter.java index 091b696db5..e64ee0b426 100644 --- a/src/java/org/apache/log4j/spi/Filter.java +++ b/src/java/org/apache/log4j/spi/Filter.java @@ -63,7 +63,7 @@ public abstract class Filter implements OptionHandler { /** Points to the next filter in the filter chain. - @deprecated As of 1.2.11, use {@link #getNext} and {@link #setNext} instead + @deprecated As of 1.2.12, use {@link #getNext} and {@link #setNext} instead */ public Filter next; From 8548fc2531101ce11e54e1b7a2fa30b443d125f0 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 26 Jul 2005 17:38:14 +0000 Subject: [PATCH 141/342] Update docs/HISTORY.txt for my bugs git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311449 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 0bc7a3f5d3..d05cedf26f 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -4,6 +4,36 @@ [**] Changes that requiring little or no modification to existing client code. [***] Changes requiring important modifications to existing client code. + + July ??th, 2005 + + - Release of version 1.2.12 + + - Added o.a.log4j.Logger.trace(), o.a.log4j.Logger.isTraceEnabled() and + o.a.log4j.Level.TRACE per bug 35711. [*] + + - Fixed bug 31056 whereby o.a.log4j.ConsoleAppender would ignore redirections + of System.out and System.err that occurred after configuration. [*] + + - Fixed bug 23705 whereby o.a.log4j.xml.DOMConfigurator would not properly + interpret relative path names in external entity declarations. [*] + + - Fixed bug 35691 whereby o.a.log4j.xml.XmlLayout would not properly escape + class names that contained '<' or '>'. [*] + + - Fixed bug 35052 whereby use of String.intern() in o.a.log4j.CategoryKey + would cause application to slow down. [*] + + - Fixed bug 9150 whereby o.a.log4j.FileAppender would not create log file + if parent directory did not exist. [*] + + - Fixed bug 23021 whereby o.a.log4j.AsycnAppender would deadlock if a + unchecked exception occurred in the attached appender causing the + dispatch thread to die. [*] + + - Added jdiff target to build.xml (bug 35516). [*] + + - Fixed bug 35831 whereby log4j would not build with a JDK 1.5 javac. [*] June 18th, 2005 From 063df1ccb8ad454933223fb974695422ae112598 Mon Sep 17 00:00:00 2001 From: Jacob Kjome Date: Wed, 27 Jul 2005 04:25:25 +0000 Subject: [PATCH 142/342] Update docs/HISTORY.txt for my change git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311450 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index d05cedf26f..5cf99768b1 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -8,7 +8,11 @@ July ??th, 2005 - Release of version 1.2.12 - + + - Added getNext/setNext methods to org.apache.log4j.spi.Filter and deprecated + public "next" field. This mirrors the same change in the upcoming 1.3 + version and, hence, provides a migration path. [*] + - Added o.a.log4j.Logger.trace(), o.a.log4j.Logger.isTraceEnabled() and o.a.log4j.Level.TRACE per bug 35711. [*] From d66f591fe20d71dccbfd2772dc6d9f7ee5125721 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 27 Jul 2005 15:57:21 +0000 Subject: [PATCH 143/342] Missed one git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311454 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 5cf99768b1..9f815c927f 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -15,6 +15,8 @@ - Added o.a.log4j.Logger.trace(), o.a.log4j.Logger.isTraceEnabled() and o.a.log4j.Level.TRACE per bug 35711. [*] + + - Implemented serialization for Level per bug 34758. [*] - Fixed bug 31056 whereby o.a.log4j.ConsoleAppender would ignore redirections of System.out and System.err that occurred after configuration. [*] From 3e99b43947c79a081cbdd46d866d205b4c4ac538 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 27 Jul 2005 16:14:52 +0000 Subject: [PATCH 144/342] Bug 35893: Add Loader.getResource(String, Class) for log4j 1.1 compatibility git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311455 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 2 ++ src/java/org/apache/log4j/helpers/Loader.java | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 9f815c927f..efd81cdb58 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -40,6 +40,8 @@ - Added jdiff target to build.xml (bug 35516). [*] - Fixed bug 35831 whereby log4j would not build with a JDK 1.5 javac. [*] + + - Fixed bug 35893 by adding log4j 1.1 compatibility method to o.a.l.helpers.Loader. [*] June 18th, 2005 diff --git a/src/java/org/apache/log4j/helpers/Loader.java b/src/java/org/apache/log4j/helpers/Loader.java index ac61276417..d82eae1265 100644 --- a/src/java/org/apache/log4j/helpers/Loader.java +++ b/src/java/org/apache/log4j/helpers/Loader.java @@ -21,8 +21,6 @@ import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; -//import java.awt.Image; -//import java.awt.Toolkit; /** Load resources (or images) from various sources. @@ -54,10 +52,21 @@ public class Loader { ignoreTCL = OptionConverter.toBoolean(ignoreTCLProp, true); } } + + /** + * Get a resource by delegating to getResource(String). + * @param resource resource name + * @param clazz class, ignored. + * @return URL to resource or null. + * @deprecated as of 1.2. + */ + public static URL getResource(String resource, Class clazz) { + return getResource(resource); + } /** This method will search for resource in different - places. The rearch order is as follows: + places. The search order is as follows:
      From 5d56abc9c784badf091ec09d71d592951aa88dd8 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Thu, 28 Jul 2005 02:20:12 +0000 Subject: [PATCH 145/342] Update to 1.2.12rc1 in files. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311457 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/HISTORY.txt | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/build.xml b/build.xml index 3c2ad40d5d..e08efc53b7 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index efd81cdb58..f8e269616d 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,9 +5,9 @@ client code. [***] Changes requiring important modifications to existing client code. - July ??th, 2005 + July 27th, 2005 - - Release of version 1.2.12 + - Release of version 1.2.12rc1 - Added getNext/setNext methods to org.apache.log4j.spi.Filter and deprecated public "next" field. This mirrors the same change in the upcoming 1.3 @@ -41,7 +41,8 @@ - Fixed bug 35831 whereby log4j would not build with a JDK 1.5 javac. [*] - - Fixed bug 35893 by adding log4j 1.1 compatibility method to o.a.l.helpers.Loader. [*] + - Fixed bug 35893 by adding log4j 1.1 compatibility method + to o.a.l.helpers.Loader. [*] June 18th, 2005 From 22476617948ea13aaac54aafe9c9e4b52e665da3 Mon Sep 17 00:00:00 2001 From: Yoav Shapira Date: Thu, 28 Jul 2005 19:26:56 +0000 Subject: [PATCH 146/342] Fixed Bugzilla 14551 (and its duplicates) by fixing JavaDoc links to XML samples. http://issues.apache.org/bugzilla/show_bug.cgi?id=14551 PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311462 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 10 ++++++++++ docs/HISTORY.txt | 9 +++++++++ src/java/org/apache/log4j/xml/DOMConfigurator.java | 2 +- src/java/org/apache/log4j/xml/XMLLayout.java | 4 ++-- .../org/apache/log4j/xml/examples/XMLSample.java | 6 +++--- src/java/org/apache/log4j/xml/examples/package.html | 12 ++++++------ 6 files changed, 31 insertions(+), 12 deletions(-) diff --git a/build.xml b/build.xml index e08efc53b7..b487b1ce60 100644 --- a/build.xml +++ b/build.xml @@ -409,6 +409,16 @@ + + + + + + + + + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index f8e269616d..2a94c30b0e 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,6 +5,15 @@ client code. [***] Changes requiring important modifications to existing client code. + [FILL IN DATE, 2005] + + - Release of versions 1.2.12rc2 + + - Fixed Bugzilla 14551 and its duplicates by fixing the JavaDoc links + for the XML sample files. + http://issues.apache.org/bugzilla/show_bug.cgi?id=14551 [*] + + July 27th, 2005 - Release of version 1.2.12rc1 diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index 3b3c1149b7..ecf2e084ca 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -46,7 +46,7 @@ Use this class to initialize the log4j environment using a DOM tree.

      The DTD is specified in log4j.dtd. + href="log4j.dtd">log4j.dtd.

      Sometimes it is useful to see how log4j is reading configuration files. You can enable log4j internal logging by defining the diff --git a/src/java/org/apache/log4j/xml/XMLLayout.java b/src/java/org/apache/log4j/xml/XMLLayout.java index 8162a4d0df..ac67ca41de 100644 --- a/src/java/org/apache/log4j/xml/XMLLayout.java +++ b/src/java/org/apache/log4j/xml/XMLLayout.java @@ -28,7 +28,7 @@ /** * The output of the XMLLayout consists of a series of log4j:event * elements as defined in the log4j.dtd. It does not output a + * href="log4j.dtd">log4j.dtd. It does not output a * complete well-formed XML file. The output is designed to be * included as an external entity in a separate file to form * a correct XML file. @@ -94,7 +94,7 @@ public void activateOptions() { /** - * Formats a {@link LoggingEvent} in conformance with the log4j.dtd. + * Formats a {@link org.apache.log4j.spi.LoggingEvent} in conformance with the log4j.dtd. * */ public String format(LoggingEvent event) { diff --git a/src/java/org/apache/log4j/xml/examples/XMLSample.java b/src/java/org/apache/log4j/xml/examples/XMLSample.java index 292277e0bb..4f1197141b 100644 --- a/src/java/org/apache/log4j/xml/examples/XMLSample.java +++ b/src/java/org/apache/log4j/xml/examples/XMLSample.java @@ -22,11 +22,11 @@ /** - This example code shows how to + This example code shows how to read an XML based configuration file using a DOM parser. -

      Sample XML files sample1.xml - and sample2.xml are provided. +

      Sample XML files sample1.xml + and sample2.xml are provided.

      Note that the log4j.dtd is not in the local directory. diff --git a/src/java/org/apache/log4j/xml/examples/package.html b/src/java/org/apache/log4j/xml/examples/package.html index 21d9bdd86c..db195a1bb2 100644 --- a/src/java/org/apache/log4j/xml/examples/package.html +++ b/src/java/org/apache/log4j/xml/examples/package.html @@ -10,13 +10,13 @@ configuration file.

      See source code of XMLSample.java showing how to +href="XMLSample.java">XMLSample.java showing how to configure with an XML file. Sample XML files -sample1.xml, -sample2.xml, -sample3.xml, -sample4.xml, -sample5.xml are provided. +sample1.xml, +sample2.xml, +sample3.xml, +sample4.xml, +sample5.xml are provided.


      From 55b5bdd459afce14f944f662d153ac33cc859fd4 Mon Sep 17 00:00:00 2001 From: Yoav Shapira Date: Thu, 28 Jul 2005 19:31:09 +0000 Subject: [PATCH 147/342] Bugzilla 30804 on this branch: http://issues.apache.org/bugzilla/show_bug.cgi?id=30804 PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311463 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/log4j/varia/StringMatchFilter.java | 36 +++++++------------ 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/src/java/org/apache/log4j/varia/StringMatchFilter.java b/src/java/org/apache/log4j/varia/StringMatchFilter.java index 56b02d1f77..49bd099838 100644 --- a/src/java/org/apache/log4j/varia/StringMatchFilter.java +++ b/src/java/org/apache/log4j/varia/StringMatchFilter.java @@ -21,29 +21,19 @@ import org.apache.log4j.helpers.OptionConverter; /** - This is a very simple filter based on string matching. - - -

      The filter admits two options StringToMatch and - AcceptOnMatch. If there is a match between the value of the - StringToMatch option and the message of the {@link LoggingEvent}, - then the {@link #decide} method returns {@link Filter#ACCEPT} if - the AcceptOnMatch option value is true, if it is false then - {@link Filter#DENY} is returned. If there is no match, {@link - Filter#NEUTRAL} is returned. - -

      See configuration files test6.xml, test7.xml, test8.xml, test9.xml, and test10.xml for examples of - seeting up a StringMatchFilter. - - - @author Ceki Gülcü - - @since 0.9.0 */ + * This is a very simple filter based on string matching. + * + *

      The filter admits two options StringToMatch and + * AcceptOnMatch. If there is a match between the value of the + * StringToMatch option and the message of the {@link org.apache.log4j.spi.LoggingEvent}, + * then the {@link #decide(LoggingEvent)} method returns {@link org.apache.log4j.spi.Filter#ACCEPT} if + * the AcceptOnMatch option value is true, if it is false then + * {@link org.apache.log4j.spi.Filter#DENY} is returned. If there is no match, {@link + * org.apache.log4j.spi.Filter#NEUTRAL} is returned. + * + * @author Ceki Gülcü + * @since 0.9.0 + */ public class StringMatchFilter extends Filter { /** From 86bf7bbc3768d8d227c0f25fac69a87ec50a8f14 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Fri, 29 Jul 2005 03:36:44 +0000 Subject: [PATCH 148/342] Fix for bug 34026. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311465 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 3 +++ .../org/apache/log4j/net/SyslogAppender.java | 20 +++++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 2a94c30b0e..7cbd5a3fae 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -52,6 +52,9 @@ - Fixed bug 35893 by adding log4j 1.1 compatibility method to o.a.l.helpers.Loader. [*] + + - Fixed bug 34026, SyslogAppender now checks Layout.ignoresThrowable() just + like every other appender. June 18th, 2005 diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/java/org/apache/log4j/net/SyslogAppender.java index e0e3cde85f..c7474d4895 100644 --- a/src/java/org/apache/log4j/net/SyslogAppender.java +++ b/src/java/org/apache/log4j/net/SyslogAppender.java @@ -253,17 +253,17 @@ void append(LoggingEvent event) { sqw.setLevel(event.getLevel().getSyslogEquivalent()); sqw.write(buffer); - String[] s = event.getThrowableStrRep(); - if (s != null) { - int len = s.length; - if(len > 0) { - sqw.write(s[0]); - - for(int i = 1; i < len; i++) { - sqw.write(TAB+s[i].substring(1)); - } + if (layout.ignoresThrowable()) { + String[] s = event.getThrowableStrRep(); + if (s != null) { + int len = s.length; + if(len > 0) { + sqw.write(s[0]); + for(int i = 1; i < len; i++) { + sqw.write(TAB+s[i].substring(1)); + } + } } - } } From c340545da110392864e9d2e3b07e7c712fc592b1 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sun, 31 Jul 2005 00:02:58 +0000 Subject: [PATCH 149/342] Bug 35947: DOMConfiguration reports XML validation errors using LogLog.error git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311469 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 4 ++++ .../org/apache/log4j/xml/SAXErrorHandler.java | 23 +++++++++---------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 7cbd5a3fae..912d7cb876 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -56,6 +56,10 @@ - Fixed bug 34026, SyslogAppender now checks Layout.ignoresThrowable() just like every other appender. + - Fixed bug 35947 whereby DOMConfigurator would call LogLog.error to report + XML validation errors that caused no problems in the interpretation of the + configuration file. + June 18th, 2005 - Release of version 1.2.11 diff --git a/src/java/org/apache/log4j/xml/SAXErrorHandler.java b/src/java/org/apache/log4j/xml/SAXErrorHandler.java index 11255c8799..45cbf46eca 100644 --- a/src/java/org/apache/log4j/xml/SAXErrorHandler.java +++ b/src/java/org/apache/log4j/xml/SAXErrorHandler.java @@ -23,24 +23,23 @@ public class SAXErrorHandler implements ErrorHandler { public - void error(SAXParseException ex) { - LogLog.error("Parsing error on line "+ex.getLineNumber()+" and column " - +ex.getColumnNumber()); - LogLog.error(ex.getMessage(), ex.getException()); - //LogLog.error("pid="+ex.getPublicId()+" sid="+ex.getSystemId()); + void error(final SAXParseException ex) { + emitMessage("Continuable parsing error ", ex); } public - void fatalError(SAXParseException ex) { - error(ex); + void fatalError(final SAXParseException ex) { + emitMessage("Fatal parsing error ", ex); } public - void warning(SAXParseException ex) { - LogLog.warn("Parsing error on line "+ex.getLineNumber()+" and column " - +ex.getColumnNumber()); + void warning(final SAXParseException ex) { + emitMessage("Parsing warning ", ex); + } + + private static void emitMessage(final String msg, final SAXParseException ex) { + LogLog.warn(msg +ex.getLineNumber()+" and column " + +ex.getColumnNumber()); LogLog.warn(ex.getMessage(), ex.getException()); } - - } From dc52cd2ec2fd7af40b79d1cff8c4bb644e1e6781 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Tue, 2 Aug 2005 03:55:32 +0000 Subject: [PATCH 150/342] Changing to 1.2.12rc2 version. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311470 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index b487b1ce60..b603ddc1f2 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + From 59a2a9f863d5ae021e0966ffe4aab4eb295ca3ea Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Tue, 2 Aug 2005 03:56:14 +0000 Subject: [PATCH 151/342] Updated to have 1.2.12rc2 info. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311471 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 912d7cb876..34bc110b39 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,15 +5,21 @@ client code. [***] Changes requiring important modifications to existing client code. - [FILL IN DATE, 2005] + August 1st, 2005 - Release of versions 1.2.12rc2 + + - Fixed bug 34026, SyslogAppender now checks Layout.ignoresThrowable() just + like every other appender. [*] + + - Fixed bug 35947 whereby DOMConfigurator would call LogLog.error to report + XML validation errors that caused no problems in the interpretation of the + configuration file. [*] - Fixed Bugzilla 14551 and its duplicates by fixing the JavaDoc links for the XML sample files. http://issues.apache.org/bugzilla/show_bug.cgi?id=14551 [*] - July 27th, 2005 - Release of version 1.2.12rc1 @@ -50,15 +56,8 @@ - Fixed bug 35831 whereby log4j would not build with a JDK 1.5 javac. [*] - - Fixed bug 35893 by adding log4j 1.1 compatibility method + - Fixed bug 35893 by adding log4j 1.1 compatibility method to o.a.l.helpers.Loader. [*] - - - Fixed bug 34026, SyslogAppender now checks Layout.ignoresThrowable() just - like every other appender. - - - Fixed bug 35947 whereby DOMConfigurator would call LogLog.error to report - XML validation errors that caused no problems in the interpretation of the - configuration file. June 18th, 2005 From b3ba4a1938b9d36c023d2531431e5041dcd9d169 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Wed, 3 Aug 2005 05:02:34 +0000 Subject: [PATCH 152/342] Fix for bug #35965. Added protected accessors for JMS related member variables. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311473 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 9 ++++++- .../org/apache/log4j/net/JMSAppender.java | 25 ++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 34bc110b39..53b44ce2e5 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,9 +5,16 @@ client code. [***] Changes requiring important modifications to existing client code. + ???, 2005 + + - Release of version 1.2.12rc3 + + - Fixed bug 35965 by adding protected accessors for member variables + topicConnection, topicSession, and topicPublisher. [*] + August 1st, 2005 - - Release of versions 1.2.12rc2 + - Release of version 1.2.12rc2 - Fixed bug 34026, SyslogAppender now checks Layout.ignoresThrowable() just like every other appender. [*] diff --git a/src/java/org/apache/log4j/net/JMSAppender.java b/src/java/org/apache/log4j/net/JMSAppender.java index ffcadff293..0d098e3387 100644 --- a/src/java/org/apache/log4j/net/JMSAppender.java +++ b/src/java/org/apache/log4j/net/JMSAppender.java @@ -397,11 +397,34 @@ public void setLocationInfo(boolean locationInfo) { this.locationInfo = locationInfo; } + /** + * Returns the TopicConnection used for this appender. Only valid after + * activateOptions() method has been invoked. + */ + protected TopicConnection getTopicConnection() { + return topicConnection; + } + + /** + * Returns the TopicSession used for this appender. Only valid after + * activateOptions() method has been invoked. + */ + protected TopicSession getTopicSession() { + return topicSession; + } + /** + * Returns the TopicPublisher used for this appender. Only valid after + * activateOptions() method has been invoked. + */ + protected TopicPublisher getTopicPublisher() { + return topicPublisher; + } + /** * The JMSAppender sends serialized events and consequently does not * require a layout. - * */ + */ public boolean requiresLayout() { return false; } From 5fe224d5fcaf4e7c00934d910968c8dad5d34a35 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Sun, 7 Aug 2005 21:57:10 +0000 Subject: [PATCH 153/342] Changes to rc3. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311475 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/HISTORY.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.xml b/build.xml index b603ddc1f2..bbf7da2a6b 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 53b44ce2e5..a1df93ebd9 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,7 +5,7 @@ client code. [***] Changes requiring important modifications to existing client code. - ???, 2005 + August 7th, 2005 - Release of version 1.2.12rc3 From fecf83a341ba55903a4fd7f0fe16176a0e2f4963 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 18 Aug 2005 22:14:46 +0000 Subject: [PATCH 154/342] Bug 36262: o.a.l.chainsaw.LoggingReceiver does not compile with JDK 1.1 or 1.2 javac git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311477 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/chainsaw/LoggingReceiver.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java b/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java index be6df5797a..5c88570f52 100644 --- a/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java +++ b/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java @@ -82,11 +82,11 @@ public void run() { } /** where to put the events **/ - private final MyTableModel mModel; + private MyTableModel mModel; /** server for listening for connections **/ - private final ServerSocket mSvrSock; - + private ServerSocket mSvrSock; + /** * Creates a new LoggingReceiver instance. * From c96a619af7148b95ba0a54af4927d21a2c9ec313 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 18 Aug 2005 22:23:53 +0000 Subject: [PATCH 155/342] Bug 32722: Extend -Dhaltonfailure=[yes\no] introduced for clover to all junit tests git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311478 13f79535-47bb-0310-9956-ffa450edef68 --- tests/build.xml | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/tests/build.xml b/tests/build.xml index 00cdc1bce9..e3def448bb 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -135,7 +135,7 @@ - + @@ -144,7 +144,7 @@ - + @@ -152,7 +152,7 @@ - + @@ -160,7 +160,7 @@ - + @@ -169,7 +169,7 @@ - + @@ -177,7 +177,7 @@ - + @@ -185,7 +185,7 @@ - + @@ -193,7 +193,7 @@ - + @@ -205,14 +205,14 @@ - + - + @@ -221,7 +221,7 @@ - + @@ -231,7 +231,7 @@ - + @@ -241,7 +241,7 @@ - + @@ -270,7 +270,7 @@ - + @@ -278,7 +278,7 @@ - + @@ -286,7 +286,7 @@ - + @@ -294,7 +294,7 @@ - + @@ -302,7 +302,7 @@ - + @@ -310,7 +310,7 @@ - + @@ -318,7 +318,7 @@ - + @@ -326,7 +326,7 @@ - + @@ -335,7 +335,7 @@ - + @@ -343,7 +343,7 @@ - + From 53b5c4c06cf0516c959bf28f79be34db19c754ef Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 18 Aug 2005 23:08:01 +0000 Subject: [PATCH 156/342] Bug 36213: Fixed broken links and removed obsolete documentation git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311480 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 10 + src/xdocs/documentation.xml | 2 +- src/xdocs/plan.xml | 2 +- src/xdocs/srtw.xml | 468 ------------------------------------ 4 files changed, 12 insertions(+), 470 deletions(-) delete mode 100644 src/xdocs/srtw.xml diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index a1df93ebd9..6287ee1ae8 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -4,6 +4,16 @@ [**] Changes that requiring little or no modification to existing client code. [***] Changes requiring important modifications to existing client code. + + TODO - + + - Release of version 1.2.12 + + - Fixed bug 36262 by removing final qualifiers on member variables + in org.apache.log4j.chainsaw.LoggingReceiver which would cause + spurious compiler errors with JDK 1.1 and 1.2 javac compilers. + + - Fixed bug 36213 by removing references to obsolete documentation. August 7th, 2005 diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index 1db56eab95..01988e2ee5 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -45,7 +45,7 @@

    1. - FAQ, + FAQ,
    2. diff --git a/src/xdocs/plan.xml b/src/xdocs/plan.xml index c8cb45ebbb..3c35ab6ca2 100644 --- a/src/xdocs/plan.xml +++ b/src/xdocs/plan.xml @@ -194,7 +194,7 @@
    Improvements to Chainsaw -

    Chainsaw v2 development has now progressed +

    Chainsaw v2 development has now progressed to the point where the main developers of it and many other members of the logging community are using it daily. It's still pre-alpha but only diff --git a/src/xdocs/srtw.xml b/src/xdocs/srtw.xml deleted file mode 100644 index a1ef8c5ed2..0000000000 --- a/src/xdocs/srtw.xml +++ /dev/null @@ -1,468 +0,0 @@ - - - - - Ceki Gülcü - Is JSR47 reinventing the wheel? - - - - - -

    - -

    As of version 0.8 of the JSR47 specification the - java.util.logging API resembles log4j even more - than was the case previously. The way the two APIs name their - components may differ but otherwise their degree of - resemblance is quite striking. -

    - -

    Changes introduced in the latest 0.8 draft include - configuration order independence, appender inheritance, - resource bundle inheritance, error handlers and lazy inference - of caller information. In other words, even if the priority - levels remain unchanged and somewhat bogus, the majority of - the points raised in my critique - of JSR47 are now obsolete. -

    - -

    Consequently, it is fair to say that our campaign to - influence the JSR47 API handsomely bore fruit. I wish to thank - the hundreds of concerned users who have expressed their - support for log4j. My gratitude goes to Jason Hunter for - arranging the appropriate communication channel to Sun. Graham - Hamilton, the JSR47 specification lead, was very open and - receptive during our exchanges. -

    - -

    From the user standpoint, there remain two critical - differences. First, JSR47 requires JDK 1.4 whereas log4j is - compatible with JDK 1.1 and later. Second, log4j offers much - more functionality. It supports a rich configuration language, - at least a dozen appenders and layouts as well as many other - useful features.

    - -

    Efforts to backport JSR47 to earlier JDKs are doomed to fail - because the java.util.logging package is located - under the java namespace. This will cause - backported code to systematically throw a - SecurityException under JDK 1.3. Moreover, Java - is a trademark owned by Sun Microsystems. As such, the - backported code will be under the threat of litigation as long - as Sun can be expected to defend its trademark. -

    - -

    If you take the time to study the terms of the final draft of - the JSR47 specification, you will discover a copyright notice - containing the following text.

    - -
    -  
    -  Sun hereby grants you a fully-paid, non-exclusive, non-transferable,
    -  worldwide, limited license (without the right to sublicense), under
    -  Sun's intellectual property rights that are essential to practice
    -  the Specification, to internally practice the Specification solely
    -  for the purpose of creating a clean room implementation of the
    -  Specification that: (i) includes a complete implementation of
    -  the current version of the Specification, without subsetting or
    -  superset-ting; (ii) implements all of the interfaces and
    -  functionality of the Specification, as defined by Sun, without
    -  sub-setting or supersetting; (iii) includes a complete
    -  implementation of any optional components (as defined by Sun in the
    -  Specification) which you choose to implement, without subsetting or
    -  supersetting; (iv) implements all of the interfaces and
    -  functionality of such optional components, without subsetting or
    -  supersetting; (v) does not add any additional packages,
    -  classes or interfaces to the "java.*" or "javax.*" packages or
    -  subpackages (or other pack-ages defined by Sun); (vi)
    -  satisfies all testing requirements available from Sun relating to
    -  the most recently pub-lished version of the Specification six (6)
    -  months prior to any release of the clean room implementation or
    -  upgrade thereto; (vii) does not derive from any Sun source
    -  code or binary code materials; and (viii) does not include
    -  any Sun source code or binary code materials without an appropriate
    -  and separate license from Sun. The Specification contains the
    -  proprietary information of Sun and may only be used in accordance
    -  with the license terms set forth herein. This license will terminate
    -  immediately without notice from Sun if you fail to comply with any
    -  provision of this license. Upon termination or expiration of this
    -  license, you must cease use of or destroy the Specification.
    -
    - -

    Given these business terms it is not possible for log4j or - other independent parties to implement the JSR47 - specification. Here is how the Apache Software foundation, a - member of the JCP Executive Committee, voted on this - JSR.

    - -
    - - The Apache Software Foundation is grateful for the significant - efforts of the JSR 47 spec lead, Graham Hamilton, toward addressing - the technical concerns raised by the members and lead of Apache's - log4j project. Regretfully, under the Merlin business terms, log4j - (or any other potential independent implementation of this - specification) cannot make use of the Specification, not can anyone - implement this specification for earlier J2SE platforms (J2SE 1.2, - 1.3), and it is on this basis that Apache cannot support this JSR. -
    - -

    This problems is not specific to JSR47. Most other JSR - specifications contain similar business terms which are not - exactly designed to facilitate independent implementations. -

    - -
    - -
    - -

    Log4j is the de facto standard logging API in Java. It has - been ported to Python, Ruby, C, C++, Eiffel and the much - maligned C#. By adopting log4j, you simultaneously benefit - from much richer functionality and wider JDK - compatibility. With the support of the log4j community, the - log4j project will continue to innovate and lead the way. As - such, many of the features that you need will be first - available in log4j.

    - -

    There are many other details in which log4j differs from - JSR47. Even if the log4j core is small, the project contains a - total of over 30'000 lines of well-tested code. JSR47 contains - about 5'000 lines of code. -

    - -

    It is likely that you will need an additional logging library - to fill in the functionality gap, the JDK compatibility gap, - or both. If you are going to install one or more logging APIs, - then why not install log4j which offers a lot more than JSR47 - and is backward compatible with JDK 1.1? -

    - -

    Log4j has been around for a number of years, enjoys the - support of an active community and is being used in thousands - of projects. Our site gets over 600 downloads each and every - day, and the numbers are on the rise. Companies are also - offering commercial products extending log4j. -

    - -

    Here is a short list of open source projects or sites that are - known to use log4j.

    - - - -

    Sun is setting a dangerous precedent by ignoring a rather - successful open source project. If it happens to log4j, can it - happen to other open source projects?

    - -

    Contact Sun

    - -

    If you feel that Sun is reinventing the wheel and setting a - dangerous precedent, then this the time to ask Sun to adopt - log4j as the official logging API for the Java language.

    - -

    Please direct your polite and personalized request to jsr-47-comments@jcp.org with Bcc: to ceki@apache.org. -

    - -

    Many individuals have written to Sun to express their - concern, in their vast majority pushing for the adoption of - log4j. Their names and the content of their request are listed - below. We are very grateful for their support. Some of these - requests are quite detailed and insightful. -

    - - - -

    Most of the e-mail notes are reproduced with - permission. However, do not hesitate to contact ceki@apache.org in case you are - uncomfortable seeing your name or the contents of your request - reproduced publicly.

    -
    - - - From 34ee9d7fcf0301a1449295670a9081e84fb2847a Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 Aug 2005 00:17:19 +0000 Subject: [PATCH 157/342] Bug 35831: parameterized javac target and source like Ant, switched default source to 1.1 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311481 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/build.xml b/build.xml index bbf7da2a6b..1eba2c2f73 100644 --- a/build.xml +++ b/build.xml @@ -70,6 +70,9 @@ + + + @@ -199,8 +202,8 @@ ${stem}/net/JMS*.java, ${stem}/jmx/*.java, ${stem}/or/jms/*.java" - target="1.1" - source="1.3" + target="${javac.target}" + source="${javac.source}" deprecation="${deprecation}" debug="on"> @@ -220,8 +223,8 @@ includes="examples/**/*.java" classpath="${classpath}" excludes="misc/*" - target="1.1" - source="1.3" + target="${javac.target}" + source="${javac.source}" deprecation="${deprecation}" debug="on"/> @@ -239,8 +242,8 @@ includes="${stem}/xml/**/*.java" excludes="${stem}/xml/examples/doc-files/**.java, ${stem}/xml/Transform.java" - target="1.1" - source="1.3" + target="${javac.target}" + source="${javac.source}" deprecation="${deprecation}" classpath="${classpath}"> @@ -253,8 +256,8 @@ @@ -264,8 +267,8 @@ @@ -276,8 +279,8 @@ destdir="${javac.dest}" includes="${stem}/jmx/*.java" excludes="${stem}/jmx/T.java" - target="1.1" - source="1.3" + target="${javac.target}" + source="${javac.source}" deprecation="${deprecation}"> From 465b4dac505adedd205bd1034b63a8bd749dfce3 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 Aug 2005 00:26:51 +0000 Subject: [PATCH 158/342] Bug 35831: parameterized javac target and source like Ant, switched default source to 1.1 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311482 13f79535-47bb-0310-9956-ffa450edef68 --- tests/build.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/build.xml b/tests/build.xml index e3def448bb..c15bcf3056 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -23,6 +23,9 @@ + + + @@ -90,8 +93,8 @@ From 1d543a1eaef257c2a6e5e40bb9d03ad5ea2fc9bb Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 Aug 2005 00:34:48 +0000 Subject: [PATCH 159/342] Bug 36267: Add jndi.jar property to build.xml git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311483 13f79535-47bb-0310-9956-ffa450edef68 --- build.properties.sample | 38 +++++++++++++++++++++----------------- build.xml | 1 + docs/HISTORY.txt | 2 ++ 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/build.properties.sample b/build.properties.sample index c5555f688f..3b3f0245af 100644 --- a/build.properties.sample +++ b/build.properties.sample @@ -1,33 +1,37 @@ +# +# base location of support directories +# +lib.home.dir=/java # The jaxp interface and a jaxp parser are required -# to build the DOMConfigurator -jaxp.home=/java/jaxp-1.1 +# to build the DOMConfigurator. +# +# modern equivalents are xml-commons-apis.jar +# and xerces-j2.jar +# +jaxp.home=${lib.home.dir}/jaxp-1.1 jaxp.jaxp.jar=${jaxp.home}/jaxp.jar jaxp.parser.jar=${jaxp.home}/crimson.jar # JavaMail API Required to build the SMTPAppender -javamail.jar=/java/javamail-1.2/mail.jar -activation.jar=/java/jaf-1.0.1/activation.jar +javamail.jar=${lib.home.dir}/javamail-1.2/mail.jar + +# and JavaBeans Activation Framework +# http://java.sun.com/products/javabeans/jaf/index.jsp +activation.jar=${lib.home.dir}/jaf-1.0.1/activation.jar # JMS interfaces are required to be on the classpath # in order to build the JMSAppender. -jms.jar=/java/JMQ1.1/lib/jms.jar - -# Required to build the org.apace.log4j.jmx package. -jmx.jar=/java/jmx/lib/jmxri.jar -jmx-extra.jar=/java/jmx/lib/jmxtools.jar - +jms.jar=${lib.home.dir}/JMQ1.1/lib/jms.jar -# jakarta-site2 module is used to transform xml files to html using -# Anakia. You do not need to worry about this property unless you -# intend to build the log4j web site yourself. -jakarta-site2=../jakarta-site2 +# Required to build the org.apache.log4j.jmx package. +jmx.jar=${lib.home.dir}/jmx/lib/jmxri.jar +jmx-extra.jar=/${lib.home.dir}/jmx/lib/jmxtools.jar +jndi.jar=${lib.home.dir}/jndi/lib/jndi.jar # Required to run Checkstyle. Available from http://checkstyle.sf.net -checkstyle.jar=/java/checkstyle-2.2/checkstyle-all-2.2.jar - - +checkstyle.jar=${lib.home.dir}/checkstyle-2.2/checkstyle-all-2.2.jar # The templates for the creation of the web-pages are inherited # from the parent project. diff --git a/build.xml b/build.xml index 1eba2c2f73..ccc8cceed4 100644 --- a/build.xml +++ b/build.xml @@ -85,6 +85,7 @@ + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 6287ee1ae8..78ef94f801 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -13,6 +13,8 @@ in org.apache.log4j.chainsaw.LoggingReceiver which would cause spurious compiler errors with JDK 1.1 and 1.2 javac compilers. + - Fixed bug 36267 by adding a jndi.jar property to the build file. + - Fixed bug 36213 by removing references to obsolete documentation. August 7th, 2005 From 88f247d5ed0bc14fee07c6dda27827919fc018c6 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 Aug 2005 01:02:04 +0000 Subject: [PATCH 160/342] Bug 36268: Add 'release' target to build.xml git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311484 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 36 ++++++++++++++++++++++++++++++++++++ docs/HISTORY.txt | 4 +++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index ccc8cceed4..1ba22de52d 100644 --- a/build.xml +++ b/build.xml @@ -114,6 +114,9 @@ dist - will create a complete distribution in dist/ Setting the env variable NO_JAVADOC will build the distribution without running the javadoc target. + + release - will create a complete distribution in dist/ + using stricter settings for public distribution. @@ -183,6 +186,9 @@ + + + @@ -226,6 +235,9 @@ excludes="misc/*" target="${javac.target}" source="${javac.source}" + includeAntRuntime="${javac.includeAntRuntime}" + includeJavaRuntime="${javac.includeJavaRuntime}" + fork="${javac.fork}" deprecation="${deprecation}" debug="on"/> @@ -245,6 +257,9 @@ ${stem}/xml/Transform.java" target="${javac.target}" source="${javac.source}" + includeAntRuntime="${javac.includeAntRuntime}" + includeJavaRuntime="${javac.includeJavaRuntime}" + fork="${javac.fork}" deprecation="${deprecation}" classpath="${classpath}"> @@ -259,6 +274,9 @@ includes="${stem}/net/SMTPAppender.java" target="${javac.target}" source="${javac.source}" + includeAntRuntime="${javac.includeAntRuntime}" + includeJavaRuntime="${javac.includeJavaRuntime}" + fork="${javac.fork}" deprecation="${deprecation}"> @@ -270,6 +288,9 @@ includes="${stem}/net/JMS*.java, ${stem}/or/jms/*.java" target="${javac.target}" source="${javac.source}" + includeAntRuntime="${javac.includeAntRuntime}" + includeJavaRuntime="${javac.includeJavaRuntime}" + fork="${javac.fork}" deprecation="${deprecation}"> @@ -282,6 +303,9 @@ excludes="${stem}/jmx/T.java" target="${javac.target}" source="${javac.source}" + includeAntRuntime="${javac.includeAntRuntime}" + includeJavaRuntime="${javac.includeJavaRuntime}" + fork="${javac.fork}" deprecation="${deprecation}"> @@ -575,5 +599,17 @@ + + + + + + + + + + + + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 78ef94f801..58be319bf7 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -13,7 +13,9 @@ in org.apache.log4j.chainsaw.LoggingReceiver which would cause spurious compiler errors with JDK 1.1 and 1.2 javac compilers. - - Fixed bug 36267 by adding a jndi.jar property to the build file. + - Fixed bug 36267 by adding a jndi.jar property to the build.xml. + + - Fixed bug 37268 by adding "release" target to build.xml. - Fixed bug 36213 by removing references to obsolete documentation. From dceccaee0719ef1ce85cdca3d00d9f62a26cafe3 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 Aug 2005 03:22:26 +0000 Subject: [PATCH 161/342] Bug 36268: Add clean-site target git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311485 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/build.xml b/build.xml index 1ba22de52d..d765ee8fd9 100644 --- a/build.xml +++ b/build.xml @@ -81,7 +81,6 @@ - @@ -231,7 +230,6 @@ + debug="on"> + + + + + @@ -490,6 +493,17 @@ + + + + + + + + + + + @@ -502,7 +516,7 @@ extension=".html" style="site.vsl" projectFile="stylesheets/project.xml" - excludes="**/stylesheets/**, empty.xml, lf5/**" + excludes="**/stylesheets/**, empty.xml" includes="**/*.xml" lastModifiedCheck="true" templatePath="${logging-site}/src/xdocs/stylesheets"> @@ -608,7 +622,7 @@ - + From eef0391c181cd948f3778bc12cc6a28c270ed2b9 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 Aug 2005 03:23:17 +0000 Subject: [PATCH 162/342] Bug 36268: Update build.properties.sample to reflect current best versions git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311486 13f79535-47bb-0310-9956-ffa450edef68 --- build.properties.sample | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/build.properties.sample b/build.properties.sample index 3b3f0245af..ceec3069ce 100644 --- a/build.properties.sample +++ b/build.properties.sample @@ -6,29 +6,28 @@ lib.home.dir=/java # The jaxp interface and a jaxp parser are required # to build the DOMConfigurator. # -# modern equivalents are xml-commons-apis.jar -# and xerces-j2.jar +# modern equivalent is xml-commons-apis.jar # -jaxp.home=${lib.home.dir}/jaxp-1.1 -jaxp.jaxp.jar=${jaxp.home}/jaxp.jar -jaxp.parser.jar=${jaxp.home}/crimson.jar +jaxp.home=${lib.home.dir}/crimson-1.1.3 +jaxp.jaxp.jar=${jaxp.home}/crimson.jar # JavaMail API Required to build the SMTPAppender -javamail.jar=${lib.home.dir}/javamail-1.2/mail.jar +javamail.jar=${lib.home.dir}/javamail-1.3.2/mail.jar # and JavaBeans Activation Framework # http://java.sun.com/products/javabeans/jaf/index.jsp -activation.jar=${lib.home.dir}/jaf-1.0.1/activation.jar +activation.jar=${lib.home.dir}/jaf-1.0.2/activation.jar # JMS interfaces are required to be on the classpath # in order to build the JMSAppender. -jms.jar=${lib.home.dir}/JMQ1.1/lib/jms.jar +jms.jar=${lib.home.dir}/jms1.1/lib/jms.jar # Required to build the org.apache.log4j.jmx package. -jmx.jar=${lib.home.dir}/jmx/lib/jmxri.jar -jmx-extra.jar=/${lib.home.dir}/jmx/lib/jmxtools.jar -jndi.jar=${lib.home.dir}/jndi/lib/jndi.jar +jmx.home.dir=${lib.home.dir}/jmx-1_2_1-bin +jmx.jar=${jmx.home.dir}/lib/jmxri.jar +jmx-extra.jar=${jmx.home.dir}/jmx/lib/jmxtools.jar +jndi.jar=${lib.home.dir}/jndi-1_2_1/lib/jndi.jar # Required to run Checkstyle. Available from http://checkstyle.sf.net checkstyle.jar=${lib.home.dir}/checkstyle-2.2/checkstyle-all-2.2.jar From 793c2d5e88a87c3540ff52b77377ed62fbd763f2 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 Aug 2005 07:09:39 +0000 Subject: [PATCH 163/342] Bug 26433: Relax serialization tests for JDK 1.2 and 1.3 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311487 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/log4j/spi/LoggingEventTest.java | 12 ++++++------ .../apache/log4j/util/SerializationTestHelper.java | 5 ++++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java index 70800ed3cb..c7571f7ed7 100644 --- a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java +++ b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java @@ -56,7 +56,7 @@ public void testSerializationSimple() throws Exception { int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( - "witness/serialization/simple.bin", event, skip, Integer.MAX_VALUE); + "witness/serialization/simple.bin", event, skip, 365); } /** @@ -75,7 +75,7 @@ public void testSerializationWithException() throws Exception { int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( - "witness/serialization/exception.bin", event, skip, 945); + "witness/serialization/exception.bin", event, skip, 365); } /** @@ -94,7 +94,7 @@ public void testSerializationWithLocation() throws Exception { int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( - "witness/serialization/location.bin", event, skip, Integer.MAX_VALUE); + "witness/serialization/location.bin", event, skip, 431); } /** @@ -113,8 +113,8 @@ public void testSerializationNDC() throws Exception { int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( - "witness/serialization/ndc.bin", event, skip, Integer.MAX_VALUE); - } + "witness/serialization/ndc.bin", event, skip, 365); + } /** * Serialize a logging event with mdc. @@ -132,7 +132,7 @@ public void testSerializationMDC() throws Exception { int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( - "witness/serialization/mdc.bin", event, skip, Integer.MAX_VALUE); + "witness/serialization/mdc.bin", event, skip, 465); } /** diff --git a/tests/src/java/org/apache/log4j/util/SerializationTestHelper.java b/tests/src/java/org/apache/log4j/util/SerializationTestHelper.java index e01c747707..8ed3a14805 100644 --- a/tests/src/java/org/apache/log4j/util/SerializationTestHelper.java +++ b/tests/src/java/org/apache/log4j/util/SerializationTestHelper.java @@ -115,7 +115,10 @@ public static void assertStreamEquals( FileInputStream is = new FileInputStream(witnessFile); int bytesRead = is.read(expected); is.close(); - TestCase.assertEquals(bytesRead, actual.length); + + if(bytesRead < endCompare) { + TestCase.assertEquals(bytesRead, actual.length); + } int endScan = actual.length; From 3a4efd9c782040369212567eb39f871098047f7d Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 Aug 2005 07:10:23 +0000 Subject: [PATCH 164/342] Bug 35519: Expanded stack trace patterns for JDK 1.2 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311488 13f79535-47bb-0310-9956-ffa450edef68 --- tests/build.properties.sample | 12 ++++++++- tests/build.xml | 4 +-- .../org/apache/log4j/MinimumTestCase.java | 3 ++- .../apache/log4j/PatternLayoutTestCase.java | 27 ++++++++++--------- .../log4j/net/SocketServerTestCase.java | 17 ++++++------ .../apache/log4j/util/LineNumberFilter.java | 5 ++-- .../org/apache/log4j/xml/DOMTestCase.java | 9 ++++--- 7 files changed, 46 insertions(+), 31 deletions(-) diff --git a/tests/build.properties.sample b/tests/build.properties.sample index 0956638889..8941457478 100644 --- a/tests/build.properties.sample +++ b/tests/build.properties.sample @@ -2,7 +2,17 @@ # by default assume that all necessary dependencies # are relative to the user's home directory # -lib.home.dir=${user.home} +lib.home.dir=/java + +# The jaxp interface and a jaxp parser are required +# to build the DOMConfigurator. +# +# modern equivalents are xml-commons-apis.jar +# and xercesImpl.jar +jaxp.home=${lib.home.dir}/crimson-1.1.3 +jaxp.jaxp.jar=${jaxp.home}/crimson.jar +jaxp.parser.jar=${jaxp.home}/crimson.jar + jakarta.oro.jar=${lib.home.dir}/jakarta-oro-2.0.8/jakarta-oro-2.0.8.jar clover.jar="${lib.home.dir}/clover-1.3.8/lib/clover.jar deprecation=on diff --git a/tests/build.xml b/tests/build.xml index c15bcf3056..2ed2458f66 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -34,8 +34,8 @@ - - + + diff --git a/tests/src/java/org/apache/log4j/MinimumTestCase.java b/tests/src/java/org/apache/log4j/MinimumTestCase.java index e38c02bace..1bbb7faf23 100644 --- a/tests/src/java/org/apache/log4j/MinimumTestCase.java +++ b/tests/src/java/org/apache/log4j/MinimumTestCase.java @@ -34,6 +34,7 @@ public class MinimumTestCase extends TestCase { static String EXCEPTION1 = "java.lang.Exception: Just testing"; static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; + static String EXCEPTION4 = "\\s*at .*\\(.*, Compiled Code\\)"; //18 fevr. 2002 20:02:41,551 [main] FATAL ERR - Message 0 @@ -84,7 +85,7 @@ public void ttcc() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{TTCC_PAT, TTCC2_PAT, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( "output/ttcc", FILTERED, diff --git a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java index 17352b76ef..0141db7d99 100644 --- a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java @@ -48,6 +48,7 @@ public class PatternLayoutTestCase extends TestCase { static String EXCEPTION1 = "java.lang.Exception: Just testing"; static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; + static String EXCEPTION4 = "\\s*at .*\\(.*, Compiled Code\\)"; static String PAT0 = "\\[main]\\ (DEBUG|INFO|WARN|ERROR|FATAL) .* - Message \\d{1,2}"; static String PAT1 = Filter.ISO8601_PAT + " " + PAT0; @@ -100,7 +101,7 @@ public void test2() throws Exception { PropertyConfigurator.configure("input/patternLayout2.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT1, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -114,7 +115,7 @@ public void test3() throws Exception { PropertyConfigurator.configure("input/patternLayout3.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT1, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -130,7 +131,7 @@ public void test4() throws Exception { PropertyConfigurator.configure("input/patternLayout4.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT2, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -144,7 +145,7 @@ public void test5() throws Exception { PropertyConfigurator.configure("input/patternLayout5.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT2, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -159,7 +160,7 @@ public void test6() throws Exception { PropertyConfigurator.configure("input/patternLayout6.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT3, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -174,7 +175,7 @@ public void test7() throws Exception { PropertyConfigurator.configure("input/patternLayout7.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT3, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -188,7 +189,7 @@ public void test8() throws Exception { PropertyConfigurator.configure("input/patternLayout8.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT4, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -202,7 +203,7 @@ public void test9() throws Exception { PropertyConfigurator.configure("input/patternLayout9.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT5, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -216,7 +217,7 @@ public void test10() throws Exception { PropertyConfigurator.configure("input/patternLayout10.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT6, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -230,7 +231,7 @@ public void test11() throws Exception { PropertyConfigurator.configure("input/patternLayout11.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT11a, PAT11b, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -244,7 +245,7 @@ public void test12() throws Exception { PropertyConfigurator.configure("input/patternLayout12.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT12, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -258,7 +259,7 @@ public void test13() throws Exception { PropertyConfigurator.configure("input/patternLayout13.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT13, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -272,7 +273,7 @@ public void test14() throws Exception { PropertyConfigurator.configure("input/patternLayout14.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT14, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, new Filter[] { diff --git a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java index 451e849c64..d5863284f4 100644 --- a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java +++ b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java @@ -82,6 +82,7 @@ public class SocketServerTestCase extends TestCase { static String EXCEPTION1 = "java.lang.Exception: Just testing"; static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; + static String EXCEPTION4 = "\\s*at .*\\(.*, Compiled Code\\)"; static Logger logger = Logger.getLogger(SocketServerTestCase.class); @@ -114,7 +115,7 @@ public void test1() throws Exception { common("T1", "key1", "MDC-TEST1"); delay(1); ControlFilter cf = new ControlFilter(new String[]{PAT1, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, @@ -138,7 +139,7 @@ public void test2() throws Exception { common("T2", "key2", "MDC-TEST2"); delay(1); ControlFilter cf = new ControlFilter(new String[]{PAT2, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, @@ -161,7 +162,7 @@ public void test3() throws Exception { common("T3", "key3", "MDC-TEST3"); delay(1); ControlFilter cf = new ControlFilter(new String[]{PAT3, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, @@ -187,7 +188,7 @@ public void test4() throws Exception { NDC.pop(); delay(1); ControlFilter cf = new ControlFilter(new String[]{PAT4, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, @@ -225,7 +226,7 @@ public void test5() throws Exception { NDC.pop(); delay(2); ControlFilter cf = new ControlFilter(new String[]{PAT5, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, @@ -257,7 +258,7 @@ public void test6() throws Exception { MDC.remove("hostID"); delay(2); ControlFilter cf = new ControlFilter(new String[]{PAT6, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, @@ -285,7 +286,7 @@ public void test7() throws Exception { MDC.remove("hostID"); delay(2); ControlFilter cf = new ControlFilter(new String[]{PAT7, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, @@ -310,7 +311,7 @@ public void test8() throws Exception { NDC.pop(); delay(2); ControlFilter cf = new ControlFilter(new String[]{PAT8, EXCEPTION1, - EXCEPTION2, EXCEPTION3}); + EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP, FILTERED, diff --git a/tests/src/java/org/apache/log4j/util/LineNumberFilter.java b/tests/src/java/org/apache/log4j/util/LineNumberFilter.java index 9f77fbfa40..14cc8e2f84 100644 --- a/tests/src/java/org/apache/log4j/util/LineNumberFilter.java +++ b/tests/src/java/org/apache/log4j/util/LineNumberFilter.java @@ -16,8 +16,6 @@ package org.apache.log4j.util; -import java.io.*; - import org.apache.oro.text.perl.Perl5Util; public class LineNumberFilter implements Filter { @@ -29,6 +27,9 @@ String filter(String in) { if(util.match("/\\(.*:\\d{1,4}\\)/", in)) { return util.substitute("s/:\\d{1,4}\\)/:XXX)/", in); } else { + if(in.indexOf(", Compiled Code") >= 0) { + return util.substitute("s/, Compiled Code/:XXX/", in); + } return in; } } diff --git a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java index aa1b503ba4..6c99f1cbaa 100644 --- a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java @@ -42,6 +42,7 @@ public class DOMTestCase extends TestCase { static String EXCEPTION1 = "java.lang.Exception: Just testing"; static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; + static String EXCEPTION4 = "\\s*at .*\\(.*, Compiled Code\\)"; static String TEST1_1A_PAT = "(DEBUG|INFO |WARN |ERROR|FATAL) \\w*\\.\\w* - Message \\d"; @@ -74,10 +75,10 @@ public void test1() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{TEST1_1A_PAT, TEST1_1B_PAT, - EXCEPTION1, EXCEPTION2, EXCEPTION3}); + EXCEPTION1, EXCEPTION2, EXCEPTION3, EXCEPTION4}); ControlFilter cf2 = new ControlFilter(new String[]{TEST1_2_PAT, - EXCEPTION1, EXCEPTION2, EXCEPTION3}); + EXCEPTION1, EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP_A1, FILTERED_A1, @@ -105,10 +106,10 @@ public void test4() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{TEST1_1A_PAT, TEST1_1B_PAT, - EXCEPTION1, EXCEPTION2, EXCEPTION3}); + EXCEPTION1, EXCEPTION2, EXCEPTION3, EXCEPTION4}); ControlFilter cf2 = new ControlFilter(new String[]{TEST1_2_PAT, - EXCEPTION1, EXCEPTION2, EXCEPTION3}); + EXCEPTION1, EXCEPTION2, EXCEPTION3, EXCEPTION4}); Transformer.transform( TEMP_A1 + ".4", FILTERED_A1 + ".4", From 57773e863da3f5be22c13a23613852db21df1360 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 Aug 2005 19:30:30 +0000 Subject: [PATCH 165/342] Bug 9150: Check for null return from getParent when creating dir git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311489 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/FileAppender.java | 13 +++++++++---- src/java/org/apache/log4j/spi/LoggerRepository.java | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/java/org/apache/log4j/FileAppender.java b/src/java/org/apache/log4j/FileAppender.java index 1657e0265a..b987db2774 100644 --- a/src/java/org/apache/log4j/FileAppender.java +++ b/src/java/org/apache/log4j/FileAppender.java @@ -293,11 +293,16 @@ void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize // attempt to create it and try to create file // see bug 9150 // - File parentDir = new File(new File(fileName).getParent()); - if(!parentDir.exists() && parentDir.mkdirs()) { - ostream = new FileOutputStream(fileName, append); + String parentName = new File(fileName).getParent(); + if (parentName != null) { + File parentDir = new File(parentName); + if(!parentDir.exists() && parentDir.mkdirs()) { + ostream = new FileOutputStream(fileName, append); + } else { + throw ex; + } } else { - throw ex; + throw ex; } } Writer fw = createWriter(ostream); diff --git a/src/java/org/apache/log4j/spi/LoggerRepository.java b/src/java/org/apache/log4j/spi/LoggerRepository.java index e4d8243e71..5f4d8cc75e 100644 --- a/src/java/org/apache/log4j/spi/LoggerRepository.java +++ b/src/java/org/apache/log4j/spi/LoggerRepository.java @@ -89,7 +89,7 @@ public interface LoggerRepository { Enumeration getCurrentLoggers(); /** - @deprecated Please use {@link #getCurrentLoggers} instead. */ + Deprecated. Please use {@link #getCurrentLoggers} instead. */ public Enumeration getCurrentCategories(); From 972770580d31e87e3d0160117b572daa581b1f5c Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 Aug 2005 19:33:38 +0000 Subject: [PATCH 166/342] Bug 26433: Relax serialization tests for JDK 1.1 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311490 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/log4j/spi/LoggingEventTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java index c7571f7ed7..00b7220ebf 100644 --- a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java +++ b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java @@ -56,7 +56,7 @@ public void testSerializationSimple() throws Exception { int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( - "witness/serialization/simple.bin", event, skip, 365); + "witness/serialization/simple.bin", event, skip, 237); } /** @@ -75,7 +75,7 @@ public void testSerializationWithException() throws Exception { int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( - "witness/serialization/exception.bin", event, skip, 365); + "witness/serialization/exception.bin", event, skip, 237); } /** @@ -94,7 +94,7 @@ public void testSerializationWithLocation() throws Exception { int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( - "witness/serialization/location.bin", event, skip, 431); + "witness/serialization/location.bin", event, skip, 237); } /** @@ -113,7 +113,7 @@ public void testSerializationNDC() throws Exception { int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( - "witness/serialization/ndc.bin", event, skip, 365); + "witness/serialization/ndc.bin", event, skip, 237); } /** @@ -132,7 +132,7 @@ public void testSerializationMDC() throws Exception { int[] skip = new int[] { 352, 353, 354, 355, 356 }; SerializationTestHelper.assertSerializationEquals( - "witness/serialization/mdc.bin", event, skip, 465); + "witness/serialization/mdc.bin", event, skip, 237); } /** From d3ca8f0cbaba4261db337ebad10c54c23370b4b5 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 19 Aug 2005 19:36:26 +0000 Subject: [PATCH 167/342] Bug 35519: Expand stack trace pattern for JDK 1.1 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311491 13f79535-47bb-0310-9956-ffa450edef68 --- tests/src/java/org/apache/log4j/LoggerTestCase.java | 4 ++-- tests/src/java/org/apache/log4j/MinimumTestCase.java | 2 +- .../java/org/apache/log4j/PatternLayoutTestCase.java | 2 +- .../org/apache/log4j/net/SocketServerTestCase.java | 2 +- tests/src/java/org/apache/log4j/or/ORTestCase.java | 11 +++++++++-- .../org/apache/log4j/util/JunitTestRunnerFilter.java | 2 ++ .../java/org/apache/log4j/util/SunReflectFilter.java | 10 +++++++++- tests/src/java/org/apache/log4j/xml/DOMTestCase.java | 2 +- tests/witness/customLogger.1 | 1 - tests/witness/dom.A1.1 | 6 ------ tests/witness/dom.A1.4 | 6 ------ tests/witness/dom.A2.1 | 4 ---- tests/witness/dom.A2.4 | 4 ---- tests/witness/patternLayout.1 | 5 ----- tests/witness/patternLayout.10 | 5 ----- tests/witness/patternLayout.11 | 5 ----- tests/witness/patternLayout.12 | 5 ----- tests/witness/patternLayout.13 | 5 ----- tests/witness/patternLayout.14 | 5 ----- tests/witness/patternLayout.2 | 5 ----- tests/witness/patternLayout.3 | 5 ----- tests/witness/patternLayout.4 | 5 ----- tests/witness/patternLayout.5 | 5 ----- tests/witness/patternLayout.6 | 5 ----- tests/witness/patternLayout.7 | 5 ----- tests/witness/patternLayout.8 | 5 ----- tests/witness/patternLayout.9 | 5 ----- tests/witness/simple | 1 - tests/witness/socketServer.1 | 2 -- tests/witness/socketServer.2 | 2 -- tests/witness/socketServer.3 | 2 -- tests/witness/socketServer.4 | 2 -- tests/witness/socketServer.5 | 2 -- tests/witness/socketServer.6 | 2 -- tests/witness/socketServer.7 | 2 -- tests/witness/socketServer.8 | 2 -- tests/witness/ttcc | 1 - tests/witness/xmlLayout.1 | 4 ---- tests/witness/xmlLayout.2 | 4 ---- tests/witness/xmlLayout.null | 1 - 40 files changed, 26 insertions(+), 127 deletions(-) diff --git a/tests/src/java/org/apache/log4j/LoggerTestCase.java b/tests/src/java/org/apache/log4j/LoggerTestCase.java index 9dfa303b91..36d65e90c1 100644 --- a/tests/src/java/org/apache/log4j/LoggerTestCase.java +++ b/tests/src/java/org/apache/log4j/LoggerTestCase.java @@ -348,7 +348,7 @@ public void testTrace() { Vector msgs = appender.getVector(); assertEquals(1, msgs.size()); - LoggingEvent event = (LoggingEvent) msgs.get(0); + LoggingEvent event = (LoggingEvent) msgs.elementAt(0); assertEquals(Level.TRACE, event.getLevel()); assertEquals("Message 1", event.getMessage()); } @@ -374,7 +374,7 @@ public void testTraceWithException() { Vector msgs = appender.getVector(); assertEquals(1, msgs.size()); - LoggingEvent event = (LoggingEvent) msgs.get(0); + LoggingEvent event = (LoggingEvent) msgs.elementAt(0); assertEquals(Level.TRACE, event.getLevel()); assertEquals("Message 1", event.getMessage()); } diff --git a/tests/src/java/org/apache/log4j/MinimumTestCase.java b/tests/src/java/org/apache/log4j/MinimumTestCase.java index 1bbb7faf23..0941b65f5e 100644 --- a/tests/src/java/org/apache/log4j/MinimumTestCase.java +++ b/tests/src/java/org/apache/log4j/MinimumTestCase.java @@ -34,7 +34,7 @@ public class MinimumTestCase extends TestCase { static String EXCEPTION1 = "java.lang.Exception: Just testing"; static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; - static String EXCEPTION4 = "\\s*at .*\\(.*, Compiled Code\\)"; + static String EXCEPTION4 = "\\s*at .*\\(.*Compiled Code\\)"; //18 fevr. 2002 20:02:41,551 [main] FATAL ERR - Message 0 diff --git a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java index 0141db7d99..34cb4ccb48 100644 --- a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java @@ -48,7 +48,7 @@ public class PatternLayoutTestCase extends TestCase { static String EXCEPTION1 = "java.lang.Exception: Just testing"; static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; - static String EXCEPTION4 = "\\s*at .*\\(.*, Compiled Code\\)"; + static String EXCEPTION4 = "\\s*at .*\\(.*Compiled Code\\)"; static String PAT0 = "\\[main]\\ (DEBUG|INFO|WARN|ERROR|FATAL) .* - Message \\d{1,2}"; static String PAT1 = Filter.ISO8601_PAT + " " + PAT0; diff --git a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java index d5863284f4..825dfde720 100644 --- a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java +++ b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java @@ -82,7 +82,7 @@ public class SocketServerTestCase extends TestCase { static String EXCEPTION1 = "java.lang.Exception: Just testing"; static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; - static String EXCEPTION4 = "\\s*at .*\\(.*, Compiled Code\\)"; + static String EXCEPTION4 = "\\s*at .*\\(.*Compiled Code\\)"; static Logger logger = Logger.getLogger(SocketServerTestCase.class); diff --git a/tests/src/java/org/apache/log4j/or/ORTestCase.java b/tests/src/java/org/apache/log4j/or/ORTestCase.java index 2036c390fd..7c800b96f9 100644 --- a/tests/src/java/org/apache/log4j/or/ORTestCase.java +++ b/tests/src/java/org/apache/log4j/or/ORTestCase.java @@ -147,9 +147,16 @@ void test6() { // Add: Comparable // Expect: Comparable public - void test7() { + void test7() throws Exception { RendererMap map = new RendererMap(); - map.put(Comparable.class, cor); + Class comparable = null; + try { + comparable = getClass().forName("java.lang.Comparable"); + } catch(Exception ex) { + // likely JDK 1.1 + return; + } + map.put(comparable, cor); ObjectRenderer r = map.get(Integer.class); assertEquals(r, cor); } diff --git a/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java b/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java index 6f8dc6c122..65c7362fae 100644 --- a/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java +++ b/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java @@ -39,6 +39,8 @@ public String filter(String in) { "/at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner/", in)) { return null; + } else if (in.indexOf("at junit.") >= 0 && in.indexOf("ui.TestRunner") >= 0) { + return null; } else { return in; } diff --git a/tests/src/java/org/apache/log4j/util/SunReflectFilter.java b/tests/src/java/org/apache/log4j/util/SunReflectFilter.java index 2ddd733797..3d67144ea0 100644 --- a/tests/src/java/org/apache/log4j/util/SunReflectFilter.java +++ b/tests/src/java/org/apache/log4j/util/SunReflectFilter.java @@ -19,7 +19,7 @@ import org.apache.oro.text.perl.Perl5Util; /** - * The sun.reflect.* lines are not present in all JDKs. + * The sun.reflect.* and java.lang.reflect.* lines are not present in all JDKs. * * @author Ceki Gulcu */ @@ -33,6 +33,14 @@ public String filter(String in) { if (util.match("/at sun.reflect/", in)) { return null; } + if (in.indexOf("at java.lang.reflect.Method") >= 0) { + return null; + } + if (in.indexOf("Compiled Code") >= 0) { + if(in.indexOf("junit.framework.TestSuite") >= 0) { + return util.substitute("s/Compiled Code/TestSuite.java:XXX/", in); + } + } if (util.match("/\\(Method.java:.*\\)/", in)) { return util.substitute("s/\\(Method.java:.*\\)/(Native Method)/", in); } diff --git a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java index 6c99f1cbaa..f6465c1171 100644 --- a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java @@ -42,7 +42,7 @@ public class DOMTestCase extends TestCase { static String EXCEPTION1 = "java.lang.Exception: Just testing"; static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; - static String EXCEPTION4 = "\\s*at .*\\(.*, Compiled Code\\)"; + static String EXCEPTION4 = "\\s*at .*\\(.*Compiled Code\\)"; static String TEST1_1A_PAT = "(DEBUG|INFO |WARN |ERROR|FATAL) \\w*\\.\\w* - Message \\d"; diff --git a/tests/witness/customLogger.1 b/tests/witness/customLogger.1 index d16e1e707d..5697b70dea 100644 --- a/tests/witness/customLogger.1 +++ b/tests/witness/customLogger.1 @@ -7,7 +7,6 @@ DEBUG customLogger.XLoggerTestCase - Message 5 java.lang.Exception: Just testing at org.apache.log4j.customLogger.XLoggerTestCase.common(XLoggerTestCase.java:XXX) at org.apache.log4j.customLogger.XLoggerTestCase.test1(XLoggerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/dom.A1.1 b/tests/witness/dom.A1.1 index 76a167444c..bd25935ca5 100644 --- a/tests/witness/dom.A1.1 +++ b/tests/witness/dom.A1.1 @@ -17,7 +17,6 @@ DEBUG xml.DOMTestCase - Message 5 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -30,7 +29,6 @@ DEBUG xml.DOMTestCase - Message 5 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -43,7 +41,6 @@ DEBUG root - Message 5 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -56,7 +53,6 @@ ERROR xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -69,7 +65,6 @@ ERROR xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -82,7 +77,6 @@ ERROR root - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/dom.A1.4 b/tests/witness/dom.A1.4 index 4e79edfaef..23b25382bd 100644 --- a/tests/witness/dom.A1.4 +++ b/tests/witness/dom.A1.4 @@ -17,7 +17,6 @@ DEBUG xml.DOMTestCase - Message 5 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -30,7 +29,6 @@ DEBUG xml.DOMTestCase - Message 5 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -43,7 +41,6 @@ DEBUG root - Message 5 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -56,7 +53,6 @@ ERROR xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -69,7 +65,6 @@ ERROR xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -82,7 +77,6 @@ ERROR root - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/dom.A2.1 b/tests/witness/dom.A2.1 index 3eea03b621..31fa30eb96 100644 --- a/tests/witness/dom.A2.1 +++ b/tests/witness/dom.A2.1 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/dom.A2.4 b/tests/witness/dom.A2.4 index 19dac364e4..1b35efb132 100644 --- a/tests/witness/dom.A2.4 +++ b/tests/witness/dom.A2.4 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.1 b/tests/witness/patternLayout.1 index b382407bf5..9b0f704e36 100644 --- a/tests/witness/patternLayout.1 +++ b/tests/witness/patternLayout.1 @@ -12,7 +12,6 @@ DEBUG - Message 5 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test1(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ INFO - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test1(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ WARN - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test1(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ ERROR - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test1(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ FATAL - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test1(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.10 b/tests/witness/patternLayout.10 index 6a7fd416d5..2e807a3471 100644 --- a/tests/witness/patternLayout.10 +++ b/tests/witness/patternLayout.10 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test10(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test10(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test10(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test10(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test10(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.11 b/tests/witness/patternLayout.11 index c8f5d9e85a..b4826afc7e 100644 --- a/tests/witness/patternLayout.11 +++ b/tests/witness/patternLayout.11 @@ -12,7 +12,6 @@ DEBUG [main] log4j.PatternLayoutTestCase: Message 5 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test11(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ INFO [main] log4j.PatternLayoutTestCase: Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test11(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ WARN [main] log4j.PatternLayoutTestCase: Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test11(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ ERROR [main] log4j.PatternLayoutTestCase: Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test11(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ FATAL [main] log4j.PatternLayoutTestCase: Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test11(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.12 b/tests/witness/patternLayout.12 index 247d057490..122f0a0168 100644 --- a/tests/witness/patternLayout.12 +++ b/tests/witness/patternLayout.12 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test12(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test12(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test12(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test12(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test12(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.13 b/tests/witness/patternLayout.13 index a7a5a7fb92..be148f425e 100644 --- a/tests/witness/patternLayout.13 +++ b/tests/witness/patternLayout.13 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test13(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test13(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test13(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test13(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test13(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.14 b/tests/witness/patternLayout.14 index 93b666e617..9ce6a2ae88 100644 --- a/tests/witness/patternLayout.14 +++ b/tests/witness/patternLayout.14 @@ -12,7 +12,6 @@ DEBUG 11 - Message 5 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test14(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test14(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test14(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ ERROR 14 - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test14(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ FATAL 15 - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test14(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.2 b/tests/witness/patternLayout.2 index a4f04acd2c..98752c168f 100644 --- a/tests/witness/patternLayout.2 +++ b/tests/witness/patternLayout.2 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test2(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test2(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test2(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test2(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test2(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.3 b/tests/witness/patternLayout.3 index cd1319d2f7..d18cfcbce4 100644 --- a/tests/witness/patternLayout.3 +++ b/tests/witness/patternLayout.3 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test3(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test3(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test3(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test3(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test3(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.4 b/tests/witness/patternLayout.4 index a2bd38d8ac..5ffff24fcf 100644 --- a/tests/witness/patternLayout.4 +++ b/tests/witness/patternLayout.4 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test4(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test4(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test4(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test4(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test4(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.5 b/tests/witness/patternLayout.5 index b73cf4ae46..e8eead0320 100644 --- a/tests/witness/patternLayout.5 +++ b/tests/witness/patternLayout.5 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test5(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test5(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test5(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test5(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test5(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.6 b/tests/witness/patternLayout.6 index af2879e437..8ae7e98513 100644 --- a/tests/witness/patternLayout.6 +++ b/tests/witness/patternLayout.6 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test6(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test6(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test6(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test6(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test6(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.7 b/tests/witness/patternLayout.7 index 37bb203b03..5bffb74164 100644 --- a/tests/witness/patternLayout.7 +++ b/tests/witness/patternLayout.7 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test7(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test7(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test7(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test7(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test7(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.8 b/tests/witness/patternLayout.8 index c59322ab5e..accb13021d 100644 --- a/tests/witness/patternLayout.8 +++ b/tests/witness/patternLayout.8 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test8(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test8(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test8(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test8(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test8(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/patternLayout.9 b/tests/witness/patternLayout.9 index 3c2d4fee8e..eb52808d8b 100644 --- a/tests/witness/patternLayout.9 +++ b/tests/witness/patternLayout.9 @@ -12,7 +12,6 @@ java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test9(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -25,7 +24,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test9(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -38,7 +36,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test9(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -51,7 +48,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test9(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -64,7 +60,6 @@ java.lang.Exception: Just testing java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test9(PatternLayoutTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/simple b/tests/witness/simple index cdefeb7a96..ff3142aedf 100644 --- a/tests/witness/simple +++ b/tests/witness/simple @@ -25,7 +25,6 @@ DEBUG - Message 23 java.lang.Exception: Just testing. at org.apache.log4j.MinimumTestCase.common(MinimumTestCase.java:XXX) at org.apache.log4j.MinimumTestCase.simple(MinimumTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/socketServer.1 b/tests/witness/socketServer.1 index 51221b8834..768f434372 100644 --- a/tests/witness/socketServer.1 +++ b/tests/witness/socketServer.1 @@ -7,7 +7,6 @@ DEBUG T1 [main] org.apache.log4j.net.SocketServerTestCase Message 6 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test1(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -20,7 +19,6 @@ ERROR T1 [main] root Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test1(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/socketServer.2 b/tests/witness/socketServer.2 index 3f36acbbf2..ad2127bbde 100644 --- a/tests/witness/socketServer.2 +++ b/tests/witness/socketServer.2 @@ -7,7 +7,6 @@ DEBUG T2 [main] ? (?:?) Message 6 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test2(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -20,7 +19,6 @@ ERROR T2 [main] ? (?:?) Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test2(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/socketServer.3 b/tests/witness/socketServer.3 index eb65c95176..3886e09e85 100644 --- a/tests/witness/socketServer.3 +++ b/tests/witness/socketServer.3 @@ -7,7 +7,6 @@ DEBUG T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase. java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test3(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -20,7 +19,6 @@ ERROR T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase. java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test3(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/socketServer.4 b/tests/witness/socketServer.4 index 700b69dd00..5af519ced7 100644 --- a/tests/witness/socketServer.4 +++ b/tests/witness/socketServer.4 @@ -7,7 +7,6 @@ DEBUG some T4 MDC-TEST4 [main] SocketServerTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test4(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -20,7 +19,6 @@ ERROR some T4 MDC-TEST4 [main] root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test4(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/socketServer.5 b/tests/witness/socketServer.5 index 941c40818f..3436e208e7 100644 --- a/tests/witness/socketServer.5 +++ b/tests/witness/socketServer.5 @@ -7,7 +7,6 @@ DEBUG some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test5(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -20,7 +19,6 @@ ERROR some5 T5 MDC-TEST5 [main] root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test5(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/socketServer.6 b/tests/witness/socketServer.6 index 61e9f6987a..412ec544d8 100644 --- a/tests/witness/socketServer.6 +++ b/tests/witness/socketServer.6 @@ -7,7 +7,6 @@ DEBUG some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test6(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -20,7 +19,6 @@ ERROR some6 T6 client-test6 MDC-TEST6 [main] root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test6(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/socketServer.7 b/tests/witness/socketServer.7 index 2ed8dcd259..6437bb2dc4 100644 --- a/tests/witness/socketServer.7 +++ b/tests/witness/socketServer.7 @@ -7,7 +7,6 @@ DEBUG some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test7(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -20,7 +19,6 @@ ERROR some7 T7 client-test7 MDC-TEST7 [main] root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test7(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/socketServer.8 b/tests/witness/socketServer.8 index 1a4323c4fc..26648609bd 100644 --- a/tests/witness/socketServer.8 +++ b/tests/witness/socketServer.8 @@ -7,7 +7,6 @@ DEBUG some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test8(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) @@ -20,7 +19,6 @@ ERROR some8 T8 shortSocketServer MDC-TEST8 [main] root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test8(SocketServerTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/ttcc b/tests/witness/ttcc index 007c3ff31e..a99699b7c8 100644 --- a/tests/witness/ttcc +++ b/tests/witness/ttcc @@ -25,7 +25,6 @@ java.lang.Exception: Just testing. at org.apache.log4j.MinimumTestCase.common(MinimumTestCase.java:XXX) at org.apache.log4j.MinimumTestCase.ttcc(MinimumTestCase.java:XXX) - at java.lang.reflect.Method.invoke(Native Method) at junit.framework.TestCase.runTest(TestCase.java:XXX) at junit.framework.TestCase.runBare(TestCase.java:XXX) at junit.framework.TestResult$1.protect(TestResult.java:XXX) diff --git a/tests/witness/xmlLayout.1 b/tests/witness/xmlLayout.1 index 24ff74cfab..8ce46bcf81 100644 --- a/tests/witness/xmlLayout.1 +++ b/tests/witness/xmlLayout.1 @@ -47,7 +47,6 @@ Date: Fri, 19 Aug 2005 21:08:42 +0000 Subject: [PATCH 168/342] Add batch file for running subset of tests on JDK 1.1 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311492 13f79535-47bb-0310-9956-ffa450edef68 --- tests/run-tests.bat | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100755 tests/run-tests.bat diff --git a/tests/run-tests.bat b/tests/run-tests.bat new file mode 100755 index 0000000000..01e71fb08c --- /dev/null +++ b/tests/run-tests.bat @@ -0,0 +1,36 @@ +' Batch file for running tests on JDK 1.1 +' +SET CLASSPATH=\java\junit3.8.1\junit.jar;\java\crimson-1.1.3\crimson.jar;\java\jakarta-oro-2.0.8\jakarta-oro-2.0.8.jar;..\dist\classes;classes;resources +java junit.textui.TestRunner org.apache.log4j.CoreTestSuite +java junit.textui.TestRunner org.apache.log4j.MinimumTestCase +java junit.textui.TestRunner org.apache.log4j.LoggerTestCase +java junit.textui.TestRunner org.apache.log4j.xml.DOMTestCase +java junit.textui.TestRunner org.apache.log4j.xml.CustomLevelTestCase +java junit.textui.TestRunner org.apache.log4j.customLogger.XLoggerTestCase +del classes\log4j.xml +del classes\log4j.properties +java junit.textui.TestRunner org.apache.log4j.defaultInit.TestCase1 +copy input\xml\defaultInit.xml classes\log4j.xml +java junit.textui.TestRunner org.apache.log4j.defaultInit.TestCase2 +del classes\log4j.xml +copy input\xml\defaultInit.xml classes\log4j.xml +java -Dlog4j.defaultInitOverride=true junit.textui.TestRunner org.apache.log4j.defaultInit.TestCase1 +del classes\log4j.xml +copy input\defaultInit3.properties classes\log4j.properties +java junit.textui.TestRunner org.apache.log4j.defaultInit.TestCase3 +del classes\log4j.properties +copy input\xml\defaultInit.xml classes\log4j.xml +copy input\defaultInit3.properties classes\log4j.properties +java junit.textui.TestRunner org.apache.log4j.defaultInit.TestCase4 +del classes\log4j.xml +del classes\log4j.properties +java junit.textui.TestRunner org.apache.log4j.xml.XMLLayoutTestCase +java junit.textui.TestRunner org.apache.log4j.AsyncAppenderTestCase +java junit.textui.TestRunner org.apache.log4j.helpers.OptionConverterTestCase +java junit.textui.TestRunner org.apache.log4j.helpers.BoundedFIFOTestCase +java junit.textui.TestRunner org.apache.log4j.helpers.CyclicBufferTestCase +java junit.textui.TestRunner org.apache.log4j.or.ORTestCase +java junit.textui.TestRunner org.apache.log4j.varia.LevelMatchFilterTestCase +java junit.textui.TestRunner org.apache.log4j.helpers.PatternParserTestCase +java junit.textui.TestRunner org.apache.log4j.PatternLayoutTestCase +java junit.textui.TestRunner org.apache.log4j.DRFATestCase From f5eb78e44198fd86c88da2162da633590285c847 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 20 Aug 2005 00:50:23 +0000 Subject: [PATCH 169/342] Add JDK 1.1 compatible test compilation git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311493 13f79535-47bb-0310-9956-ffa450edef68 --- tests/run-tests.bat | 48 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/tests/run-tests.bat b/tests/run-tests.bat index 01e71fb08c..437d1c99c2 100755 --- a/tests/run-tests.bat +++ b/tests/run-tests.bat @@ -1,6 +1,52 @@ ' Batch file for running tests on JDK 1.1 ' -SET CLASSPATH=\java\junit3.8.1\junit.jar;\java\crimson-1.1.3\crimson.jar;\java\jakarta-oro-2.0.8\jakarta-oro-2.0.8.jar;..\dist\classes;classes;resources +SET CLASSPATH=\java\junit3.8.1\junit.jar;\java\crimson-1.1.3\crimson.jar;\java\jakarta-oro-2.0.8\jakarta-oro-2.0.8.jar;..\dist\classes;classes;..\..\classes;resources;%log4j.jar% +mkdir classes +cd src\java +javac -d ..\..\classes org\apache\log4j\util\SerializationTestHelper.java +javac -d ..\..\classes org\apache\log4j\spi\LoggingEventTest.java +javac -d ..\..\classes org\apache\log4j\LevelTest.java +javac -d ..\..\classes org\apache\log4j\FileAppenderTest.java +javac -d ..\..\classes org\apache\log4j\CoreTestSuite.java +javac -d ..\..\classes org\apache\log4j\util\UnexpectedFormatException.java +javac -d ..\..\classes org\apache\log4j\util\Filter.java +javac -d ..\..\classes org\apache\log4j\util\Compare.java +javac -d ..\..\classes org\apache\log4j\util\ControlFilter.java +javac -d ..\..\classes org\apache\log4j\util\Transformer.java +javac -d ..\..\classes org\apache\log4j\util\LineNumberFilter.java +javac -d ..\..\classes org\apache\log4j\util\AbsoluteDateAndTimeFilter.java +javac -d ..\..\classes org\apache\log4j\MinimumTestCase.java +javac -d ..\..\classes org\apache\log4j\VectorAppender.java +javac -d ..\..\classes org\apache\log4j\LoggerTestCase.java +javac -d ..\..\classes org\apache\log4j\util\ISO8601Filter.java +javac -d ..\..\classes org\apache\log4j\util\SunReflectFilter.java +javac -d ..\..\classes org\apache\log4j\util\JunitTestRunnerFilter.java +javac -d ..\..\classes org\apache\log4j\xml\DOMTestCase.java +javac -d ..\..\classes org\apache\log4j\xml\XLevel.java +javac -d ..\..\classes org\apache\log4j\xml\CustomLevelTestCase.java +javac -d ..\..\classes org\apache\log4j\customLogger\XLogger.java +javac -d ..\..\classes org\apache\log4j\customLogger\XLoggerTestCase.java +javac -d ..\..\classes org\apache\log4j\defaultInit\TestCase1.java +javac -d ..\..\classes org\apache\log4j\defaultInit\TestCase3.java +javac -d ..\..\classes org\apache\log4j\defaultInit\TestCase4.java +javac -d ..\..\classes org\apache\log4j\util\XMLTimestampFilter.java +javac -d ..\..\classes org\apache\log4j\util\XMLLineAttributeFilter.java +javac -d ..\..\classes org\apache\log4j\xml\XMLLayoutTestCase.java +javac -d ..\..\classes org\apache\log4j\AsyncAppenderTestCase.java +javac -d ..\..\classes org\apache\log4j\helpers\OptionConverterTestCase.java +javac -d ..\..\classes org\apache\log4j\helpers\BoundedFIFOTestCase.java +javac -d ..\..\classes org\apache\log4j\helpers\CyclicBufferTestCase.java +javac -d ..\..\classes org\apache\log4j\or\ORTestCase.java +javac -d ..\..\classes org\apache\log4j\varia\LevelMatchFilterTestCase.java +javac -d ..\..\classes org\apache\log4j\helpers\PatternParserTestCase.java +javac -d ..\..\classes org\apache\log4j\util\AbsoluteTimeFilter.java +javac -d ..\..\classes org\apache\log4j\util\RelativeTimeFilter.java +javac -d ..\..\classes org\apache\log4j\PatternLayoutTestCase.java +javac -d ..\..\classes org\apache\log4j\MyPatternParser.java +javac -d ..\..\classes org\apache\log4j\MyPatternLayout.java +javac -d ..\..\classes org\apache\log4j\DRFATestCase.java +cd ..\.. +mkdir output java junit.textui.TestRunner org.apache.log4j.CoreTestSuite java junit.textui.TestRunner org.apache.log4j.MinimumTestCase java junit.textui.TestRunner org.apache.log4j.LoggerTestCase From 54c07cb0cceba51a482cd08b577332cd5d2e9788 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 20 Aug 2005 00:58:48 +0000 Subject: [PATCH 170/342] Bug 36283: Change build and HISTORY in anticipation of log4j 1.2.12 release next week git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311494 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/HISTORY.txt | 16 ++-------------- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/build.xml b/build.xml index d765ee8fd9..adc4ac9420 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 58be319bf7..f65ab9def8 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,7 +5,7 @@ client code. [***] Changes requiring important modifications to existing client code. - TODO - + August 26th, 2005 - Release of version 1.2.12 @@ -19,17 +19,9 @@ - Fixed bug 36213 by removing references to obsolete documentation. - August 7th, 2005 - - - Release of version 1.2.12rc3 - - Fixed bug 35965 by adding protected accessors for member variables topicConnection, topicSession, and topicPublisher. [*] - August 1st, 2005 - - - Release of version 1.2.12rc2 - - Fixed bug 34026, SyslogAppender now checks Layout.ignoresThrowable() just like every other appender. [*] @@ -41,10 +33,6 @@ for the XML sample files. http://issues.apache.org/bugzilla/show_bug.cgi?id=14551 [*] - July 27th, 2005 - - - Release of version 1.2.12rc1 - - Added getNext/setNext methods to org.apache.log4j.spi.Filter and deprecated public "next" field. This mirrors the same change in the upcoming 1.3 version and, hence, provides a migration path. [*] @@ -83,7 +71,7 @@ June 18th, 2005 - Release of version 1.2.11 - + - Fixed bug #34491 whereby the class o.a.log4j.or.jms.MessageRenderer would not be compiled in the build.jms target. Bug reported by Andy McBride. http://issues.apache.org/bugzilla/show_bug.cgi?id=34491 [*] From 0d9c908b9d195846db7873bdb84c88d25f4164b1 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 22 Aug 2005 20:51:34 +0000 Subject: [PATCH 171/342] Bug 36268: Add post-build check for optional parts in release, fix jmx location. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311496 13f79535-47bb-0310-9956-ffa450edef68 --- build.properties.sample | 2 +- build.xml | 30 ++++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/build.properties.sample b/build.properties.sample index ceec3069ce..a6efc67d55 100644 --- a/build.properties.sample +++ b/build.properties.sample @@ -26,7 +26,7 @@ jms.jar=${lib.home.dir}/jms1.1/lib/jms.jar # Required to build the org.apache.log4j.jmx package. jmx.home.dir=${lib.home.dir}/jmx-1_2_1-bin jmx.jar=${jmx.home.dir}/lib/jmxri.jar -jmx-extra.jar=${jmx.home.dir}/jmx/lib/jmxtools.jar +jmx-extra.jar=${jmx.home.dir}/lib/jmxtools.jar jndi.jar=${lib.home.dir}/jndi-1_2_1/lib/jndi.jar # Required to run Checkstyle. Available from http://checkstyle.sf.net diff --git a/build.xml b/build.xml index adc4ac9420..4e3698a27e 100644 --- a/build.xml +++ b/build.xml @@ -132,14 +132,12 @@ - - - - - + - + + @@ -624,6 +622,26 @@ + + + + + + + + + + + From db9fda752257303b57cb28c2d5dcc18a86f31c9b Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Tue, 23 Aug 2005 05:26:57 +0000 Subject: [PATCH 172/342] Fix for bug #34981. Prepping build.xml for rc5 version. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311497 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/HISTORY.txt | 5 ++++- src/java/org/apache/log4j/nt/nteventlog.cpp | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/build.xml b/build.xml index 4e3698a27e..a509830936 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index f65ab9def8..0fd6047ff6 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,7 +5,7 @@ client code. [***] Changes requiring important modifications to existing client code. - August 26th, 2005 + August TBD, 2005 - Release of version 1.2.12 @@ -67,6 +67,9 @@ - Fixed bug 35893 by adding log4j 1.1 compatibility method to o.a.l.helpers.Loader. [*] + + - Fixed bug 34981 dealing with additional null terminating character in Windows + nteventlog.cpp code. No effect on Java related code. [*] June 18th, 2005 diff --git a/src/java/org/apache/log4j/nt/nteventlog.cpp b/src/java/org/apache/log4j/nt/nteventlog.cpp index b771b8a673..2ad1adec4c 100644 --- a/src/java/org/apache/log4j/nt/nteventlog.cpp +++ b/src/java/org/apache/log4j/nt/nteventlog.cpp @@ -129,7 +129,7 @@ HKEY regGetKey(TCHAR *subkey, DWORD *disposition) { } void regSetString(HKEY hkey, TCHAR *name, TCHAR *value) { - RegSetValueEx(hkey, name, 0, REG_SZ, (LPBYTE)value, lstrlen(value)); + RegSetValueEx(hkey, name, 0, REG_SZ, (LPBYTE)value, lstrlen(value) + sizeof(TCHAR)); } void regSetDword(HKEY hkey, TCHAR *name, DWORD value) { From c374c51da045a9c2ad5b728953b1b0c1f68de39c Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Wed, 24 Aug 2005 04:32:28 +0000 Subject: [PATCH 173/342] Fix for bug #36332. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311499 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 6 +++--- docs/HISTORY.txt | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build.xml b/build.xml index a509830936..f9fd0b9227 100644 --- a/build.xml +++ b/build.xml @@ -1,6 +1,6 @@ - + @@ -17,7 +17,7 @@ - + @@ -434,7 +434,7 @@ header="<b>Log4j ${version}</b>" bottom="Copyright 2000-2005 Apache Software Foundation."> - + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 0fd6047ff6..fa06d10130 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -70,6 +70,8 @@ - Fixed bug 34981 dealing with additional null terminating character in Windows nteventlog.cpp code. No effect on Java related code. [*] + + - Fixed bug 36332, broken links to J2SE classes in javadocs. [*] June 18th, 2005 From 4ec61ff5c97ded5b732a69b3090203087b0ad7d1 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Wed, 24 Aug 2005 04:56:50 +0000 Subject: [PATCH 174/342] Adding more detailed info about the build dependencies. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311500 13f79535-47bb-0310-9956-ffa450edef68 --- BUILD-INFO.txt | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 BUILD-INFO.txt diff --git a/BUILD-INFO.txt b/BUILD-INFO.txt new file mode 100644 index 0000000000..67f07e33a1 --- /dev/null +++ b/BUILD-INFO.txt @@ -0,0 +1,39 @@ +This is the build information for the current log4j release. It contains the +versions of tools and jars used to build this version of the log4j library. + +Ant - v1.6.4; Available from http://ant.apache.org +JDK - jdk1.3.1_16; Available from http://java.sun.com/j2se/1.3/index.jsp + + +External jar dependencies - These projects were used in compiling the log4j +classes. The locations of their jars can be set in the build.properties file, +a sample of which can be duplicated from the file build.properties.sample. + +XML (jaxp.jaxp.jar) - Crimson 1.1.3; Available from + http://xml.apache.org/crimson/ + +Java Mail (javamail.jar) - v1.3.2; Available from + http://java.sun.com/products/javamail/ + +JavaBeans Activation Framework (activation.jar) - v1.0.2; Available from + http://java.sun.com/products/javabeans/jaf/index.jsp + +JMS (jms.jar) - v1.1; Available from + http://java.sun.com/products/jms/docs.html + +JMX (jmx.jar, jmx-extra.jar) - v1.2; Available from + http://java.sun.com/products/JavaManagement/index.jsp + +JNDI (jndi.jar) - v1.2.1; Available from + http://java.sun.com/products/jndi/downloads/ + + +External jar dependencies for unit tests - These jars are used as part of the +unit testing. + +JUnit - v3.8.1; Available from http://junit.org + +Jakarta ORO (jakarta.oro.jar) - v2.0.8; + Available from http://jakarta.apache.org/oro/ + +Clover (clover.jar) - v1.3.8; Available from http://www.cenqua.com/clover/ From f27254fe31a2a1315f7527c59b5340b5430cb13c Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 26 Aug 2005 03:11:33 +0000 Subject: [PATCH 175/342] Mod tests for JDK 1.1, arbibrary log4j, second try git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311502 13f79535-47bb-0310-9956-ffa450edef68 --- tests/build.properties.sample | 6 +- tests/build.xml | 12 +- .../org/apache/log4j/FileAppenderTest.java | 22 ++-- .../src/java/org/apache/log4j/LevelTest.java | 8 +- .../log4j/helpers/PatternParserTestCase.java | 7 +- .../log4j/net/SocketServerTestCase.java | 111 +++++++++++------- 6 files changed, 107 insertions(+), 59 deletions(-) diff --git a/tests/build.properties.sample b/tests/build.properties.sample index 8941457478..0b64f0bbb1 100644 --- a/tests/build.properties.sample +++ b/tests/build.properties.sample @@ -14,8 +14,10 @@ jaxp.jaxp.jar=${jaxp.home}/crimson.jar jaxp.parser.jar=${jaxp.home}/crimson.jar jakarta.oro.jar=${lib.home.dir}/jakarta-oro-2.0.8/jakarta-oro-2.0.8.jar -clover.jar="${lib.home.dir}/clover-1.3.8/lib/clover.jar +clover.jar=${lib.home.dir}/clover-1.3.8/lib/clover.jar deprecation=on -# junit must be on the classpath! It can't be handled as a property. +# junit must be on the classpath or specified with -lib +# only needs to be set here for JDK 1.1. +junit.jar=${lib.home.dir}/junit3.8.1/junit.jar diff --git a/tests/build.xml b/tests/build.xml index 2ed2458f66..31449caf09 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -1,6 +1,6 @@ - + @@ -28,6 +28,7 @@ + @@ -37,6 +38,8 @@ + + @@ -60,6 +63,9 @@ regression - Run regression tests which check large parts of log4j. runAll - run all available tests + + Specify the log4j.jar property to test an arbitrary jar, + otherwise the parent log4j will be built and tested. @@ -70,7 +76,7 @@ - + @@ -79,7 +85,7 @@ - + diff --git a/tests/src/java/org/apache/log4j/FileAppenderTest.java b/tests/src/java/org/apache/log4j/FileAppenderTest.java index 0799de08f1..a0ee2bdf1f 100644 --- a/tests/src/java/org/apache/log4j/FileAppenderTest.java +++ b/tests/src/java/org/apache/log4j/FileAppenderTest.java @@ -32,16 +32,20 @@ public class FileAppenderTest extends TestCase { * */ public void testDirectoryCreation() { - File newFile = new File("output/newdir/temp.log"); - newFile.delete(); - File newDir = new File("output/newdir"); - newDir.delete(); + // + // known to fail on JDK 1.1 + if (!System.getProperty("java.version").startsWith("1.1.")) { + File newFile = new File("output/newdir/temp.log"); + newFile.delete(); + File newDir = new File("output/newdir"); + newDir.delete(); - org.apache.log4j.FileAppender wa = new org.apache.log4j.FileAppender(); - wa.setFile("output/newdir/temp.log"); - wa.setLayout(new PatternLayout("%m%n")); - wa.activateOptions(); + org.apache.log4j.FileAppender wa = new org.apache.log4j.FileAppender(); + wa.setFile("output/newdir/temp.log"); + wa.setLayout(new PatternLayout("%m%n")); + wa.activateOptions(); - assertTrue(new File("output/newdir/temp.log").exists()); + assertTrue(new File("output/newdir/temp.log").exists()); + } } } diff --git a/tests/src/java/org/apache/log4j/LevelTest.java b/tests/src/java/org/apache/log4j/LevelTest.java index abf9438cdc..b9718115d2 100644 --- a/tests/src/java/org/apache/log4j/LevelTest.java +++ b/tests/src/java/org/apache/log4j/LevelTest.java @@ -56,7 +56,13 @@ public void testDeserializeINFO() throws Exception { SerializationTestHelper.deserializeStream( "witness/serialization/info.bin"); assertTrue(obj instanceof Level); - assertTrue(obj == Level.INFO); + Level info = (Level) obj; + assertEquals("INFO", info.toString()); + // + // JDK 1.1 doesn't support readResolve necessary for the assertion + if (!System.getProperty("java.version").startsWith("1.1.")) { + assertTrue(obj == Level.INFO); + } } /** diff --git a/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java b/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java index 316ee9df8b..e288f90c5c 100644 --- a/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java @@ -123,7 +123,12 @@ public void mdcPattern() throws Exception { public static Test suite() { TestSuite suite = new TestSuite(); - suite.addTest(new PatternParserTestCase("mdcPattern")); + // + // MDC requires JDK 1.2+ + // + if (!System.getProperty("java.version").startsWith("1.1.")) { + suite.addTest(new PatternParserTestCase("mdcPattern")); + } return suite; } diff --git a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java index 825dfde720..3423701e23 100644 --- a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java +++ b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java @@ -187,16 +187,21 @@ public void test4() throws Exception { common("T4", "key4", "MDC-TEST4"); NDC.pop(); delay(1); - ControlFilter cf = new ControlFilter(new String[]{PAT4, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + // + // These tests check MDC operation which + // requires JDK 1.2 or later + if(!System.getProperty("java.version").startsWith("1.1.")) { - Transformer.transform( - TEMP, FILTERED, - new Filter[] { cf, new LineNumberFilter(), - new JunitTestRunnerFilter(), - new SunReflectFilter() }); - - assertTrue(Compare.compare(FILTERED, "witness/socketServer.4")); + ControlFilter cf = new ControlFilter(new String[]{PAT4, EXCEPTION1, + EXCEPTION2, EXCEPTION3, EXCEPTION4}); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); + + assertTrue(Compare.compare(FILTERED, "witness/socketServer.4")); + } } /** @@ -225,16 +230,21 @@ public void test5() throws Exception { common("T5", "key5", "MDC-TEST5"); NDC.pop(); delay(2); - ControlFilter cf = new ControlFilter(new String[]{PAT5, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + // + // These tests check MDC operation which + // requires JDK 1.2 or later + if(!System.getProperty("java.version").startsWith("1.1.")) { + ControlFilter cf = new ControlFilter(new String[]{PAT5, EXCEPTION1, + EXCEPTION2, EXCEPTION3, EXCEPTION4}); - Transformer.transform( - TEMP, FILTERED, - new Filter[] { cf, new LineNumberFilter(), - new JunitTestRunnerFilter(), - new SunReflectFilter() }); - - assertTrue(Compare.compare(FILTERED, "witness/socketServer.5")); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); + + assertTrue(Compare.compare(FILTERED, "witness/socketServer.5")); + } } /** @@ -257,16 +267,21 @@ public void test6() throws Exception { NDC.pop(); MDC.remove("hostID"); delay(2); - ControlFilter cf = new ControlFilter(new String[]{PAT6, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + // + // These tests check MDC operation which + // requires JDK 1.2 or later + if(!System.getProperty("java.version").startsWith("1.1.")) { + ControlFilter cf = new ControlFilter(new String[]{PAT6, EXCEPTION1, + EXCEPTION2, EXCEPTION3, EXCEPTION4}); - Transformer.transform( - TEMP, FILTERED, - new Filter[] { cf, new LineNumberFilter(), - new JunitTestRunnerFilter(), - new SunReflectFilter() }); - - assertTrue(Compare.compare(FILTERED, "witness/socketServer.6")); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); + + assertTrue(Compare.compare(FILTERED, "witness/socketServer.6")); + } } /** @@ -285,15 +300,20 @@ public void test7() throws Exception { NDC.pop(); MDC.remove("hostID"); delay(2); - ControlFilter cf = new ControlFilter(new String[]{PAT7, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + // + // These tests check MDC operation which + // requires JDK 1.2 or later + if(!System.getProperty("java.version").startsWith("1.1.")) { + ControlFilter cf = new ControlFilter(new String[]{PAT7, EXCEPTION1, + EXCEPTION2, EXCEPTION3, EXCEPTION4}); - Transformer.transform( - TEMP, FILTERED, - new Filter[] { cf, new LineNumberFilter(), - new JunitTestRunnerFilter(), - new SunReflectFilter() }); - assertTrue(Compare.compare(FILTERED, "witness/socketServer.7")); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); + assertTrue(Compare.compare(FILTERED, "witness/socketServer.7")); + } } /** @@ -310,15 +330,20 @@ public void test8() throws Exception { common("T8", "key8", "MDC-TEST8"); NDC.pop(); delay(2); - ControlFilter cf = new ControlFilter(new String[]{PAT8, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + // + // These tests check MDC operation which + // requires JDK 1.2 or later + if(!System.getProperty("java.version").startsWith("1.1.")) { + ControlFilter cf = new ControlFilter(new String[]{PAT8, EXCEPTION1, + EXCEPTION2, EXCEPTION3, EXCEPTION4}); - Transformer.transform( - TEMP, FILTERED, - new Filter[] { cf, new LineNumberFilter(), - new JunitTestRunnerFilter(), - new SunReflectFilter() }); - assertTrue(Compare.compare(FILTERED, "witness/socketServer.8")); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { cf, new LineNumberFilter(), + new JunitTestRunnerFilter(), + new SunReflectFilter() }); + assertTrue(Compare.compare(FILTERED, "witness/socketServer.8")); + } } static From 3465277eaabe7dff12a095f858d34f5cf8481859 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Sat, 27 Aug 2005 20:40:57 +0000 Subject: [PATCH 176/342] Prepping for 1.2.12 final build. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311503 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/HISTORY.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.xml b/build.xml index f9fd0b9227..bc2d9f95c2 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index fa06d10130..9f16cbc54c 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,7 +5,7 @@ client code. [***] Changes requiring important modifications to existing client code. - August TBD, 2005 + August 27th, 2005 - Release of version 1.2.12 From 0538ec8a64d2b8894bfe80c86da8169c5e4ada90 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Tue, 30 Aug 2005 05:26:03 +0000 Subject: [PATCH 177/342] Updating date for 1.2.12 release. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@311504 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 9f16cbc54c..5936057fe0 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,7 +5,7 @@ client code. [***] Changes requiring important modifications to existing client code. - August 27th, 2005 + August 29th, 2005 - Release of version 1.2.12 From a228572273adb5decc75c366f4b05b623ae2ab2b Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Fri, 14 Oct 2005 05:46:48 +0000 Subject: [PATCH 178/342] Fix for bug 36800 plus extended test cases to cover. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@321020 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/Logger.java | 4 +- tests/input/patternLayout1.properties | 2 +- tests/input/patternLayout10.properties | 2 +- tests/input/patternLayout11.properties | 2 +- tests/input/patternLayout12.properties | 2 +- tests/input/patternLayout13.properties | 2 +- tests/input/patternLayout14.properties | 2 +- tests/input/patternLayout2.properties | 2 +- tests/input/patternLayout3.properties | 2 +- tests/input/patternLayout4.properties | 2 +- tests/input/patternLayout5.properties | 2 +- tests/input/patternLayout6.properties | 2 +- tests/input/patternLayout7.properties | 2 +- tests/input/patternLayout8.properties | 2 +- tests/input/patternLayout9.properties | 2 +- .../apache/log4j/PatternLayoutTestCase.java | 20 +++++---- tests/witness/patternLayout.1 | 44 ++++++++++++------- tests/witness/patternLayout.10 | 44 ++++++++++++------- tests/witness/patternLayout.11 | 44 ++++++++++++------- tests/witness/patternLayout.12 | 44 ++++++++++++------- tests/witness/patternLayout.13 | 44 ++++++++++++------- tests/witness/patternLayout.14 | 44 ++++++++++++------- tests/witness/patternLayout.2 | 44 ++++++++++++------- tests/witness/patternLayout.3 | 44 ++++++++++++------- tests/witness/patternLayout.4 | 44 ++++++++++++------- tests/witness/patternLayout.5 | 44 ++++++++++++------- tests/witness/patternLayout.6 | 44 ++++++++++++------- tests/witness/patternLayout.7 | 44 ++++++++++++------- tests/witness/patternLayout.8 | 44 ++++++++++++------- tests/witness/patternLayout.9 | 44 ++++++++++++------- 30 files changed, 434 insertions(+), 234 deletions(-) diff --git a/src/java/org/apache/log4j/Logger.java b/src/java/org/apache/log4j/Logger.java index f8467319d5..67c4f2f531 100644 --- a/src/java/org/apache/log4j/Logger.java +++ b/src/java/org/apache/log4j/Logger.java @@ -30,9 +30,9 @@ public class Logger extends Category { /** - The fully qualified name of the Level class. See also the + The fully qualified name of the Logger class. See also the getFQCN method. */ - private static final String FQCN = Level.class.getName(); + private static final String FQCN = Logger.class.getName(); protected diff --git a/tests/input/patternLayout1.properties b/tests/input/patternLayout1.properties index 28dcfd0210..1e50266e42 100644 --- a/tests/input/patternLayout1.properties +++ b/tests/input/patternLayout1.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File=output/temp log4j.appender.testAppender.Append=false diff --git a/tests/input/patternLayout10.properties b/tests/input/patternLayout10.properties index a137a7e8e2..ac729acf92 100644 --- a/tests/input/patternLayout10.properties +++ b/tests/input/patternLayout10.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File= output/temp log4j.appender.testAppender.Append= false diff --git a/tests/input/patternLayout11.properties b/tests/input/patternLayout11.properties index af739f6cdf..e3bcfec9af 100644 --- a/tests/input/patternLayout11.properties +++ b/tests/input/patternLayout11.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File=output/temp log4j.appender.testAppender.Append=false diff --git a/tests/input/patternLayout12.properties b/tests/input/patternLayout12.properties index acc45d3311..37c829b7e2 100644 --- a/tests/input/patternLayout12.properties +++ b/tests/input/patternLayout12.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File=output/temp log4j.appender.testAppender.Append=false diff --git a/tests/input/patternLayout13.properties b/tests/input/patternLayout13.properties index 15a00762e8..54be2123ce 100644 --- a/tests/input/patternLayout13.properties +++ b/tests/input/patternLayout13.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File= output/temp log4j.appender.testAppender.Append=false diff --git a/tests/input/patternLayout14.properties b/tests/input/patternLayout14.properties index 479d4c504c..fb4f8636f8 100644 --- a/tests/input/patternLayout14.properties +++ b/tests/input/patternLayout14.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File= output/temp log4j.appender.testAppender.Append=false diff --git a/tests/input/patternLayout2.properties b/tests/input/patternLayout2.properties index 1e286f6ebf..7d0081baab 100644 --- a/tests/input/patternLayout2.properties +++ b/tests/input/patternLayout2.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File=output/temp log4j.appender.testAppender.Append= false diff --git a/tests/input/patternLayout3.properties b/tests/input/patternLayout3.properties index f606740b37..1390a60c3b 100644 --- a/tests/input/patternLayout3.properties +++ b/tests/input/patternLayout3.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File=output/temp log4j.appender.testAppender.Append=false diff --git a/tests/input/patternLayout4.properties b/tests/input/patternLayout4.properties index 49cc887927..f220c7d658 100644 --- a/tests/input/patternLayout4.properties +++ b/tests/input/patternLayout4.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File=output/temp log4j.appender.testAppender.Append=false diff --git a/tests/input/patternLayout5.properties b/tests/input/patternLayout5.properties index 84caecd83f..f10b8321be 100644 --- a/tests/input/patternLayout5.properties +++ b/tests/input/patternLayout5.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File=output/temp log4j.appender.testAppender.Append=false diff --git a/tests/input/patternLayout6.properties b/tests/input/patternLayout6.properties index 529c856ab5..5dcff9b323 100644 --- a/tests/input/patternLayout6.properties +++ b/tests/input/patternLayout6.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File=output/temp log4j.appender.testAppender.Append=false diff --git a/tests/input/patternLayout7.properties b/tests/input/patternLayout7.properties index 789dcce737..811caa842c 100644 --- a/tests/input/patternLayout7.properties +++ b/tests/input/patternLayout7.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File=output/temp log4j.appender.testAppender.Append=false diff --git a/tests/input/patternLayout8.properties b/tests/input/patternLayout8.properties index 3fbef7bcbb..1b08d57c5a 100644 --- a/tests/input/patternLayout8.properties +++ b/tests/input/patternLayout8.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File=output/temp log4j.appender.testAppender.Append=false diff --git a/tests/input/patternLayout9.properties b/tests/input/patternLayout9.properties index 2551500d79..138e95d61f 100644 --- a/tests/input/patternLayout9.properties +++ b/tests/input/patternLayout9.properties @@ -1,4 +1,4 @@ -log4j.rootCategory=DEBUG, testAppender +log4j.rootCategory=TRACE, testAppender log4j.appender.testAppender=org.apache.log4j.FileAppender log4j.appender.testAppender.File=output/temp log4j.appender.testAppender.Append=false diff --git a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java index 34cb4ccb48..0d80064337 100644 --- a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java @@ -50,27 +50,27 @@ public class PatternLayoutTestCase extends TestCase { static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; static String EXCEPTION4 = "\\s*at .*\\(.*Compiled Code\\)"; - static String PAT0 = "\\[main]\\ (DEBUG|INFO|WARN|ERROR|FATAL) .* - Message \\d{1,2}"; + static String PAT0 = "\\[main]\\ (TRACE|DEBUG|INFO |WARN |ERROR|FATAL) .* - Message \\d{1,2}"; static String PAT1 = Filter.ISO8601_PAT + " " + PAT0; static String PAT2 = Filter.ABSOLUTE_DATE_AND_TIME_PAT+ " " + PAT0; static String PAT3 = Filter.ABSOLUTE_TIME_PAT+ " " + PAT0; static String PAT4 = Filter.RELATIVE_TIME_PAT+ " " + PAT0; - static String PAT5 = "\\[main]\\ (DEBUG|INFO|WARN|ERROR|FATAL) .* : Message \\d{1,2}"; - static String PAT6 = "\\[main]\\ (DEBUG|INFO |WARN |ERROR|FATAL) org.apache.log4j.PatternLayoutTestCase.common\\(PatternLayoutTestCase.java:\\d{1,4}\\): Message \\d{1,2}"; + static String PAT5 = "\\[main]\\ (TRACE|DEBUG|INFO |WARN |ERROR|FATAL) .* : Message \\d{1,2}"; + static String PAT6 = "\\[main]\\ (TRACE|DEBUG|INFO |WARN |ERROR|FATAL) org.apache.log4j.PatternLayoutTestCase.common\\(PatternLayoutTestCase.java:\\d{1,4}\\): Message \\d{1,2}"; - static String PAT11a = "^(DEBUG|INFO |WARN |ERROR|FATAL) \\[main]\\ log4j.PatternLayoutTestCase: Message \\d{1,2}"; - static String PAT11b = "^(DEBUG|INFO |WARN |ERROR|FATAL) \\[main]\\ root: Message \\d{1,2}"; + static String PAT11a = "^(TRACE|DEBUG|INFO |WARN |ERROR|FATAL) \\[main]\\ log4j.PatternLayoutTestCase: Message \\d{1,2}"; + static String PAT11b = "^(TRACE|DEBUG|INFO |WARN |ERROR|FATAL) \\[main]\\ root: Message \\d{1,2}"; - static String PAT12 = "^\\[main]\\ (DEBUG|INFO |WARN |ERROR|FATAL) "+ + static String PAT12 = "^\\[main]\\ (TRACE|DEBUG|INFO |WARN |ERROR|FATAL) "+ "org.apache.log4j.PatternLayoutTestCase.common\\(PatternLayoutTestCase.java:\\d{3}\\): "+ "Message \\d{1,2}"; - static String PAT13 = "^\\[main]\\ (DEBUG|INFO |WARN |ERROR|FATAL) "+ + static String PAT13 = "^\\[main]\\ (TRACE|DEBUG|INFO |WARN |ERROR|FATAL) "+ "apache.log4j.PatternLayoutTestCase.common\\(PatternLayoutTestCase.java:\\d{3}\\): "+ "Message \\d{1,2}"; - static String PAT14 = "^(DEBUG| INFO| WARN|ERROR|FATAL)\\ \\d{1,2}\\ *- Message \\d{1,2}"; + static String PAT14 = "^(TRACE|DEBUG| INFO| WARN|ERROR|FATAL)\\ \\d{1,2}\\ *- Message \\d{1,2}"; public PatternLayoutTestCase(String name) { super(name); @@ -286,6 +286,9 @@ cf1, new LineNumberFilter(), new SunReflectFilter(), void common() { int i = -1; + logger.trace("Message " + ++i); + root.trace("Message " + i); + logger.debug("Message " + ++i); root.debug("Message " + i); @@ -302,6 +305,7 @@ void common() { root.log(Level.FATAL, "Message " + i); Exception e = new Exception("Just testing"); + logger.trace("Message " + ++i, e); logger.debug("Message " + ++i, e); logger.info("Message " + ++i, e); logger.warn("Message " + ++i , e); diff --git a/tests/witness/patternLayout.1 b/tests/witness/patternLayout.1 index 9b0f704e36..263f242977 100644 --- a/tests/witness/patternLayout.1 +++ b/tests/witness/patternLayout.1 @@ -1,14 +1,16 @@ -DEBUG - Message 0 -DEBUG - Message 0 -INFO - Message 1 -INFO - Message 1 -WARN - Message 2 -WARN - Message 2 -ERROR - Message 3 -ERROR - Message 3 -FATAL - Message 4 -FATAL - Message 4 -DEBUG - Message 5 +TRACE - Message 0 +TRACE - Message 0 +DEBUG - Message 1 +DEBUG - Message 1 +INFO - Message 2 +INFO - Message 2 +WARN - Message 3 +WARN - Message 3 +ERROR - Message 4 +ERROR - Message 4 +FATAL - Message 5 +FATAL - Message 5 +TRACE - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test1(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -INFO - Message 6 +DEBUG - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test1(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -WARN - Message 7 +INFO - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test1(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR - Message 8 +WARN - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test1(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -FATAL - Message 9 +ERROR - Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test1(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) +FATAL - Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test1(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.10 b/tests/witness/patternLayout.10 index 2e807a3471..46fce63db2 100644 --- a/tests/witness/patternLayout.10 +++ b/tests/witness/patternLayout.10 @@ -1,14 +1,16 @@ -[main] DEBUG org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 0 -[main] DEBUG org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 0 -[main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 1 -[main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 1 -[main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 2 -[main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 2 -[main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 3 -[main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 3 -[main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 4 -[main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 4 -[main] DEBUG org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 5 +[main] TRACE org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 0 +[main] TRACE org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 0 +[main] DEBUG org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 1 +[main] DEBUG org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 1 +[main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 2 +[main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 2 +[main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 3 +[main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 3 +[main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 4 +[main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 4 +[main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 5 +[main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 5 +[main] TRACE org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test10(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 6 +[main] DEBUG org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test10(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 7 +[main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test10(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 8 +[main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test10(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 9 +[main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test10(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) +[main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test10(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.11 b/tests/witness/patternLayout.11 index b4826afc7e..6a91cc54d7 100644 --- a/tests/witness/patternLayout.11 +++ b/tests/witness/patternLayout.11 @@ -1,14 +1,16 @@ -DEBUG [main] log4j.PatternLayoutTestCase: Message 0 -DEBUG [main] root: Message 0 -INFO [main] log4j.PatternLayoutTestCase: Message 1 -INFO [main] root: Message 1 -WARN [main] log4j.PatternLayoutTestCase: Message 2 -WARN [main] root: Message 2 -ERROR [main] log4j.PatternLayoutTestCase: Message 3 -ERROR [main] root: Message 3 -FATAL [main] log4j.PatternLayoutTestCase: Message 4 -FATAL [main] root: Message 4 -DEBUG [main] log4j.PatternLayoutTestCase: Message 5 +TRACE [main] log4j.PatternLayoutTestCase: Message 0 +TRACE [main] root: Message 0 +DEBUG [main] log4j.PatternLayoutTestCase: Message 1 +DEBUG [main] root: Message 1 +INFO [main] log4j.PatternLayoutTestCase: Message 2 +INFO [main] root: Message 2 +WARN [main] log4j.PatternLayoutTestCase: Message 3 +WARN [main] root: Message 3 +ERROR [main] log4j.PatternLayoutTestCase: Message 4 +ERROR [main] root: Message 4 +FATAL [main] log4j.PatternLayoutTestCase: Message 5 +FATAL [main] root: Message 5 +TRACE [main] log4j.PatternLayoutTestCase: Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test11(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -INFO [main] log4j.PatternLayoutTestCase: Message 6 +DEBUG [main] log4j.PatternLayoutTestCase: Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test11(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -WARN [main] log4j.PatternLayoutTestCase: Message 7 +INFO [main] log4j.PatternLayoutTestCase: Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test11(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR [main] log4j.PatternLayoutTestCase: Message 8 +WARN [main] log4j.PatternLayoutTestCase: Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test11(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -FATAL [main] log4j.PatternLayoutTestCase: Message 9 +ERROR [main] log4j.PatternLayoutTestCase: Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test11(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) +FATAL [main] log4j.PatternLayoutTestCase: Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test11(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.12 b/tests/witness/patternLayout.12 index 122f0a0168..374f54a6bf 100644 --- a/tests/witness/patternLayout.12 +++ b/tests/witness/patternLayout.12 @@ -1,14 +1,16 @@ -[main] DEBUG org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 0 -[main] DEBUG org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 0 -[main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 1 -[main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 1 -[main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 2 -[main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 2 -[main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 3 -[main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 3 -[main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 4 -[main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 4 -[main] DEBUG org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 5 +[main] TRACE org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 0 +[main] TRACE org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 0 +[main] DEBUG org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 1 +[main] DEBUG org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 1 +[main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 2 +[main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 2 +[main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 3 +[main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 3 +[main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 4 +[main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 4 +[main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 5 +[main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 5 +[main] TRACE org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test12(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 6 +[main] DEBUG org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test12(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 7 +[main] INFO org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test12(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 8 +[main] WARN org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test12(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 9 +[main] ERROR org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test12(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) +[main] FATAL org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test12(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.13 b/tests/witness/patternLayout.13 index be148f425e..a359f35761 100644 --- a/tests/witness/patternLayout.13 +++ b/tests/witness/patternLayout.13 @@ -1,14 +1,16 @@ -[main] DEBUG apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 0 -[main] DEBUG apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 0 -[main] INFO apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 1 -[main] INFO apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 1 -[main] WARN apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 2 -[main] WARN apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 2 -[main] ERROR apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 3 -[main] ERROR apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 3 -[main] FATAL apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 4 -[main] FATAL apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 4 -[main] DEBUG apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 5 +[main] TRACE apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 0 +[main] TRACE apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 0 +[main] DEBUG apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 1 +[main] DEBUG apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 1 +[main] INFO apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 2 +[main] INFO apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 2 +[main] WARN apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 3 +[main] WARN apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 3 +[main] ERROR apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 4 +[main] ERROR apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 4 +[main] FATAL apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 5 +[main] FATAL apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 5 +[main] TRACE apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test13(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] INFO apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 6 +[main] DEBUG apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test13(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] WARN apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 7 +[main] INFO apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test13(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] ERROR apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 8 +[main] WARN apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test13(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] FATAL apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 9 +[main] ERROR apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test13(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) +[main] FATAL apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX): Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test13(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.14 b/tests/witness/patternLayout.14 index 9ce6a2ae88..df0ebbdfa5 100644 --- a/tests/witness/patternLayout.14 +++ b/tests/witness/patternLayout.14 @@ -1,14 +1,16 @@ -DEBUG 1 - Message 0 -DEBUG 2 - Message 0 - INFO 3 - Message 1 - INFO 4 - Message 1 - WARN 5 - Message 2 - WARN 6 - Message 2 -ERROR 7 - Message 3 -ERROR 8 - Message 3 -FATAL 9 - Message 4 -FATAL 10 - Message 4 -DEBUG 11 - Message 5 +TRACE 1 - Message 0 +TRACE 2 - Message 0 +DEBUG 3 - Message 1 +DEBUG 4 - Message 1 + INFO 5 - Message 2 + INFO 6 - Message 2 + WARN 7 - Message 3 + WARN 8 - Message 3 +ERROR 9 - Message 4 +ERROR 10 - Message 4 +FATAL 11 - Message 5 +FATAL 12 - Message 5 +TRACE 13 - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test14(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - INFO 12 - Message 6 +DEBUG 14 - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test14(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - WARN 13 - Message 7 + INFO 15 - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test14(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR 14 - Message 8 + WARN 16 - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test14(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -FATAL 15 - Message 9 +ERROR 17 - Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test14(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) +FATAL 18 - Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test14(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.2 b/tests/witness/patternLayout.2 index 98752c168f..82e6336909 100644 --- a/tests/witness/patternLayout.2 +++ b/tests/witness/patternLayout.2 @@ -1,14 +1,16 @@ - [main] DEBUG rnLayoutTestCase - Message 0 - [main] DEBUG root - Message 0 - [main] INFO rnLayoutTestCase - Message 1 - [main] INFO root - Message 1 - [main] WARN rnLayoutTestCase - Message 2 - [main] WARN root - Message 2 - [main] ERROR rnLayoutTestCase - Message 3 - [main] ERROR root - Message 3 - [main] FATAL rnLayoutTestCase - Message 4 - [main] FATAL root - Message 4 - [main] DEBUG rnLayoutTestCase - Message 5 + [main] TRACE rnLayoutTestCase - Message 0 + [main] TRACE root - Message 0 + [main] DEBUG rnLayoutTestCase - Message 1 + [main] DEBUG root - Message 1 + [main] INFO rnLayoutTestCase - Message 2 + [main] INFO root - Message 2 + [main] WARN rnLayoutTestCase - Message 3 + [main] WARN root - Message 3 + [main] ERROR rnLayoutTestCase - Message 4 + [main] ERROR root - Message 4 + [main] FATAL rnLayoutTestCase - Message 5 + [main] FATAL root - Message 5 + [main] TRACE rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test2(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] INFO rnLayoutTestCase - Message 6 + [main] DEBUG rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test2(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] WARN rnLayoutTestCase - Message 7 + [main] INFO rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test2(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] ERROR rnLayoutTestCase - Message 8 + [main] WARN rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test2(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] FATAL rnLayoutTestCase - Message 9 + [main] ERROR rnLayoutTestCase - Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test2(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + [main] FATAL rnLayoutTestCase - Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test2(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.3 b/tests/witness/patternLayout.3 index d18cfcbce4..b30661136a 100644 --- a/tests/witness/patternLayout.3 +++ b/tests/witness/patternLayout.3 @@ -1,14 +1,16 @@ - [main] DEBUG rnLayoutTestCase - Message 0 - [main] DEBUG root - Message 0 - [main] INFO rnLayoutTestCase - Message 1 - [main] INFO root - Message 1 - [main] WARN rnLayoutTestCase - Message 2 - [main] WARN root - Message 2 - [main] ERROR rnLayoutTestCase - Message 3 - [main] ERROR root - Message 3 - [main] FATAL rnLayoutTestCase - Message 4 - [main] FATAL root - Message 4 - [main] DEBUG rnLayoutTestCase - Message 5 + [main] TRACE rnLayoutTestCase - Message 0 + [main] TRACE root - Message 0 + [main] DEBUG rnLayoutTestCase - Message 1 + [main] DEBUG root - Message 1 + [main] INFO rnLayoutTestCase - Message 2 + [main] INFO root - Message 2 + [main] WARN rnLayoutTestCase - Message 3 + [main] WARN root - Message 3 + [main] ERROR rnLayoutTestCase - Message 4 + [main] ERROR root - Message 4 + [main] FATAL rnLayoutTestCase - Message 5 + [main] FATAL root - Message 5 + [main] TRACE rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test3(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] INFO rnLayoutTestCase - Message 6 + [main] DEBUG rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test3(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] WARN rnLayoutTestCase - Message 7 + [main] INFO rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test3(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] ERROR rnLayoutTestCase - Message 8 + [main] WARN rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test3(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] FATAL rnLayoutTestCase - Message 9 + [main] ERROR rnLayoutTestCase - Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test3(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + [main] FATAL rnLayoutTestCase - Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test3(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.4 b/tests/witness/patternLayout.4 index 5ffff24fcf..b807e55b95 100644 --- a/tests/witness/patternLayout.4 +++ b/tests/witness/patternLayout.4 @@ -1,14 +1,16 @@ - [main] DEBUG rnLayoutTestCase - Message 0 - [main] DEBUG root - Message 0 - [main] INFO rnLayoutTestCase - Message 1 - [main] INFO root - Message 1 - [main] WARN rnLayoutTestCase - Message 2 - [main] WARN root - Message 2 - [main] ERROR rnLayoutTestCase - Message 3 - [main] ERROR root - Message 3 - [main] FATAL rnLayoutTestCase - Message 4 - [main] FATAL root - Message 4 - [main] DEBUG rnLayoutTestCase - Message 5 + [main] TRACE rnLayoutTestCase - Message 0 + [main] TRACE root - Message 0 + [main] DEBUG rnLayoutTestCase - Message 1 + [main] DEBUG root - Message 1 + [main] INFO rnLayoutTestCase - Message 2 + [main] INFO root - Message 2 + [main] WARN rnLayoutTestCase - Message 3 + [main] WARN root - Message 3 + [main] ERROR rnLayoutTestCase - Message 4 + [main] ERROR root - Message 4 + [main] FATAL rnLayoutTestCase - Message 5 + [main] FATAL root - Message 5 + [main] TRACE rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test4(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] INFO rnLayoutTestCase - Message 6 + [main] DEBUG rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test4(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] WARN rnLayoutTestCase - Message 7 + [main] INFO rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test4(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] ERROR rnLayoutTestCase - Message 8 + [main] WARN rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test4(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] FATAL rnLayoutTestCase - Message 9 + [main] ERROR rnLayoutTestCase - Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test4(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + [main] FATAL rnLayoutTestCase - Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test4(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.5 b/tests/witness/patternLayout.5 index e8eead0320..e45c5cbc03 100644 --- a/tests/witness/patternLayout.5 +++ b/tests/witness/patternLayout.5 @@ -1,14 +1,16 @@ - [main] DEBUG rnLayoutTestCase - Message 0 - [main] DEBUG root - Message 0 - [main] INFO rnLayoutTestCase - Message 1 - [main] INFO root - Message 1 - [main] WARN rnLayoutTestCase - Message 2 - [main] WARN root - Message 2 - [main] ERROR rnLayoutTestCase - Message 3 - [main] ERROR root - Message 3 - [main] FATAL rnLayoutTestCase - Message 4 - [main] FATAL root - Message 4 - [main] DEBUG rnLayoutTestCase - Message 5 + [main] TRACE rnLayoutTestCase - Message 0 + [main] TRACE root - Message 0 + [main] DEBUG rnLayoutTestCase - Message 1 + [main] DEBUG root - Message 1 + [main] INFO rnLayoutTestCase - Message 2 + [main] INFO root - Message 2 + [main] WARN rnLayoutTestCase - Message 3 + [main] WARN root - Message 3 + [main] ERROR rnLayoutTestCase - Message 4 + [main] ERROR root - Message 4 + [main] FATAL rnLayoutTestCase - Message 5 + [main] FATAL root - Message 5 + [main] TRACE rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test5(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] INFO rnLayoutTestCase - Message 6 + [main] DEBUG rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test5(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] WARN rnLayoutTestCase - Message 7 + [main] INFO rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test5(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] ERROR rnLayoutTestCase - Message 8 + [main] WARN rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test5(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] FATAL rnLayoutTestCase - Message 9 + [main] ERROR rnLayoutTestCase - Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test5(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + [main] FATAL rnLayoutTestCase - Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test5(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.6 b/tests/witness/patternLayout.6 index 8ae7e98513..6140e468ea 100644 --- a/tests/witness/patternLayout.6 +++ b/tests/witness/patternLayout.6 @@ -1,14 +1,16 @@ - [main] DEBUG rnLayoutTestCase - Message 0 - [main] DEBUG root - Message 0 - [main] INFO rnLayoutTestCase - Message 1 - [main] INFO root - Message 1 - [main] WARN rnLayoutTestCase - Message 2 - [main] WARN root - Message 2 - [main] ERROR rnLayoutTestCase - Message 3 - [main] ERROR root - Message 3 - [main] FATAL rnLayoutTestCase - Message 4 - [main] FATAL root - Message 4 - [main] DEBUG rnLayoutTestCase - Message 5 + [main] TRACE rnLayoutTestCase - Message 0 + [main] TRACE root - Message 0 + [main] DEBUG rnLayoutTestCase - Message 1 + [main] DEBUG root - Message 1 + [main] INFO rnLayoutTestCase - Message 2 + [main] INFO root - Message 2 + [main] WARN rnLayoutTestCase - Message 3 + [main] WARN root - Message 3 + [main] ERROR rnLayoutTestCase - Message 4 + [main] ERROR root - Message 4 + [main] FATAL rnLayoutTestCase - Message 5 + [main] FATAL root - Message 5 + [main] TRACE rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test6(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] INFO rnLayoutTestCase - Message 6 + [main] DEBUG rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test6(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] WARN rnLayoutTestCase - Message 7 + [main] INFO rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test6(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] ERROR rnLayoutTestCase - Message 8 + [main] WARN rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test6(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] FATAL rnLayoutTestCase - Message 9 + [main] ERROR rnLayoutTestCase - Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test6(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + [main] FATAL rnLayoutTestCase - Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test6(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.7 b/tests/witness/patternLayout.7 index 5bffb74164..7a802bc49d 100644 --- a/tests/witness/patternLayout.7 +++ b/tests/witness/patternLayout.7 @@ -1,14 +1,16 @@ - [main] DEBUG rnLayoutTestCase - Message 0 - [main] DEBUG root - Message 0 - [main] INFO rnLayoutTestCase - Message 1 - [main] INFO root - Message 1 - [main] WARN rnLayoutTestCase - Message 2 - [main] WARN root - Message 2 - [main] ERROR rnLayoutTestCase - Message 3 - [main] ERROR root - Message 3 - [main] FATAL rnLayoutTestCase - Message 4 - [main] FATAL root - Message 4 - [main] DEBUG rnLayoutTestCase - Message 5 + [main] TRACE rnLayoutTestCase - Message 0 + [main] TRACE root - Message 0 + [main] DEBUG rnLayoutTestCase - Message 1 + [main] DEBUG root - Message 1 + [main] INFO rnLayoutTestCase - Message 2 + [main] INFO root - Message 2 + [main] WARN rnLayoutTestCase - Message 3 + [main] WARN root - Message 3 + [main] ERROR rnLayoutTestCase - Message 4 + [main] ERROR root - Message 4 + [main] FATAL rnLayoutTestCase - Message 5 + [main] FATAL root - Message 5 + [main] TRACE rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test7(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] INFO rnLayoutTestCase - Message 6 + [main] DEBUG rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test7(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] WARN rnLayoutTestCase - Message 7 + [main] INFO rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test7(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] ERROR rnLayoutTestCase - Message 8 + [main] WARN rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test7(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] FATAL rnLayoutTestCase - Message 9 + [main] ERROR rnLayoutTestCase - Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test7(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + [main] FATAL rnLayoutTestCase - Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test7(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.8 b/tests/witness/patternLayout.8 index accb13021d..30cb5cb584 100644 --- a/tests/witness/patternLayout.8 +++ b/tests/witness/patternLayout.8 @@ -1,14 +1,16 @@ - [main] DEBUG rnLayoutTestCase - Message 0 - [main] DEBUG root - Message 0 - [main] INFO rnLayoutTestCase - Message 1 - [main] INFO root - Message 1 - [main] WARN rnLayoutTestCase - Message 2 - [main] WARN root - Message 2 - [main] ERROR rnLayoutTestCase - Message 3 - [main] ERROR root - Message 3 - [main] FATAL rnLayoutTestCase - Message 4 - [main] FATAL root - Message 4 - [main] DEBUG rnLayoutTestCase - Message 5 + [main] TRACE rnLayoutTestCase - Message 0 + [main] TRACE root - Message 0 + [main] DEBUG rnLayoutTestCase - Message 1 + [main] DEBUG root - Message 1 + [main] INFO rnLayoutTestCase - Message 2 + [main] INFO root - Message 2 + [main] WARN rnLayoutTestCase - Message 3 + [main] WARN root - Message 3 + [main] ERROR rnLayoutTestCase - Message 4 + [main] ERROR root - Message 4 + [main] FATAL rnLayoutTestCase - Message 5 + [main] FATAL root - Message 5 + [main] TRACE rnLayoutTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test8(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] INFO rnLayoutTestCase - Message 6 + [main] DEBUG rnLayoutTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test8(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] WARN rnLayoutTestCase - Message 7 + [main] INFO rnLayoutTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test8(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] ERROR rnLayoutTestCase - Message 8 + [main] WARN rnLayoutTestCase - Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test8(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] FATAL rnLayoutTestCase - Message 9 + [main] ERROR rnLayoutTestCase - Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test8(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) + [main] FATAL rnLayoutTestCase - Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test8(PatternLayoutTestCase.java:XXX) diff --git a/tests/witness/patternLayout.9 b/tests/witness/patternLayout.9 index eb52808d8b..7b54f6da0f 100644 --- a/tests/witness/patternLayout.9 +++ b/tests/witness/patternLayout.9 @@ -1,14 +1,16 @@ -[main] DEBUG rnLayoutTestCase : Message 0 -[main] DEBUG root : Message 0 -[main] INFO rnLayoutTestCase : Message 1 -[main] INFO root : Message 1 -[main] WARN rnLayoutTestCase : Message 2 -[main] WARN root : Message 2 -[main] ERROR rnLayoutTestCase : Message 3 -[main] ERROR root : Message 3 -[main] FATAL rnLayoutTestCase : Message 4 -[main] FATAL root : Message 4 -[main] DEBUG rnLayoutTestCase : Message 5 +[main] TRACE rnLayoutTestCase : Message 0 +[main] TRACE root : Message 0 +[main] DEBUG rnLayoutTestCase : Message 1 +[main] DEBUG root : Message 1 +[main] INFO rnLayoutTestCase : Message 2 +[main] INFO root : Message 2 +[main] WARN rnLayoutTestCase : Message 3 +[main] WARN root : Message 3 +[main] ERROR rnLayoutTestCase : Message 4 +[main] ERROR root : Message 4 +[main] FATAL rnLayoutTestCase : Message 5 +[main] FATAL root : Message 5 +[main] TRACE rnLayoutTestCase : Message 6 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test9(PatternLayoutTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] INFO rnLayoutTestCase : Message 6 +[main] DEBUG rnLayoutTestCase : Message 7 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test9(PatternLayoutTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] WARN rnLayoutTestCase : Message 7 +[main] INFO rnLayoutTestCase : Message 8 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test9(PatternLayoutTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] ERROR rnLayoutTestCase : Message 8 +[main] WARN rnLayoutTestCase : Message 9 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test9(PatternLayoutTestCase.java:XXX) @@ -56,7 +58,19 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -[main] FATAL rnLayoutTestCase : Message 9 +[main] ERROR rnLayoutTestCase : Message 10 +java.lang.Exception: Just testing + at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) + at org.apache.log4j.PatternLayoutTestCase.test9(PatternLayoutTestCase.java:XXX) + at junit.framework.TestCase.runTest(TestCase.java:XXX) + at junit.framework.TestCase.runBare(TestCase.java:XXX) + at junit.framework.TestResult$1.protect(TestResult.java:XXX) + at junit.framework.TestResult.runProtected(TestResult.java:XXX) + at junit.framework.TestResult.run(TestResult.java:XXX) + at junit.framework.TestCase.run(TestCase.java:XXX) + at junit.framework.TestSuite.runTest(TestSuite.java:XXX) + at junit.framework.TestSuite.run(TestSuite.java:XXX) +[main] FATAL rnLayoutTestCase : Message 11 java.lang.Exception: Just testing at org.apache.log4j.PatternLayoutTestCase.common(PatternLayoutTestCase.java:XXX) at org.apache.log4j.PatternLayoutTestCase.test9(PatternLayoutTestCase.java:XXX) From 84193ee4c23b68fc0ba31f0ece98b902a8ee8825 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 19 Oct 2005 16:28:19 +0000 Subject: [PATCH 179/342] Bug 37122: Console redirction in 1.2.12 causes infinite loop in JBoss git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@326599 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/ConsoleAppender.java | 46 +++++++++++++++++-- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/log4j/ConsoleAppender.java b/src/java/org/apache/log4j/ConsoleAppender.java index c0b6530b8a..e6b2c05161 100644 --- a/src/java/org/apache/log4j/ConsoleAppender.java +++ b/src/java/org/apache/log4j/ConsoleAppender.java @@ -35,6 +35,12 @@ public class ConsoleAppender extends WriterAppender { protected String target = SYSTEM_OUT; + /** + * Determines if the appender honors reassignments of System.out + * or System.err made after configuration. + */ + private boolean honorReassignment = false; + /** * Constructs an unconfigured appender. */ @@ -89,6 +95,28 @@ void setTarget(String value) { String getTarget() { return target; } + + /** + * Sets whether the appender honors reassignments of System.out + * or System.err made after configuration. + * @param newValue if true, appender will use value of System.out or + * System.err in force at the time when logging events are appended. + * @since 1.2.13 + */ + public final void setHonorReassignment(final boolean newValue) { + honorReassignment = newValue; + } + + /** + * Gets whether the appender honors reassignments of System.out + * or System.err made after configuration. + * @return true if appender will use value of System.out or + * System.err in force at the time when logging events are appended. + * @since 1.2.13 + */ + public final boolean getHonorReassignment() { + return honorReassignment; + } void targetWarn(String val) { LogLog.warn("["+val+"] should be System.out or System.err."); @@ -99,10 +127,18 @@ void targetWarn(String val) { * Prepares the appender for use. */ public void activateOptions() { - if (target.equals(SYSTEM_ERR)) { - setWriter(createWriter(new SystemErrStream())); + if (honorReassignment) { + if (target.equals(SYSTEM_ERR)) { + setWriter(createWriter(new SystemErrStream())); + } else { + setWriter(createWriter(new SystemOutStream())); + } } else { - setWriter(createWriter(new SystemOutStream())); + if (target.equals(SYSTEM_ERR)) { + setWriter(createWriter(System.err)); + } else { + setWriter(createWriter(System.out)); + } } super.activateOptions(); @@ -114,7 +150,9 @@ public void activateOptions() { protected final void closeWriter() { - super.closeWriter(); + if (honorReassignment) { + super.closeWriter(); + } } From c82cc4ba16a78bdb6f05b17fbadc24d0677efdb9 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Thu, 20 Oct 2005 05:25:38 +0000 Subject: [PATCH 180/342] Expanded coverage for TRACE level in various test cases git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@326828 13f79535-47bb-0310-9956-ffa450edef68 --- tests/input/socketServer1.properties | 2 +- tests/input/socketServer2.properties | 2 +- tests/input/socketServer3.properties | 2 +- tests/input/socketServer4.properties | 2 +- tests/input/socketServer5.properties | 2 +- tests/input/socketServer6.properties | 2 +- tests/input/socketServer7.properties | 2 +- tests/input/socketServer8.properties | 2 +- tests/input/xml/DOMTest4.xml | 4 +- tests/input/xml/DOMTestCase1.xml | 4 +- .../org/apache/log4j/MinimumTestCase.java | 27 +++++++--- .../log4j/net/SocketServerTestCase.java | 25 +++++++--- .../log4j/varia/LevelMatchFilterTestCase.java | 9 ++-- .../org/apache/log4j/xml/DOMTestCase.java | 9 ++-- .../apache/log4j/xml/XMLLayoutTestCase.java | 8 ++- tests/witness/LevelMatchFilter_accept | 11 ++-- tests/witness/LevelMatchFilter_deny | 50 +++++++++++-------- tests/witness/dom.A1.1 | 45 +++++++++-------- tests/witness/dom.A1.4 | 45 +++++++++-------- tests/witness/dom.A2.1 | 30 +++++------ tests/witness/dom.A2.4 | 30 +++++------ tests/witness/simple | 8 ++- tests/witness/socketServer.1 | 16 +++--- tests/witness/socketServer.2 | 16 +++--- tests/witness/socketServer.3 | 16 +++--- tests/witness/socketServer.4 | 16 +++--- tests/witness/socketServer.5 | 16 +++--- tests/witness/socketServer.6 | 16 +++--- tests/witness/socketServer.7 | 16 +++--- tests/witness/socketServer.8 | 16 +++--- tests/witness/ttcc | 18 ++++--- tests/witness/xmlLayout.1 | 36 +++++++------ tests/witness/xmlLayout.2 | 38 ++++++++------ tests/witness/xmlLayout.3 | 5 ++ 34 files changed, 324 insertions(+), 222 deletions(-) diff --git a/tests/input/socketServer1.properties b/tests/input/socketServer1.properties index c1d478524e..406bcec7a7 100644 --- a/tests/input/socketServer1.properties +++ b/tests/input/socketServer1.properties @@ -1,4 +1,4 @@ -log4j.rootLogger=DEBUG, A +log4j.rootLogger=TRACE, A log4j.logger.org.apache.log4j.test.ShortSocketServer=WARN log4j.logger.org.apache.log4j.net.SocketNode=WARN log4j.appender.A=org.apache.log4j.FileAppender diff --git a/tests/input/socketServer2.properties b/tests/input/socketServer2.properties index 5e6cd2c312..0eb0898529 100644 --- a/tests/input/socketServer2.properties +++ b/tests/input/socketServer2.properties @@ -1,4 +1,4 @@ -log4j.rootLogger=DEBUG, A +log4j.rootLogger=TRACE, A log4j.logger.org.apache.log4j.test.ShortSocketServer=WARN log4j.logger.org.apache.log4j.net.SocketNode=WARN log4j.appender.A=org.apache.log4j.FileAppender diff --git a/tests/input/socketServer3.properties b/tests/input/socketServer3.properties index c19530172c..406b6d2135 100644 --- a/tests/input/socketServer3.properties +++ b/tests/input/socketServer3.properties @@ -1,4 +1,4 @@ -log4j.rootLogger=DEBUG, A +log4j.rootLogger=TRACE, A log4j.Logger.org.apache.log4j.test.ShortSocketServer=WARN log4j.Logger.org.apache.log4j.net.SocketNode=WARN log4j.appender.A=org.apache.log4j.FileAppender diff --git a/tests/input/socketServer4.properties b/tests/input/socketServer4.properties index 6d8001ba51..dcb7619aeb 100644 --- a/tests/input/socketServer4.properties +++ b/tests/input/socketServer4.properties @@ -1,4 +1,4 @@ -log4j.rootLogger=DEBUG, A +log4j.rootLogger=TRACE, A log4j.Logger.org.apache.log4j.test.ShortSocketServer=WARN log4j.Logger.org.apache.log4j.net.SocketNode=WARN log4j.appender.A=org.apache.log4j.FileAppender diff --git a/tests/input/socketServer5.properties b/tests/input/socketServer5.properties index 9772442e8d..152964dba8 100644 --- a/tests/input/socketServer5.properties +++ b/tests/input/socketServer5.properties @@ -1,4 +1,4 @@ -log4j.rootLogger=DEBUG, A +log4j.rootLogger=TRACE, A log4j.Logger.org.apache.log4j.test.ShortSocketServer=WARN log4j.Logger.org.apache.log4j.net.SocketNode=WARN log4j.appender.A=org.apache.log4j.FileAppender diff --git a/tests/input/socketServer6.properties b/tests/input/socketServer6.properties index 5c0742a922..52e36a57a4 100644 --- a/tests/input/socketServer6.properties +++ b/tests/input/socketServer6.properties @@ -1,4 +1,4 @@ -log4j.rootLogger=DEBUG, A +log4j.rootLogger=TRACE, A log4j.Logger.org.apache.log4j.test.ShortSocketServer=WARN log4j.Logger.org.apache.log4j.net.SocketNode=WARN log4j.appender.A=org.apache.log4j.FileAppender diff --git a/tests/input/socketServer7.properties b/tests/input/socketServer7.properties index ee5169df4b..4bf902877e 100644 --- a/tests/input/socketServer7.properties +++ b/tests/input/socketServer7.properties @@ -1,4 +1,4 @@ -log4j.rootLogger=DEBUG, A +log4j.rootLogger=TRACE, A log4j.Logger.org.apache.log4j.test.ShortSocketServer=WARN log4j.Logger.org.apache.log4j.net.SocketNode=WARN log4j.appender.A=org.apache.log4j.FileAppender diff --git a/tests/input/socketServer8.properties b/tests/input/socketServer8.properties index e88af64081..77dbff0916 100644 --- a/tests/input/socketServer8.properties +++ b/tests/input/socketServer8.properties @@ -1,4 +1,4 @@ -log4j.rootLogger=DEBUG, A +log4j.rootLogger=TRACE, A log4j.Logger.org.apache.log4j.test.ShortSocketServer=WARN log4j.Logger.org.apache.log4j.net.SocketNode=WARN log4j.appender.A=org.apache.log4j.FileAppender diff --git a/tests/input/xml/DOMTest4.xml b/tests/input/xml/DOMTest4.xml index 29ce949833..82efe1ee35 100644 --- a/tests/input/xml/DOMTest4.xml +++ b/tests/input/xml/DOMTest4.xml @@ -16,12 +16,12 @@ - + - + diff --git a/tests/input/xml/DOMTestCase1.xml b/tests/input/xml/DOMTestCase1.xml index 514fd0ea09..c8314ea858 100644 --- a/tests/input/xml/DOMTestCase1.xml +++ b/tests/input/xml/DOMTestCase1.xml @@ -21,12 +21,12 @@ - + - + diff --git a/tests/src/java/org/apache/log4j/MinimumTestCase.java b/tests/src/java/org/apache/log4j/MinimumTestCase.java index 0941b65f5e..9d53c3daa5 100644 --- a/tests/src/java/org/apache/log4j/MinimumTestCase.java +++ b/tests/src/java/org/apache/log4j/MinimumTestCase.java @@ -39,10 +39,10 @@ public class MinimumTestCase extends TestCase { //18 fevr. 2002 20:02:41,551 [main] FATAL ERR - Message 0 static String TTCC_PAT = Filter.ABSOLUTE_DATE_AND_TIME_PAT+ - " \\[main]\\ (DEBUG|INFO|WARN|ERROR|FATAL) .* - Message \\d{1,2}"; + " \\[main]\\ (TRACE|DEBUG|INFO|WARN|ERROR|FATAL) .* - Message \\d{1,2}"; static String TTCC2_PAT = Filter.ABSOLUTE_DATE_AND_TIME_PAT+ - " \\[main]\\ (DEBUG|INFO|WARN|ERROR|FATAL) .* - Messages should bear numbers 0 through 23\\."; + " \\[main]\\ (TRACE|DEBUG|INFO|WARN|ERROR|FATAL) .* - Messages should bear numbers 0 through 29\\."; //18 fvr. 2002 19:49:53,456 @@ -115,6 +115,8 @@ void common() { INF_ERR.setLevel(Level.ERROR); Logger DEB = Logger.getLogger("DEB"); DEB.setLevel(Level.DEBUG); + Logger TRC = Logger.getLogger("TRC"); + TRC.setLevel(Level.TRACE); // Note: categories with undefined level Logger INF_UNDEF = Logger.getLogger("INF.UNDEF"); @@ -136,26 +138,33 @@ void common() { INF_UNDEF.warn ( "Message " + i); i++; INF_UNDEF.info ( "Message " + i); i++; - INF_ERR.log(Level.FATAL, "Message " + i); i++; // 10 INF_ERR.error( "Message " + i); i++; - INF_ERR_UNDEF.log(Level.FATAL, "Message " + i); i++; + INF_ERR_UNDEF.log(Level.FATAL, "Message " + i); i++; INF_ERR_UNDEF.error( "Message " + i); i++; DEB.log(Level.FATAL, "Message " + i); i++; //14 DEB.error( "Message " + i); i++; DEB.warn ( "Message " + i); i++; DEB.info ( "Message " + i); i++; - DEB.debug( "Message " + i); i++; - + DEB.debug( "Message " + i); i++; + + TRC.log(Level.FATAL, "Message " + i); i++; //14 + TRC.error( "Message " + i); i++; + TRC.warn ( "Message " + i); i++; + TRC.info ( "Message " + i); i++; + TRC.debug( "Message " + i); i++; + TRC.trace( "Message " + i); i++; // defaultLevel=DEBUG UNDEF.log(Level.FATAL, "Message " + i); i++; // 19 UNDEF.error("Message " + i); i++; UNDEF.warn ("Message " + i); i++; UNDEF.info ("Message " + i); i++; - UNDEF.debug("Message " + i, new Exception("Just testing.")); i++; + UNDEF.debug("Message " + i, new Exception("Just testing.")); + int printCount = i; + i++; // ------------------------------------------------- // The following should not log @@ -173,9 +182,11 @@ void common() { INF_ERR_UNDEF.warn("Message " + i); i++; INF_ERR_UNDEF.info("Message " + i); i++; INF_ERR_UNDEF.debug("Message " + i); i++; + + UNDEF.trace("Message " + i, new Exception("Just testing.")); i++; // ------------------------------------------------- - INF.info("Messages should bear numbers 0 through 23."); + INF.info("Messages should bear numbers 0 through "+printCount+"."); } public static Test suite() { diff --git a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java index 3423701e23..e50b78224e 100644 --- a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java +++ b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java @@ -45,36 +45,36 @@ public class SocketServerTestCase extends TestCase { // %5p %x [%t] %c %m%n // DEBUG T1 [main] org.apache.log4j.net.SocketAppenderTestCase Message 1 - static String PAT1 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) T1 \\[main]\\ " + static String PAT1 = "^(TRACE|DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) T1 \\[main]\\ " + ".* Message \\d{1,2}"; // DEBUG T2 [main] ? (?:?) Message 1 - static String PAT2 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) T2 \\[main]\\ " + static String PAT2 = "^(TRACE|DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) T2 \\[main]\\ " + "\\? \\(\\?:\\?\\) Message \\d{1,2}"; // DEBUG T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:121) Message 1 - static String PAT3 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) T3 \\[main]\\ " + static String PAT3 = "^(TRACE|DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) T3 \\[main]\\ " + "org.apache.log4j.net.SocketServerTestCase " + "\\(SocketServerTestCase.java:\\d{3}\\) Message \\d{1,2}"; // DEBUG some T4 MDC-TEST4 [main] SocketAppenderTestCase - Message 1 // DEBUG some T4 MDC-TEST4 [main] SocketAppenderTestCase - Message 1 - static String PAT4 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some T4 MDC-TEST4 \\[main]\\" + static String PAT4 = "^(TRACE|DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some T4 MDC-TEST4 \\[main]\\" + " (root|SocketServerTestCase) - Message \\d{1,2}"; - static String PAT5 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some5 T5 MDC-TEST5 \\[main]\\" + static String PAT5 = "^(TRACE|DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some5 T5 MDC-TEST5 \\[main]\\" + " (root|SocketServerTestCase) - Message \\d{1,2}"; - static String PAT6 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some6 T6 client-test6 MDC-TEST6" + static String PAT6 = "^(TRACE|DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some6 T6 client-test6 MDC-TEST6" + " \\[main]\\ (root|SocketServerTestCase) - Message \\d{1,2}"; - static String PAT7 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some7 T7 client-test7 MDC-TEST7" + static String PAT7 = "^(TRACE|DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some7 T7 client-test7 MDC-TEST7" + " \\[main]\\ (root|SocketServerTestCase) - Message \\d{1,2}"; // DEBUG some8 T8 shortSocketServer MDC-TEST7 [main] SocketServerTestCase - Message 1 - static String PAT8 = "^(DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some8 T8 shortSocketServer" + static String PAT8 = "^(TRACE|DEBUG| INFO| WARN|ERROR|FATAL|LETHAL) some8 T8 shortSocketServer" + " MDC-TEST8 \\[main]\\ (root|SocketServerTestCase) - Message \\d{1,2}"; @@ -353,7 +353,16 @@ void common(String dc, String key, Object o) { MDC.put(key, o); Logger root = Logger.getRootLogger(); + logger.setLevel(Level.DEBUG); + rootLogger.setLevel(Level.DEBUG); + logger.log(XLevel.TRACE, "Message " + ++i); + + logger.setLevel(Level.TRACE); + rootLogger.setLevel(Level.TRACE); + + logger.trace("Message " + ++i); + root.trace("Message " + ++i); logger.debug("Message " + ++i); root.debug("Message " + ++i); logger.info("Message " + ++i); diff --git a/tests/src/java/org/apache/log4j/varia/LevelMatchFilterTestCase.java b/tests/src/java/org/apache/log4j/varia/LevelMatchFilterTestCase.java index 31b5ee1a08..164c6237e7 100644 --- a/tests/src/java/org/apache/log4j/varia/LevelMatchFilterTestCase.java +++ b/tests/src/java/org/apache/log4j/varia/LevelMatchFilterTestCase.java @@ -80,9 +80,9 @@ public void accept() throws Exception { // set appender on root and set level to debug root.addAppender(appender); - root.setLevel(Level.DEBUG); + root.setLevel(Level.TRACE); - Level[] levelArray = new Level[] {Level.DEBUG, Level.INFO, Level.WARN, + Level[] levelArray = new Level[] {Level.TRACE, Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR, Level.FATAL}; for (int x = 0; x < levelArray.length; x++) { // set the level to match @@ -110,9 +110,9 @@ public void deny() throws Exception { // set appender on root and set level to debug root.addAppender(appender); - root.setLevel(Level.DEBUG); + root.setLevel(Level.TRACE); - Level[] levelArray = new Level[] {Level.DEBUG, Level.INFO, Level.WARN, + Level[] levelArray = new Level[] {Level.TRACE, Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR, Level.FATAL}; for (int x = 0; x < levelArray.length; x++) { // set the level to match @@ -128,6 +128,7 @@ public void deny() throws Exception { void common(String msg) { Logger logger = Logger.getLogger("test"); + logger.trace(msg); logger.debug(msg); logger.info(msg); logger.warn(msg); diff --git a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java index f6465c1171..322cf579ed 100644 --- a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java @@ -45,12 +45,12 @@ public class DOMTestCase extends TestCase { static String EXCEPTION4 = "\\s*at .*\\(.*Compiled Code\\)"; static String TEST1_1A_PAT = - "(DEBUG|INFO |WARN |ERROR|FATAL) \\w*\\.\\w* - Message \\d"; + "(TRACE|DEBUG|INFO |WARN |ERROR|FATAL) \\w*\\.\\w* - Message \\d"; - static String TEST1_1B_PAT = "(DEBUG|INFO |WARN |ERROR|FATAL) root - Message \\d"; + static String TEST1_1B_PAT = "(TRACE|DEBUG|INFO |WARN |ERROR|FATAL) root - Message \\d"; static String TEST1_2_PAT = "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3} "+ - "\\[main]\\ (DEBUG|INFO|WARN|ERROR|FATAL) .* - Message \\d"; + "\\[main]\\ (TRACE|DEBUG|INFO|WARN|ERROR|FATAL) .* - Message \\d"; @@ -132,6 +132,9 @@ cf2, new LineNumberFilter(), new ISO8601Filter(), void common() { int i = -1; + logger.trace("Message " + ++i); + root.trace("Message " + i); + logger.debug("Message " + ++i); root.debug("Message " + i); diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java index cd28732b3f..cc8b656d10 100644 --- a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java @@ -48,7 +48,9 @@ public XMLLayoutTestCase(String name) { public void setUp() { root = Logger.getRootLogger(); + root.setLevel(Level.TRACE); logger = Logger.getLogger(XMLLayoutTestCase.class); + logger.setLevel(Level.TRACE); } public void tearDown() { @@ -92,6 +94,7 @@ public void testCDATA() throws Exception { xmlLayout.setLocationInfo(true); root.addAppender(new FileAppender(xmlLayout, TEMP, false)); + logger.trace("Message with embedded hi]]>."); logger.debug("Message with embedded hi]]>."); Transformer.transform( @@ -131,10 +134,13 @@ void common() { X x = new X(); + logger.trace("Message " + ++i); + root.trace("Message " + i); + logger.debug("Message " + ++i); root.debug("Message " + i); - logger.info ("Message " + ++i); + logger.info("Message " + ++i); root.info("Message " + i); logger.warn ("Message " + ++i); diff --git a/tests/witness/LevelMatchFilter_accept b/tests/witness/LevelMatchFilter_accept index a6a4d484a5..14c0b245bc 100644 --- a/tests/witness/LevelMatchFilter_accept +++ b/tests/witness/LevelMatchFilter_accept @@ -1,5 +1,6 @@ -DEBUG - pass 0; filter set to accept only DEBUG msgs -INFO - pass 1; filter set to accept only INFO msgs -WARN - pass 2; filter set to accept only WARN msgs -ERROR - pass 3; filter set to accept only ERROR msgs -FATAL - pass 4; filter set to accept only FATAL msgs +TRACE - pass 0; filter set to accept only TRACE msgs +DEBUG - pass 1; filter set to accept only DEBUG msgs +INFO - pass 2; filter set to accept only INFO msgs +WARN - pass 3; filter set to accept only WARN msgs +ERROR - pass 4; filter set to accept only ERROR msgs +FATAL - pass 5; filter set to accept only FATAL msgs diff --git a/tests/witness/LevelMatchFilter_deny b/tests/witness/LevelMatchFilter_deny index 5273424d4c..3755855736 100644 --- a/tests/witness/LevelMatchFilter_deny +++ b/tests/witness/LevelMatchFilter_deny @@ -1,20 +1,30 @@ -INFO - pass 0; filter set to deny only DEBUG msgs -WARN - pass 0; filter set to deny only DEBUG msgs -ERROR - pass 0; filter set to deny only DEBUG msgs -FATAL - pass 0; filter set to deny only DEBUG msgs -DEBUG - pass 1; filter set to deny only INFO msgs -WARN - pass 1; filter set to deny only INFO msgs -ERROR - pass 1; filter set to deny only INFO msgs -FATAL - pass 1; filter set to deny only INFO msgs -DEBUG - pass 2; filter set to deny only WARN msgs -INFO - pass 2; filter set to deny only WARN msgs -ERROR - pass 2; filter set to deny only WARN msgs -FATAL - pass 2; filter set to deny only WARN msgs -DEBUG - pass 3; filter set to deny only ERROR msgs -INFO - pass 3; filter set to deny only ERROR msgs -WARN - pass 3; filter set to deny only ERROR msgs -FATAL - pass 3; filter set to deny only ERROR msgs -DEBUG - pass 4; filter set to deny only FATAL msgs -INFO - pass 4; filter set to deny only FATAL msgs -WARN - pass 4; filter set to deny only FATAL msgs -ERROR - pass 4; filter set to deny only FATAL msgs +DEBUG - pass 0; filter set to deny only TRACE msgs +INFO - pass 0; filter set to deny only TRACE msgs +WARN - pass 0; filter set to deny only TRACE msgs +ERROR - pass 0; filter set to deny only TRACE msgs +FATAL - pass 0; filter set to deny only TRACE msgs +TRACE - pass 1; filter set to deny only DEBUG msgs +INFO - pass 1; filter set to deny only DEBUG msgs +WARN - pass 1; filter set to deny only DEBUG msgs +ERROR - pass 1; filter set to deny only DEBUG msgs +FATAL - pass 1; filter set to deny only DEBUG msgs +TRACE - pass 2; filter set to deny only INFO msgs +DEBUG - pass 2; filter set to deny only INFO msgs +WARN - pass 2; filter set to deny only INFO msgs +ERROR - pass 2; filter set to deny only INFO msgs +FATAL - pass 2; filter set to deny only INFO msgs +TRACE - pass 3; filter set to deny only WARN msgs +DEBUG - pass 3; filter set to deny only WARN msgs +INFO - pass 3; filter set to deny only WARN msgs +ERROR - pass 3; filter set to deny only WARN msgs +FATAL - pass 3; filter set to deny only WARN msgs +TRACE - pass 4; filter set to deny only ERROR msgs +DEBUG - pass 4; filter set to deny only ERROR msgs +INFO - pass 4; filter set to deny only ERROR msgs +WARN - pass 4; filter set to deny only ERROR msgs +FATAL - pass 4; filter set to deny only ERROR msgs +TRACE - pass 5; filter set to deny only FATAL msgs +DEBUG - pass 5; filter set to deny only FATAL msgs +INFO - pass 5; filter set to deny only FATAL msgs +WARN - pass 5; filter set to deny only FATAL msgs +ERROR - pass 5; filter set to deny only FATAL msgs diff --git a/tests/witness/dom.A1.1 b/tests/witness/dom.A1.1 index bd25935ca5..0c619b6a1a 100644 --- a/tests/witness/dom.A1.1 +++ b/tests/witness/dom.A1.1 @@ -1,19 +1,22 @@ -DEBUG xml.DOMTestCase - Message 0 -DEBUG xml.DOMTestCase - Message 0 -DEBUG root - Message 0 -INFO xml.DOMTestCase - Message 1 -INFO xml.DOMTestCase - Message 1 -INFO root - Message 1 -WARN xml.DOMTestCase - Message 2 -WARN xml.DOMTestCase - Message 2 -WARN root - Message 2 -ERROR xml.DOMTestCase - Message 3 -ERROR xml.DOMTestCase - Message 3 -ERROR root - Message 3 -FATAL xml.DOMTestCase - Message 4 -FATAL xml.DOMTestCase - Message 4 -FATAL root - Message 4 -DEBUG xml.DOMTestCase - Message 5 +TRACE xml.DOMTestCase - Message 0 +TRACE xml.DOMTestCase - Message 0 +TRACE root - Message 0 +DEBUG xml.DOMTestCase - Message 1 +DEBUG xml.DOMTestCase - Message 1 +DEBUG root - Message 1 +INFO xml.DOMTestCase - Message 2 +INFO xml.DOMTestCase - Message 2 +INFO root - Message 2 +WARN xml.DOMTestCase - Message 3 +WARN xml.DOMTestCase - Message 3 +WARN root - Message 3 +ERROR xml.DOMTestCase - Message 4 +ERROR xml.DOMTestCase - Message 4 +ERROR root - Message 4 +FATAL xml.DOMTestCase - Message 5 +FATAL xml.DOMTestCase - Message 5 +FATAL root - Message 5 +DEBUG xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) @@ -25,7 +28,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -DEBUG xml.DOMTestCase - Message 5 +DEBUG xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) @@ -37,7 +40,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -DEBUG root - Message 5 +DEBUG root - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) @@ -49,7 +52,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR xml.DOMTestCase - Message 6 +ERROR xml.DOMTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) @@ -61,7 +64,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR xml.DOMTestCase - Message 6 +ERROR xml.DOMTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) @@ -73,7 +76,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR root - Message 6 +ERROR root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) diff --git a/tests/witness/dom.A1.4 b/tests/witness/dom.A1.4 index 23b25382bd..5e961105d4 100644 --- a/tests/witness/dom.A1.4 +++ b/tests/witness/dom.A1.4 @@ -1,19 +1,22 @@ -DEBUG xml.DOMTestCase - Message 0 -DEBUG xml.DOMTestCase - Message 0 -DEBUG root - Message 0 -INFO xml.DOMTestCase - Message 1 -INFO xml.DOMTestCase - Message 1 -INFO root - Message 1 -WARN xml.DOMTestCase - Message 2 -WARN xml.DOMTestCase - Message 2 -WARN root - Message 2 -ERROR xml.DOMTestCase - Message 3 -ERROR xml.DOMTestCase - Message 3 -ERROR root - Message 3 -FATAL xml.DOMTestCase - Message 4 -FATAL xml.DOMTestCase - Message 4 -FATAL root - Message 4 -DEBUG xml.DOMTestCase - Message 5 +TRACE xml.DOMTestCase - Message 0 +TRACE xml.DOMTestCase - Message 0 +TRACE root - Message 0 +DEBUG xml.DOMTestCase - Message 1 +DEBUG xml.DOMTestCase - Message 1 +DEBUG root - Message 1 +INFO xml.DOMTestCase - Message 2 +INFO xml.DOMTestCase - Message 2 +INFO root - Message 2 +WARN xml.DOMTestCase - Message 3 +WARN xml.DOMTestCase - Message 3 +WARN root - Message 3 +ERROR xml.DOMTestCase - Message 4 +ERROR xml.DOMTestCase - Message 4 +ERROR root - Message 4 +FATAL xml.DOMTestCase - Message 5 +FATAL xml.DOMTestCase - Message 5 +FATAL root - Message 5 +DEBUG xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) @@ -25,7 +28,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -DEBUG xml.DOMTestCase - Message 5 +DEBUG xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) @@ -37,7 +40,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -DEBUG root - Message 5 +DEBUG root - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) @@ -49,7 +52,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR xml.DOMTestCase - Message 6 +ERROR xml.DOMTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) @@ -61,7 +64,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR xml.DOMTestCase - Message 6 +ERROR xml.DOMTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) @@ -73,7 +76,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR root - Message 6 +ERROR root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) diff --git a/tests/witness/dom.A2.1 b/tests/witness/dom.A2.1 index 31fa30eb96..e04b617d85 100644 --- a/tests/witness/dom.A2.1 +++ b/tests/witness/dom.A2.1 @@ -1,14 +1,16 @@ - [main] DEBUG org.apache.log4j.xml.DOMTestCase - Message 0 - [main] DEBUG root - Message 0 - [main] INFO org.apache.log4j.xml.DOMTestCase - Message 1 - [main] INFO root - Message 1 - [main] WARN org.apache.log4j.xml.DOMTestCase - Message 2 - [main] WARN root - Message 2 - [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 3 - [main] ERROR root - Message 3 - [main] FATAL org.apache.log4j.xml.DOMTestCase - Message 4 - [main] FATAL root - Message 4 - [main] DEBUG org.apache.log4j.xml.DOMTestCase - Message 5 + [main] TRACE org.apache.log4j.xml.DOMTestCase - Message 0 + [main] TRACE root - Message 0 + [main] DEBUG org.apache.log4j.xml.DOMTestCase - Message 1 + [main] DEBUG root - Message 1 + [main] INFO org.apache.log4j.xml.DOMTestCase - Message 2 + [main] INFO root - Message 2 + [main] WARN org.apache.log4j.xml.DOMTestCase - Message 3 + [main] WARN root - Message 3 + [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 4 + [main] ERROR root - Message 4 + [main] FATAL org.apache.log4j.xml.DOMTestCase - Message 5 + [main] FATAL root - Message 5 + [main] DEBUG org.apache.log4j.xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] DEBUG root - Message 5 + [main] DEBUG root - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 6 + [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] ERROR root - Message 6 + [main] ERROR root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test1(DOMTestCase.java:XXX) diff --git a/tests/witness/dom.A2.4 b/tests/witness/dom.A2.4 index 1b35efb132..6444feeeb7 100644 --- a/tests/witness/dom.A2.4 +++ b/tests/witness/dom.A2.4 @@ -1,14 +1,16 @@ - [main] DEBUG org.apache.log4j.xml.DOMTestCase - Message 0 - [main] DEBUG root - Message 0 - [main] INFO org.apache.log4j.xml.DOMTestCase - Message 1 - [main] INFO root - Message 1 - [main] WARN org.apache.log4j.xml.DOMTestCase - Message 2 - [main] WARN root - Message 2 - [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 3 - [main] ERROR root - Message 3 - [main] FATAL org.apache.log4j.xml.DOMTestCase - Message 4 - [main] FATAL root - Message 4 - [main] DEBUG org.apache.log4j.xml.DOMTestCase - Message 5 + [main] TRACE org.apache.log4j.xml.DOMTestCase - Message 0 + [main] TRACE root - Message 0 + [main] DEBUG org.apache.log4j.xml.DOMTestCase - Message 1 + [main] DEBUG root - Message 1 + [main] INFO org.apache.log4j.xml.DOMTestCase - Message 2 + [main] INFO root - Message 2 + [main] WARN org.apache.log4j.xml.DOMTestCase - Message 3 + [main] WARN root - Message 3 + [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 4 + [main] ERROR root - Message 4 + [main] FATAL org.apache.log4j.xml.DOMTestCase - Message 5 + [main] FATAL root - Message 5 + [main] DEBUG org.apache.log4j.xml.DOMTestCase - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) @@ -20,7 +22,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] DEBUG root - Message 5 + [main] DEBUG root - Message 6 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) @@ -32,7 +34,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 6 + [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 7 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) @@ -44,7 +46,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] ERROR root - Message 6 + [main] ERROR root - Message 7 java.lang.Exception: Just testing at org.apache.log4j.xml.DOMTestCase.common(DOMTestCase.java:XXX) at org.apache.log4j.xml.DOMTestCase.test4(DOMTestCase.java:XXX) diff --git a/tests/witness/simple b/tests/witness/simple index ff3142aedf..77cef876ab 100644 --- a/tests/witness/simple +++ b/tests/witness/simple @@ -22,6 +22,12 @@ ERROR - Message 20 WARN - Message 21 INFO - Message 22 DEBUG - Message 23 +TRACE - Message 24 +FATAL - Message 25 +ERROR - Message 26 +WARN - Message 27 +INFO - Message 28 +DEBUG - Message 29 java.lang.Exception: Just testing. at org.apache.log4j.MinimumTestCase.common(MinimumTestCase.java:XXX) at org.apache.log4j.MinimumTestCase.simple(MinimumTestCase.java:XXX) @@ -33,4 +39,4 @@ java.lang.Exception: Just testing. at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -INFO - Messages should bear numbers 0 through 23. +INFO - Messages should bear numbers 0 through 29. diff --git a/tests/witness/socketServer.1 b/tests/witness/socketServer.1 index 768f434372..113f262eec 100644 --- a/tests/witness/socketServer.1 +++ b/tests/witness/socketServer.1 @@ -1,9 +1,11 @@ -DEBUG T1 [main] org.apache.log4j.net.SocketServerTestCase Message 1 -DEBUG T1 [main] root Message 2 - INFO T1 [main] org.apache.log4j.net.SocketServerTestCase Message 3 - WARN T1 [main] org.apache.log4j.net.SocketServerTestCase Message 4 -LETHAL T1 [main] org.apache.log4j.net.SocketServerTestCase Message 5 -DEBUG T1 [main] org.apache.log4j.net.SocketServerTestCase Message 6 +TRACE T1 [main] org.apache.log4j.net.SocketServerTestCase Message 1 +TRACE T1 [main] root Message 2 +DEBUG T1 [main] org.apache.log4j.net.SocketServerTestCase Message 3 +DEBUG T1 [main] root Message 4 + INFO T1 [main] org.apache.log4j.net.SocketServerTestCase Message 5 + WARN T1 [main] org.apache.log4j.net.SocketServerTestCase Message 6 +LETHAL T1 [main] org.apache.log4j.net.SocketServerTestCase Message 7 +DEBUG T1 [main] org.apache.log4j.net.SocketServerTestCase Message 8 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test1(SocketServerTestCase.java:XXX) @@ -15,7 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR T1 [main] root Message 7 +ERROR T1 [main] root Message 9 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test1(SocketServerTestCase.java:XXX) diff --git a/tests/witness/socketServer.2 b/tests/witness/socketServer.2 index ad2127bbde..3ee37c1a51 100644 --- a/tests/witness/socketServer.2 +++ b/tests/witness/socketServer.2 @@ -1,9 +1,11 @@ -DEBUG T2 [main] ? (?:?) Message 1 -DEBUG T2 [main] ? (?:?) Message 2 - INFO T2 [main] ? (?:?) Message 3 - WARN T2 [main] ? (?:?) Message 4 -LETHAL T2 [main] ? (?:?) Message 5 -DEBUG T2 [main] ? (?:?) Message 6 +TRACE T2 [main] ? (?:?) Message 1 +TRACE T2 [main] ? (?:?) Message 2 +DEBUG T2 [main] ? (?:?) Message 3 +DEBUG T2 [main] ? (?:?) Message 4 + INFO T2 [main] ? (?:?) Message 5 + WARN T2 [main] ? (?:?) Message 6 +LETHAL T2 [main] ? (?:?) Message 7 +DEBUG T2 [main] ? (?:?) Message 8 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test2(SocketServerTestCase.java:XXX) @@ -15,7 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR T2 [main] ? (?:?) Message 7 +ERROR T2 [main] ? (?:?) Message 9 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test2(SocketServerTestCase.java:XXX) diff --git a/tests/witness/socketServer.3 b/tests/witness/socketServer.3 index 3886e09e85..de184bbd8c 100644 --- a/tests/witness/socketServer.3 +++ b/tests/witness/socketServer.3 @@ -1,9 +1,11 @@ -DEBUG T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 1 -DEBUG T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 2 - INFO T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 3 - WARN T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 4 -LETHAL T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 5 -DEBUG T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 6 +TRACE T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 1 +TRACE T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 2 +DEBUG T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 3 +DEBUG T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 4 + INFO T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 5 + WARN T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 6 +LETHAL T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 7 +DEBUG T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 8 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test3(SocketServerTestCase.java:XXX) @@ -15,7 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 7 +ERROR T3 [main] org.apache.log4j.net.SocketServerTestCase (SocketServerTestCase.java:XXX) Message 9 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test3(SocketServerTestCase.java:XXX) diff --git a/tests/witness/socketServer.4 b/tests/witness/socketServer.4 index 5af519ced7..69236688b4 100644 --- a/tests/witness/socketServer.4 +++ b/tests/witness/socketServer.4 @@ -1,9 +1,11 @@ -DEBUG some T4 MDC-TEST4 [main] SocketServerTestCase - Message 1 -DEBUG some T4 MDC-TEST4 [main] root - Message 2 - INFO some T4 MDC-TEST4 [main] SocketServerTestCase - Message 3 - WARN some T4 MDC-TEST4 [main] SocketServerTestCase - Message 4 -LETHAL some T4 MDC-TEST4 [main] SocketServerTestCase - Message 5 -DEBUG some T4 MDC-TEST4 [main] SocketServerTestCase - Message 6 +TRACE some T4 MDC-TEST4 [main] SocketServerTestCase - Message 1 +TRACE some T4 MDC-TEST4 [main] root - Message 2 +DEBUG some T4 MDC-TEST4 [main] SocketServerTestCase - Message 3 +DEBUG some T4 MDC-TEST4 [main] root - Message 4 + INFO some T4 MDC-TEST4 [main] SocketServerTestCase - Message 5 + WARN some T4 MDC-TEST4 [main] SocketServerTestCase - Message 6 +LETHAL some T4 MDC-TEST4 [main] SocketServerTestCase - Message 7 +DEBUG some T4 MDC-TEST4 [main] SocketServerTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test4(SocketServerTestCase.java:XXX) @@ -15,7 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR some T4 MDC-TEST4 [main] root - Message 7 +ERROR some T4 MDC-TEST4 [main] root - Message 9 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test4(SocketServerTestCase.java:XXX) diff --git a/tests/witness/socketServer.5 b/tests/witness/socketServer.5 index 3436e208e7..cde6de7152 100644 --- a/tests/witness/socketServer.5 +++ b/tests/witness/socketServer.5 @@ -1,9 +1,11 @@ -DEBUG some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 1 -DEBUG some5 T5 MDC-TEST5 [main] root - Message 2 - INFO some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 3 - WARN some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 4 -LETHAL some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 5 -DEBUG some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 6 +TRACE some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 1 +TRACE some5 T5 MDC-TEST5 [main] root - Message 2 +DEBUG some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 3 +DEBUG some5 T5 MDC-TEST5 [main] root - Message 4 + INFO some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 5 + WARN some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 6 +LETHAL some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 7 +DEBUG some5 T5 MDC-TEST5 [main] SocketServerTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test5(SocketServerTestCase.java:XXX) @@ -15,7 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR some5 T5 MDC-TEST5 [main] root - Message 7 +ERROR some5 T5 MDC-TEST5 [main] root - Message 9 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test5(SocketServerTestCase.java:XXX) diff --git a/tests/witness/socketServer.6 b/tests/witness/socketServer.6 index 412ec544d8..ae9a686040 100644 --- a/tests/witness/socketServer.6 +++ b/tests/witness/socketServer.6 @@ -1,9 +1,11 @@ -DEBUG some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 1 -DEBUG some6 T6 client-test6 MDC-TEST6 [main] root - Message 2 - INFO some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 3 - WARN some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 4 -LETHAL some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 5 -DEBUG some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 6 +TRACE some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 1 +TRACE some6 T6 client-test6 MDC-TEST6 [main] root - Message 2 +DEBUG some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 3 +DEBUG some6 T6 client-test6 MDC-TEST6 [main] root - Message 4 + INFO some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 5 + WARN some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 6 +LETHAL some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 7 +DEBUG some6 T6 client-test6 MDC-TEST6 [main] SocketServerTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test6(SocketServerTestCase.java:XXX) @@ -15,7 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR some6 T6 client-test6 MDC-TEST6 [main] root - Message 7 +ERROR some6 T6 client-test6 MDC-TEST6 [main] root - Message 9 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test6(SocketServerTestCase.java:XXX) diff --git a/tests/witness/socketServer.7 b/tests/witness/socketServer.7 index 6437bb2dc4..3ea7428cbd 100644 --- a/tests/witness/socketServer.7 +++ b/tests/witness/socketServer.7 @@ -1,9 +1,11 @@ -DEBUG some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 1 -DEBUG some7 T7 client-test7 MDC-TEST7 [main] root - Message 2 - INFO some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 3 - WARN some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 4 -LETHAL some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 5 -DEBUG some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 6 +TRACE some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 1 +TRACE some7 T7 client-test7 MDC-TEST7 [main] root - Message 2 +DEBUG some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 3 +DEBUG some7 T7 client-test7 MDC-TEST7 [main] root - Message 4 + INFO some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 5 + WARN some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 6 +LETHAL some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 7 +DEBUG some7 T7 client-test7 MDC-TEST7 [main] SocketServerTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test7(SocketServerTestCase.java:XXX) @@ -15,7 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR some7 T7 client-test7 MDC-TEST7 [main] root - Message 7 +ERROR some7 T7 client-test7 MDC-TEST7 [main] root - Message 9 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test7(SocketServerTestCase.java:XXX) diff --git a/tests/witness/socketServer.8 b/tests/witness/socketServer.8 index 26648609bd..c317ac7aca 100644 --- a/tests/witness/socketServer.8 +++ b/tests/witness/socketServer.8 @@ -1,9 +1,11 @@ -DEBUG some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 1 -DEBUG some8 T8 shortSocketServer MDC-TEST8 [main] root - Message 2 - INFO some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 3 - WARN some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 4 -LETHAL some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 5 -DEBUG some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 6 +TRACE some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 1 +TRACE some8 T8 shortSocketServer MDC-TEST8 [main] root - Message 2 +DEBUG some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 3 +DEBUG some8 T8 shortSocketServer MDC-TEST8 [main] root - Message 4 + INFO some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 5 + WARN some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 6 +LETHAL some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 7 +DEBUG some8 T8 shortSocketServer MDC-TEST8 [main] SocketServerTestCase - Message 8 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test8(SocketServerTestCase.java:XXX) @@ -15,7 +17,7 @@ java.lang.Exception: Just testing at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) -ERROR some8 T8 shortSocketServer MDC-TEST8 [main] root - Message 7 +ERROR some8 T8 shortSocketServer MDC-TEST8 [main] root - Message 9 java.lang.Exception: Just testing at org.apache.log4j.net.SocketServerTestCase.common(SocketServerTestCase.java:XXX) at org.apache.log4j.net.SocketServerTestCase.test8(SocketServerTestCase.java:XXX) diff --git a/tests/witness/ttcc b/tests/witness/ttcc index a99699b7c8..43b7394cd3 100644 --- a/tests/witness/ttcc +++ b/tests/witness/ttcc @@ -17,11 +17,17 @@ [main] WARN DEB - Message 16 [main] INFO DEB - Message 17 [main] DEBUG DEB - Message 18 - [main] FATAL UNDEF - Message 19 - [main] ERROR UNDEF - Message 20 - [main] WARN UNDEF - Message 21 - [main] INFO UNDEF - Message 22 - [main] DEBUG UNDEF - Message 23 + [main] FATAL TRC - Message 19 + [main] ERROR TRC - Message 20 + [main] WARN TRC - Message 21 + [main] INFO TRC - Message 22 + [main] DEBUG TRC - Message 23 + [main] TRACE TRC - Message 24 + [main] FATAL UNDEF - Message 25 + [main] ERROR UNDEF - Message 26 + [main] WARN UNDEF - Message 27 + [main] INFO UNDEF - Message 28 + [main] DEBUG UNDEF - Message 29 java.lang.Exception: Just testing. at org.apache.log4j.MinimumTestCase.common(MinimumTestCase.java:XXX) at org.apache.log4j.MinimumTestCase.ttcc(MinimumTestCase.java:XXX) @@ -33,4 +39,4 @@ java.lang.Exception: Just testing. at junit.framework.TestCase.run(TestCase.java:XXX) at junit.framework.TestSuite.runTest(TestSuite.java:XXX) at junit.framework.TestSuite.run(TestSuite.java:XXX) - [main] INFO INF - Messages should bear numbers 0 through 23. + [main] INFO INF - Messages should bear numbers 0 through 29. diff --git a/tests/witness/xmlLayout.1 b/tests/witness/xmlLayout.1 index 8ce46bcf81..80e596846b 100644 --- a/tests/witness/xmlLayout.1 +++ b/tests/witness/xmlLayout.1 @@ -2,48 +2,56 @@ - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + - + - + - + +hi]]>]]> + + + hi]]>]]> From 434b1a036885286b67b846d7ac6f856bf2237088 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Thu, 20 Oct 2005 05:28:07 +0000 Subject: [PATCH 181/342] Added history for 1.2.13 fixes; updated version to 1.2.13rc1 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@326829 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/HISTORY.txt | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index bc2d9f95c2..56f2ce9833 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 5936057fe0..4ac3c1626f 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,6 +5,18 @@ client code. [***] Changes requiring important modifications to existing client code. + October 19th, 2005 + + - Release of version 1.2.13rc1 + + - Fixed bug 36800. Location related info now emitted for TRACE level log + messages. + + - Fixed bug 37122. Console appender now behaves as before to fix + compatibility problem with JBoss introduced in 1.2.12 release due to fix + for bug 31056. Can still be configured to detect changes in the System.out + and System.err streams as needed by setting the honorReassignment property. + August 29th, 2005 - Release of version 1.2.12 From 871f9af19d28df58ddde023108dcc21ddfc7c509 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 10 Nov 2005 23:40:50 +0000 Subject: [PATCH 182/342] Bug 37122: honorReassignment changed to follow git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@332396 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/ConsoleAppender.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/java/org/apache/log4j/ConsoleAppender.java b/src/java/org/apache/log4j/ConsoleAppender.java index e6b2c05161..b703e69b54 100644 --- a/src/java/org/apache/log4j/ConsoleAppender.java +++ b/src/java/org/apache/log4j/ConsoleAppender.java @@ -39,7 +39,7 @@ public class ConsoleAppender extends WriterAppender { * Determines if the appender honors reassignments of System.out * or System.err made after configuration. */ - private boolean honorReassignment = false; + private boolean follow = false; /** * Constructs an unconfigured appender. @@ -103,8 +103,8 @@ String getTarget() { * System.err in force at the time when logging events are appended. * @since 1.2.13 */ - public final void setHonorReassignment(final boolean newValue) { - honorReassignment = newValue; + public final void setFollow(final boolean newValue) { + follow = newValue; } /** @@ -114,8 +114,8 @@ public final void setHonorReassignment(final boolean newValue) { * System.err in force at the time when logging events are appended. * @since 1.2.13 */ - public final boolean getHonorReassignment() { - return honorReassignment; + public final boolean getFollow() { + return follow; } void targetWarn(String val) { @@ -127,7 +127,7 @@ void targetWarn(String val) { * Prepares the appender for use. */ public void activateOptions() { - if (honorReassignment) { + if (follow) { if (target.equals(SYSTEM_ERR)) { setWriter(createWriter(new SystemErrStream())); } else { @@ -150,7 +150,7 @@ public void activateOptions() { protected final void closeWriter() { - if (honorReassignment) { + if (follow) { super.closeWriter(); } } From 9430238c7dd526fa3472c8f944851f9303a6e6fd Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Mon, 28 Nov 2005 00:10:47 +0000 Subject: [PATCH 183/342] Updating build info to 1.2.13rc2 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@349335 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/HISTORY.txt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 56f2ce9833..ef815b962d 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 4ac3c1626f..bdf59b351d 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,6 +5,12 @@ client code. [***] Changes requiring important modifications to existing client code. + November 27th, 2005 + + - Release of version 1.2.13rc2 + + - Bug 37122, renamed "honorReassignment" to "follow". + October 19th, 2005 - Release of version 1.2.13rc1 From 4eda9799b571d248ef1e1f1c9ef93c7e76cea417 Mon Sep 17 00:00:00 2001 From: Mark Dwayne Womack Date: Mon, 5 Dec 2005 03:05:00 +0000 Subject: [PATCH 184/342] changes for 1.2.13 official build git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@353959 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- docs/HISTORY.txt | 14 ++++---------- src/xdocs/download.xml | 18 ++++++++++++------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/build.xml b/build.xml index ef815b962d..c1d77d01ab 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index bdf59b351d..fc363d5933 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,23 +5,17 @@ client code. [***] Changes requiring important modifications to existing client code. - November 27th, 2005 + December 4th, 2005 - - Release of version 1.2.13rc2 - - - Bug 37122, renamed "honorReassignment" to "follow". - - October 19th, 2005 - - - Release of version 1.2.13rc1 + - Release of version 1.2.13 - Fixed bug 36800. Location related info now emitted for TRACE level log - messages. + messages. [*] - Fixed bug 37122. Console appender now behaves as before to fix compatibility problem with JBoss introduced in 1.2.12 release due to fix for bug 31056. Can still be configured to detect changes in the System.out - and System.err streams as needed by setting the honorReassignment property. + and System.err streams as needed by setting the follow property. [*] August 29th, 2005 diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 553d13e2aa..964df549ed 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -9,7 +9,7 @@ -
    +

    Log4j is available for download from a number of mirrors. Please @@ -17,11 +17,17 @@ bandwidth.

    -

    Log4j version 1.2.11, is identical to version 1.2.9, - except that the class org.apache.log4j.or.jms.MessageRenderer is now - explicitly contained in the 1.2.11.jar. In previous releases of the 1.2 - branch it was sometimes include and sometimes left out - (bug #34491). +

    Log4j version 1.2.13 has two changes from version 1.2.12: +

      +
    • Bug #36800 : + Location related info now emitted for TRACE level log messages.
    • + +
    • Bug #37122 : + Console appender now behaves as before to fix + compatibility problem with JBoss introduced in 1.2.12 release due to fix + for bug 31056. Can still be configured to detect changes in the System.out + and System.err streams as needed by setting the follow property.
    • +

    The next major release of log4j will be version 1.3. It will contain From a6a6c734b105f98080395c085ae989747317ebfa Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 12 Dec 2005 01:05:13 +0000 Subject: [PATCH 185/342] Bug 37866: NTEventLogAppender.dll not built by Ant git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@356078 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 146 +++++++++++------- .../apache/log4j/nt/NTEventLogAppender.java | 14 +- .../org/apache/log4j/nt/NTEventLogAppender.rc | 102 ++++++++++++ src/java/org/apache/log4j/nt/nteventlog.cpp | 5 + src/java/org/apache/log4j/nt/test/NTMin.java | 70 --------- tests/build.xml | 43 ++++-- .../log4j/nt/NTEventLogAppenderTest.java | 54 +++++++ 7 files changed, 290 insertions(+), 144 deletions(-) create mode 100755 src/java/org/apache/log4j/nt/NTEventLogAppender.rc delete mode 100644 src/java/org/apache/log4j/nt/test/NTMin.java create mode 100755 tests/src/java/org/apache/log4j/nt/NTEventLogAppenderTest.java diff --git a/build.xml b/build.xml index c1d77d01ab..c4d5f4b0de 100644 --- a/build.xml +++ b/build.xml @@ -104,7 +104,7 @@ These are the targets supported by this ANT build scpript: build - compile all project files, if a certain library is missing, - then the compilation of its dependents are skipped. + then the compilation of its dependents are skipped. javadoc - build project javadoc files @@ -151,7 +151,7 @@ - + @@ -169,7 +169,7 @@ - + @@ -312,6 +312,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -369,7 +411,7 @@ - + @@ -525,38 +567,27 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -568,24 +599,26 @@ + **/*.bak, **/goEnv.bat, + **/Makefile, **/goEnv.bat, + docs/pub-support/*, + ${dist.dir}/classes/org/**, + src/java/org/apache/log4j/test/**/*, + **/.#*, + **/*.o, **/*.res, **/*.bin, **/*.h, **/EventLogCategories.rc"/> @@ -596,12 +629,10 @@ - - - + includes="logging-log4j-${version}/**" + compression="gzip" /> + + + + + diff --git a/src/java/org/apache/log4j/nt/NTEventLogAppender.java b/src/java/org/apache/log4j/nt/NTEventLogAppender.java index d314f627ea..c0c3a7a151 100644 --- a/src/java/org/apache/log4j/nt/NTEventLogAppender.java +++ b/src/java/org/apache/log4j/nt/NTEventLogAppender.java @@ -95,10 +95,10 @@ void close() { void activateOptions() { if (source != null) { try { - _handle = registerEventSource(server, source); + _handle = registerEventSource(server, source); } catch (Exception e) { - LogLog.error("Could not register event source.", e); - _handle = 0; + LogLog.error("Could not register event source.", e); + _handle = 0; } } } @@ -112,10 +112,10 @@ public void append(LoggingEvent event) { if(layout.ignoresThrowable()) { String[] s = event.getThrowableStrRep(); if (s != null) { - int len = s.length; - for(int i = 0; i < len; i++) { - sbuf.append(s[i]); - } + int len = s.length; + for(int i = 0; i < len; i++) { + sbuf.append(s[i]); + } } } // Normalize the log message level into the supported categories diff --git a/src/java/org/apache/log4j/nt/NTEventLogAppender.rc b/src/java/org/apache/log4j/nt/NTEventLogAppender.rc new file mode 100755 index 0000000000..d0ab0331ee --- /dev/null +++ b/src/java/org/apache/log4j/nt/NTEventLogAppender.rc @@ -0,0 +1,102 @@ +// Microsoft Visual C++ generated resource script. +// +#include "windows.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +//#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1, 2, 14, 1 + PRODUCTVERSION 1, 2, 14, 1 + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Apache Software Foundation" + VALUE "FileDescription", "Platform methods for NTEventLogAppender" + VALUE "FileVersion", "1, 2, 14, 1" + VALUE "InternalName", "NTEventLogAppender" + VALUE "LegalCopyright", "Copyright (C) 2005, Apache Software Foundation" + VALUE "OriginalFilename", "NTEventLogAppender.dll" + VALUE "ProductName", "log4j" + VALUE "ProductVersion", "1, 2, 14, 1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/src/java/org/apache/log4j/nt/nteventlog.cpp b/src/java/org/apache/log4j/nt/nteventlog.cpp index 2ad1adec4c..1150d92c4c 100644 --- a/src/java/org/apache/log4j/nt/nteventlog.cpp +++ b/src/java/org/apache/log4j/nt/nteventlog.cpp @@ -16,6 +16,11 @@ #ifndef NtEventLogAppender_h #define NtEventLogAppender_h + +#ifdef __GNUC__ +typedef long long __int64; +#endif + #include "org_apache_log4j_Priority.h" #include "org_apache_log4j_nt_NTEventLogAppender.h" #include diff --git a/src/java/org/apache/log4j/nt/test/NTMin.java b/src/java/org/apache/log4j/nt/test/NTMin.java deleted file mode 100644 index 5c30760d57..0000000000 --- a/src/java/org/apache/log4j/nt/test/NTMin.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.nt.test; - - -import org.apache.log4j.Logger; -import org.apache.log4j.BasicConfigurator; -import org.apache.log4j.nt.NTEventLogAppender; -import org.apache.log4j.Priority; -import org.apache.log4j.NDC; - - -public class NTMin { - - static Logger cat = Logger.getLogger(NTMin.class.getName()); - - public - static - void main(String argv[]) { - - //if(argv.length == 1) { - init(); - //} - //else { - //Usage("Wrong number of arguments."); - //} - test("someHost"); - } - - - static - void Usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java " + NTMin.class + ""); - System.exit(1); - } - - - static - void init() { - - BasicConfigurator.configure(new NTEventLogAppender()); - } - - static - void test(String host) { - NDC.push(host); - int i = 0; - cat.debug( "Message " + i++); - cat.info( "Message " + i++); - cat.warn( "Message " + i++); - cat.error( "Message " + i++); - cat.log(Priority.FATAL, "Message " + i++); - cat.debug("Message " + i++, new Exception("Just testing.")); - } -} diff --git a/tests/build.xml b/tests/build.xml index 31449caf09..9befc697a9 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -20,6 +20,7 @@ + @@ -58,7 +59,7 @@ These are the targets supported by this ANT build scpript: build - compile all project files, if a certain library is missing, - then the compilation of its dependents are skipped. + then the compilation of its dependents are skipped. regression - Run regression tests which check large parts of log4j. @@ -72,6 +73,9 @@ + + + @@ -97,12 +101,12 @@ + excludes="${excludes}"> @@ -133,7 +137,7 @@ OptionConverter, BoundedFIFO, CyclicBuffer, OR, LevelMatchFilter, PatternParser, - PatternLayout, DRFA"/> + PatternLayout, DRFA, NTEventLogAppender"/> @@ -262,18 +266,18 @@ - - - + + + - - - - - - - + + + + + + + @@ -359,6 +363,17 @@ + + + + + + + + diff --git a/tests/src/java/org/apache/log4j/nt/NTEventLogAppenderTest.java b/tests/src/java/org/apache/log4j/nt/NTEventLogAppenderTest.java new file mode 100755 index 0000000000..1fa2e096ed --- /dev/null +++ b/tests/src/java/org/apache/log4j/nt/NTEventLogAppenderTest.java @@ -0,0 +1,54 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.nt; +import junit.framework.TestCase; +import org.apache.log4j.Logger; +import org.apache.log4j.LogManager; +import org.apache.log4j.Level; +import org.apache.log4j.BasicConfigurator; + + +/** + * + * NTEventLogAppender tests. + * + * @author Curt Arnold + */ +public class NTEventLogAppenderTest extends TestCase { + + /** + * Clean up configuration after each test. + */ + public void tearDown() { + LogManager.shutdown(); + } + + /** + * Simple test of NTEventLogAppender. + */ + public void testSimple() { + BasicConfigurator.configure(new NTEventLogAppender()); + Logger logger = Logger.getLogger("org.apache.log4j.nt.NTEventLogAppenderTest"); + int i = 0; + logger.debug( "Message " + i++); + logger.info( "Message " + i++); + logger.warn( "Message " + i++); + logger.error( "Message " + i++); + logger.log(Level.FATAL, "Message " + i++); + logger.debug("Message " + i++, new Exception("Just testing.")); + } +} From feee2e2a3413489f0e6bc2abc494f8fe203106a9 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 20 Dec 2005 02:48:09 +0000 Subject: [PATCH 186/342] Bug 37965: SyslogAppender not compatible, add 1.2 unit tests git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@357884 13f79535-47bb-0310-9956-ffa450edef68 --- tests/build.properties.sample | 10 + tests/build.xml | 48 ++- tests/log4j-coding-convention.xml | 225 ++++++++++++ .../org/apache/log4j/VectorErrorHandler.java | 181 +++++++++ .../apache/log4j/net/SyslogAppenderTest.java | 342 ++++++++++++++++++ tests/sun_checks.xml | 131 +++++++ 6 files changed, 936 insertions(+), 1 deletion(-) create mode 100644 tests/log4j-coding-convention.xml create mode 100644 tests/src/java/org/apache/log4j/VectorErrorHandler.java create mode 100644 tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java create mode 100644 tests/sun_checks.xml diff --git a/tests/build.properties.sample b/tests/build.properties.sample index 0b64f0bbb1..3c99de9967 100644 --- a/tests/build.properties.sample +++ b/tests/build.properties.sample @@ -21,3 +21,13 @@ deprecation=on # only needs to be set here for JDK 1.1. junit.jar=${lib.home.dir}/junit3.8.1/junit.jar +# +# Jalopy source code reformatter +# +# +jalopy-ant.dir=${lib.home.dir}/jalopy-ant-0.6.2 + +# +# Checkstyle coding convention checker +# +checkstyle.jar=${lib.home.dir}/checkstyle-4.0-beta2/checkstyle-all-4.0-beta2.jar diff --git a/tests/build.xml b/tests/build.xml index 9befc697a9..f5b1ff8070 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -137,7 +137,7 @@ OptionConverter, BoundedFIFO, CyclicBuffer, OR, LevelMatchFilter, PatternParser, - PatternLayout, DRFA, NTEventLogAppender"/> + PatternLayout, DRFA, NTEventLogAppender, Syslog"/> @@ -363,6 +363,14 @@ + + + + + + + + + + + + + + + +Specify files to reformat with -Djalopy.files=PATTERN. + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/log4j-coding-convention.xml b/tests/log4j-coding-convention.xml new file mode 100644 index 0000000000..602c04638b --- /dev/null +++ b/tests/log4j-coding-convention.xml @@ -0,0 +1,225 @@ + + + + + 14 + + + + + 6 + + + + true + false + true + false + false + + + +

    1
    + + +
    0
    +
    + + + + false + false + + + false + false + true + false + + + true + false + false + false + false + + + false + false + + + + + false + + + + false + false + false + + false + + 0 + 0 + 0 + 0 + + false + + + + + + + false + false + false + + +
    + +
    +
    + * Copyright|The Apache Software License, Version 1.1| * Copyright (C) The Apache Software Foundation. All rights reserved. + 0 + /*| * Copyright 1999,2005 The Apache Software Foundation.| *| * Licensed under the Apache License, Version 2.0 (the "License");| * you may not use this file except in compliance with the License.| * You may obtain a copy of the License at| *| * http://www.apache.org/licenses/LICENSE-2.0| *| * Unless required by applicable law or agreed to in writing, software| * distributed under the License is distributed on an "AS IS" BASIS,| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.| * See the License for the specific language governing permissions and| * limitations under the License.| */ + true +
    + + timestamp + disabled + + + disabled + + + false + + true + false + + true + + + false + + + 1 + 1 + 0 + 1 + 2 + 55 + -1 + 2 + -1 + 0 + 8 + -1 + 1 + + + false + false + + + + + static|field|initializer|constructor|method|interface|class + + + true + public|protected|private|abstract|static|final|synchronized|transient|volatile|native|strictfp + + + + + true + true + true + + + true + false + false + false + + false + + + false + false + true + + + + true + false + + true + true + true + true + true + true + + false + false + + + + + + 0 + false + false + false + + false + + false + false + + false + + + false + false + false + false + + + false + false + false + + + + true + true + 79 + + + + true + true + false + + false + false + false + + + + false + + false + + + + + diff --git a/tests/src/java/org/apache/log4j/VectorErrorHandler.java b/tests/src/java/org/apache/log4j/VectorErrorHandler.java new file mode 100644 index 0000000000..0cbab34856 --- /dev/null +++ b/tests/src/java/org/apache/log4j/VectorErrorHandler.java @@ -0,0 +1,181 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j; + +import org.apache.log4j.spi.ErrorHandler; +import org.apache.log4j.spi.LoggingEvent; + +import java.util.Vector; + + +/** + * Utility class used in testing to capture errors dispatched + * by appenders. + * + * @author Curt Arnold + */ +public final class VectorErrorHandler implements ErrorHandler { + /** + * Logger. + */ + private Logger logger; + + /** + * Appender. + */ + private Appender appender; + + /** + * Backup appender. + */ + private Appender backupAppender; + + /** + * Array of processed errors. + */ + private final Vector errors = new Vector(); + + /** + * Default constructor. + */ + public VectorErrorHandler() { + } + + /** + * {@inheritDoc} + */ + public void setLogger(final Logger logger) { + this.logger = logger; + } + + /** + * Gets last logger specified by setLogger. + * @return logger. + */ + public Logger getLogger() { + return logger; + } + + /** + * {@inheritDoc} + */ + public void activateOptions() { + } + + /** + * {@inheritDoc} + */ + public void error( + final String message, final Exception e, final int errorCode) { + error(message, e, errorCode, null); + } + + /** + * {@inheritDoc} + */ + public void error(final String message) { + error(message, null, -1, null); + } + + /** + * {@inheritDoc} + */ + public void error( + final String message, final Exception e, final int errorCode, + final LoggingEvent event) { + errors.addElement( + new Object[] { message, e, new Integer(errorCode), event }); + } + + /** + * Gets message from specified error. + * + * @param index index. + * @return message, may be null. + */ + public String getMessage(final int index) { + return (String) ((Object[]) errors.elementAt(index))[0]; + } + + /** + * Gets exception from specified error. + * + * @param index index. + * @return exception. + */ + public Exception getException(final int index) { + return (Exception) ((Object[]) errors.elementAt(index))[1]; + } + + /** + * Gets error code from specified error. + * + * @param index index. + * @return error code, -1 if not specified. + */ + public int getErrorCode(final int index) { + return ((Integer) ((Object[]) errors.elementAt(index))[2]).intValue(); + } + + /** + * Gets logging event from specified error. + * + * @param index index. + * @return exception. + */ + public LoggingEvent getEvent(final int index) { + return (LoggingEvent) ((Object[]) errors.elementAt(index))[3]; + } + + /** + * Gets number of errors captured. + * @return number of errors captured. + */ + public int size() { + return errors.size(); + } + + /** + * {@inheritDoc} + */ + public void setAppender(final Appender appender) { + this.appender = appender; + } + + /** + * Get appender. + * @return appender, may be null. + */ + public Appender getAppender() { + return appender; + } + + /** + * {@inheritDoc} + */ + public void setBackupAppender(final Appender appender) { + this.backupAppender = appender; + } + + /** + * Get backup appender. + * @return backup appender, may be null. + */ + public Appender getBackupAppender() { + return backupAppender; + } +} diff --git a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java new file mode 100644 index 0000000000..d5956b6ace --- /dev/null +++ b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java @@ -0,0 +1,342 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.net; + +import junit.framework.TestCase; + +import org.apache.log4j.AsyncAppender; +import org.apache.log4j.Layout; +import org.apache.log4j.Level; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.apache.log4j.PatternLayout; +import org.apache.log4j.VectorErrorHandler; + + +/** + * Tests for SyslogAppender + * + * @author Curt Arnold + **/ +public class SyslogAppenderTest extends TestCase { + /** + * Create new instance of SyslogAppenderTest. + * @param testName test name + */ + public SyslogAppenderTest(final String testName) { + super(testName); + } + + /** + * Resets configuration after every test. + */ + public void tearDown() { + LogManager.resetConfiguration(); + } + + /** + * Test default constructor. + */ + public void testDefaultConstructor() { + SyslogAppender appender = new SyslogAppender(); + assertEquals("user", appender.getFacility()); + assertEquals(false, appender.getFacilityPrinting()); + assertNull(appender.getLayout()); + assertNull(appender.getSyslogHost()); + assertTrue(appender.requiresLayout()); + } + + /** + * Test two parameter constructor. + */ + public void testTwoParamConstructor() { + Layout layout = new PatternLayout(); + SyslogAppender appender = new SyslogAppender(layout, 24); + assertEquals("daemon", appender.getFacility()); + assertEquals(false, appender.getFacilityPrinting()); + assertEquals(layout, appender.getLayout()); + assertNull(appender.getSyslogHost()); + assertTrue(appender.requiresLayout()); + } + + /** + * Test two parameter constructor with unexpected facility. + */ + public void testTwoParamConstructorBadFacility() { + Layout layout = new PatternLayout(); + SyslogAppender appender = new SyslogAppender(layout, 25); + assertEquals("user", appender.getFacility()); + assertEquals(false, appender.getFacilityPrinting()); + assertEquals(layout, appender.getLayout()); + assertNull(appender.getSyslogHost()); + assertTrue(appender.requiresLayout()); + } + + /** + * Test three parameter constructor. + */ + public void testThreeParamConstructor() { + Layout layout = new PatternLayout(); + SyslogAppender appender = + new SyslogAppender(layout, "syslog.example.org", 24); + assertEquals("daemon", appender.getFacility()); + assertEquals(false, appender.getFacilityPrinting()); + assertEquals(layout, appender.getLayout()); + assertEquals("syslog.example.org", appender.getSyslogHost()); + assertTrue(appender.requiresLayout()); + } + + /** + * Test getFacilityString for expected facility codes. + */ + public void testGetFacilityString() { + String expected = + "kern user mail daemon auth syslog lpr news " + + "uucp cron authpriv ftp local0 local1 local2 local3 " + + "local4 local5 local6 local7 "; + StringBuffer actual = new StringBuffer(); + + for (int i = 0; i <= 11; i++) { + actual.append(SyslogAppender.getFacilityString(i << 3)); + actual.append(' '); + } + + for (int i = 16; i <= 23; i++) { + actual.append(SyslogAppender.getFacilityString(i << 3)); + actual.append(' '); + } + + assertEquals(expected, actual.toString()); + } + + /** + * Test getFacilityString for some unexpected facility codes. + */ + public void testGetFacilityStringUnexpected() { + assertNull(SyslogAppender.getFacilityString(1)); + assertNull(SyslogAppender.getFacilityString(12 << 3)); + } + + /** + * Test getFacility with a bogus facility name. + */ + public void testGetFacilityBogus() { + assertEquals(-1, SyslogAppender.getFacility("bogus")); + } + + /** + * Test getFacility with a null facility name. + */ + public void testGetFacilityNull() { + assertEquals(-1, SyslogAppender.getFacility(null)); + } + + /** + * Test getFacility for expected system facility names. + */ + public void testGetFacilitySystemNames() { + String[] names = + new String[] { + "kErn", "usEr", "MaIL", "daemOn", "auTh", "syslOg", "lPr", "newS", + "Uucp", "croN", "authprIv", "ftP" + }; + + for (int i = 0; i <= 11; i++) { + assertEquals(i << 3, SyslogAppender.getFacility(names[i])); + } + } + + /** + * Test getFacility for expected system facility names. + */ + public void testGetFacilityLocalNames() { + String[] names = + new String[] { + "lOcal0", "LOCAL1", "loCal2", "locAl3", "locaL4", "local5", "LOCal6", + "loCAL7" + }; + + for (int i = 0; i <= 7; i++) { + assertEquals((16 + i) << 3, SyslogAppender.getFacility(names[i])); + } + } + + /** + * Test setFacilityPrinting. + */ + public void testSetFacilityPrinting() { + SyslogAppender appender = new SyslogAppender(); + assertFalse(appender.getFacilityPrinting()); + appender.setFacilityPrinting(true); + assertTrue(appender.getFacilityPrinting()); + appender.setFacilityPrinting(false); + assertFalse(appender.getFacilityPrinting()); + } + + /** + * Test of SyslogAppender constants. + */ + public void testConstants() { + assertEquals(0 << 3, SyslogAppender.LOG_KERN); + assertEquals(1 << 3, SyslogAppender.LOG_USER); + assertEquals(2 << 3, SyslogAppender.LOG_MAIL); + assertEquals(3 << 3, SyslogAppender.LOG_DAEMON); + assertEquals(4 << 3, SyslogAppender.LOG_AUTH); + assertEquals(5 << 3, SyslogAppender.LOG_SYSLOG); + assertEquals(6 << 3, SyslogAppender.LOG_LPR); + assertEquals(7 << 3, SyslogAppender.LOG_NEWS); + assertEquals(8 << 3, SyslogAppender.LOG_UUCP); + assertEquals(9 << 3, SyslogAppender.LOG_CRON); + assertEquals(10 << 3, SyslogAppender.LOG_AUTHPRIV); + assertEquals(11 << 3, SyslogAppender.LOG_FTP); + assertEquals(16 << 3, SyslogAppender.LOG_LOCAL0); + assertEquals(17 << 3, SyslogAppender.LOG_LOCAL1); + assertEquals(18 << 3, SyslogAppender.LOG_LOCAL2); + assertEquals(19 << 3, SyslogAppender.LOG_LOCAL3); + assertEquals(20 << 3, SyslogAppender.LOG_LOCAL4); + assertEquals(21 << 3, SyslogAppender.LOG_LOCAL5); + assertEquals(22 << 3, SyslogAppender.LOG_LOCAL6); + assertEquals(23 << 3, SyslogAppender.LOG_LOCAL7); + } + + /** + * Test setFacility with null. + * Should have no effect. + */ + public void testSetFacilityKern() { + SyslogAppender appender = new SyslogAppender(); + appender.setFacility("kern"); + appender.setFacility(null); + assertEquals("kern", appender.getFacility()); + } + + /** + * Test setFacility with null. + * Should have no effect. + */ + public void testSetFacilityNull() { + SyslogAppender appender = new SyslogAppender(); + appender.setFacility("kern"); + appender.setFacility(null); + assertEquals("kern", appender.getFacility()); + } + + /** + * Test setFacility with bogus value. + * Should reset to user. + */ + public void testSetFacilityBogus() { + SyslogAppender appender = new SyslogAppender(); + appender.setFacility("kern"); + appender.setFacility("bogus"); + assertEquals("user", appender.getFacility()); + } + + /** + * Tests calling setFacility after appender has been activated. + */ + public void testSetFacilityAfterActivation() { + SyslogAppender appender = new SyslogAppender(); + appender.setName("foo"); + appender.setThreshold(Level.INFO); + appender.setSyslogHost("localhost"); + appender.setFacility("user"); + appender.setLayout(new PatternLayout("%m%n")); + + VectorErrorHandler errorHandler = new VectorErrorHandler(); + appender.setErrorHandler(errorHandler); + appender.activateOptions(); + appender.setFacility("kern"); + assertEquals("kern", appender.getFacility()); + } + + /** + * Tests that append method drops messages below threshold. + * Can't reach isSevereAsThreshold call in SyslogAppender.append + * since it is checked in AppenderSkeleton.doAppend. + */ + public void testAppendBelowThreshold() { + SyslogAppender appender = new SyslogAppender(); + appender.setThreshold(Level.ERROR); + appender.activateOptions(); + + Logger logger = Logger.getRootLogger(); + logger.addAppender(appender); + logger.info( + "Should not be logged by SyslogAppenderTest.testAppendBelowThreshold."); + } + + /** + * Tests that append method drops messages below threshold. + */ + public void testAppendNoHost() { + SyslogAppender appender = new SyslogAppender(); + appender.setName("foo"); + appender.setThreshold(Level.INFO); + + VectorErrorHandler errorHandler = new VectorErrorHandler(); + appender.setErrorHandler(errorHandler); + appender.setLayout(new PatternLayout("%m%n")); + appender.activateOptions(); + + Logger logger = Logger.getRootLogger(); + logger.addAppender(appender); + logger.info( + "Should not be logged by SyslogAppenderTest.testAppendNoHost."); + assertEquals(1, errorHandler.size()); + + // + // Appender is misspelled in implementation + // + assertEquals( + "No syslog host is set for SyslogAppedender named \"foo\".", + errorHandler.getMessage(0)); + } + + /** + * Tests append method under normal conditions. + */ + public void testAppend() { + SyslogAppender appender = new SyslogAppender(); + appender.setName("foo"); + appender.setThreshold(Level.INFO); + appender.setSyslogHost("localhost"); + appender.setFacility("user"); + appender.setLayout(new PatternLayout("%m%n")); + + VectorErrorHandler errorHandler = new VectorErrorHandler(); + appender.setErrorHandler(errorHandler); + appender.activateOptions(); + + // + // wrap SyslogAppender with an Async since appender may + // hang if syslogd is not accepting network messages + // + AsyncAppender asyncAppender = new AsyncAppender(); + asyncAppender.addAppender(appender); + asyncAppender.activateOptions(); + + Logger logger = Logger.getRootLogger(); + logger.addAppender(asyncAppender); + + Exception e = + new Exception("Expected exception from SyslogAppenderTest.testAppend"); + logger.info( + "Expected message from log4j unit test SyslogAppenderTest.testAppend.", e); + assertEquals(0, errorHandler.size()); + } +} diff --git a/tests/sun_checks.xml b/tests/sun_checks.xml new file mode 100644 index 0000000000..2385ae1c3f --- /dev/null +++ b/tests/sun_checks.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 142aa519a5bfaacbae1483207de3be739c59f553 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 21 Dec 2005 18:30:44 +0000 Subject: [PATCH 187/342] Bug 35452: Tests for constants missing in 1.3 branch git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@358337 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/log4j/CoreTestSuite.java | 3 +- .../java/org/apache/log4j/LogManagerTest.java | 74 +++++++++++++++++++ .../org/apache/log4j/helpers/LogLogTest.java | 50 +++++++++++++ 3 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 tests/src/java/org/apache/log4j/LogManagerTest.java create mode 100644 tests/src/java/org/apache/log4j/helpers/LogLogTest.java diff --git a/tests/src/java/org/apache/log4j/CoreTestSuite.java b/tests/src/java/org/apache/log4j/CoreTestSuite.java index 088659837d..1a9f07fa26 100644 --- a/tests/src/java/org/apache/log4j/CoreTestSuite.java +++ b/tests/src/java/org/apache/log4j/CoreTestSuite.java @@ -24,7 +24,6 @@ * Suite of log4j class level unit tests. * * @author Curt Arnold - * @since 1.3 */ public class CoreTestSuite { /** @@ -36,6 +35,8 @@ public static Test suite() { s.addTestSuite(LoggingEventTest.class); s.addTestSuite(org.apache.log4j.LevelTest.class); s.addTestSuite(org.apache.log4j.FileAppenderTest.class); + s.addTestSuite(org.apache.log4j.LogManagerTest.class); + s.addTestSuite(org.apache.log4j.helpers.LogLogTest.class); return s; } } diff --git a/tests/src/java/org/apache/log4j/LogManagerTest.java b/tests/src/java/org/apache/log4j/LogManagerTest.java new file mode 100644 index 0000000000..514f638ddc --- /dev/null +++ b/tests/src/java/org/apache/log4j/LogManagerTest.java @@ -0,0 +1,74 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j; + +import junit.framework.TestCase; + + +/** + * Tests for LogManager + * + * @author Curt Arnold + **/ +public class LogManagerTest extends TestCase { + /** + * Create new instance of LogManagerTest. + * @param testName test name + */ + public LogManagerTest(final String testName) { + super(testName); + } + + /** + * Check value of DEFAULT_CONFIGURATION_FILE. + * @deprecated since constant is deprecated + */ + public void testDefaultConfigurationFile() { + assertEquals("log4j.properties", LogManager.DEFAULT_CONFIGURATION_FILE); + } + + /** + * Check value of DEFAULT_XML_CONFIGURATION_FILE. + */ + public void testDefaultXmlConfigurationFile() { + assertEquals("log4j.xml", LogManager.DEFAULT_XML_CONFIGURATION_FILE); + } + + /** + * Check value of DEFAULT_CONFIGURATION_KEY. + * @deprecated since constant is deprecated + */ + public void testDefaultConfigurationKey() { + assertEquals("log4j.configuration", LogManager.DEFAULT_CONFIGURATION_KEY); + } + + /** + * Check value of CONFIGURATOR_CLASS_KEY. + * @deprecated since constant is deprecated + */ + public void testConfiguratorClassKey() { + assertEquals("log4j.configuratorClass", LogManager.CONFIGURATOR_CLASS_KEY); + } + + /** + * Check value of DEFAULT_INIT_OVERRIDE_KEY. + * @deprecated since constant is deprecated + */ + public void testDefaultInitOverrideKey() { + assertEquals("log4j.defaultInitOverride", LogManager.DEFAULT_INIT_OVERRIDE_KEY); + } +} diff --git a/tests/src/java/org/apache/log4j/helpers/LogLogTest.java b/tests/src/java/org/apache/log4j/helpers/LogLogTest.java new file mode 100644 index 0000000000..d664f9d794 --- /dev/null +++ b/tests/src/java/org/apache/log4j/helpers/LogLogTest.java @@ -0,0 +1,50 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.helpers; + +import junit.framework.TestCase; + + +/** + * Tests for LogLog. + * + * @author Curt Arnold + **/ +public class LogLogTest extends TestCase { + /** + * Create new instance of LogLogTest. + * @param testName test name + */ + public LogLogTest(final String testName) { + super(testName); + } + + /** + * Check value of DEBUG_KEY. + */ + public void testDebugKey() { + assertEquals("log4j.debug", LogLog.DEBUG_KEY); + } + + /** + * Check value of CONFIG_DEBUG_KEY. + * @deprecated since constant is deprecated + */ + public void testConfigDebugKey() { + assertEquals("log4j.configDebug", LogLog.CONFIG_DEBUG_KEY); + } +} From cb8ef826b16a772987eab5b3713dbe38b20300ba Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 23 Dec 2005 07:19:08 +0000 Subject: [PATCH 188/342] Bug 38024: Additional tests for Layout classes git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@358758 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/log4j/CoreTestSuite.java | 6 + .../java/org/apache/log4j/HTMLLayoutTest.java | 179 ++++++++++ .../src/java/org/apache/log4j/LayoutTest.java | 167 ++++++++++ .../org/apache/log4j/PatternLayoutTest.java | 141 ++++++++ .../java/org/apache/log4j/TTCCLayoutTest.java | 111 +++++++ .../apache/log4j/helpers/DateLayoutTest.java | 254 ++++++++++++++ .../org/apache/log4j/xml/XMLLayoutTest.java | 310 ++++++++++++++++++ 7 files changed, 1168 insertions(+) create mode 100644 tests/src/java/org/apache/log4j/HTMLLayoutTest.java create mode 100644 tests/src/java/org/apache/log4j/LayoutTest.java create mode 100644 tests/src/java/org/apache/log4j/PatternLayoutTest.java create mode 100644 tests/src/java/org/apache/log4j/TTCCLayoutTest.java create mode 100644 tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java create mode 100644 tests/src/java/org/apache/log4j/xml/XMLLayoutTest.java diff --git a/tests/src/java/org/apache/log4j/CoreTestSuite.java b/tests/src/java/org/apache/log4j/CoreTestSuite.java index 1a9f07fa26..d20f33e159 100644 --- a/tests/src/java/org/apache/log4j/CoreTestSuite.java +++ b/tests/src/java/org/apache/log4j/CoreTestSuite.java @@ -37,6 +37,12 @@ public static Test suite() { s.addTestSuite(org.apache.log4j.FileAppenderTest.class); s.addTestSuite(org.apache.log4j.LogManagerTest.class); s.addTestSuite(org.apache.log4j.helpers.LogLogTest.class); + s.addTestSuite(org.apache.log4j.LayoutTest.class); + s.addTestSuite(org.apache.log4j.helpers.DateLayoutTest.class); + s.addTestSuite(org.apache.log4j.TTCCLayoutTest.class); + s.addTestSuite(org.apache.log4j.xml.XMLLayoutTest.class); + s.addTestSuite(org.apache.log4j.HTMLLayoutTest.class); + s.addTestSuite(org.apache.log4j.PatternLayoutTest.class); return s; } } diff --git a/tests/src/java/org/apache/log4j/HTMLLayoutTest.java b/tests/src/java/org/apache/log4j/HTMLLayoutTest.java new file mode 100644 index 0000000000..b19925c21f --- /dev/null +++ b/tests/src/java/org/apache/log4j/HTMLLayoutTest.java @@ -0,0 +1,179 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j; + +import org.apache.log4j.spi.LoggingEvent; + +import org.w3c.dom.Document; + +import org.xml.sax.InputSource; + +import java.io.Reader; +import java.io.StringReader; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + + +/** + * Test for HTMLLayout. + * + * @author Curt Arnold + */ +public class HTMLLayoutTest extends LayoutTest { + /** + * Construct new instance of XMLLayoutTest. + * + * @param testName test name. + */ + public HTMLLayoutTest(final String testName) { + super(testName, "text/html", false, null, null); + } + + /** + * @{inheritDoc} + */ + protected Layout createLayout() { + return new HTMLLayout(); + } + + /** + * Parses the string as the body of an XML document and returns the document element. + * @param source source string. + * @return document element. + * @throws Exception if parser can not be constructed or source is not a valid XML document. + */ + private Document parse(final String source) throws Exception { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(false); + factory.setCoalescing(true); + + DocumentBuilder builder = factory.newDocumentBuilder(); + Reader reader = new StringReader(source); + + return builder.parse(new InputSource(reader)); + } + + /** + * Tests formatted results. + * @throws Exception if unable to create parser or output is not valid XML. + */ + public void testFormat() throws Exception { + Logger logger = Logger.getLogger("org.apache.log4j.xml.HTMLLayoutTest"); + NDC.push("NDC goes here"); + + LoggingEvent event = + new LoggingEvent( + "org.apache.log4j.Logger", logger, Level.INFO, "Hello, World", null); + HTMLLayout layout = (HTMLLayout) createLayout(); + layout.setLocationInfo(true); + + String result = layout.format(event); + NDC.pop(); + + String src = + "]>" + result + ""; + Document doc = parse(src); + } + + /** + * Tests getHeader. + */ + public void testGetHeader() { + assertEquals("", createLayout().getFooter().substring(0, 8)); + } + + /** + * Tests getLocationInfo and setLocationInfo. + */ + public void testGetSetLocationInfo() { + HTMLLayout layout = new HTMLLayout(); + assertEquals(false, layout.getLocationInfo()); + layout.setLocationInfo(true); + assertEquals(true, layout.getLocationInfo()); + layout.setLocationInfo(false); + assertEquals(false, layout.getLocationInfo()); + } + + /** + * Tests activateOptions(). + */ + public void testActivateOptions() { + HTMLLayout layout = new HTMLLayout(); + layout.activateOptions(); + } + + /** + * Tests getTitle and setTitle. + */ + public void testGetSetTitle() { + HTMLLayout layout = new HTMLLayout(); + assertEquals("Log4J Log Messages", layout.getTitle()); + layout.setTitle(null); + assertNull(layout.getTitle()); + + String newTitle = "A treatise on messages of log persuasion"; + layout.setTitle(newTitle); + assertEquals(newTitle, layout.getTitle()); + } + + /** + * Tests buffer downsizing and DEBUG and WARN colorization code paths. + */ + public void testFormatResize() { + Logger logger = Logger.getLogger("org.apache.log4j.xml.HTMLLayoutTest"); + NDC.clear(); + + char[] msg = new char[2000]; + + for (int i = 0; i < msg.length; i++) { + msg[i] = 'A'; + } + + LoggingEvent event1 = + new LoggingEvent( + "org.apache.log4j.Logger", logger, Level.DEBUG, new String(msg), null); + HTMLLayout layout = (HTMLLayout) createLayout(); + layout.setLocationInfo(true); + + String result = layout.format(event1); + Exception ex = new IllegalArgumentException("'foo' is not a valid value."); + LoggingEvent event2 = + new LoggingEvent( + "org.apache.log4j.Logger", logger, Level.WARN, "Hello, World", ex); + result = layout.format(event2); + assertEquals( + Layout.LINE_SEP + "
    rUsed to output the number of milliseconds elapsed since the start - of the application until the creation of the logging event.Used to output the number of milliseconds elapsed from the construction + of the layout until the creation of the logging event.
    + + + + + + ## +#end + +#macro (printMeta $metaElement) + +#end + +#macro (faqIndex $root) + + #set( $section = 1 ) + + #foreach ( $s in $root.getChild("body").getChildren() ) + #if ($s.getName().equals("faqSection")) + #set( $counter = 1 ) +
    +
    + Section $section. $s.getChild("title").getContent() +
    + + #foreach ( $q in $s.getChildren() ) + #if ($q.getName().equals("question")) + + + +
    Question $section.$counter$q.getChild("title").getContent()
    + #set( $counter = $counter + 1 ) + #end + #end + #set( $section = $section + 1 ) + #end + #end +#end + +#macro (faqContents $root) +
    + + #set( $section = 1 ) + + #foreach ( $s in $root.getChild("body").getChildren() ) + #if ($s.getName().equals("faqSection")) + #set( $counter = 1 ) +
    + Section $section. $s.getChild("title").getContent() +
    + #foreach ( $i in $s.getChildren() ) + #if ($i.getName().equals("question")) + + #set( $counter = $counter + 1 ) + $i.getChild("answer").getContent() + #elseif ($i.getName().equals("text")) + $i.getContent() + #end + #end + #set( $section = $section + 1 ) + #end + #end +#end + + +#macro (messages $root) + #foreach ( $m in $root.getChild("body").getChildren() ) + #if ($m.getName().equals("message")) + +
    + $m.getChild("explanation").getContent() +
    + #end + #end +#end + +#macro (document) + #set ($properties = $root.getChild("properties") ) + + + + + + + + + #set ($authors = $properties.getChildren("author")) + #foreach ( $au in $authors ) + #metaauthor ( $au.getText() $au.getAttributeValue("email") ) + #end + + #set ($metas = $root.getChildren("meta")) + + ## Parse meta directives such as + ## + #foreach ($meta in $metas) #printMeta($meta) #end + + ## Support for tags. + #if ($properties.getChild("base")) + #set ($url = $properties.getChild("base").getAttributeValue("href")) + + #end + + + #set ($links = $properties.getChildren("link")) + #foreach ( $l in $links ) + + #end + + + $project.getChild("title").getText() - $properties.getChild("title").getText() + + + + + #getProjectImage() + + +
    +
    + + #foreach ( $item in $root.getChild("body").getChildren() ) + #if ($item.getName().equals("img")) + #image ($item) + #elseif ($item.getName().equals("section")) + #section ($item) + #elseif ($item.getName().equals("faqSection")) + ## do nothing, we'll handle the faq later + #elseif ($item.getName().equals("message")) + ## do nothing, we'll handle the faq later + #else + $item + #end + #end + + #faqIndex ($root) + #faqContents ($root) + #messages ($root) + +## #if ($root.getChild("body").getChild("titleSection")) +## #set ($titleSection = $root.getChild("body").getChild("titleSection")) +## #titleSection($titleSection) +## #end +## +## #set ($allSections = $root.getChild("body").getChildren("section")) +## #foreach ( $section in $allSections ) +## #section ($section) +## #end + + + +
    + Copyright © 1999-2006, Apache Software Foundation.
    +Licensed under the Apache License, Version 2.0. +
    + + + + + #makeNavigationBar() + + + +#end + + + + + From e99a1d56f4028d847efb0d8f6006e547ba37920a Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 14 Sep 2006 05:49:29 +0000 Subject: [PATCH 224/342] Bug 24969: Fix javadoc for createSession git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@443245 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/net/SMTPAppender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/net/SMTPAppender.java b/src/java/org/apache/log4j/net/SMTPAppender.java index 694c069cf4..cfdf82c318 100644 --- a/src/java/org/apache/log4j/net/SMTPAppender.java +++ b/src/java/org/apache/log4j/net/SMTPAppender.java @@ -146,7 +146,7 @@ protected void addressMessage(final Message msg) throws MessagingException { /** * Create mail session. - * @param mail session, may not be null. + * @return mail session, may not be null. */ protected Session createSession() { Properties props = null; From 39e98c2844439e3a7c2a7688dd01370c210dfcac Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 14 Sep 2006 05:50:56 +0000 Subject: [PATCH 225/342] Bug 40172: Fix javadoc for ConsoleAppender.setTarget git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@443248 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/ConsoleAppender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/ConsoleAppender.java b/src/java/org/apache/log4j/ConsoleAppender.java index b703e69b54..e937c32899 100644 --- a/src/java/org/apache/log4j/ConsoleAppender.java +++ b/src/java/org/apache/log4j/ConsoleAppender.java @@ -59,7 +59,7 @@ public ConsoleAppender(Layout layout) { /** * Creates a configured appender. * @param layout layout, may not be null. - * @param targetStr target, either "System.err" or "System.out". + * @param target target, either "System.err" or "System.out". */ public ConsoleAppender(Layout layout, String target) { setLayout(layout); From e48b3e19cff70c8b9df3e85c8ac8f2a053544f5a Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 14 Sep 2006 06:21:30 +0000 Subject: [PATCH 226/342] Bug 40172: Make log4j 1.2 and 1.3 documentation consistent git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@443258 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 35 +++++ src/xdocs/contributors.xml | 8 + src/xdocs/documentation.xml | 49 ++---- src/xdocs/download.xml | 6 +- src/xdocs/index.xml | 4 +- src/xdocs/plan.xml | 290 ++++-------------------------------- 6 files changed, 87 insertions(+), 305 deletions(-) diff --git a/build.xml b/build.xml index c2dd5e539f..8d79337dc2 100644 --- a/build.xml +++ b/build.xml @@ -73,6 +73,12 @@ + + + + + + @@ -574,6 +580,35 @@ + + -Dapache.user=USERNAME must be specified. + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/xdocs/contributors.xml b/src/xdocs/contributors.xml index 0d9f333a12..b28c204088 100644 --- a/src/xdocs/contributors.xml +++ b/src/xdocs/contributors.xml @@ -19,6 +19,14 @@ + +
  • Curt Arnold + +

    Curt is an independent software developer and current Logging Services PMC chair. + Curt developed the test framework for the W3C DOM test suites and has contributed to the + Apache Ant, Apache Xerces, Apache Batik, JSUnit, ArgoUML and ant-contrib + projects.

    +
  • Mathias Bogaert diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index 01988e2ee5..2209a1c7b8 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -3,62 +3,44 @@ Ceki Gülcü - Yoav Shapira + Yoav Shapira Documentation -
    +
    -

    With the exception of the complete manual, the following - documentation is included with the standard log4j distribution - and also browsable online: -

    - -
    -
    +
    • Spanish @@ -158,17 +140,10 @@
        -

      • Advanced - Log4j Louisville JUG presentation by Jonathan Cowherd
      • -

      • Log4J In 30 Minutes Or Less by John Munsch
      • -

      • Log4j, a logging package for the Java language by Ceki Gülcü
      • - -

      • Log4j presentation by the - Edmonton Java Users Group
      • +

      • Log4j, a logging package for the Java language by Ceki Gülcü
      • Log4j by Brent Twenter
      • diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index eb5678d658..fd702fac51 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -147,17 +147,17 @@ -
        log4jME
        +
        log4jME
        Log4jME, or log4j MiniEdition, is based on the same code as log4j. However, as the name indicates the mini-edition is much smaller. It offers the same client - interface such that code compiled for log4jME is 100% + interface such that code compiled for log4jME is compatible with log4j standard edition. You can choose to upgrade to log4j standard edition at any time by replacing log4jME.jar with log4j.jar in your classpath. At this time, log4jME is only available through - CVS. + ASF Subversion repository in the Logging Services Sandbox.
        diff --git a/src/xdocs/index.xml b/src/xdocs/index.xml index 2915668e0e..c6555d4fc7 100644 --- a/src/xdocs/index.xml +++ b/src/xdocs/index.xml @@ -10,6 +10,7 @@ +

        Inserting log statements into your code is a low-tech method @@ -50,8 +51,7 @@

        The target of the log output can be a file, an OutputStream, a java.io.Writer, a - remote log4j server, a remote Unix Syslog daemon, or even a NT - Event logger among many other output targets.

        + remote log4j server, a remote Unix Syslog daemon, or many other output targets.

        On an AMD Duron clocked at 800Mhz running JDK 1.3.1, it costs about 5 nanoseconds to determine if a logging statement should diff --git a/src/xdocs/plan.xml b/src/xdocs/plan.xml index 3c35ab6ca2..1c10af3a34 100644 --- a/src/xdocs/plan.xml +++ b/src/xdocs/plan.xml @@ -4,6 +4,7 @@ Ceki Gülcü Mark Womack + Curt Arnold Release roadmap for log4j @@ -11,8 +12,7 @@

        -

        The log4j committers have adopted a roadmap for future releases - of log4j. This page documents that roadmap and gives you an idea of what +

        This page documents that roadmap and gives you an idea of what to expect from future versions and timeframes for release.

        @@ -29,274 +29,38 @@
        -
        -

        Expected timeframe: End of July, 2005

        +
        +

        Expected timeframe: As needed

        -

        Version 1.2.12 is planned primarily as a bug fix release. It will be - addressing major bugs where the fixes do not require api changes. If you - have a bug or problem that you feel should be addressed, please make sure - that is reported in the log4j bug database and highlight it as a candidate - for the 1.2.12 release. -

        - -

        The log4j committers did decide to include one change in the 1.2 api - for the 1.2.12 release: adding the TRACE level as a level choice with - supporting methods to log messages for that level and check if the level - is enabled. The change is minor and should not cause problems with - existing deployments that use version 1.2.12 throughout. However, the - committers reserve the right to not include it if it appears to break too - much. -

        - -

        It is expected that version 1.2.12 will be the last release for the - 1.2 branch, the next major release being version 1.3. However, if a - critical bug fix is needed, another version will be released. -

        +

        log4j 1.2.14 was released in September 2006. log4j 1.2 is continuing to be maintained + in response to reported, but no active development is anticipated in the near future. Backporting + the org.apache.log4j.rolling package from log4j 1.3 might be desirable since usage problems + with the original org.apache.log4j.RollingFileAppender and org.apache.log4j.DailyRollingFileAppender + are commonly reported.

        -

        Expected timeframe: October, 2005

        - -

        The work for version 1.3 has been ongoing for a long time now, and it - is time to button it up and let others take it for a ride. Reviewing, - stablizing, and testing the 1.3 code for release is the major goal for - the log4j committers for this year. -

        - -

        Version 1.3 is going to contain some very extensive changes and new - features. You should expect a number of api changes. Early release - alpha versions have been available for a while, and the releases will be - accelerating as the committers review and cleanup the current code base - for release. As part of those releases, the committers plan to include - jDiff reports that will clearly outline the changes and additions to the - log4j code since the most recent 1.2.X release. This should help you in - seeing what might need to be reviewed or fixed in your own code related - to log4j. -

        - -

        Below is a table from previous documentation about the 1.3 work plan - and it is somewhat out of date. The committers will be updating this page - with more and better documentation about what has changed, what has been - reviewed, and what tasks remain as we work toward the 1.3 release. -

        - - - - - - - - - - - - - - - - - - - - - +

        Expected timeframe: indeterminate

        - - - - - - - +

        Compatibility with earlier releases (as implied by a minor verion number change) was not enforced during the + development process and much of the recent effort has been to restore compatibility. However, it does not + seem likely that log4j 1.3 will ever been sufficiently compatible with log4j 1.2 + to recommend it as a general replacement for log4j 1.2. Additional alpha releases are expected, + however it is possible that the development focus may shift to log4j 2.0.

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - -
        LabelCommentVolunteerStatus
        test cases -

        Writing test cases is not the most sexy part of - software development but it is one of the most - important. Automated test cases allow us to catch bugs - as early is possible. It is strongly recommended to add - a new test case with each new feature or component.

        - -

        Existing Perl language based test cases have been - migrated to junit (all-Java)based test - cases. The new tests are placed under the - tests/ directory. It should be thus - possible for participants in the project to understand - the stucture of our tests and add tests for their - components. -

        -
        All committersongoing effort
        Extensible XML configuration files -

        The DOMConfigurator is complex and not very - flexible. It can only deal with elements that the - developer knew about at compilation time. This has been - an important drawback in the design of several appenders - such as the the SMTPAppender and the - RollingFileAppenders and its variants. These appenders - need to delegate certain task to sub-components which - are configured separately. -

        - -

        The new JoranConfigurator being created by Ceki Gülcü will be based on - a new 'module' know as Joran, which can convert XML files into other - objects based on rules. You can read more abouth Joran - here - -

        -
        Ceki GülcüSignificantly progressed
        Log4j Domains -

        This is a very powerful and innovative concept that - extends the notion of hierarchical loggers. It will also - allow dynamic logging with pin-point accuracy. It was - first suggested to me by Scott Stark of JBoss fame. -

        -
        Ceki Gülcüdesign board
        Multiple implementations of Logger -

        Based on RepositorySelectors introduced in - log4j 1.2, the user will be able to replace the - Logger implementation. Several - implementations will be provided offering different - properties and functionality although none of the - implementations will add new public methods. -

        -
        ?vaporware
        Plugins/Receivers -

        A Plugin framework has been designed and implemented.

        -

        All of the currently developed plugins are "Receivers", which can be - thought of as the reverse of an appender; something - that accepts LoggingEvents from some external source. -

        -

        This has proven particulaly useful with the log4j ports, with the - addition of the XML-based Receivers able to accept - LoggingEvents generated from other languages (see "Overture to other - programming languages" below) -

        - -
        AllSignificantly progressed
        Improvements to Chainsaw -

        Chainsaw v2 development has now progressed - to the point where the main developers of it - and many other members of the logging community are using it daily. It's - still pre-alpha but only - because we keep thinking up things to add. -

        - -
        Scott Deboy and Paul SmithSignificantly progressed
        Custom conversion characters in PatternLayoutUsers often want to add new conversions characters or - override the existing ones. This should be made easy using - new configuration directives. This feature would use the - extensions to XML configuration language mentioned - above.Ceki GülcüCompleted, still testing
        Overture to other programming languages

        It is higly desriable to allow log4j ports in other languages - to access log4j services in a language independent way.

        - -

        The use of a standard XML format to represent a LoggingEvent has been - established and many of the related logging projects from - non-Java languages have begun to support it. In fact, a number of the - log4j ports have volunteered to join Apache!

        - -

        Scott Deboy has completed work to create a fex XML-based Receiver - classes that can accept logging events from an external source, and - 'import' them into the local log4j environment.

        Ceki Gülcü, Scott DeboySignificantly Progressed (if not completed)
        Strategy based rollovers -

        Contrary to our own DailyRollingFileAppender, Avalon's - logkit has a nice and clean implementation for rolling - files. See the - org.apache.log.output.io.rotate package for - exact details. -

        - -

        Their implementation is based on strategies which are - sub-components of appender. We will be able to configure - such sub-components with the new XML configuration - scripts. -

        -
        Ceki GülcüSignificantly Progressed
        Redesign of configure and watch architecture in - configuratorsThis is a very useful feature and the current architecture is not - very good. - -

        Contributions have been received by Mark Womack and others.

        - -

        See -

        -     http://www.mail-archive.com/log4j-dev@jakarta.apache.org/msg01390.html
        -     http://www.mail-archive.com/log4j-user@jakarta.apache.org/msg00666.html
        -     http://marc.theaimsgroup.com/?t=101010070500002&r=1&w=2
        -              
        -

        -
        Mark Womackinitial implementation
        Performance improvements to LoggingEvent serialization -

        Ole Dalgaard has shown that by implementing the - java.io.Externalizable interface instead of - java.io.Serializable in the LoggingEvent class, the - speed of serialiazation is increased by a factor of 4 or - more. -

        - -
        Ole Dalgaard?initial implementation
        +
        +

        Expected timeframe: indeterminate

        + +

        log4j 2.0 is still conceptual but would be designed for Java 5 and later, + would use be designed for fine-grain concurrency to maximize performance on + multi-processor systems, would minimize exposure of implementation details and + adhere to current Java coding practices. The design of log4j 2.0 may attempt to + support javax.util.logging by allowing, for example, a log4j 2.0 Appender to serve + as a javax.util.logging.Handler. log4j 2.0 would likely be modularized, possibly using + OSGi and would include a facade that emulates the log4j 1.3 API but would not be compatible + with user written appenders and other components.

        From 2a363e694a56e93da93e75364d60a8e08bf3976a Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 14 Sep 2006 06:55:42 +0000 Subject: [PATCH 227/342] Bug 40172: Update license version in manual.html git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@443268 13f79535-47bb-0310-9956-ffa450edef68 --- docs/manual.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/manual.html b/docs/manual.html index 6c1b0cf76e..8da3873f52 100644 --- a/docs/manual.html +++ b/docs/manual.html @@ -17,8 +17,8 @@

        Short introduction to log4j

        Copyright © 2000-2002 The Apache Software Foundation. All rights reserved. This software is published under the terms of - the Apache Software License version 1.1, a copy of which has - been included in the LICENSE.txt file shipped with the log4j + the Apache Software License version 2.0, a copy of which has + been included in the LICENSE file shipped with the log4j distribution. This document is based on the article "Log4j delivers control over logging" published in November 2000 @@ -47,7 +47,7 @@

        Introduction

        own tracing API. This was in early 1996. After countless enhancements, several incarnations and much work that API has evolved to become log4j, a popular logging package for Java. The package is distributed -under the Apache Software License, a +under the Apache Software License, a fully-fledged open source license certified by the open source initiative. The latest log4j version, including full-source code, class files and From 0cbaa7c655f1cb87b1e06bd8b062fcb57d4ed8a1 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 25 Sep 2006 19:33:36 +0000 Subject: [PATCH 228/342] Bug 40604: Build maven repository bundle git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@449783 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 31 +++++++++++++++++++++++++++++++ pom.xml | 1 + 2 files changed, 32 insertions(+) create mode 100644 pom.xml diff --git a/build.xml b/build.xml index 8d79337dc2..1608ffc51f 100644 --- a/build.xml +++ b/build.xml @@ -687,6 +687,37 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000..56a2f03cdc --- /dev/null +++ b/pom.xml @@ -0,0 +1 @@ + 4.0.0 log4j log4j jar Log4j 1.2.14 Log4j http://logging.apache.org/log4j/docs/ Bugzilla http://issues.apache.org/bugzilla 1999 log4j-user log4j-user-subscribe@logging.apache.org log4j-user-unsubscribe@logging.apache.org log4j-user@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-user&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.user log4j-dev log4j-dev-subscribe@logging.apache.org log4j-dev-unsubscribe@logging.apache.org log4j-dev@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-dev&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.devel The Apache Software License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt repo scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_14/ Apache Software Foundation http://www.apache.org \ No newline at end of file From b8c28400a4f71053c5b75a0f2e8ee1873caa4433 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 25 Sep 2006 19:39:22 +0000 Subject: [PATCH 229/342] Bug 40604: Build maven repository bundle git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@449786 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 56a2f03cdc..21901d3666 100644 --- a/pom.xml +++ b/pom.xml @@ -1 +1 @@ - 4.0.0 log4j log4j jar Log4j 1.2.14 Log4j http://logging.apache.org/log4j/docs/ Bugzilla http://issues.apache.org/bugzilla 1999 log4j-user log4j-user-subscribe@logging.apache.org log4j-user-unsubscribe@logging.apache.org log4j-user@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-user&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.user log4j-dev log4j-dev-subscribe@logging.apache.org log4j-dev-unsubscribe@logging.apache.org log4j-dev@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-dev&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.devel The Apache Software License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt repo scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_14/ Apache Software Foundation http://www.apache.org \ No newline at end of file + 4.0.0 log4j log4j jar Log4j 1.2.14 Log4j http://logging.apache.org/log4j/docs/ Bugzilla http://issues.apache.org/bugzilla 1999 log4j-user log4j-user-subscribe@logging.apache.org log4j-user-unsubscribe@logging.apache.org log4j-user@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-user&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.user log4j-dev log4j-dev-subscribe@logging.apache.org log4j-dev-unsubscribe@logging.apache.org log4j-dev@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-dev&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.devel The Apache Software License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt repo scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_14/ Apache Software Foundation http://www.apache.org \ No newline at end of file From 65d70e0785ef7a21d3336ca44162647dc01eeae8 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 25 Sep 2006 19:47:42 +0000 Subject: [PATCH 230/342] Bug 40604: Build maven repository bundle git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@449792 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 1608ffc51f..a08d3070c9 100644 --- a/build.xml +++ b/build.xml @@ -710,7 +710,7 @@ - From 3dfba55a4c3a7c29526b86f8b03dbe8c10a26035 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 29 Nov 2006 00:32:53 +0000 Subject: [PATCH 231/342] Bug 40604: Build Maven Repository Bundle git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@480304 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 64 ++++++++++++++++++++++++++++++++++++++----------------- pom.xml | 2 +- 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/build.xml b/build.xml index a08d3070c9..0914cb08f4 100644 --- a/build.xml +++ b/build.xml @@ -78,6 +78,11 @@ + + + + + @@ -690,36 +695,55 @@ - - - - + + + - - + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/pom.xml b/pom.xml index 21901d3666..a5c962261f 100644 --- a/pom.xml +++ b/pom.xml @@ -1 +1 @@ - 4.0.0 log4j log4j jar Log4j 1.2.14 Log4j http://logging.apache.org/log4j/docs/ Bugzilla http://issues.apache.org/bugzilla 1999 log4j-user log4j-user-subscribe@logging.apache.org log4j-user-unsubscribe@logging.apache.org log4j-user@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-user&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.user log4j-dev log4j-dev-subscribe@logging.apache.org log4j-dev-unsubscribe@logging.apache.org log4j-dev@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-dev&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.devel The Apache Software License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt repo scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_14/ Apache Software Foundation http://www.apache.org \ No newline at end of file + 4.0.0 log4j log4j jar Log4j 1.2.14 Log4j http://logging.apache.org/log4j/docs/ Bugzilla http://issues.apache.org/bugzilla 1999 log4j-user log4j-user-subscribe@logging.apache.org log4j-user-unsubscribe@logging.apache.org log4j-user@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-user&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.user log4j-dev log4j-dev-subscribe@logging.apache.org log4j-dev-unsubscribe@logging.apache.org log4j-dev@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-dev&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.devel The Apache Software License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt repo scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_14/ Apache Software Foundation http://www.apache.org \ No newline at end of file From 55bb30b541917c6736d582d49d11a6447d75d512 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 15 Dec 2006 22:03:38 +0000 Subject: [PATCH 232/342] Bug 39437: Eliminate unnecessary conversion to local code page git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@487686 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/nt/nteventlog.cpp | 135 ++++++-------------- 1 file changed, 39 insertions(+), 96 deletions(-) diff --git a/src/java/org/apache/log4j/nt/nteventlog.cpp b/src/java/org/apache/log4j/nt/nteventlog.cpp index 1150d92c4c..0a9f7e2980 100644 --- a/src/java/org/apache/log4j/nt/nteventlog.cpp +++ b/src/java/org/apache/log4j/nt/nteventlog.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. + * Copyright 1999-2006 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,71 +24,8 @@ typedef long long __int64; #include "org_apache_log4j_Priority.h" #include "org_apache_log4j_nt_NTEventLogAppender.h" #include +#include -// Borrowed unabashedly from the JNI Programmer's Guide -void JNU_ThrowByName(JNIEnv *env, const char *name, const char *msg) { - - jclass classForName = env->FindClass(name); - // If cls is null, an exception has already been thrown. - if (classForName != (jclass)0) { - env->ThrowNew(classForName, msg); - } - // cleanup - env->DeleteLocalRef(classForName); - return; -} - -// Borrowed unabashedly from the JNI Programmer's Guide -char *JNU_GetStringNativeChars(JNIEnv *env, jstring jstr) { - static jmethodID midStringGetBytes = 0; - jbyteArray bytes = 0; - jthrowable exc; - char *nstr = 0; - - //if (env->EnsureLocalCapacity(2) < 0) { - // out of memory - //return 0; - //} - - if (midStringGetBytes == 0) { - // Lookup and cache the String.getBytes() method id. - jclass stringClass = env->FindClass("java/lang/String"); - if (stringClass == 0) { - // An exception will have been thrown. - return 0; - } - midStringGetBytes = env->GetMethodID(stringClass, "getBytes", "()[B"); - env->DeleteLocalRef(stringClass); - if (midStringGetBytes == 0) { - // An exception will have been thrown. - return 0; - } - } - - bytes = (jbyteArray)env->CallObjectMethod(jstr, midStringGetBytes); - exc = env->ExceptionOccurred(); - if (exc == 0) { - // Attempt to malloc enough room for the length of the Java - // string plus one byte for the 0-terminator. - jint len = env->GetArrayLength(bytes); - nstr = (char *)malloc(len + 1); - if (nstr == 0) { - // malloc failed -- throw an OutOfMemoryError - JNU_ThrowByName(env, "java/lang/OutOfMemoryError", 0); - env->DeleteLocalRef(bytes); - return 0; - } - // copy to the malloc'd array and 0-terminate - env->GetByteArrayRegion(bytes, 0, len, (jbyte *)nstr); - nstr[len] = 0; - } else { - // cleanup - env->DeleteLocalRef(exc); - } - // cleanup - env->DeleteLocalRef(bytes); - return nstr; -} /* * Convert log4j Priority to an EventLog category. Each category is @@ -125,39 +62,39 @@ WORD getType(jint priority) { return ret_val; } -HKEY regGetKey(TCHAR *subkey, DWORD *disposition) { +HKEY regGetKey(wchar_t *subkey, DWORD *disposition) { HKEY hkey = 0; - RegCreateKeyEx(HKEY_LOCAL_MACHINE, subkey, 0, NULL, + RegCreateKeyExW(HKEY_LOCAL_MACHINE, subkey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hkey, disposition); return hkey; } -void regSetString(HKEY hkey, TCHAR *name, TCHAR *value) { - RegSetValueEx(hkey, name, 0, REG_SZ, (LPBYTE)value, lstrlen(value) + sizeof(TCHAR)); +void regSetString(HKEY hkey, wchar_t *name, wchar_t *value) { + RegSetValueExW(hkey, name, 0, REG_SZ, (LPBYTE)value, (wcslen(value) + 1) * sizeof(wchar_t)); } -void regSetDword(HKEY hkey, TCHAR *name, DWORD value) { - RegSetValueEx(hkey, name, 0, REG_DWORD, (LPBYTE)&value, sizeof(DWORD)); +void regSetDword(HKEY hkey, wchar_t *name, DWORD value) { + RegSetValueExW(hkey, name, 0, REG_DWORD, (LPBYTE)&value, sizeof(DWORD)); } /* * Add this source with appropriate configuration keys to the registry. */ -void addRegistryInfo(char *source) { - const TCHAR *prefix = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\"; +void addRegistryInfo(wchar_t *source) { + const wchar_t *prefix = L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\"; DWORD disposition; HKEY hkey = 0; - TCHAR subkey[256]; + wchar_t subkey[256]; - lstrcpy(subkey, prefix); - lstrcat(subkey, source); + wcscpy(subkey, prefix); + wcscat(subkey, source); hkey = regGetKey(subkey, &disposition); if (disposition == REG_CREATED_NEW_KEY) { - regSetString(hkey, "EventMessageFile", "NTEventLogAppender.dll"); - regSetString(hkey, "CategoryMessageFile", "NTEventLogAppender.dll"); - regSetDword(hkey, "TypesSupported", (DWORD)7); - regSetDword(hkey, "CategoryCount", (DWORD)8); + regSetString(hkey, L"EventMessageFile", L"NTEventLogAppender.dll"); + regSetString(hkey, L"CategoryMessageFile", L"NTEventLogAppender.dll"); + regSetDword(hkey, L"TypesSupported", (DWORD)7); + regSetDword(hkey, L"CategoryCount", (DWORD)8); } //RegSetValueEx(hkey, "EventMessageFile", 0, REG_SZ, (LPBYTE)dllname, lstrlen(dllname)); //RegSetValueEx(hkey, "CategoryMessageFile", 0, REG_SZ, (LPBYTE)dllname, lstrlen(dllname)); @@ -175,19 +112,25 @@ void addRegistryInfo(char *source) { JNIEXPORT jint JNICALL Java_org_apache_log4j_nt_NTEventLogAppender_registerEventSource( JNIEnv *env, jobject java_this, jstring server, jstring source) { - char *nserver = 0; - char *nsource = 0; + jchar *nserver = 0; + jchar *nsource = 0; if (server != 0) { - nserver = JNU_GetStringNativeChars(env, server); + jsize serverLen = env->GetStringLength(server); + nserver = (jchar*) malloc((serverLen +1) * sizeof(jchar)); + env->GetStringRegion(server, 0, serverLen, nserver); + nserver[serverLen] = 0; } if (source != 0) { - nsource = JNU_GetStringNativeChars(env, source); + jsize sourceLen = env->GetStringLength(source); + nsource = (jchar*) malloc((sourceLen +1) * sizeof(jchar)); + env->GetStringRegion(source, 0, sourceLen, nsource); + nsource[sourceLen] = 0; } - addRegistryInfo(nsource); - jint handle = (jint)RegisterEventSource(nserver, nsource); - free((void *)nserver); - free((void *)nsource); + addRegistryInfo((wchar_t*) nsource); + jint handle = (jint)RegisterEventSourceW((const wchar_t*) nserver, (const wchar_t*) nsource); + free(nserver); + free(nsource); return handle; } @@ -202,25 +145,25 @@ JNIEXPORT void JNICALL Java_org_apache_log4j_nt_NTEventLogAppender_reportEvent( jboolean localHandle = JNI_FALSE; if (handle == 0) { // Client didn't give us a handle so make a local one. - handle = (jint)RegisterEventSource(NULL, "Log4j"); + handle = (jint)RegisterEventSourceW(NULL, L"Log4j"); localHandle = JNI_TRUE; } // convert Java String to character array - const int numStrings = 1; - LPCTSTR array[numStrings]; - char *nstr = JNU_GetStringNativeChars(env, jstr); - array[0] = nstr; + jsize msgLen = env->GetStringLength(jstr); + jchar* msg = (jchar*) malloc((msgLen + 1) * sizeof(jchar)); + env->GetStringRegion(jstr, 0, msgLen, msg); + msg[msgLen] = 0; // This is the only message supported by the package. It is backed by // a message resource which consists of just '%1' which is replaced // by the string we just created. const DWORD messageID = 0x1000; - ReportEvent((HANDLE)handle, getType(priority), + ReportEventW((HANDLE)handle, getType(priority), getCategory(priority), - messageID, NULL, 1, 0, array, NULL); + messageID, NULL, 1, 0, (const wchar_t**) &msg, NULL); - free((void *)nstr); + free((void *)msg); if (localHandle == JNI_TRUE) { // Created the handle here so free it here too. DeregisterEventSource((HANDLE)handle); From 6e4da7fcdfb8504c627278ac564957555db105e2 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 15 Dec 2006 22:06:40 +0000 Subject: [PATCH 233/342] Bug 41169: NTEventLogAppender.dll missing event description git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@487688 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 10 +- .../org/apache/log4j/nt/EventLogCategories.h | 90 ------------------ .../org/apache/log4j/nt/EventLogCategories.mc | 40 ++++++-- .../org/apache/log4j/nt/EventLogCategories.rc | 2 - src/java/org/apache/log4j/nt/MSG00001.bin | Bin 192 -> 164 bytes .../org/apache/log4j/nt/NTEventLogAppender.rc | 31 +++++- src/java/org/apache/log4j/nt/nteventlog.cpp | 66 ++++++++----- 7 files changed, 99 insertions(+), 140 deletions(-) delete mode 100644 src/java/org/apache/log4j/nt/EventLogCategories.h delete mode 100644 src/java/org/apache/log4j/nt/EventLogCategories.rc diff --git a/build.xml b/build.xml index 0914cb08f4..2ec4f801c5 100644 --- a/build.xml +++ b/build.xml @@ -343,14 +343,7 @@ destdir="${javac.dest}" classpath="${jar.dest}/${jar.filename}"/> - - - - - - - - + @@ -367,7 +360,6 @@ - diff --git a/src/java/org/apache/log4j/nt/EventLogCategories.h b/src/java/org/apache/log4j/nt/EventLogCategories.h deleted file mode 100644 index 478e5c0120..0000000000 --- a/src/java/org/apache/log4j/nt/EventLogCategories.h +++ /dev/null @@ -1,90 +0,0 @@ -// -// Values are 32 bit values layed out as follows: -// -// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 -// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 -// +---+-+-+-----------------------+-------------------------------+ -// |Sev|C|R| Facility | Code | -// +---+-+-+-----------------------+-------------------------------+ -// -// where -// -// Sev - is the severity code -// -// 00 - Success -// 01 - Informational -// 10 - Warning -// 11 - Error -// -// C - is the Customer code flag -// -// R - is a reserved bit -// -// Facility - is the facility code -// -// Code - is the facility's status code -// -// -// Define the facility codes -// - - -// -// Define the severity codes -// - - -// -// MessageId: 0x0000C350L (No symbolic name defined) -// -// MessageText: -// -// Fatal -// - - -// -// MessageId: 0x00009C40L (No symbolic name defined) -// -// MessageText: -// -// Error -// - - -// -// MessageId: 0x00007530L (No symbolic name defined) -// -// MessageText: -// -// Warn -// - - -// -// MessageId: 0x00004E20L (No symbolic name defined) -// -// MessageText: -// -// Info -// - - -// -// MessageId: 0x00002710L (No symbolic name defined) -// -// MessageText: -// -// Debug -// - - -// -// MessageId: 0x00001000L (No symbolic name defined) -// -// MessageText: -// -// %1 -// - - diff --git a/src/java/org/apache/log4j/nt/EventLogCategories.mc b/src/java/org/apache/log4j/nt/EventLogCategories.mc index c896f54471..f017900055 100644 --- a/src/java/org/apache/log4j/nt/EventLogCategories.mc +++ b/src/java/org/apache/log4j/nt/EventLogCategories.mc @@ -1,22 +1,44 @@ -MessageId=0xC350 +; +; Licensed to the Apache Software Foundation (ASF) under one +; or more contributor license agreements. See the NOTICE file +; distributed with this work for additional information +; regarding copyright ownership. The ASF licenses this file +; to you under the Apache License, Version 2.0 (the +; "License"); you may not use this file except in compliance +; with the License. You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, +; software distributed under the License is distributed on an +; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +; KIND, either express or implied. See the License for the +; specific language governing permissions and limitations +; under the License. +; +MessageId=1 Language=English -Fatal +Trace . -MessageId=0x9C40 +MessageId=2 Language=English -Error +Debug +. +MessageId=3 +Language=English +Info . -MessageId=0x7530 +MessageId=4 Language=English Warn . -MessageId=0x4E20 +MessageId=5 Language=English -Info +Error . -MessageId=0x2710 +MessageId=6 Language=English -Debug +Fatal . MessageId=0x1000 Language=English diff --git a/src/java/org/apache/log4j/nt/EventLogCategories.rc b/src/java/org/apache/log4j/nt/EventLogCategories.rc deleted file mode 100644 index 116522b7d4..0000000000 --- a/src/java/org/apache/log4j/nt/EventLogCategories.rc +++ /dev/null @@ -1,2 +0,0 @@ -LANGUAGE 0x9,0x1 -1 11 MSG00001.bin diff --git a/src/java/org/apache/log4j/nt/MSG00001.bin b/src/java/org/apache/log4j/nt/MSG00001.bin index b05c1a3ef6378f270d91aa9e9c40d1d011711637..b6a1996851a63eee39104e2df6a7ff67757e5294 100644 GIT binary patch delta 70 zcmX@WxP(!ciGhKE5s2AW0Pa%;X8-^I delta 84 zcmZ3&c!1H9jR6P*AlL^)sY7rKkgebc!399JK`8{c0ND<6Ab19l9dH= org_apache_log4j_Priority_DEBUG_INT) { + category = 2; + if (priority >= org_apache_log4j_Priority_INFO_INT) { + category = 3; + if (priority >= org_apache_log4j_Priority_WARN_INT) { + category = 4; + if (priority >= org_apache_log4j_Priority_ERROR_INT) { + category = 5; + if (priority >= org_apache_log4j_Priority_FATAL_INT) { + category = 6; + } + } + } + } + } + return category; } /* @@ -43,23 +58,17 @@ WORD getCategory(jint priority) { * 3 event types of interest to us: ERROR, WARNING, and INFO. */ WORD getType(jint priority) { - WORD ret_val; - - switch (priority) { - case org_apache_log4j_Priority_FATAL_INT: - case org_apache_log4j_Priority_ERROR_INT: - ret_val = EVENTLOG_ERROR_TYPE; - break; - case org_apache_log4j_Priority_WARN_INT: - ret_val = EVENTLOG_WARNING_TYPE; - break; - case org_apache_log4j_Priority_INFO_INT: - case org_apache_log4j_Priority_DEBUG_INT: - default: - ret_val = EVENTLOG_INFORMATION_TYPE; - break; + WORD type = EVENTLOG_SUCCESS; + if (priority >= org_apache_log4j_Priority_INFO_INT) { + type = EVENTLOG_INFORMATION_TYPE; + if (priority >= org_apache_log4j_Priority_WARN_INT) { + type = EVENTLOG_WARNING_TYPE; + if (priority >= org_apache_log4j_Priority_ERROR_INT) { + type = EVENTLOG_ERROR_TYPE; + } + } } - return ret_val; + return type; } HKEY regGetKey(wchar_t *subkey, DWORD *disposition) { @@ -71,7 +80,8 @@ HKEY regGetKey(wchar_t *subkey, DWORD *disposition) { } void regSetString(HKEY hkey, wchar_t *name, wchar_t *value) { - RegSetValueExW(hkey, name, 0, REG_SZ, (LPBYTE)value, (wcslen(value) + 1) * sizeof(wchar_t)); + RegSetValueExW(hkey, name, 0, REG_EXPAND_SZ, + (LPBYTE)value, (wcslen(value) + 1) * sizeof(wchar_t)); } void regSetDword(HKEY hkey, wchar_t *name, DWORD value) { @@ -91,15 +101,19 @@ void addRegistryInfo(wchar_t *source) { wcscat(subkey, source); hkey = regGetKey(subkey, &disposition); if (disposition == REG_CREATED_NEW_KEY) { - regSetString(hkey, L"EventMessageFile", L"NTEventLogAppender.dll"); - regSetString(hkey, L"CategoryMessageFile", L"NTEventLogAppender.dll"); + HMODULE hmodule = GetModuleHandleW(L"NTEventLogAppender.dll"); + if (hmodule != NULL) { + wchar_t modpath[_MAX_PATH]; + DWORD modlen = GetModuleFileNameW(hmodule, modpath, _MAX_PATH - 1); + if (modlen > 0) { + modpath[modlen] = 0; + regSetString(hkey, L"EventMessageFile", modpath); + regSetString(hkey, L"CategoryMessageFile", modpath); + } + } regSetDword(hkey, L"TypesSupported", (DWORD)7); - regSetDword(hkey, L"CategoryCount", (DWORD)8); + regSetDword(hkey, L"CategoryCount", (DWORD) 6); } - //RegSetValueEx(hkey, "EventMessageFile", 0, REG_SZ, (LPBYTE)dllname, lstrlen(dllname)); - //RegSetValueEx(hkey, "CategoryMessageFile", 0, REG_SZ, (LPBYTE)dllname, lstrlen(dllname)); - //RegSetValueEx(hkey, "TypesSupported", 0, REG_DWORD, (LPBYTE)&whichTypes, sizeof(DWORD)); - //RegSetValueEx(hkey, "CategoryCount", 0, REG_DWORD, (LPBYTE)&numCategories, sizeof(DWORD)); RegCloseKey(hkey); return; } From 16d943b19781ee83ae9a276debcf1139f89a6d5c Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 16 Dec 2006 00:06:13 +0000 Subject: [PATCH 234/342] Bug 41186: DiscardSummary events create NPE in layouts git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@487724 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/AsyncAppender.java | 6 +- .../apache/log4j/AsyncAppenderTestCase.java | 174 ++++++++++++++++++ 2 files changed, 179 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/AsyncAppender.java b/src/java/org/apache/log4j/AsyncAppender.java index 97081011e3..967dd13544 100644 --- a/src/java/org/apache/log4j/AsyncAppender.java +++ b/src/java/org/apache/log4j/AsyncAppender.java @@ -466,7 +466,11 @@ public LoggingEvent createEvent() { new Object[] { new Integer(count), maxEvent.getMessage() }); return new LoggingEvent( - null, Logger.getLogger(maxEvent.getLoggerName()), maxEvent.getLevel(), msg, null); + "org.apache.log4j.AsyncAppender.DONT_REPORT_LOCATION", + Logger.getLogger(maxEvent.getLoggerName()), + maxEvent.getLevel(), + msg, + null); } } diff --git a/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java b/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java index 56b1d0466f..027e6ea640 100644 --- a/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java +++ b/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java @@ -23,6 +23,7 @@ import java.util.Vector; import org.apache.log4j.*; +import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.varia.NullAppender; /** @@ -151,4 +152,177 @@ public void testBadAppender() throws Exception { } } + + /** + * Tests location processing when buffer is full and locationInfo=true. + * See bug 41186. + */ + public void testLocationInfoTrue() { + BlockableVectorAppender blockableAppender = new BlockableVectorAppender(); + AsyncAppender async = new AsyncAppender(); + async.addAppender(blockableAppender); + async.setBufferSize(5); + async.setLocationInfo(true); + async.setBlocking(false); + async.activateOptions(); + Logger rootLogger = Logger.getRootLogger(); + rootLogger.addAppender(async); + Greeter greeter = new Greeter(rootLogger, 100); + synchronized(blockableAppender.getMonitor()) { + greeter.run(); + rootLogger.error("That's all folks."); + } + async.close(); + Vector events = blockableAppender.getVector(); + LoggingEvent initialEvent = (LoggingEvent) events.get(0); + LoggingEvent discardEvent = (LoggingEvent) events.get(events.size() - 1); + PatternLayout layout = new PatternLayout(); + layout.setConversionPattern("%C:%L %m%n"); + layout.activateOptions(); + String initialStr = layout.format(initialEvent); + assertEquals(AsyncAppenderTestCase.class.getName(), + initialStr.substring(0, AsyncAppenderTestCase.class.getName().length())); + String discardStr = layout.format(discardEvent); + assertEquals("?:? ", discardStr.substring(0, 4)); + } + + + /** + * Tests location processing when buffer is full and locationInfo=false. + * See bug 41186. + */ + public void testLocationInfoFalse() { + BlockableVectorAppender blockableAppender = new BlockableVectorAppender(); + AsyncAppender async = new AsyncAppender(); + async.addAppender(blockableAppender); + async.setBufferSize(5); + async.setLocationInfo(false); + async.setBlocking(false); + async.activateOptions(); + Logger rootLogger = Logger.getRootLogger(); + rootLogger.addAppender(async); + Greeter greeter = new Greeter(rootLogger, 100); + synchronized(blockableAppender.getMonitor()) { + greeter.run(); + rootLogger.error("That's all folks."); + } + async.close(); + Vector events = blockableAppender.getVector(); + LoggingEvent initialEvent = (LoggingEvent) events.get(0); + LoggingEvent discardEvent = (LoggingEvent) events.get(events.size() - 1); + PatternLayout layout = new PatternLayout(); + layout.setConversionPattern("%C:%L %m%n"); + layout.activateOptions(); + String initialStr = layout.format(initialEvent); + assertEquals("?:? ", initialStr.substring(0, 4)); + String discardStr = layout.format(discardEvent); + assertEquals("?:? ", discardStr.substring(0, 4)); + } + + /** + * Logging request runnable. + */ + private static final class Greeter implements Runnable { + /** + * Logger. + */ + private final Logger logger; + + /** + * Repetitions. + */ + private final int repetitions; + + /** + * Create new instance. + * @param logger logger, may not be null. + * @param repetitions repetitions. + */ + public Greeter(final Logger logger, final int repetitions) { + if (logger == null) { + throw new IllegalArgumentException("logger"); + } + + this.logger = logger; + this.repetitions = repetitions; + } + + /** + * {@inheritDoc} + */ + public void run() { + try { + for (int i = 0; i < repetitions; i++) { + logger.info("Hello, World"); + Thread.sleep(1); + } + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } + } + + + + /** + * Vector appender that can be explicitly blocked. + */ + private static final class BlockableVectorAppender extends VectorAppender { + /** + * Monitor object used to block appender. + */ + private final Object monitor = new Object(); + + /** + * Thread of last call to append. + */ + private Thread dispatcher; + + /** + * Create new instance. + */ + public BlockableVectorAppender() { + super(); + } + + /** + * {@inheritDoc} + */ + public void append(final LoggingEvent event) { + synchronized (monitor) { + dispatcher = Thread.currentThread(); + super.append(event); + // + // if fatal, echo messages for testLoggingInDispatcher + // + if (event.getLevel() == Level.FATAL) { + Logger logger = Logger.getLogger(event.getLoggerName()); + logger.error(event.getMessage().toString()); + logger.warn(event.getMessage().toString()); + logger.info(event.getMessage().toString()); + logger.debug(event.getMessage().toString()); + } + } + } + + /** + * Get monitor object. + * @return monitor. + */ + public Object getMonitor() { + return monitor; + } + + /** + * Get thread of previous call to append. + * @return thread, may be null. + */ + public Thread getDispatcher() { + synchronized (monitor) { + return dispatcher; + } + } + } + + } From 8fbbfd356b7c4329d7acdd20818711853086c8ac Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 9 Feb 2007 02:29:29 +0000 Subject: [PATCH 235/342] Bug 41575: projects.apache.org metadata for Logging Services PMC git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@505142 13f79535-47bb-0310-9956-ffa450edef68 --- doap_log4j.rdf | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 doap_log4j.rdf diff --git a/doap_log4j.rdf b/doap_log4j.rdf new file mode 100644 index 0000000000..51b1f9bf83 --- /dev/null +++ b/doap_log4j.rdf @@ -0,0 +1,51 @@ + + + + + + 2007-02-09 + + Apache log4j + + + Apache log4j provides logging services for Java. + + + + Java + + + + Apache log4j 1.2.14 + 2006-09-18 + 1.2.14 + + + + + + + + + + From 3f7f3da644351b76b0c325c251b156928d4eed78 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 9 Feb 2007 02:52:09 +0000 Subject: [PATCH 236/342] Bug 41575: projects.apache.org metadata for Logging Services PMC git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@505150 13f79535-47bb-0310-9956-ffa450edef68 --- doap_log4j.rdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doap_log4j.rdf b/doap_log4j.rdf index 51b1f9bf83..5d4d5168b4 100644 --- a/doap_log4j.rdf +++ b/doap_log4j.rdf @@ -27,7 +27,7 @@ Apache log4j - + Apache log4j provides logging services for Java. From 62da6bda45f2eaa810b32c6f2b9132abf3f09e91 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 20 Feb 2007 23:16:20 +0000 Subject: [PATCH 237/342] Bug 38680: fix warning message git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@509804 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/helpers/OptionConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/helpers/OptionConverter.java b/src/java/org/apache/log4j/helpers/OptionConverter.java index 7d9029a5af..e533cc2f49 100644 --- a/src/java/org/apache/log4j/helpers/OptionConverter.java +++ b/src/java/org/apache/log4j/helpers/OptionConverter.java @@ -228,7 +228,7 @@ Level toLevel(String value, Level defaultValue) { LogLog.warn("custom level class [" + clazz + "] not found."); } catch(NoSuchMethodException e) { LogLog.warn("custom level class [" + clazz + "]" - + " does not have a constructor which takes one string parameter", e); + + " does not have a class function toLevel(String, Level)", e); } catch(java.lang.reflect.InvocationTargetException e) { LogLog.warn("custom level class [" + clazz + "]" + " could not be instantiated", e); From 4dfcd799fa9de74758d0b1474e0deee37e46af37 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 21 Feb 2007 16:35:14 +0000 Subject: [PATCH 238/342] Bug 35324: Tests for stacktrace issues capturing pre-fix behavior git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510089 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/log4j/CoreTestSuite.java | 1 + .../log4j/spi/ThrowableInformationTest.java | 216 ++++++++++++++++++ 2 files changed, 217 insertions(+) create mode 100644 tests/src/java/org/apache/log4j/spi/ThrowableInformationTest.java diff --git a/tests/src/java/org/apache/log4j/CoreTestSuite.java b/tests/src/java/org/apache/log4j/CoreTestSuite.java index 51a0ac7ef2..204ee8986c 100644 --- a/tests/src/java/org/apache/log4j/CoreTestSuite.java +++ b/tests/src/java/org/apache/log4j/CoreTestSuite.java @@ -46,6 +46,7 @@ public static Test suite() { s.addTestSuite(org.apache.log4j.HTMLLayoutTest.class); s.addTestSuite(org.apache.log4j.PatternLayoutTest.class); s.addTestSuite(org.apache.log4j.spi.LoggingEventTest.class); + s.addTestSuite(org.apache.log4j.spi.ThrowableInformationTest.class); return s; } } diff --git a/tests/src/java/org/apache/log4j/spi/ThrowableInformationTest.java b/tests/src/java/org/apache/log4j/spi/ThrowableInformationTest.java new file mode 100644 index 0000000000..e742b0a851 --- /dev/null +++ b/tests/src/java/org/apache/log4j/spi/ThrowableInformationTest.java @@ -0,0 +1,216 @@ +/* + * Copyright 1999,2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.spi; + +import junit.framework.TestCase; + +import java.io.PrintWriter; + + +/** + * Unit tests for ThrowableInformation. + */ +public class ThrowableInformationTest extends TestCase { + /** + * Create ThrowableInformationTest. + * + * @param name test name. + */ + public ThrowableInformationTest(final String name) { + super(name); + } + + /** + * Custom throwable that only calls methods + * overridden by VectorWriter in log4j 1.2.14 and earlier. + */ + private static final class OverriddenThrowable extends Throwable { + /** + * Create new instance. + */ + public OverriddenThrowable() { + } + + /** + * Print stack trace. + * + * @param s print writer. + */ + public void printStackTrace(final PrintWriter s) { + s.print((Object) "print(Object)"); + s.print("print(char[])".toCharArray()); + s.print("print(String)"); + s.println((Object) "println(Object)"); + s.println("println(char[])".toCharArray()); + s.println("println(String)"); + s.write("write(char[])".toCharArray()); + s.write("write(char[], int, int)".toCharArray(), 2, 8); + s.write("write(String, int, int)", 2, 8); + } + } + + /** + * Test capturing stack trace from a throwable that only uses the + * PrintWriter methods overridden in log4j 1.2.14 and earlier. + */ + public void testOverriddenBehavior() { + ThrowableInformation ti = new ThrowableInformation(new OverriddenThrowable()); + String[] rep = ti.getThrowableStrRep(); + assertEquals(9, rep.length); + assertEquals("print(Object)", rep[0]); + assertEquals("print(char[])", rep[1]); + assertEquals("print(String)", rep[2]); + assertEquals("println(Object)", rep[3]); + assertEquals("println(char[])", rep[4]); + assertEquals("println(String)", rep[5]); + assertEquals("write(char[])", rep[6]); + assertEquals("ite(char", rep[7]); + assertEquals("ite(Stri", rep[8]); + } + + /** + * Custom throwable that calls methods + * not overridden by VectorWriter in log4j 1.2.14 and earlier. + */ + private static final class NotOverriddenThrowable extends Throwable { + /** + * Create new instance. + */ + public NotOverriddenThrowable() { + } + + /** + * Print stack trace. + * + * @param s print writer. + */ + public void printStackTrace(final PrintWriter s) { + s.print(true); + s.print('a'); + s.print(1); + s.print(2L); + s.print(Float.MAX_VALUE); + s.print(Double.MIN_VALUE); + s.println(true); + s.println('a'); + s.println(1); + s.println(2L); + s.println(Float.MAX_VALUE); + s.println(Double.MIN_VALUE); + s.write('C'); + } + } + + /** + * Test capturing stack trace from a throwable that uses the + * PrintWriter methods not overridden in log4j 1.2.14 and earlier. + */ + public void testNotOverriddenBehavior() { + ThrowableInformation ti = new ThrowableInformation(new NotOverriddenThrowable()); + String[] rep = ti.getThrowableStrRep(); + // + // The results under log4j 1.2.14 could change depending on implementation + // of java.io.PrintWriter + // + assertEquals(10, rep.length); + assertEquals(String.valueOf(true), rep[0]); +// Calls to print(char) are discarded +// assertEquals("a", rep[1]); + assertEquals(String.valueOf(1), rep[1]); + assertEquals(String.valueOf(2L), rep[2]); + assertEquals(String.valueOf(Float.MAX_VALUE), rep[3]); + assertEquals(String.valueOf(Double.MIN_VALUE), rep[4]); + assertEquals(String.valueOf(true), rep[5]); +// Calls to println(char) are discarded +// assertEquals("a", rep[7]); + assertEquals(String.valueOf(1), rep[6]); + assertEquals(String.valueOf(2L), rep[7]); + assertEquals(String.valueOf(Float.MAX_VALUE), rep[8]); + assertEquals(String.valueOf(Double.MIN_VALUE), rep[9]); +// output to write(int) are discarded +// assertEquals("C", rep[12]); + } + + /** + * Custom throwable that calls methods of VectorWriter + * with null. + */ + private static final class NullThrowable extends Throwable { + /** + * Create new instance. + */ + public NullThrowable() { + } + + /** + * Print stack trace. + * + * @param s print writer. + */ + public void printStackTrace(final PrintWriter s) { + s.print((Object) null); + s.print((String) null); + s.println((Object) null); + s.println((String) null); + } + } + + /** + * Test capturing stack trace from a throwable that passes + * null to PrintWriter methods. + */ + + public void testNull() { + ThrowableInformation ti = new ThrowableInformation(new NullThrowable()); + try { + String[] rep = ti.getThrowableStrRep(); + } catch (NullPointerException ex) { + return; + } + fail("log4j 1.2.14 would throw exception"); + } + + /** + * Custom throwable that does nothing in printStackTrace. + */ + private static final class EmptyThrowable extends Throwable { + /** + * Create new instance. + */ + public EmptyThrowable() { + } + + /** + * Print stack trace. + * + * @param s print writer. + */ + public void printStackTrace(final PrintWriter s) { + } + } + + /** + * Test capturing stack trace from a throwable that + * does nothing on a call to printStackTrace. + */ + + public void testEmpty() { + ThrowableInformation ti = new ThrowableInformation(new EmptyThrowable()); + String[] rep = ti.getThrowableStrRep(); + assertEquals(0, rep.length); + } +} From 676af4dd7b9912afc09a5adc70ecf6ecfe45eacb Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 21 Feb 2007 16:51:40 +0000 Subject: [PATCH 239/342] Bug 35324: Stacktrace may choke on null fields git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510097 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/spi/ThrowableInformation.java | 8 ++++---- .../apache/log4j/spi/ThrowableInformationTest.java | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/java/org/apache/log4j/spi/ThrowableInformation.java b/src/java/org/apache/log4j/spi/ThrowableInformation.java index 7b9e6d7219..69f15cb3ea 100644 --- a/src/java/org/apache/log4j/spi/ThrowableInformation.java +++ b/src/java/org/apache/log4j/spi/ThrowableInformation.java @@ -65,10 +65,10 @@ String[] getThrowableStrRep() { /** * VectorWriter is a seemingly trivial implemtantion of PrintWriter. - * The throwable instance that we are trying to represnt is asked to + * The throwable instance that we are trying to represent is asked to * print itself to a VectorWriter. * - * By our design choice, r string representation of the throwable + * By our design choice, our string representation of the throwable * does not contain any line separators. It follows that println() * methods of VectorWriter ignore the 'ln' part. * */ @@ -82,7 +82,7 @@ class VectorWriter extends PrintWriter { } public void print(Object o) { - v.addElement(o.toString()); + v.addElement(String.valueOf(o)); } public void print(char[] chars) { @@ -94,7 +94,7 @@ public void print(String s) { } public void println(Object o) { - v.addElement(o.toString()); + v.addElement(String.valueOf(o)); } // JDK 1.1.x apprenly uses this form of println while in diff --git a/tests/src/java/org/apache/log4j/spi/ThrowableInformationTest.java b/tests/src/java/org/apache/log4j/spi/ThrowableInformationTest.java index e742b0a851..dc1e5a3431 100644 --- a/tests/src/java/org/apache/log4j/spi/ThrowableInformationTest.java +++ b/tests/src/java/org/apache/log4j/spi/ThrowableInformationTest.java @@ -176,12 +176,12 @@ public void printStackTrace(final PrintWriter s) { public void testNull() { ThrowableInformation ti = new ThrowableInformation(new NullThrowable()); - try { - String[] rep = ti.getThrowableStrRep(); - } catch (NullPointerException ex) { - return; - } - fail("log4j 1.2.14 would throw exception"); + String[] rep = ti.getThrowableStrRep(); + assertEquals(4, rep.length); + assertEquals(String.valueOf((Object) null), rep[0]); + assertNull(rep[1]); + assertEquals(String.valueOf((Object) null), rep[2]); + assertNull(rep[3]); } /** From 5acb6467f22f695ff58ff1116943e90eaca679c4 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 21 Feb 2007 16:53:11 +0000 Subject: [PATCH 240/342] Bug 41373: T113 causes the build to fail git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510099 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/test/.cvsignore | 5 - src/java/org/apache/log4j/test/.functions | 96 -- .../apache/log4j/test/AsyncAppenderTest.java | 77 -- .../apache/log4j/test/CategoryWrapper.java | 76 -- .../log4j/test/ConfigurationFileParsing.java | 54 -- src/java/org/apache/log4j/test/DRFATest.java | 100 -- .../org/apache/log4j/test/DefaultInit.java | 36 - .../org/apache/log4j/test/DelayedLoop.java | 75 -- src/java/org/apache/log4j/test/FQCNTest.java | 114 --- src/java/org/apache/log4j/test/Finalize.java | 103 -- src/java/org/apache/log4j/test/Hello.java | 38 - .../apache/log4j/test/L7D_en_US.properties | 3 - .../org/apache/log4j/test/L7D_fr.properties | 3 - .../apache/log4j/test/L7D_fr_CH.properties | 2 - src/java/org/apache/log4j/test/MDCStress.java | 158 --- .../apache/log4j/test/MultipleAppenders.java | 69 -- .../org/apache/log4j/test/PatternTest.java | 94 -- .../apache/log4j/test/PrintProperties.java | 35 - src/java/org/apache/log4j/test/README | 9 - src/java/org/apache/log4j/test/ROFile.java | 55 -- src/java/org/apache/log4j/test/Shallow.java | 110 --- .../apache/log4j/test/ShortSocketServer.java | 84 -- src/java/org/apache/log4j/test/SpacePad.java | 57 -- .../log4j/test/StressAsyncAppender.java | 170 ---- src/java/org/apache/log4j/test/StressNDC.pl | 77 -- .../apache/log4j/test/SysoutConfigurator.java | 34 - src/java/org/apache/log4j/test/confParsing | 288 ------ src/java/org/apache/log4j/test/customCategory | 42 - src/java/org/apache/log4j/test/defaultInit | 75 -- src/java/org/apache/log4j/test/domTest | 88 -- src/java/org/apache/log4j/test/drfa | 36 - src/java/org/apache/log4j/test/drfa.pl | 45 - src/java/org/apache/log4j/test/extSupport | 29 - src/java/org/apache/log4j/test/filter.pl | 132 --- src/java/org/apache/log4j/test/finalize | 45 - src/java/org/apache/log4j/test/fqcn | 28 - src/java/org/apache/log4j/test/getOptions | 49 - src/java/org/apache/log4j/test/l7d | 34 - .../org/apache/log4j/test/multipleAppenders | 25 - src/java/org/apache/log4j/test/mycat | 57 -- src/java/org/apache/log4j/test/package.html | 15 - src/java/org/apache/log4j/test/propConfig | 54 -- src/java/org/apache/log4j/test/roTest | 30 - src/java/org/apache/log4j/test/runAll | 19 - .../apache/log4j/test/serialization/README | 36 - .../test/serialization/SerializationUT.java | 235 ----- .../log4j/test/serialization/T/T113.java | 87 -- .../log4j/test/serialization/T/T12.java | 86 -- .../test/serialization/T/compile.sample.bat | 15 - .../test/serialization/T/compile.sample.sh | 12 - src/java/org/apache/log4j/test/shallow | 137 --- .../apache/log4j/test/stressAsyncAppender.pl | 60 -- src/java/org/apache/log4j/test/stressCategory | 899 ------------------ .../org/apache/log4j/test/stressCategory.pl | 57 -- src/java/org/apache/log4j/test/stressNDC | 6 - .../apache/log4j/test/witness/confParsing.1 | 2 - .../apache/log4j/test/witness/confParsing.10 | 2 - .../apache/log4j/test/witness/confParsing.11 | 2 - .../apache/log4j/test/witness/confParsing.2 | 2 - .../apache/log4j/test/witness/confParsing.3 | 1 - .../apache/log4j/test/witness/confParsing.4 | 3 - .../apache/log4j/test/witness/confParsing.5 | 3 - .../apache/log4j/test/witness/confParsing.6 | 2 - .../apache/log4j/test/witness/confParsing.7 | 3 - .../apache/log4j/test/witness/confParsing.8 | 2 - .../apache/log4j/test/witness/confParsing.9 | 2 - .../org/apache/log4j/test/witness/customCat.1 | 6 - .../org/apache/log4j/test/witness/definit.1 | 1 - .../org/apache/log4j/test/witness/definit.2 | 0 .../org/apache/log4j/test/witness/definit.3 | 0 .../org/apache/log4j/test/witness/definit.4 | 0 .../org/apache/log4j/test/witness/definit.5 | 1 - .../org/apache/log4j/test/witness/definit.6 | 1 - .../org/apache/log4j/test/witness/domTest.10 | 2 - .../org/apache/log4j/test/witness/domTest.11 | 2 - .../org/apache/log4j/test/witness/domTest.12 | 24 - .../org/apache/log4j/test/witness/domTest.4 | 12 - .../org/apache/log4j/test/witness/domTest.5 | 26 - .../org/apache/log4j/test/witness/domTest.6 | 4 - .../org/apache/log4j/test/witness/domTest.7 | 24 - .../org/apache/log4j/test/witness/domTest.8 | 6 - .../org/apache/log4j/test/witness/domTest.9 | 0 .../apache/log4j/test/witness/domTest.A1.1 | 39 - .../apache/log4j/test/witness/domTest.A1.2 | 0 .../apache/log4j/test/witness/domTest.A1.3 | 0 .../apache/log4j/test/witness/domTest.A2.1 | 26 - .../apache/log4j/test/witness/domTest.A2.2 | 0 .../apache/log4j/test/witness/domTest.A2.3 | 4 - .../log4j/test/witness/enableFlagTest.1 | 0 .../log4j/test/witness/enableFlagTest.2 | 1 - .../log4j/test/witness/enableFlagTest.3 | 2 - .../log4j/test/witness/enableFlagTest.4 | 3 - .../log4j/test/witness/enableFlagTest.5 | 4 - .../log4j/test/witness/enableFlagTest.6 | 5 - .../log4j/test/witness/enableFlagTest.7 | 5 - src/java/org/apache/log4j/test/witness/fqcn.1 | 3 - .../apache/log4j/test/witness/getOptions.1 | 11 - src/java/org/apache/log4j/test/witness/l7d.1 | 21 - .../org/apache/log4j/test/witness/mycat.1 | 1 - .../org/apache/log4j/test/witness/mycat.2 | 0 .../org/apache/log4j/test/witness/mycat.3 | 1 - .../org/apache/log4j/test/witness/propCfg.1 | 1 - .../org/apache/log4j/test/witness/propCfg.2 | 1 - .../apache/log4j/test/witness/shallow.1000 | 50 - .../apache/log4j/test/witness/shallow.1001 | 50 - .../apache/log4j/test/witness/shallow.A1.1 | 50 - .../apache/log4j/test/witness/shallow.A1.2 | 45 - .../apache/log4j/test/witness/shallow.A1.3 | 50 - .../apache/log4j/test/witness/shallow.A1.4 | 40 - .../apache/log4j/test/witness/shallow.A1.5 | 40 - .../apache/log4j/test/witness/shallow.A1.6 | 40 - .../apache/log4j/test/witness/shallow.A1.7 | 25 - .../apache/log4j/test/witness/shallow.A1.8 | 15 - .../apache/log4j/test/witness/shallow.A2.1 | 25 - .../apache/log4j/test/witness/shallow.A2.2 | 25 - .../apache/log4j/test/witness/shallow.A2.3 | 25 - .../apache/log4j/test/witness/shallow.A2.4 | 20 - .../apache/log4j/test/witness/shallow.A2.5 | 15 - .../apache/log4j/test/witness/shallow.A2.6 | 15 - .../apache/log4j/test/witness/shallow.A2.7 | 15 - .../apache/log4j/test/witness/shallow.A2.8 | 25 - .../org/apache/log4j/test/xml/asyncTest.xml | 24 - .../org/apache/log4j/test/xml/domTest1.xml | 34 - .../org/apache/log4j/test/xml/domTest10.xml | 31 - .../org/apache/log4j/test/xml/domTest11.xml | 28 - .../org/apache/log4j/test/xml/domTest12.xml | 24 - .../org/apache/log4j/test/xml/domTest2.xml | 26 - .../org/apache/log4j/test/xml/domTest3.xml | 41 - .../org/apache/log4j/test/xml/domTest4.xml | 21 - .../org/apache/log4j/test/xml/domTest5.xml | 18 - .../org/apache/log4j/test/xml/domTest6.xml | 30 - .../org/apache/log4j/test/xml/domTest7.xml | 24 - .../org/apache/log4j/test/xml/domTest8.xml | 42 - .../org/apache/log4j/test/xml/domTest9.xml | 32 - src/java/org/apache/log4j/test/xml/ext1.xml | 26 - .../org/apache/log4j/test/xml/fallback1.xml | 35 - .../log4j/test/xml/stressAsyncAppender.xml | 43 - 137 files changed, 5765 deletions(-) delete mode 100644 src/java/org/apache/log4j/test/.cvsignore delete mode 100644 src/java/org/apache/log4j/test/.functions delete mode 100644 src/java/org/apache/log4j/test/AsyncAppenderTest.java delete mode 100644 src/java/org/apache/log4j/test/CategoryWrapper.java delete mode 100644 src/java/org/apache/log4j/test/ConfigurationFileParsing.java delete mode 100644 src/java/org/apache/log4j/test/DRFATest.java delete mode 100644 src/java/org/apache/log4j/test/DefaultInit.java delete mode 100644 src/java/org/apache/log4j/test/DelayedLoop.java delete mode 100644 src/java/org/apache/log4j/test/FQCNTest.java delete mode 100644 src/java/org/apache/log4j/test/Finalize.java delete mode 100644 src/java/org/apache/log4j/test/Hello.java delete mode 100644 src/java/org/apache/log4j/test/L7D_en_US.properties delete mode 100644 src/java/org/apache/log4j/test/L7D_fr.properties delete mode 100644 src/java/org/apache/log4j/test/L7D_fr_CH.properties delete mode 100644 src/java/org/apache/log4j/test/MDCStress.java delete mode 100644 src/java/org/apache/log4j/test/MultipleAppenders.java delete mode 100644 src/java/org/apache/log4j/test/PatternTest.java delete mode 100644 src/java/org/apache/log4j/test/PrintProperties.java delete mode 100644 src/java/org/apache/log4j/test/README delete mode 100644 src/java/org/apache/log4j/test/ROFile.java delete mode 100644 src/java/org/apache/log4j/test/Shallow.java delete mode 100644 src/java/org/apache/log4j/test/ShortSocketServer.java delete mode 100644 src/java/org/apache/log4j/test/SpacePad.java delete mode 100644 src/java/org/apache/log4j/test/StressAsyncAppender.java delete mode 100644 src/java/org/apache/log4j/test/StressNDC.pl delete mode 100644 src/java/org/apache/log4j/test/SysoutConfigurator.java delete mode 100644 src/java/org/apache/log4j/test/confParsing delete mode 100644 src/java/org/apache/log4j/test/customCategory delete mode 100644 src/java/org/apache/log4j/test/defaultInit delete mode 100644 src/java/org/apache/log4j/test/domTest delete mode 100644 src/java/org/apache/log4j/test/drfa delete mode 100644 src/java/org/apache/log4j/test/drfa.pl delete mode 100644 src/java/org/apache/log4j/test/extSupport delete mode 100644 src/java/org/apache/log4j/test/filter.pl delete mode 100644 src/java/org/apache/log4j/test/finalize delete mode 100644 src/java/org/apache/log4j/test/fqcn delete mode 100644 src/java/org/apache/log4j/test/getOptions delete mode 100644 src/java/org/apache/log4j/test/l7d delete mode 100755 src/java/org/apache/log4j/test/multipleAppenders delete mode 100644 src/java/org/apache/log4j/test/mycat delete mode 100644 src/java/org/apache/log4j/test/package.html delete mode 100644 src/java/org/apache/log4j/test/propConfig delete mode 100644 src/java/org/apache/log4j/test/roTest delete mode 100644 src/java/org/apache/log4j/test/runAll delete mode 100644 src/java/org/apache/log4j/test/serialization/README delete mode 100644 src/java/org/apache/log4j/test/serialization/SerializationUT.java delete mode 100644 src/java/org/apache/log4j/test/serialization/T/T113.java delete mode 100644 src/java/org/apache/log4j/test/serialization/T/T12.java delete mode 100755 src/java/org/apache/log4j/test/serialization/T/compile.sample.bat delete mode 100644 src/java/org/apache/log4j/test/serialization/T/compile.sample.sh delete mode 100644 src/java/org/apache/log4j/test/shallow delete mode 100644 src/java/org/apache/log4j/test/stressAsyncAppender.pl delete mode 100644 src/java/org/apache/log4j/test/stressCategory delete mode 100644 src/java/org/apache/log4j/test/stressCategory.pl delete mode 100644 src/java/org/apache/log4j/test/stressNDC delete mode 100644 src/java/org/apache/log4j/test/witness/confParsing.1 delete mode 100644 src/java/org/apache/log4j/test/witness/confParsing.10 delete mode 100644 src/java/org/apache/log4j/test/witness/confParsing.11 delete mode 100644 src/java/org/apache/log4j/test/witness/confParsing.2 delete mode 100644 src/java/org/apache/log4j/test/witness/confParsing.3 delete mode 100644 src/java/org/apache/log4j/test/witness/confParsing.4 delete mode 100644 src/java/org/apache/log4j/test/witness/confParsing.5 delete mode 100644 src/java/org/apache/log4j/test/witness/confParsing.6 delete mode 100644 src/java/org/apache/log4j/test/witness/confParsing.7 delete mode 100644 src/java/org/apache/log4j/test/witness/confParsing.8 delete mode 100644 src/java/org/apache/log4j/test/witness/confParsing.9 delete mode 100644 src/java/org/apache/log4j/test/witness/customCat.1 delete mode 100644 src/java/org/apache/log4j/test/witness/definit.1 delete mode 100644 src/java/org/apache/log4j/test/witness/definit.2 delete mode 100644 src/java/org/apache/log4j/test/witness/definit.3 delete mode 100644 src/java/org/apache/log4j/test/witness/definit.4 delete mode 100644 src/java/org/apache/log4j/test/witness/definit.5 delete mode 100644 src/java/org/apache/log4j/test/witness/definit.6 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.10 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.11 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.12 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.4 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.5 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.6 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.7 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.8 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.9 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.A1.1 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.A1.2 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.A1.3 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.A2.1 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.A2.2 delete mode 100644 src/java/org/apache/log4j/test/witness/domTest.A2.3 delete mode 100644 src/java/org/apache/log4j/test/witness/enableFlagTest.1 delete mode 100644 src/java/org/apache/log4j/test/witness/enableFlagTest.2 delete mode 100644 src/java/org/apache/log4j/test/witness/enableFlagTest.3 delete mode 100644 src/java/org/apache/log4j/test/witness/enableFlagTest.4 delete mode 100644 src/java/org/apache/log4j/test/witness/enableFlagTest.5 delete mode 100644 src/java/org/apache/log4j/test/witness/enableFlagTest.6 delete mode 100644 src/java/org/apache/log4j/test/witness/enableFlagTest.7 delete mode 100644 src/java/org/apache/log4j/test/witness/fqcn.1 delete mode 100644 src/java/org/apache/log4j/test/witness/getOptions.1 delete mode 100644 src/java/org/apache/log4j/test/witness/l7d.1 delete mode 100644 src/java/org/apache/log4j/test/witness/mycat.1 delete mode 100644 src/java/org/apache/log4j/test/witness/mycat.2 delete mode 100644 src/java/org/apache/log4j/test/witness/mycat.3 delete mode 100644 src/java/org/apache/log4j/test/witness/propCfg.1 delete mode 100644 src/java/org/apache/log4j/test/witness/propCfg.2 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.1000 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.1001 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A1.1 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A1.2 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A1.3 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A1.4 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A1.5 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A1.6 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A1.7 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A1.8 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A2.1 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A2.2 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A2.3 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A2.4 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A2.5 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A2.6 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A2.7 delete mode 100644 src/java/org/apache/log4j/test/witness/shallow.A2.8 delete mode 100644 src/java/org/apache/log4j/test/xml/asyncTest.xml delete mode 100644 src/java/org/apache/log4j/test/xml/domTest1.xml delete mode 100644 src/java/org/apache/log4j/test/xml/domTest10.xml delete mode 100644 src/java/org/apache/log4j/test/xml/domTest11.xml delete mode 100644 src/java/org/apache/log4j/test/xml/domTest12.xml delete mode 100644 src/java/org/apache/log4j/test/xml/domTest2.xml delete mode 100644 src/java/org/apache/log4j/test/xml/domTest3.xml delete mode 100644 src/java/org/apache/log4j/test/xml/domTest4.xml delete mode 100644 src/java/org/apache/log4j/test/xml/domTest5.xml delete mode 100644 src/java/org/apache/log4j/test/xml/domTest6.xml delete mode 100644 src/java/org/apache/log4j/test/xml/domTest7.xml delete mode 100644 src/java/org/apache/log4j/test/xml/domTest8.xml delete mode 100644 src/java/org/apache/log4j/test/xml/domTest9.xml delete mode 100644 src/java/org/apache/log4j/test/xml/ext1.xml delete mode 100644 src/java/org/apache/log4j/test/xml/fallback1.xml delete mode 100644 src/java/org/apache/log4j/test/xml/stressAsyncAppender.xml diff --git a/src/java/org/apache/log4j/test/.cvsignore b/src/java/org/apache/log4j/test/.cvsignore deleted file mode 100644 index 31b2fd0f00..0000000000 --- a/src/java/org/apache/log4j/test/.cvsignore +++ /dev/null @@ -1,5 +0,0 @@ -test* -current.reg* -logging.lcf -socket.lcf -temp* \ No newline at end of file diff --git a/src/java/org/apache/log4j/test/.functions b/src/java/org/apache/log4j/test/.functions deleted file mode 100644 index 38fec0f4de..0000000000 --- a/src/java/org/apache/log4j/test/.functions +++ /dev/null @@ -1,96 +0,0 @@ - -# Constants -NOPWriter=NOPWriter -LCF=logging.lcf -TEMP=temp -OUTPUT=current.reg -ROOT_PREFIX="log4j.rootCategory" -CAT_PREFIX="log4j.category" - -DEF_DEBUG=-Dlog4j.configDebug - -SHALLOW_CAT="$CAT_PREFIX.org.apache.log4j.test.Shallow" -LOG_CAT="$CAT_PREFIX.org.apache.log4j.Log" -SIMPLE="org.apache.log4j.SimpleLayout" -TTCC="org.apache.log4j.TTCCLayout" - -# +=============================================+ -# Strip the filename, retain the directory only.| -# +=============================================+ -function getShellScriptDirectory { - local dir - - dir=${0%/*} - - if [ "$dir" = "." ] - then - dir=$(pwd) - elif [ "${dir#/}" = "$dir" ] # dir does not start with a / - then - dir=$(pwd)/$dir - fi - echo $dir -} -# +============================================= -# Compensate for ZRL idiosyncrasy -# +============================================= -function setPERL { - if [ -z "$PERL" ] - then - PERL=perl - fi -} -# ============================================= -# Echo to $LCF -# ============================================= -function lecho { - # The quotes ensure that spaces in arguments are preserved. - echo "$*" >> $LCF -} -# +============================================ -# Print a message and exit. -# +============================================ -function die { - echo $1 - exit 1 -} -function makeRollingConfigFile { - fileName=$1 - rootPriority=$2 - maxFileSize=$3; - maxBackupIndex=$4; - - PRE="log4j.appender.roll" - echo "$PRE=org.apache.log4j.RollingFileAppender" > $LCF - echo "$PRE.File=$fileName" >> $LCF - echo "$PRE.MaxFileSize=$maxFileSize" >> $LCF - echo "$PRE.MaxBackupIndex=$maxBackupIndex" >> $LCF - - echo "$ROOT_PREFIX=$rootPriority, roll" >> $LCF - -} -# ============================================== -# Delete the file if exists -# ============================================== -function deleteFile { - if [ -e $1 ]; then - echo "Deleting file [$1]." - rm $1 - fi -} -# ============================================== -function runRollingFiles() { - confFile=$1 - - java -Dlog4j.configDebug=x org.apache.log4j.test.RollingFiles $confFile -} -# ---------------------------------------------------------------------- -function check() { - if ! cmp -s $1 $2 - then - echo "The output of current code DIFFERS from witness." - exit 1; - fi -} -# ---------------------------------------------------------------------- - diff --git a/src/java/org/apache/log4j/test/AsyncAppenderTest.java b/src/java/org/apache/log4j/test/AsyncAppenderTest.java deleted file mode 100644 index 743aee5b96..0000000000 --- a/src/java/org/apache/log4j/test/AsyncAppenderTest.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.test; - -import org.apache.log4j.Logger; -import org.apache.log4j.LogManager; -import org.apache.log4j.xml.DOMConfigurator; - -/** - Test the coordination of the AsyncAppender with its Dispatcher. - @author Ceki Gülcü -*/ -public class AsyncAppenderTest { - - static Logger cat = Logger.getLogger(AsyncAppenderTest.class); - static int delayBeforeClose; - - - public - static - void main(String argv[]) { - - if(argv.length == 2) - init(argv[0], argv[1]); - else - usage("Wrong number of arguments."); - test(); - } - - - static - void usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java "+ Shallow.class.getName() + - "configFile"); - System.exit(1); - } - - static - void init(String configFile, String delayBeforeCloseStr) { - DOMConfigurator.configure(configFile); - try { - delayBeforeClose = Integer.parseInt(delayBeforeCloseStr); - } catch(java.lang.NumberFormatException e) { - e.printStackTrace(); - usage("Could not convert ["+delayBeforeCloseStr+"] to Integer."); - } - } - - - static - void test() { - Logger root = Logger.getRootLogger(); - for(int i = 0; i < 100; i++) { - root.debug("Message " + i); - } - - try{Thread.currentThread().sleep(delayBeforeClose);}catch(Exception e){} - LogManager.shutdown(); - } - - -} diff --git a/src/java/org/apache/log4j/test/CategoryWrapper.java b/src/java/org/apache/log4j/test/CategoryWrapper.java deleted file mode 100644 index 9056315bb3..0000000000 --- a/src/java/org/apache/log4j/test/CategoryWrapper.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.test; - -import org.apache.log4j.*; - -/** - This is just to test that wrapper can work. This implementation is - actually quite bad and should be avoided. - -*/ - -public class CategoryWrapper { - - - Logger c; - static String FQCN = CategoryWrapper.class.getName(); - - CategoryWrapper(String name) { - c = Logger.getLogger(name); - } - - public - static - void main(String argv[]) { - Layout layout = new PatternLayout("%p [%t] %C %F - %m\n"); - Appender out = new ConsoleAppender(layout, ConsoleAppender.SYSTEM_OUT); - CategoryWrapper w1 = new CategoryWrapper("c1"); - w1.addAppender(out); - w1.print("hello"); - } - - - public - void addAppender(Appender appender) { - c.addAppender(appender); - } - - public - void print(String msg) { - - // You have to supply the fully qualified named of the wrapper - // class to the specially tailored logger.log method for - // PatternLayout's %C conversion pattern to work. - - // We have to add the ".print" string because the invocation of - // wrapper.print method is made from the wrapper itself (main - // method). This is highly unusual. The fqcn of the wrapper is - // normally sufficient. - - c.log(FQCN+".print", Priority.DEBUG, msg, null); - } - - - static - void Usage(String msg) { - System.err.println(msg); - System.err.println("Usage: java "+CategoryWrapper.class.getName() - + " fileName"); - System.exit(1); - } -} diff --git a/src/java/org/apache/log4j/test/ConfigurationFileParsing.java b/src/java/org/apache/log4j/test/ConfigurationFileParsing.java deleted file mode 100644 index d5d85ed981..0000000000 --- a/src/java/org/apache/log4j/test/ConfigurationFileParsing.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.test; - -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.Logger; -import org.apache.log4j.LogManager; -import org.apache.log4j.NDC; - -public class ConfigurationFileParsing { - - public - static - void main(String argv[]) { - - if(argv.length == 1) { - NDC.push("testing"); - PropertyConfigurator.configure(argv[0]); - Logger root = Logger.getRootLogger(); - root.debug("Message 1"); - root.debug("Message 2"); - NDC.pop(); - LogManager.shutdown(); - } - else { - Usage("Wrong number of arguments."); - } - - } - - static - void Usage(String msg) { - System.err.println(msg); - System.err.println("Usage: java "+ConfigurationFileParsing.class.getName() - + " fileName"); - System.exit(1); - } - - -} diff --git a/src/java/org/apache/log4j/test/DRFATest.java b/src/java/org/apache/log4j/test/DRFATest.java deleted file mode 100644 index b7d12ed698..0000000000 --- a/src/java/org/apache/log4j/test/DRFATest.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.test; -import org.apache.log4j.BasicConfigurator; -import org.apache.log4j.Logger; -import org.apache.log4j.Layout; -import org.apache.log4j.PatternLayout; -import org.apache.log4j.Appender; -import org.apache.log4j.DailyRollingFileAppender; - - -/** - This class is used in testing the DailyRollingFileAppender. - @author Ceki Gülcü -*/ -public class DRFATest { - - static Logger cat = Logger.getLogger(DRFATest.class); - - static int limit; - - public - static - void main(String argv[]) { - if(argv.length == 1) - init(argv[0]); - else - usage("Wrong number of arguments."); - test(); - } - - static - void usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java "+ DRFATest.class.getName()+" length"); - System.exit(1); - } - - static - void init(String limitStr) { - try { - limit = Integer.parseInt(limitStr); - } catch(java.lang.NumberFormatException e) { - usage("Could not convert "+limitStr+" to int"); - } - } - - static - void test() { - - Layout layout = new PatternLayout("%d{yyyy-MM-dd-HH-mm ss:SSS} %m%n"); - try { - Appender appender = new DailyRollingFileAppender(layout, "test", - "'.'yyyy-MM-dd-HH-mm" ); - appender.setName("drfa"); - BasicConfigurator.configure(appender); - } catch(Exception e) { - System.err.println("Could not create DailyRollingFileAppender"); - e.printStackTrace(); - } - - System.out.println("Limit: "+limit); - - for(int i = 0; i < limit; i++) { - System.out.println(i); - cat.debug("Message"+ i); - delay(10000); - - if((i % 7) == 0) { - System.out.println("Sleeping 1min."); - delay(60000); - System.err.println(""); - } - } - } - - - static - void delay(int amount) { - try { - Thread.currentThread().sleep(amount); - } - catch(Exception e) {} - } -} - diff --git a/src/java/org/apache/log4j/test/DefaultInit.java b/src/java/org/apache/log4j/test/DefaultInit.java deleted file mode 100644 index 0f95d95c0a..0000000000 --- a/src/java/org/apache/log4j/test/DefaultInit.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.test; - -import org.apache.log4j.Logger; - -public class DefaultInit { - - static Logger cat = Logger.getLogger(DefaultInit.class); - - public static void main( String[] argv) { - cat.debug("Hello world"); - } - - static - void Usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java org.apache.log4j.test.DefaultInit "); - System.exit(1); - } - -} diff --git a/src/java/org/apache/log4j/test/DelayedLoop.java b/src/java/org/apache/log4j/test/DelayedLoop.java deleted file mode 100644 index 0b3be60bd7..0000000000 --- a/src/java/org/apache/log4j/test/DelayedLoop.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.test; - -import org.apache.log4j.Logger; -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.xml.DOMConfigurator; - -/** - This test program sits in a loop and logs things. Its logging is - configured by a configuration file. Changes to this configuration - file are monitored and when a change occurs, the config file is re-read. - - - @author Ceki Gülcü */ -public class DelayedLoop { - - static Logger cat = Logger.getLogger(DelayedLoop.class); - static int loopLength; - - public - static - void main(String argv[]) { - - if(argv.length == 1) - init(argv[0]); - else - usage("Wrong number of arguments."); - test(); - } - - - static - void usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java " + DelayedLoop.class.getName() + - "configFile"); - System.exit(1); - } - - - static - void init(String configFile) { - if(configFile.endsWith("xml")) { - DOMConfigurator.configureAndWatch(configFile, 3000); - } else { - PropertyConfigurator.configureAndWatch(configFile, 3000); - } - } - - static - void test() { - int i = 0; - while(true) { - cat.debug("MSG "+i++); - try { - Thread.currentThread().sleep(1000); - } catch(Exception e) {} - } - } -} diff --git a/src/java/org/apache/log4j/test/FQCNTest.java b/src/java/org/apache/log4j/test/FQCNTest.java deleted file mode 100644 index 00dd5ee77c..0000000000 --- a/src/java/org/apache/log4j/test/FQCNTest.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.test; - -import org.apache.log4j.*; -import org.apache.log4j.spi.*; -//import org.apache.log4j.xml.examples.XPriority; - -/** - This class is a shallow test of the various appenders and - layouts. It also tests their reading of the configuration file. - @author Ceki Gülcü -*/ -public class FQCNTest { - - //static Logger cat = Logger.getLogger("dddd"); - - public - static - void main(String argv[]) throws Exception { - if(argv.length == 1) - init(argv[0]); - else - usage("Wrong number of arguments."); - test(); - } - - static - void usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java "+ FQCNTest.class.getName()+"outputFile"); - System.exit(1); - } - - static - void init(String file) throws Exception { - Layout layout = new PatternLayout("%p %c (%C{2}#%M) - %m%n"); - FileAppender appender = new FileAppender(layout, file, false); - appender.setLayout(layout); - Logger root = Logger.getRootLogger(); - root.addAppender(appender); - } - - - static - void test() { - X1Logger x1 = X1Logger.getX1Logger("x1"); - x1.debug("hello"); - x1.debug1("hello"); - x1.debug2("hello"); - } -} - - -// ========================================================================== -// ========================================================================== -// ========================================================================== - -class X1Logger extends Logger { - static String FQCN = X1Logger.class.getName() + "."; - - private static X1LoggerFactory factory = new X1LoggerFactory(); - - public X1Logger(String name) { - super(name); - } - - public - void debug1(Object message) { - super.log(FQCN, Priority.DEBUG, message + " world.", null); - } - - public - void debug2(Object message) { - super.log(FQCN, Priority.DEBUG, message, null); - } - - protected - String getFQCN() { - return X1Logger.FQCN; - } - - public - static - X1Logger getX1Logger(String name) { - return ((X1Logger) Logger.getLogger(name, factory)); - } -} - -class X1LoggerFactory implements LoggerFactory { - - public - X1LoggerFactory() { - } - - public - Logger makeNewLoggerInstance(String name) { - return new X1Logger(name); - } -} diff --git a/src/java/org/apache/log4j/test/Finalize.java b/src/java/org/apache/log4j/test/Finalize.java deleted file mode 100644 index eb91b93c9a..0000000000 --- a/src/java/org/apache/log4j/test/Finalize.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package org.apache.log4j.test; - -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.Logger; -import java.io.InputStreamReader; -import java.util.Enumeration; - -public class Finalize { - - static Logger CAT = Logger.getLogger(Finalize.class.getName()); - - public - static - void main(String argv[]) { - - if(argv.length == 1) - init(argv[0]); - else - Usage("Wrong number of arguments."); - - test(); - } - - static - void Usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java " + Finalize.class.getName() + - " configFile"); - System.exit(1); - } - - - static - void init(String configFile) { - PropertyConfigurator.configure(configFile); - } - - static - void test() { - int i = -1; - - InputStreamReader in = new InputStreamReader(System.in); - Logger root = Logger.getRootLogger(); - - System.out.println("Type 'q' to quit"); - int j = 0; - while (true) { - System.gc(); - try {i = in.read(); } - catch(Exception e) { return; } - System.gc(); - System.out.println("Read ["+i+"]."); - if(i == -1) - break; - else if(i == 'q') - break; - else - root.debug("Hello " + (++j)); - } - - //foo(root); - root.removeAllAppenders(); - System.gc(); delay(3000); - System.gc(); delay(3000); - System.gc(); delay(3000); System.gc(); - } - - static - void foo(Logger cat) { - Enumeration enumaration = cat.getAllAppenders(); - while(enumaration != null && enumaration.hasMoreElements()) { - ((org.apache.log4j.Appender) enumaration.nextElement()).close(); - } - } - - - - static - void delay(int amount) { - try { - Thread.currentThread().sleep(amount); - } - catch(Exception e) {} - } - -} diff --git a/src/java/org/apache/log4j/test/Hello.java b/src/java/org/apache/log4j/test/Hello.java deleted file mode 100644 index 4b767aa95e..0000000000 --- a/src/java/org/apache/log4j/test/Hello.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.test; - -import org.apache.log4j.Logger; -import org.apache.log4j.BasicConfigurator; - -/** - Very simple log4j usage example. - - @author Ceki Gülcü - */ -public class Hello { - - static Logger cat = Logger.getLogger(Hello.class); - - public - static - void main(String argv[]) { - BasicConfigurator.configure(); - cat.debug("Hello world."); - cat.info("What a beatiful day."); - } -} diff --git a/src/java/org/apache/log4j/test/L7D_en_US.properties b/src/java/org/apache/log4j/test/L7D_en_US.properties deleted file mode 100644 index 4620e30e5f..0000000000 --- a/src/java/org/apache/log4j/test/L7D_en_US.properties +++ /dev/null @@ -1,3 +0,0 @@ -test=This is the English, US test. -hello_world=Hello world. -msg1=This is test number {0} with string argument {1}. diff --git a/src/java/org/apache/log4j/test/L7D_fr.properties b/src/java/org/apache/log4j/test/L7D_fr.properties deleted file mode 100644 index 2e883c5c83..0000000000 --- a/src/java/org/apache/log4j/test/L7D_fr.properties +++ /dev/null @@ -1,3 +0,0 @@ -test=Ceci est le test en francais pour la France. -hello_world=Bonjour la France. -msg1=Ceci est le test numero {0} contenant l''argument {1}. diff --git a/src/java/org/apache/log4j/test/L7D_fr_CH.properties b/src/java/org/apache/log4j/test/L7D_fr_CH.properties deleted file mode 100644 index 89293954d9..0000000000 --- a/src/java/org/apache/log4j/test/L7D_fr_CH.properties +++ /dev/null @@ -1,2 +0,0 @@ -test=Ceci est le test en francais pour la p'tite Suisse. -hello world=Salut le monde. diff --git a/src/java/org/apache/log4j/test/MDCStress.java b/src/java/org/apache/log4j/test/MDCStress.java deleted file mode 100644 index 260e4c0415..0000000000 --- a/src/java/org/apache/log4j/test/MDCStress.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.test; - -import org.apache.log4j.*; - - -import java.util.Random; - -public class MDCStress extends Thread { - - static Logger root = Logger.getRootLogger(); - static Logger log = Logger.getLogger(MDCStress.class); - - static Random random = new Random(17); - - static final int BRANCHING_FACTOR = 2; - static final int LOOP_LENGTH = 12; - - static int maxThreads; - static int threadCounter = 0; - static int totalThreads = 0; - - - public - static - void main(String args[]) { - - Layout layout = new PatternLayout("%r [%t] depth=%X{depth} total=%X{total} - %m%n"); - Appender appender = new ConsoleAppender(layout); - root.addAppender(appender); - - if(args.length != 1) { - usage(); - } - try { - maxThreads = Integer.parseInt(args[0]); - } - catch(java.lang.NumberFormatException e) { - System.err.println(e); - usage(); - } - - while(true) { - synchronized(MDCStress.class) { - // Adding 1 to ensure that at least 1 child is created. - createChildren(randomInt(BRANCHING_FACTOR) + 1, 0); - - // wait until all threads are finished - try { - root.debug("About to wait for notification."); - MDCStress.class.wait(); - root.debug( "Got a notification."); - } - catch(InterruptedException e) { - root.warn("Unpextected InterruptedException received.", e); - } - } - } - - } - - static - void usage() { - System.err.println( "Usage: "+MDCStress.class + " maxThreads"); - System.exit(1); - } - - - public - static - void createChildren(int n, int currentDepth) { - if (n <= 0) - return; - - synchronized(MDCStress.class) { - n = maxThreadsConstained(n); - for(int i = 0; i < n; i++) { - threadCounter++; - totalThreads++; - log.debug("Creating Thread-"+(totalThreads-1)); - new MDCStress(currentDepth+1, totalThreads-1).start(); - } - } - } - - - int depth; - int total; - - MDCStress(int depth, int totalThreads) { - this.depth = depth; - this.total = totalThreads; - } - - public - void run() { - log.debug("Entered run()"); - - createChildren(randomInt(BRANCHING_FACTOR), depth); - - MDC.put("depth", new Integer(depth)); - MDC.put("total", new Integer(this.total)); - - log.debug("Set MDC variables."); - - createChildren(randomInt(BRANCHING_FACTOR), depth); - - - synchronized(MDCStress.class) { - threadCounter--; - root.debug("Exiting run loop. " + threadCounter); - if(threadCounter <= 0) { - MDCStress.class.notify(); // wake up the main thread - } - } - - } - - - static - public - int maxThreadsConstained(int a) { - int maxAllowed = MDCStress.maxThreads - MDCStress.threadCounter; - return a <= maxAllowed ? a : maxAllowed; - } - - /** - Return a random value in the range - */ - public - static - int randomInt(int n) { - int r = random.nextInt() % n; - return r >= 0 ? r : -r; - } - - public - static - String randomID() { - return Integer.toHexString(random.nextInt()& 0xFFFFFF); - } - -} diff --git a/src/java/org/apache/log4j/test/MultipleAppenders.java b/src/java/org/apache/log4j/test/MultipleAppenders.java deleted file mode 100644 index fbbaeeb2bb..0000000000 --- a/src/java/org/apache/log4j/test/MultipleAppenders.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package org.apache.log4j.test; -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.Logger; -import org.apache.log4j.Appender; -import java.util.Enumeration; -import java.util.Vector; - -public class MultipleAppenders { - - public - static - void main(String argv[]) { - - // A1 and A2 should be added to root by reading the config file - PropertyConfigurator.configure(argv[0]); - - Logger root = Logger.getRootLogger(); - - Enumeration e1 = root.getAllAppenders(); - Vector v = new Vector(1); - - while(e1.hasMoreElements()) { - Appender a = (Appender) e1.nextElement(); - v.addElement(a); - String appenderName = a.getName(); - if(a != root.getAppender(appenderName)) { - System.out.println(appenderName + " lookup failed. Exiting."); - System.exit(1); - } - // attempt to add the existing appender - root.addAppender(a); - } - - // attempt to add a null appender - root.addAppender(null); - - Enumeration e2 = root.getAllAppenders(); - - for(int i = 0; i < v.size(); i++) { - if(v.elementAt(i) != e2.nextElement()) { - } - } - - if(e2.hasMoreElements()){ - System.out.println("Failure, e2 has remaining elements. Exiting."); - System.exit(1); - } - System.out.println("OK"); - } - - -} diff --git a/src/java/org/apache/log4j/test/PatternTest.java b/src/java/org/apache/log4j/test/PatternTest.java deleted file mode 100644 index b4f12ff66e..0000000000 --- a/src/java/org/apache/log4j/test/PatternTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.test; - -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.Logger; -import org.apache.log4j.LogManager; -import org.apache.log4j.Priority; -/** - This class is a test of the PatternLayout class. - - @author Ceki Gülcü -*/ -public class PatternTest { - static Logger CAT = Logger.getLogger(PatternTest.class); - - - public - static - void main(String argv[]) { - - if(argv.length == 1) - init(argv[0]); - else - Usage("Wrong number of arguments."); - - test(); - } - - static - void Usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java " + PatternTest.class.getName() + - " configFile"); - System.exit(1); - } - static - void init(String configFile) { - PropertyConfigurator.configure(configFile); - } - - static - void test() { - int i = -1; - Logger root = Logger.getRootLogger(); - - CAT.debug("Message " + ++i); - root.debug("Message " + i); - - CAT.info ("Message " + ++i); - root.info("Message " + i); - - CAT.warn ("Message " + ++i); - root.warn("Message " + i); - - CAT.error("Message " + ++i); - root.error("Message " + i); - - CAT.log(Priority.FATAL, "Message " + ++i); - root.log(Priority.FATAL, "Message " + i); - - Exception e = new Exception("Just testing"); - CAT.debug("Message " + ++i, e); - root.debug("Message " + i, e); - - CAT.info("Message " + ++i, e); - root.info("Message " + i, e); - - CAT.warn("Message " + ++i , e); - root.warn("Message " + i , e); - - CAT.error("Message " + ++i, e); - root.error("Message " + i, e); - - CAT.log(Priority.FATAL, "Message " + ++i, e); - root.log(Priority.FATAL, "Message " + i, e); - - LogManager.shutdown(); - } -} diff --git a/src/java/org/apache/log4j/test/PrintProperties.java b/src/java/org/apache/log4j/test/PrintProperties.java deleted file mode 100644 index 00d23b2548..0000000000 --- a/src/java/org/apache/log4j/test/PrintProperties.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.test; - -import java.io.*; -import org.apache.log4j.config.PropertyPrinter; - -/** - Prints the configuration of the log4j default hierarchy - (which needs to be auto-initialized) as a propoperties file - on System.out. - - @author Anders Kristensen - */ -public class PrintProperties { - public - static - void main(String[] args) { - new PropertyPrinter(new PrintWriter(System.out), true); - } -} \ No newline at end of file diff --git a/src/java/org/apache/log4j/test/README b/src/java/org/apache/log4j/test/README deleted file mode 100644 index ece49e2ff2..0000000000 --- a/src/java/org/apache/log4j/test/README +++ /dev/null @@ -1,9 +0,0 @@ - -The log4j test suite has been verfied to run on both Windows NT/2000 -and Linux. However, the suite requires the bash shell and perl. On -most Unix systems these are included by default. On Windows systems -you nedd to install the Cygwin tools from - - http://sources.redhat.com/cygwin - -In case of problems send an e-mail note to log4j-dev@jakarta.apache.org. diff --git a/src/java/org/apache/log4j/test/ROFile.java b/src/java/org/apache/log4j/test/ROFile.java deleted file mode 100644 index 8fb8fb0c80..0000000000 --- a/src/java/org/apache/log4j/test/ROFile.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.log4j.test; - -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.Logger; - -public class ROFile { - - static Logger cat = Logger.getLogger(ROFile.class); - - public - static - void main(String argv[]) { - - if(argv.length == 1) - init(argv[0]); - else - Usage("Wrong number of arguments."); - - test(); - } - - static - void Usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java " + ROFile.class.getName() + - "configFile"); - System.exit(1); - } - - static - void init(String configFile) { - PropertyConfigurator.configure(configFile); - } - - static - void test() { - int i = -1; - cat.debug("Message " + ++i); - } -} diff --git a/src/java/org/apache/log4j/test/Shallow.java b/src/java/org/apache/log4j/test/Shallow.java deleted file mode 100644 index 0dfa33e2b1..0000000000 --- a/src/java/org/apache/log4j/test/Shallow.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// NOTICE: Some tests are sensitive to line numbers! -package org.apache.log4j.test; -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.xml.DOMConfigurator; -import org.apache.log4j.Logger; -import org.apache.log4j.Logger; -import org.apache.log4j.LogManager; -import org.apache.log4j.NDC; -import org.apache.log4j.Level; -/** - This class is a shallow test of the various appenders and - layouts. It also tests their reading of the configuration file. - @author Ceki Gülcü -*/ -public class Shallow { - - static Logger cat = Logger.getLogger(Shallow.class); - - public - static - void main(String argv[]) { - if(argv.length == 1) - init(argv[0]); - else - usage("Wrong number of arguments."); - test(); - } - - static - void usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java "+ Shallow.class.getName()+"configFile"); - System.exit(1); - } - - static - void init(String configFile) { - if(configFile.endsWith(".xml")) - DOMConfigurator.configure(configFile); - else - PropertyConfigurator.configure(configFile); - } - - static - void test() { - int i = -1; - NDC.push("NDC"); - Logger root = Logger.getRootLogger(); - cat.debug("Message " + ++i); - root.debug("Message " + i); - - cat.info ("Message " + ++i); - root.info("Message " + i); - - cat.warn ("Message " + ++i); - root.warn("Message " + i); - - cat.error("Message " + ++i); - root.error("Message " + i); - - cat.log(Level.FATAL, "Message " + ++i); - root.log(Level.FATAL, "Message " + i); - - Exception e = new Exception("Just testing"); - cat.debug("Message " + ++i, e); - root.debug("Message " + i, e); - - cat.info("Message " + ++i, e); - root.info("Message " + i, e); - - cat.warn("Message " + ++i , e); - root.warn("Message " + i , e); - - cat.error("Message " + ++i, e); - root.error("Message " + i, e); - - cat.log(Level.FATAL, "Message " + ++i, e); - root.log(Level.FATAL, "Message " + i, e); - - root.setLevel(Level.FATAL); - - // It is always a good idea to call this method when exiting an - // application. - LogManager.shutdown(); - } - - - static - void delay(int amount) { - try { - Thread.currentThread().sleep(amount); - } - catch(Exception e) {} - } -} diff --git a/src/java/org/apache/log4j/test/ShortSocketServer.java b/src/java/org/apache/log4j/test/ShortSocketServer.java deleted file mode 100644 index a520898c73..0000000000 --- a/src/java/org/apache/log4j/test/ShortSocketServer.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package org.apache.log4j.test; - -import java.net.Socket; -import java.net.ServerSocket; - -import org.apache.log4j.Logger; -import org.apache.log4j.LogManager; -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.helpers.LogLog; -import org.apache.log4j.net.SocketNode; - -/** -*/ - -public class ShortSocketServer { - - static Logger cat = Logger.getLogger(ShortSocketServer.class.getName()); - - static int port; - - public - static - void main(String argv[]) { - if(argv.length == 2) { - init(argv[0], argv[1]); - } else { - usage("Wrong number of arguments."); - } - - try { - LogLog.debug("Listening on port " + port); - ServerSocket serverSocket = new ServerSocket(port); - LogLog.debug("Waiting to accept a new client."); - Socket socket = serverSocket.accept(); - LogLog.debug("Connected to client at " + socket.getInetAddress()); - LogLog.debug("Starting new socket node."); - SocketNode sn = new SocketNode(socket, LogManager.getLoggerRepository()); - Thread t = new Thread(sn); - t.start(); - t.join(); - } - catch(Exception e) { - cat.error("Error while in main.", e); - } - } - - - static - void usage(String msg) { - System.err.println(msg); - System.err.println( - "Usage: java " +ShortSocketServer.class.getName() + " port configFile"); - System.exit(1); - } - - static - void init(String portStr, String configFile) { - try { - port = Integer.parseInt(portStr); - } - catch(java.lang.NumberFormatException e) { - e.printStackTrace(); - usage("Could not interpret port number ["+ portStr +"]."); - } - PropertyConfigurator.configure(configFile); - } -} diff --git a/src/java/org/apache/log4j/test/SpacePad.java b/src/java/org/apache/log4j/test/SpacePad.java deleted file mode 100644 index 71c3242c47..0000000000 --- a/src/java/org/apache/log4j/test/SpacePad.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.log4j.test; - -public class SpacePad { - - static String[] SPACES = {" ", " ", " ", " ", //1,2,4,8 spaces - " ", // 16 spaces - " " }; // 32 - - static public void main(String[] args) { - StringBuffer sbuf = new StringBuffer(); - - for(int i = 0; i < 35; i++) { - sbuf.setLength(0); - sbuf.append("\""); - spacePad(sbuf, i); - sbuf.append("\""); - System.out.println(sbuf.toString()); - } - - sbuf.setLength(0); - sbuf.append("\""); - spacePad(sbuf, 67); - sbuf.append("\""); - System.out.println(sbuf.toString()); - - } - static - public - void spacePad(StringBuffer sbuf, int length) { - //LogLog.debug("Padding with " + length + " spaces."); - while(length >= 32) { - sbuf.append(SPACES[5]); - length -= 32; - } - - for(int i = 4; i >= 0; i--) { - if((length & (1<> $TEMP.x - mv $TEMP.x $TEMP - fi - - $PERL filter.pl $TEMP $OUTPUT ConfigurationFileParsing $options - if [ $? != 0 ]; then - echo "The output is not in expected format. See the file [$OUTPUT]." - exit 1 - fi - - check witness/confParsing.$TEST $OUTPUT; echo " OK" -} - - -# ========================================================================= -# Just run ConfigurationFileParsing and direct the output to STDOUT or -# STDERR. -# ========================================================================= -function testConfigurationParsingII { - conf=$1; - target=$2 - - case $target in - OUT ) - java $D_FLAG org.apache.log4j.test.ConfigurationFileParsing $conf>$TEMP - ;; - ERR ) - java $D_FLAG org.apache.log4j.test.ConfigurationFileParsing $conf>& $TEMP - ;; - esac - - check witness/confParsing.$TEST $TEMP; echo " OK" -} -# ====================================================== - -declare -i TEST - - -TEST=1; -if [ $TEST -ge $start ]; then - D_FLAG=$DEF_DEBUG - echo "log4j.rootCategory=DEBUG, testAppender" > $LCF - lecho "log4j.appender.testAppender=org.apache.log4j.RollingFileAppender" - lecho "log4j.appender.testAppender.File= $TEMP" - lecho "log4j.appender.testAppender.Append=false" - lecho "log4j.appender.testAppender.layout.ContextPrinting= false " - lecho "log4j.appender.testAppender.layout.ThreadPrinting= xx " - lecho "log4j.appender.testAppender.layout=org.apache.log4j.TTCCLayout " - testConfigurationParsing $LCF LINE_NUMBER -fi - -TEST=2; -if [ $TEST -ge $start ]; then - D_FLAG=$DEF_DEBUG - echo "log4j.rootCategory=DEBUG, testAppender" > $LCF - lecho "log4j.appender.testAppender=org.apache.log4j.RollingFileAppender" - lecho "log4j.appender.testAppender.File= $TEMP" - lecho "log4j.appender.testAppender.Append=false" - lecho "log4j.appender.testAppender.MaxFileSize=1KB" - lecho "log4j.appender.testAppender.MaxBackupIndex= 1 " - lecho "log4j.appender.testAppender.layout=org.apache.log4j.TTCCLayout" - lecho "log4j.appender.testAppender.layout.ThreadPrinting=true" - lecho "log4j.appender.testAppender.layout.DateFormat=ReLaTIve" - testConfigurationParsing $LCF RELATIVE -fi - -TEST=3; -if [ $TEST -ge $start ]; then - D_FLAG=$DEF_DEBUG - echo "18:25:32.394 [main] DEBUG testing - HELLO WORLD" > $TEMP - echo "log4j.rootCategory=DEBUG, testAppender" > $LCF - lecho "log4j.appender.testAppender=org.apache.log4j.RollingFileAppender" - lecho "log4j.appender.testAppender.File=$TEMP" - lecho "log4j.appender.testAppender.Append=true" - lecho "log4j.appender.testAppender.MaxFileSize=54" - lecho "log4j.appender.testAppender.MaxBackupIndex= 0 " - lecho "log4j.appender.testAppender.layout=org.apache.log4j.TTCCLayout" - lecho "log4j.appender.testAppender.layout.DateFormat=aBSOlute" - lecho "log4j.appender.testAppender.layout.TimeZone=GMT" - testConfigurationParsing $LCF ABSOLUTE -fi - - -TEST=4; -if [ $TEST -ge $start ]; then - D_FLAG=$DEF_DEBUG - echo "18:25:32,394 [main] DEBUG testing - HELLO WORLD" > $TEMP - echo "log4j.rootCategory= DEBUG , testAppender" > $LCF - lecho "log4j.appender.testAppender=org.apache.log4j.RollingFileAppender" - lecho "log4j.appender.testAppender.File=$TEMP" - lecho "log4j.appender.testAppender.Append=true" - lecho "log4j.appender.testAppender.MaxFileSize=155" - lecho "log4j.appender.testAppender.MaxBackupIndex=0" - lecho "log4j.appender.testAppender.layout=org.apache.log4j.TTCCLayout" - lecho "log4j.appender.testAppender.layout.DateFormat=aBSOlute" - lecho "log4j.appender.testAppender.layout.TimeZone=ECT" - testConfigurationParsing $LCF ABSOLUTE -fi - - -TEST=5; -if [ $TEST -ge $start ]; then - D_FLAG="" - echo "18:25:32,394 [main] DEBUG testing - HELLO WORLD" > $TEMP - echo "log4j.rootCategory= DEBUG , testAppender" > $LCF - lecho "log4j.debug=" - lecho "log4j.appender.testAppender=org.apache.log4j.RollingFileAppender" - lecho "log4j.appender.testAppender.File=$TEMP" - lecho "log4j.appender.testAppender.Append= true" - lecho "log4j.appender.testAppender.MaxFileSize= 1 " - lecho "log4j.appender.testAppender.MaxBackupIndex= 2" - lecho "log4j.appender.testAppender.layout=org.apache.log4j.TTCCLayout" - lecho "log4j.appender.testAppender.layout.DateFormat=aBSOlute" - lecho "log4j.appender.testAppender.layout.TimeZone=ECT" - testConfigurationParsing $LCF ABSOLUTE $TEMP.2 $TEMP.1 -fi - -TEST=6; -if [ $TEST -ge $start ]; then - D_FLAG="" - echo "log4j.rootCategory= , testAppender" > $LCF - lecho "log4j.debug=" - lecho "log4j.appender.testAppender=org.apache.log4j.FileAppender" - lecho "log4j.appender.testAppender.File=$TEMP" - lecho "log4j.appender.testAppender.Append= false " - lecho "log4j.appender.testAppender.layout=org.apache.log4j.TTCCLayout" - lecho "log4j.appender.testAppender.layout.DateFormat=dAtE" - lecho "log4j.appender.testAppender.layout.TimeZone=" - - testConfigurationParsing $LCF DATE -fi - - -TEST=7; -if [ $TEST -ge $start ]; then - D_FLAG="" - echo "18:25:32,394 [main] DEBUG testing - HELLO WORLD" > $TEMP - echo "log4j.rootCategory= DEBUG , testAppender, inexistentAppender" > $LCF - lecho "log4j.debug=false" - lecho "log4j.appender.testAppender=org.apache.log4j.RollingFileAppender" - lecho "log4j.appender.testAppender.File=$TEMP" - lecho "log4j.appender.testAppender.Append= true" - lecho "log4j.appender.testAppender.MaxFileSize= 1 " - lecho "log4j.appender.testAppender.MaxBackupIndex=2 " - lecho "log4j.appender.testAppender.layout=org.apache.log4j.TTCCLayout" - lecho "log4j.appender.testAppender.layout.DateFormat=aBSOlute" - lecho "log4j.appender.testAppender.layout.TimeZone=ECT" - - testConfigurationParsing $LCF ABSOLUTE $TEMP.2 $TEMP.1 -fi - - -TEST=8; -if [ $TEST -ge $start ]; then - D_FLAG="" - echo "log4j.rootCategory= DEBUG , testAppender" > $LCF - lecho "log4j.debug=false" - lecho "log4j.appender.testAppender=org.apache.log4j.ConsoleAppender" - # Note the spaces - lecho "log4j.appender.testAppender.layout=org.apache.log4j.PatternLayout " - lecho "log4j.appender.testAppender.layout.ConversionPattern=[%t] %p - %m%n" - echo -n " ConfigurationParsing test $TEST - " - testConfigurationParsingII $LCF OUT -fi - -TEST=9; -if [ $TEST -ge $start ]; then - D_FLAG="" - echo "log4j.rootCategory= DEBUG , testAppender" > $LCF - lecho "log4j.debug=false" - lecho "log4j.appender.testAppender=org.apache.log4j.ConsoleAppender" - lecho "log4j.appender.testAppender.Target= System.out " -# lecho "log4j.appender.testAppender.Append= true " - lecho "log4j.appender.testAppender.layout=org.apache.log4j.PatternLayout" - lecho "log4j.appender.testAppender.layout.ConversionPattern=[%t] %p - %m%n" - echo -n " ConfigurationParsing test $TEST (can fail if anything is written to System.err) - " - testConfigurationParsingII $LCF ERR -fi - -# Test variable subst from System properties -TEST=10; -if [ $TEST -ge $start ]; then - D_FLAG="" - echo "log4j.rootCategory= DEBUG , testAppender" > $LCF - lecho "log4j.debug=false" - lecho "log4j.appender.testAppender=org.apache.log4j.FileAppender" - # We escape the dollar sign to avoid substitution at the shell level. - lecho "log4j.appender.testAppender.File=\${user.dir}/$TEMP" - lecho "log4j.appender.testAppender.Append=false" - lecho "log4j.appender.testAppender.layout=org.apache.log4j.PatternLayout" - lecho "log4j.appender.testAppender.layout.ConversionPattern=AVY [%t] %p-%m%n" - testConfigurationParsing $LCF NONE -fi - -rm $TEMP > /dev/null - -# Test variable subst from the config file itself -TEST=11; -if [ $TEST -ge $start ]; then - D_FALG="" - echo "log4j.rootCategory= DEBUG , testAppender" > $LCF - lecho "log4j.configDebug=false" - # $TEMP will be replaced by the shell - lecho "t=$TEMP" - lecho "log4j.appender.testAppender=org.apache.log4j.FileAppender" - # We escape the dollar sign to avoid substitution at the shell level. - lecho "log4j.appender.testAppender.File=\${t}" - lecho "log4j.appender.testAppender.Append=false" - lecho "log4j.appender.testAppender.layout=org.apache.log4j.PatternLayout" - lecho "log4j.appender.testAppender.layout.ConversionPattern=VSUB [%t] %p-%m%n" - testConfigurationParsing $LCF NONE -fi - - - - - - - - - - - -# Do SyslogAppender test (not real tests) - -TEST=100; - -if [ $TEST -ge $start ]; then - D_FLAG="" - echo "log4j.rootCategory= , testAppender" > $LCF - lecho "log4j.debug=true" - lecho "log4j.appender.testAppender=org.apache.log4j.net.SyslogAppender" - lecho "log4j.appender.testAppender.SyslogHost=localhost" - lecho "log4j.appender.testAppender.Facility= LOCAL0 " - lecho "log4j.appender.testAppender.FacilityPrinting=true" - lecho "log4j.appender.testAppender.layout=org.apache.log4j.TTCCLayout" - lecho "log4j.appender.testAppender.layout.DateFormat=NULL" - lecho "log4j.appender.testAppender.layout.TimeZone=" - - echo -n " ConfigurationParsing test $TEST - " - java $D_FLAG org.apache.log4j.test.ConfigurationFileParsing $LCF -fi - - -TEST=101; - -if [ $TEST -ge $start ]; then - D_FLAG="" - echo "log4j.rootCategory= , testAppender" > $LCF - lecho "log4j.debug=true" - lecho "log4j.appender.testAppender=org.apache.log4j.net.SyslogAppender" - lecho "log4j.appender.testAppender.SyslogHost=localhost" - lecho "log4j.appender.testAppender.Facility=" - lecho "log4j.appender.testAppender.FacilityPrinting=" - lecho "log4j.appender.testAppender.layout=org.apache.log4j.TTCCLayout" - lecho "log4j.appender.testAppender.layout.DateFormat=NULL" - lecho "log4j.appender.testAppender.layout.TimeZone=" - - echo -n " ConfigurationParsing test $TEST - " - java $D_FLAG org.apache.log4j.test.ConfigurationFileParsing $LCF -fi diff --git a/src/java/org/apache/log4j/test/customCategory b/src/java/org/apache/log4j/test/customCategory deleted file mode 100644 index 36adae9eb3..0000000000 --- a/src/java/org/apache/log4j/test/customCategory +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -# A regression test to check support custom priorities - -# Read the .functions file -. .functions - -# If set, allows to skip tests -declare -i start=$1 -echo "start=$start TEMP=$TEMP OUTPUT=$OUTPUT" - -function testCustomCat { - layout=$1 - - echo -n "Custom Priority test $TEST - " - java -Dlog4j.debug org.apache.log4j.test.CustomCategoryTest $LCF - - check witness/customCat.$TEST $TEMP; echo "OK." -} - - - -setPERL - -declare -i TEST - -TEST=1 -if [ $TEST -ge $start ]; then - echo "LOG4J=org.apache.log4j" > $LCF - lecho "log4j.rootCategory=TRACE#\${LOG4J}.xml.examples.XLevel, testAppender" - lecho "log4j.loggerFactory=\${LOG4J}.xml.examples.XLogger\$XFactory" - lecho "log4j.appender.testAppender=\${LOG4J}.FileAppender" - lecho "log4j.appender.testAppender=\${LOG4J}.FileAppender" - lecho "log4j.appender.testAppender.File=$TEMP" - lecho "log4j.appender.testAppender.Append=false" - lecho "log4j.appender.testAppender.layout=\${LOG4J}.PatternLayout " - lecho "log4j.appender.testAppender.layout.ConversionPattern=%-5p - %m%n" - testCustomCat -fi - - - diff --git a/src/java/org/apache/log4j/test/defaultInit b/src/java/org/apache/log4j/test/defaultInit deleted file mode 100644 index e05628d855..0000000000 --- a/src/java/org/apache/log4j/test/defaultInit +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash - -# Read the .functions file -. .functions - -# If set, allows to skip tests -declare -i start=$1 - -# ================================================== -function testDefaultInit { - echo -n "Default initialization test $TEST - " - - if [ -e $TEMP ]; then - #echo "Deleting $TEMP." - rm $TEMP - touch $TEMP - fi - - java $1 -Dlog4j.debug org.apache.log4j.test.DefaultInit - - check witness/definit.$TEST $TEMP; echo "OK." -} -# ================================================== - - -declare -i TEST - -function createProperties { - echo "log4j.rootCategory=DEBUG, A1" > $LCF - lecho "log4j.appender.A1=org.apache.log4j.FileAppender" - lecho "log4j.appender.A1.File=$TEMP" - lecho "log4j.appender.A1.Append=false" - lecho "log4j.appender.A1.layout=org.apache.log4j.PatternLayout " - lecho "log4j.appender.A1.layout.ConversionPattern=%m%n" -} - -LCF=log4j.properties -createProperties - -TEST=1 -if [ $TEST -ge $start ]; then - testDefaultInit -fi - -TEST=2 -if [ $TEST -ge $start ]; then - testDefaultInit -Dlog4j.defaultInitOverride -fi - -TEST=3 -if [ $TEST -ge $start ]; then - testDefaultInit -Dlog4j.defaultInitOverride=true -fi - -TEST=4 -if [ $TEST -ge $start ]; then - testDefaultInit -Dlog4j.defaultInitOverride= -fi - -TEST=5 -if [ $TEST -ge $start ]; then - testDefaultInit -Dlog4j.defaultInitOverride=false -fi - -rm $LCF - -LCF=props -createProperties - -TEST=6 -if [ $TEST -ge $start ]; then - testDefaultInit -Dlog4j.configuration=props -fi - -rm $LCF diff --git a/src/java/org/apache/log4j/test/domTest b/src/java/org/apache/log4j/test/domTest deleted file mode 100644 index adf10088de..0000000000 --- a/src/java/org/apache/log4j/test/domTest +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash - -# A regression test to check the PatternLayout code. - -# Read the .functions -. .functions - - -# If set, allows to skip tests -declare -i start=$1 - -echo "start=$start TEMP=$TEMP OUTPUT=$OUTPUT" -# ================================================================== -function testDOM { - - configFile=$1 - layoutA1=$2 - layoutA2=$3 - - deleteFile temp.A1 > /dev/null; deleteFile output.A1 > /dev/null ; - deleteFile temp.A2 > /dev/null; deleteFile output.A2 > /dev/null; - touch temp.A1 temp.A2 - - echo -n "DOM test $TEST - " - #java org.apache.log4j.xml.test.DOMTest $configFile - java -Dlog4j.configDebug org.apache.log4j.xml.test.DOMTest $configFile - - $PERL filter.pl temp.A1 output.A1 DOMTest $layoutA1 - if [ $? != 0 ]; then - echo "The output(1) is not in expected format. See the file [output.A1]." - exit 1 - fi - - $PERL filter.pl temp.A2 output.A2 DOMTest $layoutA2 - if [ $? != 0 ]; then - echo "The output(2) is not in expected format. See the file [output.A2]." - exit 1 - fi - - - check witness/domTest.A1.$TEST output.A1; echo -n "-" - check witness/domTest.A2.$TEST output.A2; echo " OK" - -} -# ================================================================== -function simpleTest { - - configFile=$1 - - echo -n "DOM test $TEST - " - java org.apache.log4j.xml.test.DOMTest $configFile - #java -Dlog4j.configDebug org.apache.log4j.xml.test.DOMTest $configFile - $PERL filter.pl $TEMP $OUTPUT DOMTest LINE_NUMBER - - check witness/domTest.$TEST $OUTPUT; echo " OK" - -} -# ================================================================== - - -setPERL - -declare -i TEST - -TEST=1 -if [ $TEST -ge $start ]; then - testDOM xml/domTest$TEST.xml LINE_NUMBER ISO8601 -fi - -TEST=2 -if [ $TEST -ge $start ]; then - echo "THIS TEST WILL ECHO WARNINGS (BUT DOES NOT THROW EXCEPTIONS)." - testDOM xml/domTest$TEST.xml LINE_NUMBER ISO8601 -fi - -TEST=3 -if [ $TEST -ge $start ]; then - testDOM xml/domTest$TEST.xml RELATIVE RELATIVE -fi - -for TEST in 4 5 6 7 8 9 10 11 12 -do - if [ $TEST -ge $start ]; then - simpleTest xml/domTest$TEST.xml - fi -done - - diff --git a/src/java/org/apache/log4j/test/drfa b/src/java/org/apache/log4j/test/drfa deleted file mode 100644 index c3ce23094f..0000000000 --- a/src/java/org/apache/log4j/test/drfa +++ /dev/null @@ -1,36 +0,0 @@ -if [ -z "$PERL" ] -then - PERL=perl -fi - -. .functions - -#rm test -#rm test.* - -echo "starting org.apache.log4j.test.DRFATest 5" -java -Dlog4j.debug org.apache.log4j.test.DRFATest 5 -$PERL drfa.pl || die "drfa test FAILED." - -echo -n "About to sleep ";date -sleep 60 -echo -n "After sleep ";date -echo "Starting org.apache.log4j.test.DRFATest 10" -java -Dlog4j.debug org.apache.log4j.test.DRFATest 10 -$PERL drfa.pl || die "drfa test FAILED." - - -echo -n "About to sleep ";date -sleep 60 -echo -n "After sleep ";date -echo "Starting org.apache.log4j.test.DRFATest 100" -java -Dlog4j.debug org.apache.log4j.test.DRFATest 100 -$PERL drfa.pl || die "drfa test FAILED." - - -echo -n "About to sleep ";date -sleep 60 -echo -n "After sleep ";date -echo "Starting org.apache.log4j.test.DRFATest 100" -java -Dlog4j.debug org.apache.log4j.test.DRFATest 100 -$PERL drfa.pl || die "drfa test FAILED." diff --git a/src/java/org/apache/log4j/test/drfa.pl b/src/java/org/apache/log4j/test/drfa.pl deleted file mode 100644 index 5ee1a2b547..0000000000 --- a/src/java/org/apache/log4j/test/drfa.pl +++ /dev/null @@ -1,45 +0,0 @@ - -$|=1; - -while($next = ) { - - print "Reading $next\n"; - check($next); -} - -print "Reading test\n"; -checkResidual(); - -sub checkResidual() { - open(F, "test"); - - while() { - if($_ =~ /(.*) \d\d:/) { - $p = $1; - } else { - die "In [test] unexpected line: [$_]\n"; - } - - if($old && $old != $p) { - die "Mismatch in [test] unexpected line: [$_]\n"; - } else { - print " $_"; - } - $old = $p; - } -} - -sub check() { - my ($filename) = @_; - - open(F, $filename); - $_ = $filename; - $p = s/test.//; - while() { - if($_ =~ /$p/) { - print " $_"; - } else { - die "In [$filename] unexpected line: [$_]\n"; - } - } -} diff --git a/src/java/org/apache/log4j/test/extSupport b/src/java/org/apache/log4j/test/extSupport deleted file mode 100644 index 82a360eadb..0000000000 --- a/src/java/org/apache/log4j/test/extSupport +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -# A regression test to check extension support in DOMConfigurator and elsewhere - -# Read the .functions file -. .functions - -# If set, allows to skip tests -declare -i start=$1 -echo "start=$start TEMP=$TEMP OUTPUT=$OUTPUT" - -function testExtSupport { - configFile=$1 - - echo -n "Extension support test $TEST - " - java org.apache.log4j.xml.test.XTest $configFile - - check witness/ext.$TEST $OUTPUT; echo "OK." -} - - -echo "-- $OUTPUT" - -declare -i TEST - -TEST=1 -if [ $TEST -ge $start ]; then - testExtSupport xml/ext$TEST.xml -fi \ No newline at end of file diff --git a/src/java/org/apache/log4j/test/filter.pl b/src/java/org/apache/log4j/test/filter.pl deleted file mode 100644 index b0f8b3ea8e..0000000000 --- a/src/java/org/apache/log4j/test/filter.pl +++ /dev/null @@ -1,132 +0,0 @@ - -# Usage: perl filter.pl input output exceptionString layout -# where exceptionString is the string to filter in stack traces -# layout is one of NONE|LINE_NUMBER|RELATIVE|DATE|ABSOLUTE|ISO8601|HTML -# - -$INPUT=$ARGV[0]; -$OUTPUT=$ARGV[1]; -$EXSTR=$ARGV[2]; -$LAYOUT=$ARGV[3]; # filtering type - - -open(IN, $INPUT) || die "Could not open $INPUT"; -open(OUT, ">$OUTPUT") || die "Could not open $OUTPUT"; - -local($oldfh) = select(); select(OUT); $|=1; select($oldfh); - -if ($LAYOUT =~ "NONE") { - doNoneFilter(); -} elsif($LAYOUT =~ "LINE_NUMBER") { - doLineNumberFilter(); -} elsif($LAYOUT =~ "HTML") { - doHTMLFilter(); -} else { - doFilter($LAYOUT); -} - -close(OUT); - -sub wrongFormat { - my $line = $_; - print "Wrong format. Offending line: \"$_\"\n"; - exit 1; -} - -sub doNoneFilter { - while() { - print OUT; - } -} - -sub doHTMLFilter { - while() { - if(/\($EXSTR\.java:\d*\)/) { - s/\($EXSTR\.java:\d+\)/\($EXSTR\.java:XXX\)/g; - } - elsif(/\(Compiled Code\)/) { - s/\(Compiled Code\)$/\($EXSTR\.java:XXX\)/g; - } - elsif(/\(Unknown Source\)/) { - s/\(Unknown Source\)$/\($EXSTR\.java:XXX\)/g; - } - elsif(/
  • \d+<\/td>/) { - s/
    \d+<\/td>/
    XXX<\/td>/; - } - print OUT ; - } -} - -sub doLineNumberFilter { - while() { - if(/\($EXSTR\.java:\d*\)/) { - s/\($EXSTR\.java:\d+\)$/\($EXSTR\.java:XXX\)/; - print OUT; - } elsif(/\(Compiled Code\)/) { - s/\(Compiled Code\)$/\($EXSTR\.java:XXX\)/; - print OUT; - } elsif(/\(Unknown Source\)/) { - s/\(Unknown Source\)$/\($EXSTR\.java:XXX\)/; - print OUT; - } else { - print OUT; - } - } -} - - -sub doFilter() { - my $layout = $_[0]; - $basicPat = "\\[main\\] (FATAL|ERROR|WARN|INFO|DEBUG)"; - #$basicPat = 'main'; - - - $timePat = "\\d\\d:\\d\\d:\\d\\d,\\d{3}"; # "17:49:20.733" - - #$datePat = "\\d\\d [A-Z][a-z]{2} \\d{4}"; # 20 Dec 1999 - # The month is locale dependent - $datePat = "\\d\\d .{3,6} \\d{4}"; # 20 Dec 1999 - - if($layout =~ "NULL") { - $pattern = $basicPat; - } - # 98 [main] ERROR DEB - Message 15 - elsif($layout =~ "RELATIVE") { - $pattern = "^\\d+ $basicPat"; - } - # 17:49:20.733 [main] ERROR DEB - Message 15 - elsif($layout =~ "ABSOLUTE") { - $pattern = "^$timePat $basicPat"; - } - elsif ($layout =~ "DATE") { - $pattern = "^$datePat $timePat $basicPat"; - } - elsif ($layout =~ "ISO8601") { - $pattern = "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3} $basicPat"; - } - else { - die "Unknown layout [$layout]"; - } - - #print "PATTERN \"$pattern\"\n"; - while() { - if (/$pattern/o) { - $i = index($_,"[main]"); - print OUT substr($_, $i); - } elsif(/\($EXSTR\.java:\d*\)/) { - s/\($EXSTR\.java:\d+\)$/\($EXSTR\.java:XXX\)/; - print OUT; - } elsif(/\(Compiled Code\)/) { - s/\(Compiled Code\)$/\($EXSTR\.java:XXX\)/; - print OUT; - } elsif(/\(Unknown Source\)/) { - s/\(Unknown Source\)$/\($EXSTR\.java:XXX\)/; - print OUT; - } elsif (/^java\.lang\.Exception: Just testing$/) { - print OUT; - } - else { - wrongFormat($_); - } - } -} diff --git a/src/java/org/apache/log4j/test/finalize b/src/java/org/apache/log4j/test/finalize deleted file mode 100644 index 54f0ec9c54..0000000000 --- a/src/java/org/apache/log4j/test/finalize +++ /dev/null @@ -1,45 +0,0 @@ - - -# Read the .functions file -. .functions - -declare -i start=$1 - -# ====================================================== -function testFinalize { - conf=$1 - - - java -Dlog4j.configDebug org.apache.log4j.test.Finalize $conf -} -# ====================================================== - - - -declare -i TEST - - -TEST=1 -if [ $TEST -ge $start ]; then - D_FLAG=$DEF_DEBUG - echo "log4j.rootCategory=DEBUG, A1" > $LCF - lecho "log4j.appender.A1=org.apache.log4j.FileAppender" - lecho "log4j.appender.A1.File=$TEMP" - lecho "log4j.appender.A1.Append=false" - lecho "log4j.appender.A1.layout.ConversionPattern=%m\n" - lecho "log4j.appender.A1.layout=org.apache.log4j.PatternLayout" - testFinalize $LCF -fi - -TEST=2 -if [ $TEST -ge $start ]; then - D_FLAG=$DEF_DEBUG - echo "log4j.rootCategory=DEBUG, A1" > $LCF - lecho "log4j.appender.A1=org.apache.log4j.net.SocketAppender" - lecho "log4j.appender.A1.RemoteHost=$REMOTE_HOST" - lecho "log4j.appender.A1.Port=12345" - lecho "log4j.appender.A1.ReconnectionDelay=2000" - testFinalize $LCF -fi - - diff --git a/src/java/org/apache/log4j/test/fqcn b/src/java/org/apache/log4j/test/fqcn deleted file mode 100644 index a97c97af9e..0000000000 --- a/src/java/org/apache/log4j/test/fqcn +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -# A regression test to check the caller localization in subclasses of Category - -# Read the .functions file -. .functions - -# If set, allows to skip tests -declare -i start=$1 -echo "start=$start TEMP=$TEMP OUTPUT=$OUTPUT" - -function testFQCN { - layout=$1 - - echo -n "FQCN test $TEST - " - java org.apache.log4j.test.FQCNTest $OUTPUT - - check witness/fqcn.$TEST $OUTPUT; echo "OK." -} - - - -declare -i TEST - -TEST=1 -if [ $TEST -ge $start ]; then - testFQCN -fi \ No newline at end of file diff --git a/src/java/org/apache/log4j/test/getOptions b/src/java/org/apache/log4j/test/getOptions deleted file mode 100644 index 881853e63a..0000000000 --- a/src/java/org/apache/log4j/test/getOptions +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -# Read the .functions file -. .functions - -# If set, allows to skip tests -declare -i start=$1 - -# ================================================== -function testGetOptions { - echo -n "OptionHandler.getOption() test $TEST - " - - if [ -e $TEMP ]; then - #echo "Deleting $TEMP." - rm $TEMP - touch $TEMP - fi - - java $1 -Dlog4j.configuration=$LCF org.apache.log4j.test.PrintProperties | sort > $TEMP - - check witness/getOptions.$TEST $TEMP; echo "OK." -} -# ================================================== - - -declare -i TEST - -function createProperties { - echo -n "" > $LCF - #if [ -n "$1" ]; then - # lecho "log4j.configurator=$1" - #fi - lecho "log4j.appender.f=org.apache.log4j.FileAppender" - lecho "log4j.appender.f.File=$TEMP" - lecho "log4j.appender.f.Append=false" - lecho "log4j.appender.f.layout=org.apache.log4j.PatternLayout " - lecho "log4j.appender.f.layout.ConversionPattern=%m%n" - lecho "log4j.rootCategory=DEBUG, f" - lecho "log4j.category.org.apache.log4j=INFO, f" -} - -createProperties - -TEST=1 -if [ $TEST -ge $start ]; then - testGetOptions -fi - -rm $LCF diff --git a/src/java/org/apache/log4j/test/l7d b/src/java/org/apache/log4j/test/l7d deleted file mode 100644 index 2743b4342e..0000000000 --- a/src/java/org/apache/log4j/test/l7d +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -# Read the .functions file -. .functions - -declare -i start=$1 - -# ------------------------------------------------ -function testL7D { - configFile=$1 - lang=$2 - country=$3 - - echo -n "L7D test $TEST - " - java org.apache.log4j.test.L7D $configFile $lang $country - - check witness/l7d.$TEST $TEMP; echo " OK." -} -# ------------------------------------------------ - -declare -i TEST - - -TEST=1; -if [ $TEST -ge $start ]; then - D_FLAG=$DEF_DEBUG - echo "log4j.rootCategory=INFO, testAppender" > $LCF - lecho "log4j.appender.testAppender=org.apache.log4j.RollingFileAppender" - lecho "log4j.appender.testAppender.File=$TEMP" - lecho "log4j.appender.testAppender.Append=false" - lecho "log4j.appender.testAppender.layout=org.apache.log4j.PatternLayout" - lecho "log4j.appender.testAppender.layout.ConversionPattern=T$TEST %5p - %m%n" - testL7D $LCF en US -fi diff --git a/src/java/org/apache/log4j/test/multipleAppenders b/src/java/org/apache/log4j/test/multipleAppenders deleted file mode 100755 index 02aeee89e4..0000000000 --- a/src/java/org/apache/log4j/test/multipleAppenders +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# Read the .functions file -. .functions - -setPERL - -echo "log4j.rootCategory=DEBUG, A1, A2" > $LCF -lecho "log4j.appender.A1=org.apache.log4j.FileAppender" -lecho "log4j.appender.A1.File=$TEMP" -lecho "log4j.appender.A1.Append=false" -lecho "log4j.appender.A1.layout=org.apache.log4j.TTCCLayout" -lecho "log4j.appender.A1.layout.ContextPrinting=false" -lecho "log4j.appender.A1.layout.ThreadPrinting=xx" - -lecho "log4j.appender.A2=org.apache.log4j.FileAppender" -lecho "log4j.appender.A2.File=$TEMP.1" -lecho "log4j.appender.A2.Append=false" -lecho "log4j.appender.A2.layout=org.apache.log4j.TTCCLayout" -lecho "log4j.appender.A2.layout.ContextPrinting=false" -lecho "log4j.appender.A2.layout.ThreadPrinting=true" - -echo -n " MultipleAppenders test $TEST - " -java $D_FLAG org.apache.log4j.test.MultipleAppenders $LCF - diff --git a/src/java/org/apache/log4j/test/mycat b/src/java/org/apache/log4j/test/mycat deleted file mode 100644 index e954d30c85..0000000000 --- a/src/java/org/apache/log4j/test/mycat +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -# Read the .functions file -. .functions - -# If set, allows to skip tests -declare -i start=$1 - - -declare -i TEST - -function testSubclassing { - - echo -n "Subclassing test $TEST - " - java examples.subclass.MyLoggerTest $LCF - check witness/mycat.$TEST $TEMP; echo "OK." -} - - -TEST=1 -if [ $TEST -ge $start ]; then - echo "log4j.rootCategory=DEBUG, A1" > $LCF - lecho "log4j.appender.A1=org.apache.log4j.FileAppender" - lecho "log4j.appender.A1.File=$TEMP" - lecho "log4j.appender.A1.Append=false" - lecho "log4j.appender.A1.layout=org.apache.log4j.PatternLayout " - lecho "log4j.appender.A1.layout.ConversionPattern=%c %p - %m%n" - testSubclassing -fi - -rm $TEMP > /dev/null -TEST=2 -if [ $TEST -ge $start ]; then - echo "The next test outputs error messages." - echo "log4j.rootCategory=DEBUG, A1" > $LCF - lecho "log4j.appender.A1=org.apache.log4j.FileAppender" - lecho "log4j.appender.A1.File=$TEMP" - lecho "log4j.appender.A1.Append=false" - lecho "log4j.appender.A1.layout=org.apache.log4j.PatternLayout " - lecho "log4j.appender.A1.layout.ConversionPattern=%c %p - %m%n" - lecho "log4j.category.some.cat=DEBUG" - testSubclassing -fi - -rm $TEMP > /dev/null -TEST=3 -if [ $TEST -ge $start ]; then - echo "log4j.rootCategory=DEBUG, A1" > $LCF - lecho "log4j.appender.A1=org.apache.log4j.FileAppender" - lecho "log4j.appender.A1.File=$TEMP" - lecho "log4j.appender.A1.Append=false" - lecho "log4j.appender.A1.layout=org.apache.log4j.PatternLayout " - lecho "log4j.appender.A1.layout.ConversionPattern=%c %p - %m%n" - lecho "log4j.category.some.cat=DEBUG" - lecho "log4j.loggerFactory=examples.subclass.MyLoggerFactory" - testSubclassing -fi diff --git a/src/java/org/apache/log4j/test/package.html b/src/java/org/apache/log4j/test/package.html deleted file mode 100644 index 6081c183b2..0000000000 --- a/src/java/org/apache/log4j/test/package.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - -

    Package used to test the functionality of log4j. - -


    -
    - -Last modified: Tue Nov 16 20:26:36 MET 1999 - - diff --git a/src/java/org/apache/log4j/test/propConfig b/src/java/org/apache/log4j/test/propConfig deleted file mode 100644 index 447e0fab6d..0000000000 --- a/src/java/org/apache/log4j/test/propConfig +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -# Read the .functions file -. .functions - -# If set, allows to skip tests -declare -i start=$1 - -# ================================================== -function testPropConfig { - echo -n "PropertyConfiguratorInterface test $TEST - " - - if [ -e $TEMP ]; then - #echo "Deleting $TEMP." - rm $TEMP - touch $TEMP - fi - - java $* org.apache.log4j.test.DefaultInit > $TEMP - check witness/propCfg.$TEST $TEMP; echo "OK." -} -# ================================================== - - -declare -i TEST - -LCF=log4j.properties - -function createProperties { - echo "" > $LCF - lecho "log4j.rootLogger=DEBUG, A1" - lecho "log4j.appender.A1=org.apache.log4j.FileAppender" - lecho "log4j.appender.A1.File=$TEMP" - lecho "log4j.appender.A1.Append=false" - lecho "log4j.appender.A1.layout=org.apache.log4j.PatternLayout " - lecho "log4j.appender.A1.layout.ConversionPattern=%m%n" -} - -createProperties - -TEST=1 -if [ $TEST -ge $start ]; then - testPropConfig -fi - -#org.apache.log4j.test.SysoutConfigurator - -TEST=2 -if [ $TEST -ge $start ]; then - testPropConfig -Dlog4j=debug -Dlog4j.configuration=file:$LCF -Dlog4j.configuratorClass=org.apache.log4j.test.SysoutConfigurator -fi - - -rm $LCF diff --git a/src/java/org/apache/log4j/test/roTest b/src/java/org/apache/log4j/test/roTest deleted file mode 100644 index 94cb9f5aa2..0000000000 --- a/src/java/org/apache/log4j/test/roTest +++ /dev/null @@ -1,30 +0,0 @@ - -# A regression test to check the option reading code and print formats. - -# Read the .functions file -. .functions - -A1_PREFIX="log4j.appender.A1" - -# ---------------------------------------------------------------------- -function testRO { - confFile=$1 - - echo -n "ReadOnlyFile test $TEST - " - java -Dlog4j.configDebug org.apache.log4j.test.ROFile $confFile - -} - -touch readonly -chmod -w readonly - -echo "$A1_PREFIX=org.apache.log4j.RollingFileAppender" > $LCF -lecho "$A1_PREFIX.Append=true" -lecho "$A1_PREFIX.File=readonly" -lecho "$A1_PREFIX.layout=org.apache.log4j.PatternLayout" -lecho "$A1_PREFIX.layout.ConversionPattern=%p [%t] = %m" -lecho "$ROOT_PREFIX=DEBUG, A1" -testRO $LCF - -rm -f readonly - diff --git a/src/java/org/apache/log4j/test/runAll b/src/java/org/apache/log4j/test/runAll deleted file mode 100644 index 0b44b94185..0000000000 --- a/src/java/org/apache/log4j/test/runAll +++ /dev/null @@ -1,19 +0,0 @@ - -#!/bin/sh - -. .functions - -deleteFile log4j.properties - -./shallow || die "shallow test FAILED." -./defaultInit || die "defaultInit test FAILED." -./propConfig || die "propConfig test FAILED." -./getOptions || die "getOptions test FAILED." -./domTest || die "domTest FAILED." -./multipleAppenders || die "multipleAppenders test FAILED." -./confParsing || die "confParsing test FAILED." -#./customCategory || die "customCategory test FAILED." -./mycat || die "mycat test FAILED." -./l7d || die "L7D test FAILED." -./fqcn || die "FQCN test FAILED." -#./extSupport || die "Extension support test FAILED." diff --git a/src/java/org/apache/log4j/test/serialization/README b/src/java/org/apache/log4j/test/serialization/README deleted file mode 100644 index 4c8b23e435..0000000000 --- a/src/java/org/apache/log4j/test/serialization/README +++ /dev/null @@ -1,36 +0,0 @@ - ======================= - Serialization unit test - ======================= - -Running the serialization test is not for the faint of heart. It is -complicated because we are trying to read or write two different -versions of the same class. This requires unusual classloading -techniques. - -Compiling -========= - -step1) - -The file SerializationUT.java must be compiled with only the Java -rt.jar and junit.jar on the class path. The compilation must be -carried out from the directory where this README file is located. - -step2) - -Compile the files T/T113.java and T/T12.java. See the files -compile.sample.bat and compile.sample.sh under the T/ -directory. Compilations must be carried in T/. - -Running -======= -Tests use the same classpath and are run as follows: - - 1) cd to $LOG4J_HOME/src/java/org/apache/log4j/test/serialization - - This is where this README file is located. - - 2) Run - - java junit.textui.TestRunner SerializationUT - diff --git a/src/java/org/apache/log4j/test/serialization/SerializationUT.java b/src/java/org/apache/log4j/test/serialization/SerializationUT.java deleted file mode 100644 index 68a52adbd9..0000000000 --- a/src/java/org/apache/log4j/test/serialization/SerializationUT.java +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import junit.framework.TestCase; -import junit.framework.TestSuite; -import junit.framework.Test; -import java.util.Hashtable; - -import java.net.URL; -import java.net.URLClassLoader; -import java.lang.reflect.Method; - -/** - The SerializationUnitTest checks whether the {@link LoggingEvent} - objects are compatible across different log4j versions. - - @author Ceki Gülcü - -*/ -public class SerializationUT extends TestCase { - - // String categoryName - // String ndc - // boolan ndcLookupRequired - // String renderedMessage - // String threadName - // long timeStamp - - - static URLClassLoader classLoader113; - static Class class113; - static Object o113; - static Method serMethod113; - static Method deserMethod113; - - static URLClassLoader classLoader12a7; - static Class class12a7; - static Object o12a7; - static Method serMethod12a7; - static Method deserMethod12a7; - - public SerializationUT(String name) { - super(name); - } - - public - void setUp() throws Exception { - - try { - URL urlLocal = new URL("file:T/"); - - URL url113 = new URL("file:T/log4j-1.1.3.jar"); - - classLoader113 = new URLClassLoader(new URL[] {urlLocal, url113}); - class113 = classLoader113.loadClass("T113"); - o113 = class113.newInstance(); - serMethod113 = class113.getMethod("serialize", - new Class[] {java.util.Hashtable.class}); - - deserMethod113 = class113.getMethod("deserialize", - new Class[] {byte[].class}); - - - URL url2a7 = new URL("file:T/log4j-1.2alpha7.jar"); - - classLoader12a7 = new URLClassLoader(new URL[] {urlLocal, url2a7}); - class12a7 = classLoader12a7.loadClass("T12"); - o12a7 = class12a7.newInstance(); - serMethod12a7 = class12a7.getMethod("serialize", - new Class[] {java.util.Hashtable.class}); - deserMethod12a7 = class12a7.getMethod("deserialize", - new Class[] {byte[].class}); - } catch(Exception e) { - e.printStackTrace(); - throw e; - } - - System.out.println("---Exiting setup"); - } - - public - void tearDown() { - } - - - /** - Test writing in 1.1.3 and reading from 1.1.3. Here we are testing - the test. */ - public - void test1() throws Exception { - - Hashtable inHt = new Hashtable(); - Hashtable witness = new Hashtable(); - - inHt.put("categoryName", "a.b.c"); - inHt.put("priorityStr", "DEBUG"); - inHt.put("message", "hello"); - - witness.put("categoryName", "a.b.c"); - witness.put("priorityStr", "DEBUG"); - witness.put("renderedMessage", "hello"); - - byte[] buf = (byte[]) serMethod113.invoke(o113, new Object[] {inHt}); - - Hashtable outHt = (Hashtable) deserMethod113.invoke(o113, new Object[] {buf}); - - System.out.println("witness"+witness); - System.out.println("outHt "+outHt); - - assertEquals(witness, outHt); - } - - /** - Test writing 1.2 and reading from 1.2. Here we are testing the test. - */ - public - void test2() throws Exception { - - Hashtable inHt = new Hashtable(); - Hashtable witness = new Hashtable(); - - inHt.put("categoryName", "a.b.c"); - inHt.put("priorityStr", "DEBUG"); - inHt.put("message", "hello"); - - witness.put("categoryName", "a.b.c"); - witness.put("priorityStr", "DEBUG"); - witness.put("renderedMessage", "hello"); - - byte[] buf = (byte[]) serMethod12a7.invoke(o12a7, new Object[] {inHt}); - - Hashtable outHt = (Hashtable) deserMethod12a7.invoke(o12a7, new Object[] {buf}); - assertEquals(witness, outHt); - } - - /** - Test writing 1.1.3 and reading from 1.2. - */ - public - void test3() throws Exception { - - Hashtable inHt = new Hashtable(); - Hashtable witness = new Hashtable(); - - inHt.put("categoryName", "a.b.c"); - inHt.put("priorityStr", "DEBUG"); - inHt.put("message", "hello"); - - witness.put("categoryName", "a.b.c"); - witness.put("priorityStr", "DEBUG"); - witness.put("renderedMessage", "hello"); - byte[] buf = (byte[]) serMethod113.invoke(o113, new Object[] {inHt}); - Hashtable outHt = (Hashtable) deserMethod12a7.invoke(o12a7, new Object[] {buf}); - assertEquals(witness, outHt); - } - - /** - Test writing 1.2 and reading from 1.1.3. - */ - public - void test4() throws Exception { - - Hashtable inHt = new Hashtable(); - Hashtable witness = new Hashtable(); - - inHt.put("categoryName", "a.b.c"); - inHt.put("priorityStr", "DEBUG"); - inHt.put("message", "hello"); - Exception e = new ComparableException("test4"); - inHt.put("throwable", e); - - witness.put("categoryName", "a.b.c"); - witness.put("priorityStr", "DEBUG"); - witness.put("renderedMessage", "hello"); - witness.put("throwable", e); - - byte[] buf = (byte[]) serMethod12a7.invoke(o12a7, new Object[] {inHt}); - - Hashtable outHt = (Hashtable) deserMethod113.invoke(o113, new Object[] {buf}); - - //System.out.println("witness"+witness); - //System.out.println("outHt "+outHt); - - assertEquals(witness, outHt); - } - - - public - static - Test suite() { - TestSuite suite = new TestSuite(); - suite.addTest(new SerializationUT("test1")); - suite.addTest(new SerializationUT("test2")); - suite.addTest(new SerializationUT("test3")); - suite.addTest(new SerializationUT("test4")); - return suite; - } -} - -class ComparableException extends Exception { - - public ComparableException(String msg) { - super(msg); - } - - public boolean equals(Object o) { - System.out.println("ComparableException.equals called."); - if(!(o instanceof ComparableException)) - return false; - - ComparableException r = (ComparableException) o; - - if(r.getMessage() == null) { - if(getMessage() != null) - return false; - } else if(!r.getMessage().equals(getMessage())) { - return false; - } - return true; - } -} - diff --git a/src/java/org/apache/log4j/test/serialization/T/T113.java b/src/java/org/apache/log4j/test/serialization/T/T113.java deleted file mode 100644 index 3760637faa..0000000000 --- a/src/java/org/apache/log4j/test/serialization/T/T113.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.*; - -import org.apache.log4j.Category; -import org.apache.log4j.Priority; -import org.apache.log4j.spi.LoggingEvent; - -import java.util.Hashtable; - - -// String categoryName -// String ndc -// boolan ndcLookupRequired -// String renderedMessage -// String threadName -// long timeStamp - -// LocationInfo -// ThrowableInformation ti. -public class T113 { - - public - byte[] serialize(Hashtable ht) { - try { - Category category = Category.getInstance((String) ht.get("categoryName")); - - - LoggingEvent event = new LoggingEvent("org.apache.log4j.Category", - category, - Priority.toPriority((String)ht.get("priorityStr")), - ht.get("message"), - (Throwable) ht.get("throwable")); - event.getThreadName(); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(event); - oos.flush(); - return baos.toByteArray(); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public - Hashtable deserialize(byte[] buf) { - try { - System.out.println("deserialize called."); - ByteArrayInputStream bais = new ByteArrayInputStream(buf); - ObjectInputStream si = new ObjectInputStream(bais); - LoggingEvent event = (LoggingEvent) si.readObject(); - System.out.println("Desrialization looks successful."); - - return eventToHashtable(event); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - Hashtable eventToHashtable(LoggingEvent event) { - Hashtable ht = new Hashtable(); - ht.put("categoryName", event.categoryName); - ht.put("renderedMessage", event.getRenderedMessage()); - ht.put("priorityStr", event.priority.toString()); - ht.put("throwableInfo", event.getThrowableInformation()); - return ht; - } - -} - diff --git a/src/java/org/apache/log4j/test/serialization/T/T12.java b/src/java/org/apache/log4j/test/serialization/T/T12.java deleted file mode 100644 index 919ed0e9dc..0000000000 --- a/src/java/org/apache/log4j/test/serialization/T/T12.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.*; - -import org.apache.log4j.*; -import org.apache.log4j.spi.LoggingEvent; - -import java.util.Hashtable; - - -// String categoryName -// String ndc -// boolan ndcLookupRequired -// String renderedMessage -// String threadName -// long timeStamp - -// LocationInfo -// ThrowableInformation ti. -public class T12 { - - public - byte[] serialize(Hashtable ht) { - try { - Category category = Category.getInstance((String) ht.get("categoryName")); - - - LoggingEvent event = new LoggingEvent("org.apache.log4j.Category", - category, - Level.toLevel((String)ht.get("priorityStr")), - ht.get("message"), - (Throwable) ht.get("throwable")); - event.getThreadName(); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(event); - oos.flush(); - return baos.toByteArray(); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public - Hashtable deserialize(byte[] buf) { - try { - System.out.println("deserialize called."); - ByteArrayInputStream bais = new ByteArrayInputStream(buf); - ObjectInputStream si = new ObjectInputStream(bais); - LoggingEvent event = (LoggingEvent) si.readObject(); - System.out.println("Desrialization looks successful."); - - return eventToHashtable(event); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - Hashtable eventToHashtable(LoggingEvent event) { - Hashtable ht = new Hashtable(); - ht.put("categoryName", event.categoryName); - ht.put("renderedMessage", event.getRenderedMessage()); - ht.put("priorityStr", event.level.toString()); - ht.put("throwableInfo", event.getThrowableInformation()); - return ht; - } - -} - diff --git a/src/java/org/apache/log4j/test/serialization/T/compile.sample.bat b/src/java/org/apache/log4j/test/serialization/T/compile.sample.bat deleted file mode 100755 index bc1e69762f..0000000000 --- a/src/java/org/apache/log4j/test/serialization/T/compile.sample.bat +++ /dev/null @@ -1,15 +0,0 @@ - -@REM This little script compiles the files T113.java and T12.java with -@REM different classpaths. -@REM -@REM You have to set the classpath to point to rt.jar depending on your -@REM environment. - -set CLASSPATH=.;%JAVA_HOME%\jre\lib\rt.jar;log4j-1.1.3.jar - -echo [%CLASSPATH%] - -javac T113.java - -set CLASSPATH=.;%JAVA_HOME%\jre\lib\rt.jar;log4j-1.2alpha7.jar -javac -deprecation T12.java \ No newline at end of file diff --git a/src/java/org/apache/log4j/test/serialization/T/compile.sample.sh b/src/java/org/apache/log4j/test/serialization/T/compile.sample.sh deleted file mode 100644 index 1af7a4ee60..0000000000 --- a/src/java/org/apache/log4j/test/serialization/T/compile.sample.sh +++ /dev/null @@ -1,12 +0,0 @@ - -# This little Unix script compiles the files T113.java and T12.java -# with different classpaths. - -# You have to set the classpath to point to rt.jar depending on your -# environment. - -CLASSPATH=".:$JAVA_HOME/jre/lib/rt.jar:log4j-1.1.3.jar" -javac -deprecation T113.java - -CLASSPATH=".:$JAVA_HOME/jre/lib/rt.jar:log4j-1.2alpha7.jar" -javac -deprecation T12.java \ No newline at end of file diff --git a/src/java/org/apache/log4j/test/shallow b/src/java/org/apache/log4j/test/shallow deleted file mode 100644 index 3b416f4271..0000000000 --- a/src/java/org/apache/log4j/test/shallow +++ /dev/null @@ -1,137 +0,0 @@ -#!/bin/bash - -# A regression test to check the option reading code and print formats. - -# Read the .functions file -. .functions - -A1_PREFIX="log4j.appender.A1" -A2_PREFIX="log4j.appender.A2" - -PORT=12345 -DELAY=5000 - -# If set, allows to skip tests -declare -i start=$1 - -# ---------------------------------------------------------------------- -function testShallow { - layout=$1 - - echo -n "Shallow test $TEST - " - runShallow $LCF - $PERL filter.pl $TEMP.A1 $OUTPUT.A1 Shallow $layout - $PERL filter.pl $TEMP.A2 $OUTPUT.A2 Shallow $layout - if [ $? != 0 ]; then - echo "The output is not in expected format. See the file [$OUTPUT]." - exit 1 -fi - check witness/shallow.A1.$TEST $OUTPUT.A1; echo -n "-" - check witness/shallow.A2.$TEST $OUTPUT.A2; echo " OK." -} -# +============================================ -# Make a config file for the shallow test -# +============================================ -function makeShallowConfigFile { - logFile=$1 - rootPriority=$2 - shallowPriority=$3 - layoutClass=$4 - dateFormat=$5 - additivity=$6 - - echo "$A1_PREFIX=org.apache.log4j.FileAppender" > $LCF - echo "$A1_PREFIX.Append=false" >> $LCF - echo "$A1_PREFIX.layout=$layoutClass" >> $LCF - echo "$A1_PREFIX.layout.DateFormat=$dateFormat" >> $LCF - - echo "$A2_PREFIX=org.apache.log4j.FileAppender" >> $LCF - echo "$A2_PREFIX.append=false" >> $LCF - echo "$A2_PREFIX.layout=$layoutClass" >> $LCF - echo "$A2_PREFIX.layout.DateFormat=$dateFormat" >> $LCF - - - echo "$A1_PREFIX.File=$logFile.A1" >> $LCF - echo "$A2_PREFIX.File=$logFile.A2" >> $LCF - - echo "$ROOT_PREFIX=$rootPriority, A1" >> $LCF - echo "log4j.logger.org.apache.log4j.test.Shallow=$shallowPriority, A2" >> $LCF - - if [ -n "$additivity" ]; then - echo "log4j.additivity.org.apache.log4j.test.Shallow=$additivity" >> $LCF - fi - -} -# ---------------------------------------------------------------------- -function runShallow() { - confFile=$1 - #java -Dlog4j.configDebug org.apache.log4j.test.Shallow $confFile - java org.apache.log4j.test.Shallow $confFile -} -# ---------------------------------------------------------------------- -function testSocket { - layout=$1 - echo -n "Shallow test $TEST - " - runShallow $LCF - sleep 8 - $PERL filter.pl $TEMP $OUTPUT Shallow $layout - check witness/shallow.$TEST $OUTPUT; echo " Test PASSED O.K." -} -# =============================================================== - -setPERL - -declare -i TEST - -TEST=1 -if [ $TEST -ge $start ]; then - - makeShallowConfigFile $TEMP DEBUG " " $SIMPLE - testShallow LINE_NUMBER -fi - - -TEST=2 -if [ $TEST -ge $start ]; then - makeShallowConfigFile $TEMP INFO DEBUG $SIMPLE xxx true - testShallow LINE_NUMBER -fi - -TEST=3 -if [ $TEST -ge $start ]; then - makeShallowConfigFile $TEMP DEBUG " " $TTCC NULL true - testShallow LINE_NUMBER -fi - -TEST=4 -if [ $TEST -ge $start ]; then - makeShallowConfigFile $TEMP INFO " " $TTCC RELATIVE - testShallow RELATIVE -fi - -TEST=5 -if [ $TEST -ge $start ]; then - makeShallowConfigFile $TEMP DEBUG WARN $TTCC ABSOLUTE - testShallow ABSOLUTE -fi - -TEST=6 -if [ $TEST -ge $start ]; then - makeShallowConfigFile $TEMP DEBUG WARN $TTCC DATE - testShallow DATE -fi - -TEST=7 -if [ $TEST -ge $start ]; then - makeShallowConfigFile $TEMP DEBUG WARN $TTCC DATE false - testShallow DATE -fi - -TEST=8 -if [ $TEST -ge $start ]; then - makeShallowConfigFile $TEMP DEBUG DEBUG $TTCC DATE false - echo "$A1_PREFIX.Threshold=WARN" >> $LCF - testShallow DATE -fi - - diff --git a/src/java/org/apache/log4j/test/stressAsyncAppender.pl b/src/java/org/apache/log4j/test/stressAsyncAppender.pl deleted file mode 100644 index aeb99a557a..0000000000 --- a/src/java/org/apache/log4j/test/stressAsyncAppender.pl +++ /dev/null @@ -1,60 +0,0 @@ - -# Copyright 2000, Ceki Gulcu. All rights reserved. - -package SAA; - -$SAA::size = 0; -$SAA::sizeAvg = 0; -$n = 0; -$expected = 0; -while() { - my @ndc; - - #print $_; - $SAA::sizeAvg = ($SAA::sizeAvg*$n + $SAA::size)/(++$n); - if($n % 10000 == 0) { - print "n=$n, size=$SAA::size, sizeAverage: $SAA::sizeAvg,\n"; - } - - #25607 [Thread-17] DEBUG AsyncAppender - About to put new event in buffer. - if(/^\d+\s+\[(.+)\] DEBUG\s+(.*)\s-\s(.*)$/) { - $thread = $1; - $cat = $2; - $msg = $3; - - #print "cat is [$cat]\n"; - - if($cat =~ /AsyncAppender/) { - if($msg =~ /About to put new event in buffer./) { - #print "Got: About to put new event in buffer.\n"; - $SAA::size++; - } elsif ($msg =~ /Notifying dispatcher to process events./) { - if($SAA::size != 1) { - die "size not 1 ($SAA::size), as dispatcher is notified."; - } - } - } elsif ($cat =~ /Dispatcher/) { - if($msg =~ /Waiting for new event to dispatch./) { - if($SAA::size != 0) { - die "size not 0 ($SAA::size), as dispatcher waits for new events."; - } - } elsif($msg =~ /About to get new event./) { - #print "--------------------Got: About to get new event.\n"; - $SAA::size--; - if($SAA::size < 0) { - die "Negative buffer size: $SAA::size\n"; - } - } - } elsif ($cat =~ root) { - if($msg =~ /Message number (\d+)/) { - $new = $1; - if($expected != $new) { - die "expected $expected, but got $new\n"; - } else { - $expected = $new+1; - } - } - - } - } -} diff --git a/src/java/org/apache/log4j/test/stressCategory b/src/java/org/apache/log4j/test/stressCategory deleted file mode 100644 index 30833c0c9d..0000000000 --- a/src/java/org/apache/log4j/test/stressCategory +++ /dev/null @@ -1,899 +0,0 @@ -# ==================================================== -function stressTest { - java org.apache.log4j.StressCategory $* - if [ "$?" = "0" ] - then - echo "Passed category stress test $index." - index=$index+1 - else - echo "Failed stress test with arguments [$*]" - exit - fi -} -# ==================================================== - -declare -i index -index=1 - -stressTest a b -stressTest a a.b -# -stressTest a b c -stressTest a b a.c -stressTest a b b.c -stressTest a a.b c -stressTest a a.b a.c -stressTest a a.b a.b.c -# -stressTest a b c d -stressTest a b c a.d -stressTest a b c b.d -stressTest a b c c.d -stressTest a b a.c d -stressTest a b a.c a.d -stressTest a b a.c b.d -stressTest a b a.c a.c.d -stressTest a b b.c d -stressTest a b b.c a.d -stressTest a b b.c b.d -stressTest a b b.c b.c.d -stressTest a a.b c d -stressTest a a.b c a.d -stressTest a a.b c a.b.d -stressTest a a.b c c.d -stressTest a a.b a.c d -stressTest a a.b a.c a.d -stressTest a a.b a.c a.b.d -stressTest a a.b a.c a.c.d -stressTest a a.b a.b.c d -stressTest a a.b a.b.c a.d -stressTest a a.b a.b.c a.b.d -stressTest a a.b a.b.c a.b.c.d -# -stressTest a b c d e -stressTest a b c d a.e -stressTest a b c d b.e -stressTest a b c d c.e -stressTest a b c d d.e -stressTest a b c a.d e -stressTest a b c a.d a.e -stressTest a b c a.d b.e -stressTest a b c a.d c.e -stressTest a b c a.d a.d.e -stressTest a b c b.d e -stressTest a b c b.d a.e -stressTest a b c b.d b.e -stressTest a b c b.d c.e -stressTest a b c b.d b.d.e -stressTest a b c c.d e -stressTest a b c c.d a.e -stressTest a b c c.d b.e -stressTest a b c c.d c.e -stressTest a b c c.d c.d.e -stressTest a b a.c d e -stressTest a b a.c d a.e -stressTest a b a.c d b.e -stressTest a b a.c d a.c.e -stressTest a b a.c d d.e -stressTest a b a.c a.d e -stressTest a b a.c a.d a.e -stressTest a b a.c a.d b.e -stressTest a b a.c a.d a.c.e -stressTest a b a.c a.d a.d.e -stressTest a b a.c b.d e -stressTest a b a.c b.d a.e -stressTest a b a.c b.d b.e -stressTest a b a.c b.d a.c.e -stressTest a b a.c b.d b.d.e -stressTest a b a.c a.c.d e -stressTest a b a.c a.c.d a.e -stressTest a b a.c a.c.d b.e -stressTest a b a.c a.c.d a.c.e -stressTest a b a.c a.c.d a.c.d.e -stressTest a b b.c d e -stressTest a b b.c d a.e -stressTest a b b.c d b.e -stressTest a b b.c d b.c.e -stressTest a b b.c d d.e -stressTest a b b.c a.d e -stressTest a b b.c a.d a.e -stressTest a b b.c a.d b.e -stressTest a b b.c a.d b.c.e -stressTest a b b.c a.d a.d.e -stressTest a b b.c b.d e -stressTest a b b.c b.d a.e -stressTest a b b.c b.d b.e -stressTest a b b.c b.d b.c.e -stressTest a b b.c b.d b.d.e -stressTest a b b.c b.c.d e -stressTest a b b.c b.c.d a.e -stressTest a b b.c b.c.d b.e -stressTest a b b.c b.c.d b.c.e -stressTest a b b.c b.c.d b.c.d.e -stressTest a a.b c d e -stressTest a a.b c d a.e -stressTest a a.b c d a.b.e -stressTest a a.b c d c.e -stressTest a a.b c d d.e -stressTest a a.b c a.d e -stressTest a a.b c a.d a.e -stressTest a a.b c a.d a.b.e -stressTest a a.b c a.d c.e -stressTest a a.b c a.d a.d.e -stressTest a a.b c a.b.d e -stressTest a a.b c a.b.d a.e -stressTest a a.b c a.b.d a.b.e -stressTest a a.b c a.b.d c.e -stressTest a a.b c a.b.d a.b.d.e -stressTest a a.b c c.d e -stressTest a a.b c c.d a.e -stressTest a a.b c c.d a.b.e -stressTest a a.b c c.d c.e -stressTest a a.b c c.d c.d.e -stressTest a a.b a.c d e -stressTest a a.b a.c d a.e -stressTest a a.b a.c d a.b.e -stressTest a a.b a.c d a.c.e -stressTest a a.b a.c d d.e -stressTest a a.b a.c a.d e -stressTest a a.b a.c a.d a.e -stressTest a a.b a.c a.d a.b.e -stressTest a a.b a.c a.d a.c.e -stressTest a a.b a.c a.d a.d.e -stressTest a a.b a.c a.b.d e -stressTest a a.b a.c a.b.d a.e -stressTest a a.b a.c a.b.d a.b.e -stressTest a a.b a.c a.b.d a.c.e -stressTest a a.b a.c a.b.d a.b.d.e -stressTest a a.b a.c a.c.d e -stressTest a a.b a.c a.c.d a.e -stressTest a a.b a.c a.c.d a.b.e -stressTest a a.b a.c a.c.d a.c.e -stressTest a a.b a.c a.c.d a.c.d.e -stressTest a a.b a.b.c d e -stressTest a a.b a.b.c d a.e -stressTest a a.b a.b.c d a.b.e -stressTest a a.b a.b.c d a.b.c.e -stressTest a a.b a.b.c d d.e -stressTest a a.b a.b.c a.d e -stressTest a a.b a.b.c a.d a.e -stressTest a a.b a.b.c a.d a.b.e -stressTest a a.b a.b.c a.d a.b.c.e -stressTest a a.b a.b.c a.d a.d.e -stressTest a a.b a.b.c a.b.d e -stressTest a a.b a.b.c a.b.d a.e -stressTest a a.b a.b.c a.b.d a.b.e -stressTest a a.b a.b.c a.b.d a.b.c.e -stressTest a a.b a.b.c a.b.d a.b.d.e -stressTest a a.b a.b.c a.b.c.d e -stressTest a a.b a.b.c a.b.c.d a.e -stressTest a a.b a.b.c a.b.c.d a.b.e -stressTest a a.b a.b.c a.b.c.d a.b.c.e -stressTest a a.b a.b.c a.b.c.d a.b.c.d.e -# -stressTest a b c d e f -stressTest a b c d e a.f -stressTest a b c d e b.f -stressTest a b c d e c.f -stressTest a b c d e d.f -stressTest a b c d e e.f -stressTest a b c d a.e f -stressTest a b c d a.e a.f -stressTest a b c d a.e b.f -stressTest a b c d a.e c.f -stressTest a b c d a.e d.f -stressTest a b c d a.e a.e.f -stressTest a b c d b.e f -stressTest a b c d b.e a.f -stressTest a b c d b.e b.f -stressTest a b c d b.e c.f -stressTest a b c d b.e d.f -stressTest a b c d b.e b.e.f -stressTest a b c d c.e f -stressTest a b c d c.e a.f -stressTest a b c d c.e b.f -stressTest a b c d c.e c.f -stressTest a b c d c.e d.f -stressTest a b c d c.e c.e.f -stressTest a b c d d.e f -stressTest a b c d d.e a.f -stressTest a b c d d.e b.f -stressTest a b c d d.e c.f -stressTest a b c d d.e d.f -stressTest a b c d d.e d.e.f -stressTest a b c a.d e f -stressTest a b c a.d e a.f -stressTest a b c a.d e b.f -stressTest a b c a.d e c.f -stressTest a b c a.d e a.d.f -stressTest a b c a.d e e.f -stressTest a b c a.d a.e f -stressTest a b c a.d a.e a.f -stressTest a b c a.d a.e b.f -stressTest a b c a.d a.e c.f -stressTest a b c a.d a.e a.d.f -stressTest a b c a.d a.e a.e.f -stressTest a b c a.d b.e f -stressTest a b c a.d b.e a.f -stressTest a b c a.d b.e b.f -stressTest a b c a.d b.e c.f -stressTest a b c a.d b.e a.d.f -stressTest a b c a.d b.e b.e.f -stressTest a b c a.d c.e f -stressTest a b c a.d c.e a.f -stressTest a b c a.d c.e b.f -stressTest a b c a.d c.e c.f -stressTest a b c a.d c.e a.d.f -stressTest a b c a.d c.e c.e.f -stressTest a b c a.d a.d.e f -stressTest a b c a.d a.d.e a.f -stressTest a b c a.d a.d.e b.f -stressTest a b c a.d a.d.e c.f -stressTest a b c a.d a.d.e a.d.f -stressTest a b c a.d a.d.e a.d.e.f -stressTest a b c b.d e f -stressTest a b c b.d e a.f -stressTest a b c b.d e b.f -stressTest a b c b.d e c.f -stressTest a b c b.d e b.d.f -stressTest a b c b.d e e.f -stressTest a b c b.d a.e f -stressTest a b c b.d a.e a.f -stressTest a b c b.d a.e b.f -stressTest a b c b.d a.e c.f -stressTest a b c b.d a.e b.d.f -stressTest a b c b.d a.e a.e.f -stressTest a b c b.d b.e f -stressTest a b c b.d b.e a.f -stressTest a b c b.d b.e b.f -stressTest a b c b.d b.e c.f -stressTest a b c b.d b.e b.d.f -stressTest a b c b.d b.e b.e.f -stressTest a b c b.d c.e f -stressTest a b c b.d c.e a.f -stressTest a b c b.d c.e b.f -stressTest a b c b.d c.e c.f -stressTest a b c b.d c.e b.d.f -stressTest a b c b.d c.e c.e.f -stressTest a b c b.d b.d.e f -stressTest a b c b.d b.d.e a.f -stressTest a b c b.d b.d.e b.f -stressTest a b c b.d b.d.e c.f -stressTest a b c b.d b.d.e b.d.f -stressTest a b c b.d b.d.e b.d.e.f -stressTest a b c c.d e f -stressTest a b c c.d e a.f -stressTest a b c c.d e b.f -stressTest a b c c.d e c.f -stressTest a b c c.d e c.d.f -stressTest a b c c.d e e.f -stressTest a b c c.d a.e f -stressTest a b c c.d a.e a.f -stressTest a b c c.d a.e b.f -stressTest a b c c.d a.e c.f -stressTest a b c c.d a.e c.d.f -stressTest a b c c.d a.e a.e.f -stressTest a b c c.d b.e f -stressTest a b c c.d b.e a.f -stressTest a b c c.d b.e b.f -stressTest a b c c.d b.e c.f -stressTest a b c c.d b.e c.d.f -stressTest a b c c.d b.e b.e.f -stressTest a b c c.d c.e f -stressTest a b c c.d c.e a.f -stressTest a b c c.d c.e b.f -stressTest a b c c.d c.e c.f -stressTest a b c c.d c.e c.d.f -stressTest a b c c.d c.e c.e.f -stressTest a b c c.d c.d.e f -stressTest a b c c.d c.d.e a.f -stressTest a b c c.d c.d.e b.f -stressTest a b c c.d c.d.e c.f -stressTest a b c c.d c.d.e c.d.f -stressTest a b c c.d c.d.e c.d.e.f -stressTest a b a.c d e f -stressTest a b a.c d e a.f -stressTest a b a.c d e b.f -stressTest a b a.c d e a.c.f -stressTest a b a.c d e d.f -stressTest a b a.c d e e.f -stressTest a b a.c d a.e f -stressTest a b a.c d a.e a.f -stressTest a b a.c d a.e b.f -stressTest a b a.c d a.e a.c.f -stressTest a b a.c d a.e d.f -stressTest a b a.c d a.e a.e.f -stressTest a b a.c d b.e f -stressTest a b a.c d b.e a.f -stressTest a b a.c d b.e b.f -stressTest a b a.c d b.e a.c.f -stressTest a b a.c d b.e d.f -stressTest a b a.c d b.e b.e.f -stressTest a b a.c d a.c.e f -stressTest a b a.c d a.c.e a.f -stressTest a b a.c d a.c.e b.f -stressTest a b a.c d a.c.e a.c.f -stressTest a b a.c d a.c.e d.f -stressTest a b a.c d a.c.e a.c.e.f -stressTest a b a.c d d.e f -stressTest a b a.c d d.e a.f -stressTest a b a.c d d.e b.f -stressTest a b a.c d d.e a.c.f -stressTest a b a.c d d.e d.f -stressTest a b a.c d d.e d.e.f -stressTest a b a.c a.d e f -stressTest a b a.c a.d e a.f -stressTest a b a.c a.d e b.f -stressTest a b a.c a.d e a.c.f -stressTest a b a.c a.d e a.d.f -stressTest a b a.c a.d e e.f -stressTest a b a.c a.d a.e f -stressTest a b a.c a.d a.e a.f -stressTest a b a.c a.d a.e b.f -stressTest a b a.c a.d a.e a.c.f -stressTest a b a.c a.d a.e a.d.f -stressTest a b a.c a.d a.e a.e.f -stressTest a b a.c a.d b.e f -stressTest a b a.c a.d b.e a.f -stressTest a b a.c a.d b.e b.f -stressTest a b a.c a.d b.e a.c.f -stressTest a b a.c a.d b.e a.d.f -stressTest a b a.c a.d b.e b.e.f -stressTest a b a.c a.d a.c.e f -stressTest a b a.c a.d a.c.e a.f -stressTest a b a.c a.d a.c.e b.f -stressTest a b a.c a.d a.c.e a.c.f -stressTest a b a.c a.d a.c.e a.d.f -stressTest a b a.c a.d a.c.e a.c.e.f -stressTest a b a.c a.d a.d.e f -stressTest a b a.c a.d a.d.e a.f -stressTest a b a.c a.d a.d.e b.f -stressTest a b a.c a.d a.d.e a.c.f -stressTest a b a.c a.d a.d.e a.d.f -stressTest a b a.c a.d a.d.e a.d.e.f -stressTest a b a.c b.d e f -stressTest a b a.c b.d e a.f -stressTest a b a.c b.d e b.f -stressTest a b a.c b.d e a.c.f -stressTest a b a.c b.d e b.d.f -stressTest a b a.c b.d e e.f -stressTest a b a.c b.d a.e f -stressTest a b a.c b.d a.e a.f -stressTest a b a.c b.d a.e b.f -stressTest a b a.c b.d a.e a.c.f -stressTest a b a.c b.d a.e b.d.f -stressTest a b a.c b.d a.e a.e.f -stressTest a b a.c b.d b.e f -stressTest a b a.c b.d b.e a.f -stressTest a b a.c b.d b.e b.f -stressTest a b a.c b.d b.e a.c.f -stressTest a b a.c b.d b.e b.d.f -stressTest a b a.c b.d b.e b.e.f -stressTest a b a.c b.d a.c.e f -stressTest a b a.c b.d a.c.e a.f -stressTest a b a.c b.d a.c.e b.f -stressTest a b a.c b.d a.c.e a.c.f -stressTest a b a.c b.d a.c.e b.d.f -stressTest a b a.c b.d a.c.e a.c.e.f -stressTest a b a.c b.d b.d.e f -stressTest a b a.c b.d b.d.e a.f -stressTest a b a.c b.d b.d.e b.f -stressTest a b a.c b.d b.d.e a.c.f -stressTest a b a.c b.d b.d.e b.d.f -stressTest a b a.c b.d b.d.e b.d.e.f -stressTest a b a.c a.c.d e f -stressTest a b a.c a.c.d e a.f -stressTest a b a.c a.c.d e b.f -stressTest a b a.c a.c.d e a.c.f -stressTest a b a.c a.c.d e a.c.d.f -stressTest a b a.c a.c.d e e.f -stressTest a b a.c a.c.d a.e f -stressTest a b a.c a.c.d a.e a.f -stressTest a b a.c a.c.d a.e b.f -stressTest a b a.c a.c.d a.e a.c.f -stressTest a b a.c a.c.d a.e a.c.d.f -stressTest a b a.c a.c.d a.e a.e.f -stressTest a b a.c a.c.d b.e f -stressTest a b a.c a.c.d b.e a.f -stressTest a b a.c a.c.d b.e b.f -stressTest a b a.c a.c.d b.e a.c.f -stressTest a b a.c a.c.d b.e a.c.d.f -stressTest a b a.c a.c.d b.e b.e.f -stressTest a b a.c a.c.d a.c.e f -stressTest a b a.c a.c.d a.c.e a.f -stressTest a b a.c a.c.d a.c.e b.f -stressTest a b a.c a.c.d a.c.e a.c.f -stressTest a b a.c a.c.d a.c.e a.c.d.f -stressTest a b a.c a.c.d a.c.e a.c.e.f -stressTest a b a.c a.c.d a.c.d.e f -stressTest a b a.c a.c.d a.c.d.e a.f -stressTest a b a.c a.c.d a.c.d.e b.f -stressTest a b a.c a.c.d a.c.d.e a.c.f -stressTest a b a.c a.c.d a.c.d.e a.c.d.f -stressTest a b a.c a.c.d a.c.d.e a.c.d.e.f -stressTest a b b.c d e f -stressTest a b b.c d e a.f -stressTest a b b.c d e b.f -stressTest a b b.c d e b.c.f -stressTest a b b.c d e d.f -stressTest a b b.c d e e.f -stressTest a b b.c d a.e f -stressTest a b b.c d a.e a.f -stressTest a b b.c d a.e b.f -stressTest a b b.c d a.e b.c.f -stressTest a b b.c d a.e d.f -stressTest a b b.c d a.e a.e.f -stressTest a b b.c d b.e f -stressTest a b b.c d b.e a.f -stressTest a b b.c d b.e b.f -stressTest a b b.c d b.e b.c.f -stressTest a b b.c d b.e d.f -stressTest a b b.c d b.e b.e.f -stressTest a b b.c d b.c.e f -stressTest a b b.c d b.c.e a.f -stressTest a b b.c d b.c.e b.f -stressTest a b b.c d b.c.e b.c.f -stressTest a b b.c d b.c.e d.f -stressTest a b b.c d b.c.e b.c.e.f -stressTest a b b.c d d.e f -stressTest a b b.c d d.e a.f -stressTest a b b.c d d.e b.f -stressTest a b b.c d d.e b.c.f -stressTest a b b.c d d.e d.f -stressTest a b b.c d d.e d.e.f -stressTest a b b.c a.d e f -stressTest a b b.c a.d e a.f -stressTest a b b.c a.d e b.f -stressTest a b b.c a.d e b.c.f -stressTest a b b.c a.d e a.d.f -stressTest a b b.c a.d e e.f -stressTest a b b.c a.d a.e f -stressTest a b b.c a.d a.e a.f -stressTest a b b.c a.d a.e b.f -stressTest a b b.c a.d a.e b.c.f -stressTest a b b.c a.d a.e a.d.f -stressTest a b b.c a.d a.e a.e.f -stressTest a b b.c a.d b.e f -stressTest a b b.c a.d b.e a.f -stressTest a b b.c a.d b.e b.f -stressTest a b b.c a.d b.e b.c.f -stressTest a b b.c a.d b.e a.d.f -stressTest a b b.c a.d b.e b.e.f -stressTest a b b.c a.d b.c.e f -stressTest a b b.c a.d b.c.e a.f -stressTest a b b.c a.d b.c.e b.f -stressTest a b b.c a.d b.c.e b.c.f -stressTest a b b.c a.d b.c.e a.d.f -stressTest a b b.c a.d b.c.e b.c.e.f -stressTest a b b.c a.d a.d.e f -stressTest a b b.c a.d a.d.e a.f -stressTest a b b.c a.d a.d.e b.f -stressTest a b b.c a.d a.d.e b.c.f -stressTest a b b.c a.d a.d.e a.d.f -stressTest a b b.c a.d a.d.e a.d.e.f -stressTest a b b.c b.d e f -stressTest a b b.c b.d e a.f -stressTest a b b.c b.d e b.f -stressTest a b b.c b.d e b.c.f -stressTest a b b.c b.d e b.d.f -stressTest a b b.c b.d e e.f -stressTest a b b.c b.d a.e f -stressTest a b b.c b.d a.e a.f -stressTest a b b.c b.d a.e b.f -stressTest a b b.c b.d a.e b.c.f -stressTest a b b.c b.d a.e b.d.f -stressTest a b b.c b.d a.e a.e.f -stressTest a b b.c b.d b.e f -stressTest a b b.c b.d b.e a.f -stressTest a b b.c b.d b.e b.f -stressTest a b b.c b.d b.e b.c.f -stressTest a b b.c b.d b.e b.d.f -stressTest a b b.c b.d b.e b.e.f -stressTest a b b.c b.d b.c.e f -stressTest a b b.c b.d b.c.e a.f -stressTest a b b.c b.d b.c.e b.f -stressTest a b b.c b.d b.c.e b.c.f -stressTest a b b.c b.d b.c.e b.d.f -stressTest a b b.c b.d b.c.e b.c.e.f -stressTest a b b.c b.d b.d.e f -stressTest a b b.c b.d b.d.e a.f -stressTest a b b.c b.d b.d.e b.f -stressTest a b b.c b.d b.d.e b.c.f -stressTest a b b.c b.d b.d.e b.d.f -stressTest a b b.c b.d b.d.e b.d.e.f -stressTest a b b.c b.c.d e f -stressTest a b b.c b.c.d e a.f -stressTest a b b.c b.c.d e b.f -stressTest a b b.c b.c.d e b.c.f -stressTest a b b.c b.c.d e b.c.d.f -stressTest a b b.c b.c.d e e.f -stressTest a b b.c b.c.d a.e f -stressTest a b b.c b.c.d a.e a.f -stressTest a b b.c b.c.d a.e b.f -stressTest a b b.c b.c.d a.e b.c.f -stressTest a b b.c b.c.d a.e b.c.d.f -stressTest a b b.c b.c.d a.e a.e.f -stressTest a b b.c b.c.d b.e f -stressTest a b b.c b.c.d b.e a.f -stressTest a b b.c b.c.d b.e b.f -stressTest a b b.c b.c.d b.e b.c.f -stressTest a b b.c b.c.d b.e b.c.d.f -stressTest a b b.c b.c.d b.e b.e.f -stressTest a b b.c b.c.d b.c.e f -stressTest a b b.c b.c.d b.c.e a.f -stressTest a b b.c b.c.d b.c.e b.f -stressTest a b b.c b.c.d b.c.e b.c.f -stressTest a b b.c b.c.d b.c.e b.c.d.f -stressTest a b b.c b.c.d b.c.e b.c.e.f -stressTest a b b.c b.c.d b.c.d.e f -stressTest a b b.c b.c.d b.c.d.e a.f -stressTest a b b.c b.c.d b.c.d.e b.f -stressTest a b b.c b.c.d b.c.d.e b.c.f -stressTest a b b.c b.c.d b.c.d.e b.c.d.f -stressTest a b b.c b.c.d b.c.d.e b.c.d.e.f -stressTest a a.b c d e f -stressTest a a.b c d e a.f -stressTest a a.b c d e a.b.f -stressTest a a.b c d e c.f -stressTest a a.b c d e d.f -stressTest a a.b c d e e.f -stressTest a a.b c d a.e f -stressTest a a.b c d a.e a.f -stressTest a a.b c d a.e a.b.f -stressTest a a.b c d a.e c.f -stressTest a a.b c d a.e d.f -stressTest a a.b c d a.e a.e.f -stressTest a a.b c d a.b.e f -stressTest a a.b c d a.b.e a.f -stressTest a a.b c d a.b.e a.b.f -stressTest a a.b c d a.b.e c.f -stressTest a a.b c d a.b.e d.f -stressTest a a.b c d a.b.e a.b.e.f -stressTest a a.b c d c.e f -stressTest a a.b c d c.e a.f -stressTest a a.b c d c.e a.b.f -stressTest a a.b c d c.e c.f -stressTest a a.b c d c.e d.f -stressTest a a.b c d c.e c.e.f -stressTest a a.b c d d.e f -stressTest a a.b c d d.e a.f -stressTest a a.b c d d.e a.b.f -stressTest a a.b c d d.e c.f -stressTest a a.b c d d.e d.f -stressTest a a.b c d d.e d.e.f -stressTest a a.b c a.d e f -stressTest a a.b c a.d e a.f -stressTest a a.b c a.d e a.b.f -stressTest a a.b c a.d e c.f -stressTest a a.b c a.d e a.d.f -stressTest a a.b c a.d e e.f -stressTest a a.b c a.d a.e f -stressTest a a.b c a.d a.e a.f -stressTest a a.b c a.d a.e a.b.f -stressTest a a.b c a.d a.e c.f -stressTest a a.b c a.d a.e a.d.f -stressTest a a.b c a.d a.e a.e.f -stressTest a a.b c a.d a.b.e f -stressTest a a.b c a.d a.b.e a.f -stressTest a a.b c a.d a.b.e a.b.f -stressTest a a.b c a.d a.b.e c.f -stressTest a a.b c a.d a.b.e a.d.f -stressTest a a.b c a.d a.b.e a.b.e.f -stressTest a a.b c a.d c.e f -stressTest a a.b c a.d c.e a.f -stressTest a a.b c a.d c.e a.b.f -stressTest a a.b c a.d c.e c.f -stressTest a a.b c a.d c.e a.d.f -stressTest a a.b c a.d c.e c.e.f -stressTest a a.b c a.d a.d.e f -stressTest a a.b c a.d a.d.e a.f -stressTest a a.b c a.d a.d.e a.b.f -stressTest a a.b c a.d a.d.e c.f -stressTest a a.b c a.d a.d.e a.d.f -stressTest a a.b c a.d a.d.e a.d.e.f -stressTest a a.b c a.b.d e f -stressTest a a.b c a.b.d e a.f -stressTest a a.b c a.b.d e a.b.f -stressTest a a.b c a.b.d e c.f -stressTest a a.b c a.b.d e a.b.d.f -stressTest a a.b c a.b.d e e.f -stressTest a a.b c a.b.d a.e f -stressTest a a.b c a.b.d a.e a.f -stressTest a a.b c a.b.d a.e a.b.f -stressTest a a.b c a.b.d a.e c.f -stressTest a a.b c a.b.d a.e a.b.d.f -stressTest a a.b c a.b.d a.e a.e.f -stressTest a a.b c a.b.d a.b.e f -stressTest a a.b c a.b.d a.b.e a.f -stressTest a a.b c a.b.d a.b.e a.b.f -stressTest a a.b c a.b.d a.b.e c.f -stressTest a a.b c a.b.d a.b.e a.b.d.f -stressTest a a.b c a.b.d a.b.e a.b.e.f -stressTest a a.b c a.b.d c.e f -stressTest a a.b c a.b.d c.e a.f -stressTest a a.b c a.b.d c.e a.b.f -stressTest a a.b c a.b.d c.e c.f -stressTest a a.b c a.b.d c.e a.b.d.f -stressTest a a.b c a.b.d c.e c.e.f -stressTest a a.b c a.b.d a.b.d.e f -stressTest a a.b c a.b.d a.b.d.e a.f -stressTest a a.b c a.b.d a.b.d.e a.b.f -stressTest a a.b c a.b.d a.b.d.e c.f -stressTest a a.b c a.b.d a.b.d.e a.b.d.f -stressTest a a.b c a.b.d a.b.d.e a.b.d.e.f -stressTest a a.b c c.d e f -stressTest a a.b c c.d e a.f -stressTest a a.b c c.d e a.b.f -stressTest a a.b c c.d e c.f -stressTest a a.b c c.d e c.d.f -stressTest a a.b c c.d e e.f -stressTest a a.b c c.d a.e f -stressTest a a.b c c.d a.e a.f -stressTest a a.b c c.d a.e a.b.f -stressTest a a.b c c.d a.e c.f -stressTest a a.b c c.d a.e c.d.f -stressTest a a.b c c.d a.e a.e.f -stressTest a a.b c c.d a.b.e f -stressTest a a.b c c.d a.b.e a.f -stressTest a a.b c c.d a.b.e a.b.f -stressTest a a.b c c.d a.b.e c.f -stressTest a a.b c c.d a.b.e c.d.f -stressTest a a.b c c.d a.b.e a.b.e.f -stressTest a a.b c c.d c.e f -stressTest a a.b c c.d c.e a.f -stressTest a a.b c c.d c.e a.b.f -stressTest a a.b c c.d c.e c.f -stressTest a a.b c c.d c.e c.d.f -stressTest a a.b c c.d c.e c.e.f -stressTest a a.b c c.d c.d.e f -stressTest a a.b c c.d c.d.e a.f -stressTest a a.b c c.d c.d.e a.b.f -stressTest a a.b c c.d c.d.e c.f -stressTest a a.b c c.d c.d.e c.d.f -stressTest a a.b c c.d c.d.e c.d.e.f -stressTest a a.b a.c d e f -stressTest a a.b a.c d e a.f -stressTest a a.b a.c d e a.b.f -stressTest a a.b a.c d e a.c.f -stressTest a a.b a.c d e d.f -stressTest a a.b a.c d e e.f -stressTest a a.b a.c d a.e f -stressTest a a.b a.c d a.e a.f -stressTest a a.b a.c d a.e a.b.f -stressTest a a.b a.c d a.e a.c.f -stressTest a a.b a.c d a.e d.f -stressTest a a.b a.c d a.e a.e.f -stressTest a a.b a.c d a.b.e f -stressTest a a.b a.c d a.b.e a.f -stressTest a a.b a.c d a.b.e a.b.f -stressTest a a.b a.c d a.b.e a.c.f -stressTest a a.b a.c d a.b.e d.f -stressTest a a.b a.c d a.b.e a.b.e.f -stressTest a a.b a.c d a.c.e f -stressTest a a.b a.c d a.c.e a.f -stressTest a a.b a.c d a.c.e a.b.f -stressTest a a.b a.c d a.c.e a.c.f -stressTest a a.b a.c d a.c.e d.f -stressTest a a.b a.c d a.c.e a.c.e.f -stressTest a a.b a.c d d.e f -stressTest a a.b a.c d d.e a.f -stressTest a a.b a.c d d.e a.b.f -stressTest a a.b a.c d d.e a.c.f -stressTest a a.b a.c d d.e d.f -stressTest a a.b a.c d d.e d.e.f -stressTest a a.b a.c a.d e f -stressTest a a.b a.c a.d e a.f -stressTest a a.b a.c a.d e a.b.f -stressTest a a.b a.c a.d e a.c.f -stressTest a a.b a.c a.d e a.d.f -stressTest a a.b a.c a.d e e.f -stressTest a a.b a.c a.d a.e f -stressTest a a.b a.c a.d a.e a.f -stressTest a a.b a.c a.d a.e a.b.f -stressTest a a.b a.c a.d a.e a.c.f -stressTest a a.b a.c a.d a.e a.d.f -stressTest a a.b a.c a.d a.e a.e.f -stressTest a a.b a.c a.d a.b.e f -stressTest a a.b a.c a.d a.b.e a.f -stressTest a a.b a.c a.d a.b.e a.b.f -stressTest a a.b a.c a.d a.b.e a.c.f -stressTest a a.b a.c a.d a.b.e a.d.f -stressTest a a.b a.c a.d a.b.e a.b.e.f -stressTest a a.b a.c a.d a.c.e f -stressTest a a.b a.c a.d a.c.e a.f -stressTest a a.b a.c a.d a.c.e a.b.f -stressTest a a.b a.c a.d a.c.e a.c.f -stressTest a a.b a.c a.d a.c.e a.d.f -stressTest a a.b a.c a.d a.c.e a.c.e.f -stressTest a a.b a.c a.d a.d.e f -stressTest a a.b a.c a.d a.d.e a.f -stressTest a a.b a.c a.d a.d.e a.b.f -stressTest a a.b a.c a.d a.d.e a.c.f -stressTest a a.b a.c a.d a.d.e a.d.f -stressTest a a.b a.c a.d a.d.e a.d.e.f -stressTest a a.b a.c a.b.d e f -stressTest a a.b a.c a.b.d e a.f -stressTest a a.b a.c a.b.d e a.b.f -stressTest a a.b a.c a.b.d e a.c.f -stressTest a a.b a.c a.b.d e a.b.d.f -stressTest a a.b a.c a.b.d e e.f -stressTest a a.b a.c a.b.d a.e f -stressTest a a.b a.c a.b.d a.e a.f -stressTest a a.b a.c a.b.d a.e a.b.f -stressTest a a.b a.c a.b.d a.e a.c.f -stressTest a a.b a.c a.b.d a.e a.b.d.f -stressTest a a.b a.c a.b.d a.e a.e.f -stressTest a a.b a.c a.b.d a.b.e f -stressTest a a.b a.c a.b.d a.b.e a.f -stressTest a a.b a.c a.b.d a.b.e a.b.f -stressTest a a.b a.c a.b.d a.b.e a.c.f -stressTest a a.b a.c a.b.d a.b.e a.b.d.f -stressTest a a.b a.c a.b.d a.b.e a.b.e.f -stressTest a a.b a.c a.b.d a.c.e f -stressTest a a.b a.c a.b.d a.c.e a.f -stressTest a a.b a.c a.b.d a.c.e a.b.f -stressTest a a.b a.c a.b.d a.c.e a.c.f -stressTest a a.b a.c a.b.d a.c.e a.b.d.f -stressTest a a.b a.c a.b.d a.c.e a.c.e.f -stressTest a a.b a.c a.b.d a.b.d.e f -stressTest a a.b a.c a.b.d a.b.d.e a.f -stressTest a a.b a.c a.b.d a.b.d.e a.b.f -stressTest a a.b a.c a.b.d a.b.d.e a.c.f -stressTest a a.b a.c a.b.d a.b.d.e a.b.d.f -stressTest a a.b a.c a.b.d a.b.d.e a.b.d.e.f -stressTest a a.b a.c a.c.d e f -stressTest a a.b a.c a.c.d e a.f -stressTest a a.b a.c a.c.d e a.b.f -stressTest a a.b a.c a.c.d e a.c.f -stressTest a a.b a.c a.c.d e a.c.d.f -stressTest a a.b a.c a.c.d e e.f -stressTest a a.b a.c a.c.d a.e f -stressTest a a.b a.c a.c.d a.e a.f -stressTest a a.b a.c a.c.d a.e a.b.f -stressTest a a.b a.c a.c.d a.e a.c.f -stressTest a a.b a.c a.c.d a.e a.c.d.f -stressTest a a.b a.c a.c.d a.e a.e.f -stressTest a a.b a.c a.c.d a.b.e f -stressTest a a.b a.c a.c.d a.b.e a.f -stressTest a a.b a.c a.c.d a.b.e a.b.f -stressTest a a.b a.c a.c.d a.b.e a.c.f -stressTest a a.b a.c a.c.d a.b.e a.c.d.f -stressTest a a.b a.c a.c.d a.b.e a.b.e.f -stressTest a a.b a.c a.c.d a.c.e f -stressTest a a.b a.c a.c.d a.c.e a.f -stressTest a a.b a.c a.c.d a.c.e a.b.f -stressTest a a.b a.c a.c.d a.c.e a.c.f -stressTest a a.b a.c a.c.d a.c.e a.c.d.f -stressTest a a.b a.c a.c.d a.c.e a.c.e.f -stressTest a a.b a.c a.c.d a.c.d.e f -stressTest a a.b a.c a.c.d a.c.d.e a.f -stressTest a a.b a.c a.c.d a.c.d.e a.b.f -stressTest a a.b a.c a.c.d a.c.d.e a.c.f -stressTest a a.b a.c a.c.d a.c.d.e a.c.d.f -stressTest a a.b a.c a.c.d a.c.d.e a.c.d.e.f -stressTest a a.b a.b.c d e f -stressTest a a.b a.b.c d e a.f -stressTest a a.b a.b.c d e a.b.f -stressTest a a.b a.b.c d e a.b.c.f -stressTest a a.b a.b.c d e d.f -stressTest a a.b a.b.c d e e.f -stressTest a a.b a.b.c d a.e f -stressTest a a.b a.b.c d a.e a.f -stressTest a a.b a.b.c d a.e a.b.f -stressTest a a.b a.b.c d a.e a.b.c.f -stressTest a a.b a.b.c d a.e d.f -stressTest a a.b a.b.c d a.e a.e.f -stressTest a a.b a.b.c d a.b.e f -stressTest a a.b a.b.c d a.b.e a.f -stressTest a a.b a.b.c d a.b.e a.b.f -stressTest a a.b a.b.c d a.b.e a.b.c.f -stressTest a a.b a.b.c d a.b.e d.f -stressTest a a.b a.b.c d a.b.e a.b.e.f -stressTest a a.b a.b.c d a.b.c.e f -stressTest a a.b a.b.c d a.b.c.e a.f -stressTest a a.b a.b.c d a.b.c.e a.b.f -stressTest a a.b a.b.c d a.b.c.e a.b.c.f -stressTest a a.b a.b.c d a.b.c.e d.f -stressTest a a.b a.b.c d a.b.c.e a.b.c.e.f -stressTest a a.b a.b.c d d.e f -stressTest a a.b a.b.c d d.e a.f -stressTest a a.b a.b.c d d.e a.b.f -stressTest a a.b a.b.c d d.e a.b.c.f -stressTest a a.b a.b.c d d.e d.f -stressTest a a.b a.b.c d d.e d.e.f -stressTest a a.b a.b.c a.d e f -stressTest a a.b a.b.c a.d e a.f -stressTest a a.b a.b.c a.d e a.b.f -stressTest a a.b a.b.c a.d e a.b.c.f -stressTest a a.b a.b.c a.d e a.d.f -stressTest a a.b a.b.c a.d e e.f -stressTest a a.b a.b.c a.d a.e f -stressTest a a.b a.b.c a.d a.e a.f -stressTest a a.b a.b.c a.d a.e a.b.f -stressTest a a.b a.b.c a.d a.e a.b.c.f -stressTest a a.b a.b.c a.d a.e a.d.f -stressTest a a.b a.b.c a.d a.e a.e.f -stressTest a a.b a.b.c a.d a.b.e f -stressTest a a.b a.b.c a.d a.b.e a.f -stressTest a a.b a.b.c a.d a.b.e a.b.f -stressTest a a.b a.b.c a.d a.b.e a.b.c.f -stressTest a a.b a.b.c a.d a.b.e a.d.f -stressTest a a.b a.b.c a.d a.b.e a.b.e.f -stressTest a a.b a.b.c a.d a.b.c.e f -stressTest a a.b a.b.c a.d a.b.c.e a.f -stressTest a a.b a.b.c a.d a.b.c.e a.b.f -stressTest a a.b a.b.c a.d a.b.c.e a.b.c.f -stressTest a a.b a.b.c a.d a.b.c.e a.d.f -stressTest a a.b a.b.c a.d a.b.c.e a.b.c.e.f -stressTest a a.b a.b.c a.d a.d.e f -stressTest a a.b a.b.c a.d a.d.e a.f -stressTest a a.b a.b.c a.d a.d.e a.b.f -stressTest a a.b a.b.c a.d a.d.e a.b.c.f -stressTest a a.b a.b.c a.d a.d.e a.d.f -stressTest a a.b a.b.c a.d a.d.e a.d.e.f -stressTest a a.b a.b.c a.b.d e f -stressTest a a.b a.b.c a.b.d e a.f -stressTest a a.b a.b.c a.b.d e a.b.f -stressTest a a.b a.b.c a.b.d e a.b.c.f -stressTest a a.b a.b.c a.b.d e a.b.d.f -stressTest a a.b a.b.c a.b.d e e.f -stressTest a a.b a.b.c a.b.d a.e f -stressTest a a.b a.b.c a.b.d a.e a.f -stressTest a a.b a.b.c a.b.d a.e a.b.f -stressTest a a.b a.b.c a.b.d a.e a.b.c.f -stressTest a a.b a.b.c a.b.d a.e a.b.d.f -stressTest a a.b a.b.c a.b.d a.e a.e.f -stressTest a a.b a.b.c a.b.d a.b.e f -stressTest a a.b a.b.c a.b.d a.b.e a.f -stressTest a a.b a.b.c a.b.d a.b.e a.b.f -stressTest a a.b a.b.c a.b.d a.b.e a.b.c.f -stressTest a a.b a.b.c a.b.d a.b.e a.b.d.f -stressTest a a.b a.b.c a.b.d a.b.e a.b.e.f -stressTest a a.b a.b.c a.b.d a.b.c.e f -stressTest a a.b a.b.c a.b.d a.b.c.e a.f -stressTest a a.b a.b.c a.b.d a.b.c.e a.b.f -stressTest a a.b a.b.c a.b.d a.b.c.e a.b.c.f -stressTest a a.b a.b.c a.b.d a.b.c.e a.b.d.f -stressTest a a.b a.b.c a.b.d a.b.c.e a.b.c.e.f -stressTest a a.b a.b.c a.b.d a.b.d.e f -stressTest a a.b a.b.c a.b.d a.b.d.e a.f -stressTest a a.b a.b.c a.b.d a.b.d.e a.b.f -stressTest a a.b a.b.c a.b.d a.b.d.e a.b.c.f -stressTest a a.b a.b.c a.b.d a.b.d.e a.b.d.f -stressTest a a.b a.b.c a.b.d a.b.d.e a.b.d.e.f -stressTest a a.b a.b.c a.b.c.d e f -stressTest a a.b a.b.c a.b.c.d e a.f -stressTest a a.b a.b.c a.b.c.d e a.b.f -stressTest a a.b a.b.c a.b.c.d e a.b.c.f -stressTest a a.b a.b.c a.b.c.d e a.b.c.d.f -stressTest a a.b a.b.c a.b.c.d e e.f -stressTest a a.b a.b.c a.b.c.d a.e f -stressTest a a.b a.b.c a.b.c.d a.e a.f -stressTest a a.b a.b.c a.b.c.d a.e a.b.f -stressTest a a.b a.b.c a.b.c.d a.e a.b.c.f -stressTest a a.b a.b.c a.b.c.d a.e a.b.c.d.f -stressTest a a.b a.b.c a.b.c.d a.e a.e.f -stressTest a a.b a.b.c a.b.c.d a.b.e f -stressTest a a.b a.b.c a.b.c.d a.b.e a.f -stressTest a a.b a.b.c a.b.c.d a.b.e a.b.f -stressTest a a.b a.b.c a.b.c.d a.b.e a.b.c.f -stressTest a a.b a.b.c a.b.c.d a.b.e a.b.c.d.f -stressTest a a.b a.b.c a.b.c.d a.b.e a.b.e.f -stressTest a a.b a.b.c a.b.c.d a.b.c.e f -stressTest a a.b a.b.c a.b.c.d a.b.c.e a.f -stressTest a a.b a.b.c a.b.c.d a.b.c.e a.b.f -stressTest a a.b a.b.c a.b.c.d a.b.c.e a.b.c.f -stressTest a a.b a.b.c a.b.c.d a.b.c.e a.b.c.d.f -stressTest a a.b a.b.c a.b.c.d a.b.c.e a.b.c.e.f -stressTest a a.b a.b.c a.b.c.d a.b.c.d.e f -stressTest a a.b a.b.c a.b.c.d a.b.c.d.e a.f -stressTest a a.b a.b.c a.b.c.d a.b.c.d.e a.b.f -stressTest a a.b a.b.c a.b.c.d a.b.c.d.e a.b.c.f -stressTest a a.b a.b.c a.b.c.d a.b.c.d.e a.b.c.d.f -stressTest a a.b a.b.c a.b.c.d a.b.c.d.e a.b.c.d.e.f - -# -stressTest a a.b a.b.c1 a.b.c1.d1 a.b.c1.d2 a.b.c1.d3 a.b.c2 -stressTest a a.b a.b.c a.b.c.d a.b.c.d.e a.b.c.d.e.f a.b.c.d.e.f.g - - diff --git a/src/java/org/apache/log4j/test/stressCategory.pl b/src/java/org/apache/log4j/test/stressCategory.pl deleted file mode 100644 index 875d2ca6d3..0000000000 --- a/src/java/org/apache/log4j/test/stressCategory.pl +++ /dev/null @@ -1,57 +0,0 @@ - -# This perl script all combinations of tree structures based on the "args" -# array. - -# For example, if args = ("a", "b", "c"), it will output: -# -# stressTest a b c -# stressTest a b a.c -# stressTest a b b.c -# stressTest a a.b c -# stressTest a a.b a.c -# stressTest a a.b a.b.c - -$prefix = "stressTest"; - -@tree = (""); - -@args = ("a", "b"); -permute(0, @tree); - -@args = ("a", "b", "c"); -permute(0, @tree); - -@args = ("a", "b", "c", "d"); -permute(0, @tree); - -@args = ("a", "b", "c", "d", "e"); -permute(0, @tree); - -@args = ("a", "b", "c", "d", "e", "f"); -permute(0, @tree); - - -sub permute() { - my ($i, @t) = @_; - #print "Tree is @t\n"; - #print "i is $i \n"; - - if($i == $#args + 1) { - print "$prefix @t\n"; - return; - } - - foreach $j (@t) { - #print "J is $j \n"; - #print "args[$i]=$args[$i]\n"; - if($j eq "") { - $next = "$args[$i]"; - } - else { - $next = "$j.$args[$i]"; - } - - permute($i+1, (@t, $next)); - } - -} diff --git a/src/java/org/apache/log4j/test/stressNDC b/src/java/org/apache/log4j/test/stressNDC deleted file mode 100644 index 93530034f7..0000000000 --- a/src/java/org/apache/log4j/test/stressNDC +++ /dev/null @@ -1,6 +0,0 @@ -if [ -z "$PERL" ] -then - PERL=perl -fi - -java org.apache.log4j.test.StressNDC $1 | $PERL StressNDC.pl diff --git a/src/java/org/apache/log4j/test/witness/confParsing.1 b/src/java/org/apache/log4j/test/witness/confParsing.1 deleted file mode 100644 index f679458ca5..0000000000 --- a/src/java/org/apache/log4j/test/witness/confParsing.1 +++ /dev/null @@ -1,2 +0,0 @@ -[main] DEBUG root - Message 1 -[main] DEBUG root - Message 2 diff --git a/src/java/org/apache/log4j/test/witness/confParsing.10 b/src/java/org/apache/log4j/test/witness/confParsing.10 deleted file mode 100644 index 6941ab2051..0000000000 --- a/src/java/org/apache/log4j/test/witness/confParsing.10 +++ /dev/null @@ -1,2 +0,0 @@ -AVY [main] DEBUG-Message 1 -AVY [main] DEBUG-Message 2 diff --git a/src/java/org/apache/log4j/test/witness/confParsing.11 b/src/java/org/apache/log4j/test/witness/confParsing.11 deleted file mode 100644 index ef6ea2ad51..0000000000 --- a/src/java/org/apache/log4j/test/witness/confParsing.11 +++ /dev/null @@ -1,2 +0,0 @@ -VSUB [main] DEBUG-Message 1 -VSUB [main] DEBUG-Message 2 diff --git a/src/java/org/apache/log4j/test/witness/confParsing.2 b/src/java/org/apache/log4j/test/witness/confParsing.2 deleted file mode 100644 index e740f81250..0000000000 --- a/src/java/org/apache/log4j/test/witness/confParsing.2 +++ /dev/null @@ -1,2 +0,0 @@ -[main] DEBUG root testing - Message 1 -[main] DEBUG root testing - Message 2 diff --git a/src/java/org/apache/log4j/test/witness/confParsing.3 b/src/java/org/apache/log4j/test/witness/confParsing.3 deleted file mode 100644 index 1f4dfb9de1..0000000000 --- a/src/java/org/apache/log4j/test/witness/confParsing.3 +++ /dev/null @@ -1 +0,0 @@ -[main] DEBUG root testing - Message 2 diff --git a/src/java/org/apache/log4j/test/witness/confParsing.4 b/src/java/org/apache/log4j/test/witness/confParsing.4 deleted file mode 100644 index 63b67e541b..0000000000 --- a/src/java/org/apache/log4j/test/witness/confParsing.4 +++ /dev/null @@ -1,3 +0,0 @@ -[main] DEBUG testing - HELLO WORLD -[main] DEBUG root testing - Message 1 -[main] DEBUG root testing - Message 2 diff --git a/src/java/org/apache/log4j/test/witness/confParsing.5 b/src/java/org/apache/log4j/test/witness/confParsing.5 deleted file mode 100644 index 63b67e541b..0000000000 --- a/src/java/org/apache/log4j/test/witness/confParsing.5 +++ /dev/null @@ -1,3 +0,0 @@ -[main] DEBUG testing - HELLO WORLD -[main] DEBUG root testing - Message 1 -[main] DEBUG root testing - Message 2 diff --git a/src/java/org/apache/log4j/test/witness/confParsing.6 b/src/java/org/apache/log4j/test/witness/confParsing.6 deleted file mode 100644 index e740f81250..0000000000 --- a/src/java/org/apache/log4j/test/witness/confParsing.6 +++ /dev/null @@ -1,2 +0,0 @@ -[main] DEBUG root testing - Message 1 -[main] DEBUG root testing - Message 2 diff --git a/src/java/org/apache/log4j/test/witness/confParsing.7 b/src/java/org/apache/log4j/test/witness/confParsing.7 deleted file mode 100644 index 63b67e541b..0000000000 --- a/src/java/org/apache/log4j/test/witness/confParsing.7 +++ /dev/null @@ -1,3 +0,0 @@ -[main] DEBUG testing - HELLO WORLD -[main] DEBUG root testing - Message 1 -[main] DEBUG root testing - Message 2 diff --git a/src/java/org/apache/log4j/test/witness/confParsing.8 b/src/java/org/apache/log4j/test/witness/confParsing.8 deleted file mode 100644 index 1df45268ef..0000000000 --- a/src/java/org/apache/log4j/test/witness/confParsing.8 +++ /dev/null @@ -1,2 +0,0 @@ -[main] DEBUG - Message 1 -[main] DEBUG - Message 2 diff --git a/src/java/org/apache/log4j/test/witness/confParsing.9 b/src/java/org/apache/log4j/test/witness/confParsing.9 deleted file mode 100644 index 1df45268ef..0000000000 --- a/src/java/org/apache/log4j/test/witness/confParsing.9 +++ /dev/null @@ -1,2 +0,0 @@ -[main] DEBUG - Message 1 -[main] DEBUG - Message 2 diff --git a/src/java/org/apache/log4j/test/witness/customCat.1 b/src/java/org/apache/log4j/test/witness/customCat.1 deleted file mode 100644 index af70b03a1f..0000000000 --- a/src/java/org/apache/log4j/test/witness/customCat.1 +++ /dev/null @@ -1,6 +0,0 @@ -TRACE - Message 0 -DEBUG - Message 1 -INFO - Message 2 -WARN - Message 3 -ERROR - Message 4 -LETHAL - Message 5 diff --git a/src/java/org/apache/log4j/test/witness/definit.1 b/src/java/org/apache/log4j/test/witness/definit.1 deleted file mode 100644 index 802992c422..0000000000 --- a/src/java/org/apache/log4j/test/witness/definit.1 +++ /dev/null @@ -1 +0,0 @@ -Hello world diff --git a/src/java/org/apache/log4j/test/witness/definit.2 b/src/java/org/apache/log4j/test/witness/definit.2 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/java/org/apache/log4j/test/witness/definit.3 b/src/java/org/apache/log4j/test/witness/definit.3 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/java/org/apache/log4j/test/witness/definit.4 b/src/java/org/apache/log4j/test/witness/definit.4 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/java/org/apache/log4j/test/witness/definit.5 b/src/java/org/apache/log4j/test/witness/definit.5 deleted file mode 100644 index 802992c422..0000000000 --- a/src/java/org/apache/log4j/test/witness/definit.5 +++ /dev/null @@ -1 +0,0 @@ -Hello world diff --git a/src/java/org/apache/log4j/test/witness/definit.6 b/src/java/org/apache/log4j/test/witness/definit.6 deleted file mode 100644 index 802992c422..0000000000 --- a/src/java/org/apache/log4j/test/witness/definit.6 +++ /dev/null @@ -1 +0,0 @@ -Hello world diff --git a/src/java/org/apache/log4j/test/witness/domTest.10 b/src/java/org/apache/log4j/test/witness/domTest.10 deleted file mode 100644 index 4a2ce8c062..0000000000 --- a/src/java/org/apache/log4j/test/witness/domTest.10 +++ /dev/null @@ -1,2 +0,0 @@ -INFO test.DOMTest - Message 1 -INFO root - Message 1 diff --git a/src/java/org/apache/log4j/test/witness/domTest.11 b/src/java/org/apache/log4j/test/witness/domTest.11 deleted file mode 100644 index 8c16ea6d90..0000000000 --- a/src/java/org/apache/log4j/test/witness/domTest.11 +++ /dev/null @@ -1,2 +0,0 @@ -WARN test.DOMTest - Message 2 -WARN root - Message 2 diff --git a/src/java/org/apache/log4j/test/witness/domTest.12 b/src/java/org/apache/log4j/test/witness/domTest.12 deleted file mode 100644 index 9960bc1d48..0000000000 --- a/src/java/org/apache/log4j/test/witness/domTest.12 +++ /dev/null @@ -1,24 +0,0 @@ -DEBUG test.DOMTest - Message 0 -DEBUG root - Message 0 -INFO test.DOMTest - Message 1 -INFO root - Message 1 -ERROR test.DOMTest - Message 3 -ERROR root - Message 3 -FATAL test.DOMTest - Message 4 -FATAL root - Message 4 -DEBUG test.DOMTest - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -DEBUG root - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -ERROR test.DOMTest - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -ERROR root - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/domTest.4 b/src/java/org/apache/log4j/test/witness/domTest.4 deleted file mode 100644 index fe6e2b332e..0000000000 --- a/src/java/org/apache/log4j/test/witness/domTest.4 +++ /dev/null @@ -1,12 +0,0 @@ -ERROR test.DOMTest - Message 3 -ERROR root - Message 3 -FATAL test.DOMTest - Message 4 -FATAL root - Message 4 -ERROR test.DOMTest - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -ERROR root - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/domTest.5 b/src/java/org/apache/log4j/test/witness/domTest.5 deleted file mode 100644 index 9633880812..0000000000 --- a/src/java/org/apache/log4j/test/witness/domTest.5 +++ /dev/null @@ -1,26 +0,0 @@ -DEBUG test.DOMTest - Message 0 -DEBUG root - Message 0 -INFO test.DOMTest - Message 1 -INFO root - Message 1 -WARN test.DOMTest - Message 2 -WARN root - Message 2 -ERROR test.DOMTest - Message 3 -ERROR root - Message 3 -FATAL test.DOMTest - Message 4 -FATAL root - Message 4 -DEBUG test.DOMTest - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -DEBUG root - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -ERROR test.DOMTest - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -ERROR root - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/domTest.6 b/src/java/org/apache/log4j/test/witness/domTest.6 deleted file mode 100644 index 3c27dfafc1..0000000000 --- a/src/java/org/apache/log4j/test/witness/domTest.6 +++ /dev/null @@ -1,4 +0,0 @@ -INFO test.DOMTest - Message 1 -INFO root - Message 1 -WARN test.DOMTest - Message 2 -WARN root - Message 2 diff --git a/src/java/org/apache/log4j/test/witness/domTest.7 b/src/java/org/apache/log4j/test/witness/domTest.7 deleted file mode 100644 index 478b640574..0000000000 --- a/src/java/org/apache/log4j/test/witness/domTest.7 +++ /dev/null @@ -1,24 +0,0 @@ -DEBUG test.DOMTest - Message 0 -DEBUG root - Message 0 -WARN test.DOMTest - Message 2 -WARN root - Message 2 -ERROR test.DOMTest - Message 3 -ERROR root - Message 3 -FATAL test.DOMTest - Message 4 -FATAL root - Message 4 -DEBUG test.DOMTest - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -DEBUG root - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -ERROR test.DOMTest - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -ERROR root - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/domTest.8 b/src/java/org/apache/log4j/test/witness/domTest.8 deleted file mode 100644 index 39a4e528e6..0000000000 --- a/src/java/org/apache/log4j/test/witness/domTest.8 +++ /dev/null @@ -1,6 +0,0 @@ -WARN test.DOMTest - Message 2 -WARN root - Message 2 -ERROR test.DOMTest - Message 3 -ERROR root - Message 3 -FATAL test.DOMTest - Message 4 -FATAL root - Message 4 diff --git a/src/java/org/apache/log4j/test/witness/domTest.9 b/src/java/org/apache/log4j/test/witness/domTest.9 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/java/org/apache/log4j/test/witness/domTest.A1.1 b/src/java/org/apache/log4j/test/witness/domTest.A1.1 deleted file mode 100644 index 5d7b3fa5c2..0000000000 --- a/src/java/org/apache/log4j/test/witness/domTest.A1.1 +++ /dev/null @@ -1,39 +0,0 @@ -DEBUG test.DOMTest - Message 0 -DEBUG test.DOMTest - Message 0 -DEBUG root - Message 0 -INFO test.DOMTest - Message 1 -INFO test.DOMTest - Message 1 -INFO root - Message 1 -WARN test.DOMTest - Message 2 -WARN test.DOMTest - Message 2 -WARN root - Message 2 -ERROR test.DOMTest - Message 3 -ERROR test.DOMTest - Message 3 -ERROR root - Message 3 -FATAL test.DOMTest - Message 4 -FATAL test.DOMTest - Message 4 -FATAL root - Message 4 -DEBUG test.DOMTest - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -DEBUG test.DOMTest - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -DEBUG root - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -ERROR test.DOMTest - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -ERROR test.DOMTest - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -ERROR root - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/domTest.A1.2 b/src/java/org/apache/log4j/test/witness/domTest.A1.2 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/java/org/apache/log4j/test/witness/domTest.A1.3 b/src/java/org/apache/log4j/test/witness/domTest.A1.3 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/java/org/apache/log4j/test/witness/domTest.A2.1 b/src/java/org/apache/log4j/test/witness/domTest.A2.1 deleted file mode 100644 index 97882605e4..0000000000 --- a/src/java/org/apache/log4j/test/witness/domTest.A2.1 +++ /dev/null @@ -1,26 +0,0 @@ -[main] DEBUG org.apache.log4j.xml.test.DOMTest - Message 0 -[main] DEBUG root - Message 0 -[main] INFO org.apache.log4j.xml.test.DOMTest - Message 1 -[main] INFO root - Message 1 -[main] WARN org.apache.log4j.xml.test.DOMTest - Message 2 -[main] WARN root - Message 2 -[main] ERROR org.apache.log4j.xml.test.DOMTest - Message 3 -[main] ERROR root - Message 3 -[main] FATAL org.apache.log4j.xml.test.DOMTest - Message 4 -[main] FATAL root - Message 4 -[main] DEBUG org.apache.log4j.xml.test.DOMTest - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -[main] DEBUG root - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -[main] ERROR org.apache.log4j.xml.test.DOMTest - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) -[main] ERROR root - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/domTest.A2.2 b/src/java/org/apache/log4j/test/witness/domTest.A2.2 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/java/org/apache/log4j/test/witness/domTest.A2.3 b/src/java/org/apache/log4j/test/witness/domTest.A2.3 deleted file mode 100644 index 5922655c77..0000000000 --- a/src/java/org/apache/log4j/test/witness/domTest.A2.3 +++ /dev/null @@ -1,4 +0,0 @@ -[main] ERROR test.DOMTest - TEST3 Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.xml.test.DOMTest.test(DOMTest.java:XXX) - at org.apache.log4j.xml.test.DOMTest.main(DOMTest.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/enableFlagTest.1 b/src/java/org/apache/log4j/test/witness/enableFlagTest.1 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/java/org/apache/log4j/test/witness/enableFlagTest.2 b/src/java/org/apache/log4j/test/witness/enableFlagTest.2 deleted file mode 100644 index b422ddcfaf..0000000000 --- a/src/java/org/apache/log4j/test/witness/enableFlagTest.2 +++ /dev/null @@ -1 +0,0 @@ -FATAL [main] test.EnableFlagTest = m5 diff --git a/src/java/org/apache/log4j/test/witness/enableFlagTest.3 b/src/java/org/apache/log4j/test/witness/enableFlagTest.3 deleted file mode 100644 index 6c81bdce17..0000000000 --- a/src/java/org/apache/log4j/test/witness/enableFlagTest.3 +++ /dev/null @@ -1,2 +0,0 @@ -ERROR [main] test.EnableFlagTest = m4 -FATAL [main] test.EnableFlagTest = m5 diff --git a/src/java/org/apache/log4j/test/witness/enableFlagTest.4 b/src/java/org/apache/log4j/test/witness/enableFlagTest.4 deleted file mode 100644 index 244e782c78..0000000000 --- a/src/java/org/apache/log4j/test/witness/enableFlagTest.4 +++ /dev/null @@ -1,3 +0,0 @@ -WARN [main] test.EnableFlagTest = m3 -ERROR [main] test.EnableFlagTest = m4 -FATAL [main] test.EnableFlagTest = m5 diff --git a/src/java/org/apache/log4j/test/witness/enableFlagTest.5 b/src/java/org/apache/log4j/test/witness/enableFlagTest.5 deleted file mode 100644 index df019ef3fa..0000000000 --- a/src/java/org/apache/log4j/test/witness/enableFlagTest.5 +++ /dev/null @@ -1,4 +0,0 @@ -INFO [main] test.EnableFlagTest = m2 -WARN [main] test.EnableFlagTest = m3 -ERROR [main] test.EnableFlagTest = m4 -FATAL [main] test.EnableFlagTest = m5 diff --git a/src/java/org/apache/log4j/test/witness/enableFlagTest.6 b/src/java/org/apache/log4j/test/witness/enableFlagTest.6 deleted file mode 100644 index 335f6ea0a0..0000000000 --- a/src/java/org/apache/log4j/test/witness/enableFlagTest.6 +++ /dev/null @@ -1,5 +0,0 @@ -DEBUG [main] test.EnableFlagTest = m1 -INFO [main] test.EnableFlagTest = m2 -WARN [main] test.EnableFlagTest = m3 -ERROR [main] test.EnableFlagTest = m4 -FATAL [main] test.EnableFlagTest = m5 diff --git a/src/java/org/apache/log4j/test/witness/enableFlagTest.7 b/src/java/org/apache/log4j/test/witness/enableFlagTest.7 deleted file mode 100644 index 335f6ea0a0..0000000000 --- a/src/java/org/apache/log4j/test/witness/enableFlagTest.7 +++ /dev/null @@ -1,5 +0,0 @@ -DEBUG [main] test.EnableFlagTest = m1 -INFO [main] test.EnableFlagTest = m2 -WARN [main] test.EnableFlagTest = m3 -ERROR [main] test.EnableFlagTest = m4 -FATAL [main] test.EnableFlagTest = m5 diff --git a/src/java/org/apache/log4j/test/witness/fqcn.1 b/src/java/org/apache/log4j/test/witness/fqcn.1 deleted file mode 100644 index 24b03ebd67..0000000000 --- a/src/java/org/apache/log4j/test/witness/fqcn.1 +++ /dev/null @@ -1,3 +0,0 @@ -DEBUG x1 (test.FQCNTest#test) - hello -DEBUG x1 (test.FQCNTest#test) - hello world. -DEBUG x1 (test.FQCNTest#test) - hello diff --git a/src/java/org/apache/log4j/test/witness/getOptions.1 b/src/java/org/apache/log4j/test/witness/getOptions.1 deleted file mode 100644 index 46a2d13694..0000000000 --- a/src/java/org/apache/log4j/test/witness/getOptions.1 +++ /dev/null @@ -1,11 +0,0 @@ -log4j.appender.f.Append=false -log4j.appender.f.BufferSize=8192 -log4j.appender.f.BufferedIO=false -log4j.appender.f.File=temp -log4j.appender.f.ImmediateFlush=true -log4j.appender.f.layout.ContentType=text/plain -log4j.appender.f.layout.ConversionPattern=%m%n -log4j.appender.f.layout=org.apache.log4j.PatternLayout -log4j.appender.f=org.apache.log4j.FileAppender -log4j.category.org.apache.log4j=INFO, f -log4j.rootCategory=DEBUG, f diff --git a/src/java/org/apache/log4j/test/witness/l7d.1 b/src/java/org/apache/log4j/test/witness/l7d.1 deleted file mode 100644 index 0bc132b563..0000000000 --- a/src/java/org/apache/log4j/test/witness/l7d.1 +++ /dev/null @@ -1,21 +0,0 @@ -T1 INFO - This is the English, US test. -T1 WARN - Hello world. -T1 ERROR - No resource is associated with key "bogusMsg". -T1 ERROR - bogusMsg -T1 ERROR - This is test number 1 with string argument log4j. -T1 ERROR - No resource is associated with key "bogus2". -T1 INFO - bogus2 -T1 INFO - Ceci est le test en francais pour la France. -T1 WARN - Bonjour la France. -T1 ERROR - No resource is associated with key "bogusMsg". -T1 ERROR - bogusMsg -T1 ERROR - Ceci est le test numero 2 contenant l'argument log4j. -T1 ERROR - No resource is associated with key "bogus2". -T1 INFO - bogus2 -T1 INFO - Ceci est le test en francais pour la p'tite Suisse. -T1 WARN - Bonjour la France. -T1 ERROR - No resource is associated with key "bogusMsg". -T1 ERROR - bogusMsg -T1 ERROR - Ceci est le test numero 3 contenant l'argument log4j. -T1 ERROR - No resource is associated with key "bogus2". -T1 INFO - bogus2 diff --git a/src/java/org/apache/log4j/test/witness/mycat.1 b/src/java/org/apache/log4j/test/witness/mycat.1 deleted file mode 100644 index 8ab1b55b8e..0000000000 --- a/src/java/org/apache/log4j/test/witness/mycat.1 +++ /dev/null @@ -1 +0,0 @@ -some.cat DEBUG - Hello world. diff --git a/src/java/org/apache/log4j/test/witness/mycat.2 b/src/java/org/apache/log4j/test/witness/mycat.2 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/java/org/apache/log4j/test/witness/mycat.3 b/src/java/org/apache/log4j/test/witness/mycat.3 deleted file mode 100644 index 8ab1b55b8e..0000000000 --- a/src/java/org/apache/log4j/test/witness/mycat.3 +++ /dev/null @@ -1 +0,0 @@ -some.cat DEBUG - Hello world. diff --git a/src/java/org/apache/log4j/test/witness/propCfg.1 b/src/java/org/apache/log4j/test/witness/propCfg.1 deleted file mode 100644 index 802992c422..0000000000 --- a/src/java/org/apache/log4j/test/witness/propCfg.1 +++ /dev/null @@ -1 +0,0 @@ -Hello world diff --git a/src/java/org/apache/log4j/test/witness/propCfg.2 b/src/java/org/apache/log4j/test/witness/propCfg.2 deleted file mode 100644 index e64a372d74..0000000000 --- a/src/java/org/apache/log4j/test/witness/propCfg.2 +++ /dev/null @@ -1 +0,0 @@ -DEBUG - Hello world diff --git a/src/java/org/apache/log4j/test/witness/shallow.1000 b/src/java/org/apache/log4j/test/witness/shallow.1000 deleted file mode 100644 index 7938faf55c..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.1000 +++ /dev/null @@ -1,50 +0,0 @@ -DEBUG NDC [main] org.apache.log4j.test.Shallow Message 0 -DEBUG NDC [main] root Message 0 - INFO NDC [main] org.apache.log4j.test.Shallow Message 1 - INFO NDC [main] root Message 1 - WARN NDC [main] org.apache.log4j.test.Shallow Message 2 - WARN NDC [main] root Message 2 -ERROR NDC [main] org.apache.log4j.test.Shallow Message 3 -ERROR NDC [main] root Message 3 -FATAL NDC [main] org.apache.log4j.test.Shallow Message 4 -FATAL NDC [main] root Message 4 -DEBUG NDC [main] org.apache.log4j.test.Shallow Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -DEBUG NDC [main] root Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) - INFO NDC [main] org.apache.log4j.test.Shallow Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) - INFO NDC [main] root Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) - WARN NDC [main] org.apache.log4j.test.Shallow Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) - WARN NDC [main] root Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -ERROR NDC [main] org.apache.log4j.test.Shallow Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -ERROR NDC [main] root Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -FATAL NDC [main] org.apache.log4j.test.Shallow Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -FATAL NDC [main] root Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.1001 b/src/java/org/apache/log4j/test/witness/shallow.1001 deleted file mode 100644 index 9ea45d7d6f..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.1001 +++ /dev/null @@ -1,50 +0,0 @@ -DEBUG NDC [main] org.apache.log4j.test.Shallow (Shallow.java:55) Message 0 -DEBUG NDC [main] org.apache.log4j.test.Shallow (Shallow.java:56) Message 0 - INFO NDC [main] org.apache.log4j.test.Shallow (Shallow.java:58) Message 1 - INFO NDC [main] org.apache.log4j.test.Shallow (Shallow.java:59) Message 1 - WARN NDC [main] org.apache.log4j.test.Shallow (Shallow.java:61) Message 2 - WARN NDC [main] org.apache.log4j.test.Shallow (Shallow.java:62) Message 2 -ERROR NDC [main] org.apache.log4j.test.Shallow (Shallow.java:64) Message 3 -ERROR NDC [main] org.apache.log4j.test.Shallow (Shallow.java:65) Message 3 -FATAL NDC [main] org.apache.log4j.test.Shallow (Shallow.java:67) Message 4 -FATAL NDC [main] org.apache.log4j.test.Shallow (Shallow.java:68) Message 4 -DEBUG NDC [main] org.apache.log4j.test.Shallow (Shallow.java:71) Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -DEBUG NDC [main] org.apache.log4j.test.Shallow (Shallow.java:72) Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) - INFO NDC [main] org.apache.log4j.test.Shallow (Shallow.java:74) Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) - INFO NDC [main] org.apache.log4j.test.Shallow (Shallow.java:75) Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) - WARN NDC [main] org.apache.log4j.test.Shallow (Shallow.java:77) Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) - WARN NDC [main] org.apache.log4j.test.Shallow (Shallow.java:78) Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -ERROR NDC [main] org.apache.log4j.test.Shallow (Shallow.java:80) Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -ERROR NDC [main] org.apache.log4j.test.Shallow (Shallow.java:81) Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -FATAL NDC [main] org.apache.log4j.test.Shallow (Shallow.java:83) Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -FATAL NDC [main] org.apache.log4j.test.Shallow (Shallow.java:84) Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A1.1 b/src/java/org/apache/log4j/test/witness/shallow.A1.1 deleted file mode 100644 index 0f3794caad..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A1.1 +++ /dev/null @@ -1,50 +0,0 @@ -DEBUG - Message 0 -DEBUG - Message 0 -INFO - Message 1 -INFO - Message 1 -WARN - Message 2 -WARN - Message 2 -ERROR - Message 3 -ERROR - Message 3 -FATAL - Message 4 -FATAL - Message 4 -DEBUG - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -DEBUG - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -INFO - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -INFO - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -WARN - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -WARN - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -ERROR - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -ERROR - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -FATAL - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -FATAL - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A1.2 b/src/java/org/apache/log4j/test/witness/shallow.A1.2 deleted file mode 100644 index 72b8396430..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A1.2 +++ /dev/null @@ -1,45 +0,0 @@ -DEBUG - Message 0 -INFO - Message 1 -INFO - Message 1 -WARN - Message 2 -WARN - Message 2 -ERROR - Message 3 -ERROR - Message 3 -FATAL - Message 4 -FATAL - Message 4 -DEBUG - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -INFO - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -INFO - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -WARN - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -WARN - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -ERROR - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -ERROR - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -FATAL - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -FATAL - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A1.3 b/src/java/org/apache/log4j/test/witness/shallow.A1.3 deleted file mode 100644 index 2e6ca8185f..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A1.3 +++ /dev/null @@ -1,50 +0,0 @@ -[main] DEBUG org.apache.log4j.test.Shallow NDC - Message 0 -[main] DEBUG root NDC - Message 0 -[main] INFO org.apache.log4j.test.Shallow NDC - Message 1 -[main] INFO root NDC - Message 1 -[main] WARN org.apache.log4j.test.Shallow NDC - Message 2 -[main] WARN root NDC - Message 2 -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 3 -[main] ERROR root NDC - Message 3 -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 4 -[main] FATAL root NDC - Message 4 -[main] DEBUG org.apache.log4j.test.Shallow NDC - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] DEBUG root NDC - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] INFO org.apache.log4j.test.Shallow NDC - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] INFO root NDC - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] WARN org.apache.log4j.test.Shallow NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] WARN root NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR root NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL root NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A1.4 b/src/java/org/apache/log4j/test/witness/shallow.A1.4 deleted file mode 100644 index e6836961eb..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A1.4 +++ /dev/null @@ -1,40 +0,0 @@ -[main] INFO org.apache.log4j.test.Shallow NDC - Message 1 -[main] INFO root NDC - Message 1 -[main] WARN org.apache.log4j.test.Shallow NDC - Message 2 -[main] WARN root NDC - Message 2 -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 3 -[main] ERROR root NDC - Message 3 -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 4 -[main] FATAL root NDC - Message 4 -[main] INFO org.apache.log4j.test.Shallow NDC - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] INFO root NDC - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] WARN org.apache.log4j.test.Shallow NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] WARN root NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR root NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL root NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A1.5 b/src/java/org/apache/log4j/test/witness/shallow.A1.5 deleted file mode 100644 index d40c5d98ac..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A1.5 +++ /dev/null @@ -1,40 +0,0 @@ -[main] DEBUG root NDC - Message 0 -[main] INFO root NDC - Message 1 -[main] WARN org.apache.log4j.test.Shallow NDC - Message 2 -[main] WARN root NDC - Message 2 -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 3 -[main] ERROR root NDC - Message 3 -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 4 -[main] FATAL root NDC - Message 4 -[main] DEBUG root NDC - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] INFO root NDC - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] WARN org.apache.log4j.test.Shallow NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] WARN root NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR root NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL root NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A1.6 b/src/java/org/apache/log4j/test/witness/shallow.A1.6 deleted file mode 100644 index d40c5d98ac..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A1.6 +++ /dev/null @@ -1,40 +0,0 @@ -[main] DEBUG root NDC - Message 0 -[main] INFO root NDC - Message 1 -[main] WARN org.apache.log4j.test.Shallow NDC - Message 2 -[main] WARN root NDC - Message 2 -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 3 -[main] ERROR root NDC - Message 3 -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 4 -[main] FATAL root NDC - Message 4 -[main] DEBUG root NDC - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] INFO root NDC - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] WARN org.apache.log4j.test.Shallow NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] WARN root NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR root NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL root NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A1.7 b/src/java/org/apache/log4j/test/witness/shallow.A1.7 deleted file mode 100644 index 564f22cfc4..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A1.7 +++ /dev/null @@ -1,25 +0,0 @@ -[main] DEBUG root NDC - Message 0 -[main] INFO root NDC - Message 1 -[main] WARN root NDC - Message 2 -[main] ERROR root NDC - Message 3 -[main] FATAL root NDC - Message 4 -[main] DEBUG root NDC - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] INFO root NDC - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] WARN root NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR root NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL root NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A1.8 b/src/java/org/apache/log4j/test/witness/shallow.A1.8 deleted file mode 100644 index c1afbe6d7d..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A1.8 +++ /dev/null @@ -1,15 +0,0 @@ -[main] WARN root NDC - Message 2 -[main] ERROR root NDC - Message 3 -[main] FATAL root NDC - Message 4 -[main] WARN root NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR root NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL root NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A2.1 b/src/java/org/apache/log4j/test/witness/shallow.A2.1 deleted file mode 100644 index a724c6a56a..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A2.1 +++ /dev/null @@ -1,25 +0,0 @@ -DEBUG - Message 0 -INFO - Message 1 -WARN - Message 2 -ERROR - Message 3 -FATAL - Message 4 -DEBUG - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -INFO - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -WARN - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -ERROR - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -FATAL - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A2.2 b/src/java/org/apache/log4j/test/witness/shallow.A2.2 deleted file mode 100644 index a724c6a56a..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A2.2 +++ /dev/null @@ -1,25 +0,0 @@ -DEBUG - Message 0 -INFO - Message 1 -WARN - Message 2 -ERROR - Message 3 -FATAL - Message 4 -DEBUG - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -INFO - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -WARN - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -ERROR - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -FATAL - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A2.3 b/src/java/org/apache/log4j/test/witness/shallow.A2.3 deleted file mode 100644 index 1ae373ad70..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A2.3 +++ /dev/null @@ -1,25 +0,0 @@ -[main] DEBUG org.apache.log4j.test.Shallow NDC - Message 0 -[main] INFO org.apache.log4j.test.Shallow NDC - Message 1 -[main] WARN org.apache.log4j.test.Shallow NDC - Message 2 -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 3 -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 4 -[main] DEBUG org.apache.log4j.test.Shallow NDC - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] INFO org.apache.log4j.test.Shallow NDC - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] WARN org.apache.log4j.test.Shallow NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A2.4 b/src/java/org/apache/log4j/test/witness/shallow.A2.4 deleted file mode 100644 index 1bbfd2398c..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A2.4 +++ /dev/null @@ -1,20 +0,0 @@ -[main] INFO org.apache.log4j.test.Shallow NDC - Message 1 -[main] WARN org.apache.log4j.test.Shallow NDC - Message 2 -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 3 -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 4 -[main] INFO org.apache.log4j.test.Shallow NDC - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] WARN org.apache.log4j.test.Shallow NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A2.5 b/src/java/org/apache/log4j/test/witness/shallow.A2.5 deleted file mode 100644 index 1df2f98412..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A2.5 +++ /dev/null @@ -1,15 +0,0 @@ -[main] WARN org.apache.log4j.test.Shallow NDC - Message 2 -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 3 -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 4 -[main] WARN org.apache.log4j.test.Shallow NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A2.6 b/src/java/org/apache/log4j/test/witness/shallow.A2.6 deleted file mode 100644 index 1df2f98412..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A2.6 +++ /dev/null @@ -1,15 +0,0 @@ -[main] WARN org.apache.log4j.test.Shallow NDC - Message 2 -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 3 -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 4 -[main] WARN org.apache.log4j.test.Shallow NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A2.7 b/src/java/org/apache/log4j/test/witness/shallow.A2.7 deleted file mode 100644 index 1df2f98412..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A2.7 +++ /dev/null @@ -1,15 +0,0 @@ -[main] WARN org.apache.log4j.test.Shallow NDC - Message 2 -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 3 -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 4 -[main] WARN org.apache.log4j.test.Shallow NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/witness/shallow.A2.8 b/src/java/org/apache/log4j/test/witness/shallow.A2.8 deleted file mode 100644 index 1ae373ad70..0000000000 --- a/src/java/org/apache/log4j/test/witness/shallow.A2.8 +++ /dev/null @@ -1,25 +0,0 @@ -[main] DEBUG org.apache.log4j.test.Shallow NDC - Message 0 -[main] INFO org.apache.log4j.test.Shallow NDC - Message 1 -[main] WARN org.apache.log4j.test.Shallow NDC - Message 2 -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 3 -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 4 -[main] DEBUG org.apache.log4j.test.Shallow NDC - Message 5 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] INFO org.apache.log4j.test.Shallow NDC - Message 6 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] WARN org.apache.log4j.test.Shallow NDC - Message 7 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] ERROR org.apache.log4j.test.Shallow NDC - Message 8 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) -[main] FATAL org.apache.log4j.test.Shallow NDC - Message 9 -java.lang.Exception: Just testing - at org.apache.log4j.test.Shallow.test(Shallow.java:XXX) - at org.apache.log4j.test.Shallow.main(Shallow.java:XXX) diff --git a/src/java/org/apache/log4j/test/xml/asyncTest.xml b/src/java/org/apache/log4j/test/xml/asyncTest.xml deleted file mode 100644 index cddfcc714c..0000000000 --- a/src/java/org/apache/log4j/test/xml/asyncTest.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/java/org/apache/log4j/test/xml/domTest1.xml b/src/java/org/apache/log4j/test/xml/domTest1.xml deleted file mode 100644 index 6a9673be9a..0000000000 --- a/src/java/org/apache/log4j/test/xml/domTest1.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/domTest10.xml b/src/java/org/apache/log4j/test/xml/domTest10.xml deleted file mode 100644 index 3e2c2a8249..0000000000 --- a/src/java/org/apache/log4j/test/xml/domTest10.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/domTest11.xml b/src/java/org/apache/log4j/test/xml/domTest11.xml deleted file mode 100644 index aee35d648c..0000000000 --- a/src/java/org/apache/log4j/test/xml/domTest11.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/domTest12.xml b/src/java/org/apache/log4j/test/xml/domTest12.xml deleted file mode 100644 index 409ffc19b5..0000000000 --- a/src/java/org/apache/log4j/test/xml/domTest12.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/domTest2.xml b/src/java/org/apache/log4j/test/xml/domTest2.xml deleted file mode 100644 index bc4a8699b1..0000000000 --- a/src/java/org/apache/log4j/test/xml/domTest2.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/domTest3.xml b/src/java/org/apache/log4j/test/xml/domTest3.xml deleted file mode 100644 index 724295e90a..0000000000 --- a/src/java/org/apache/log4j/test/xml/domTest3.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/domTest4.xml b/src/java/org/apache/log4j/test/xml/domTest4.xml deleted file mode 100644 index 2c465c86ee..0000000000 --- a/src/java/org/apache/log4j/test/xml/domTest4.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/domTest5.xml b/src/java/org/apache/log4j/test/xml/domTest5.xml deleted file mode 100644 index 9101c28688..0000000000 --- a/src/java/org/apache/log4j/test/xml/domTest5.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/domTest6.xml b/src/java/org/apache/log4j/test/xml/domTest6.xml deleted file mode 100644 index e24c201046..0000000000 --- a/src/java/org/apache/log4j/test/xml/domTest6.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/domTest7.xml b/src/java/org/apache/log4j/test/xml/domTest7.xml deleted file mode 100644 index 8c641fb5ae..0000000000 --- a/src/java/org/apache/log4j/test/xml/domTest7.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/domTest8.xml b/src/java/org/apache/log4j/test/xml/domTest8.xml deleted file mode 100644 index 2a975a1e41..0000000000 --- a/src/java/org/apache/log4j/test/xml/domTest8.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/domTest9.xml b/src/java/org/apache/log4j/test/xml/domTest9.xml deleted file mode 100644 index d7ba221fd7..0000000000 --- a/src/java/org/apache/log4j/test/xml/domTest9.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/ext1.xml b/src/java/org/apache/log4j/test/xml/ext1.xml deleted file mode 100644 index fafe77ee9f..0000000000 --- a/src/java/org/apache/log4j/test/xml/ext1.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/fallback1.xml b/src/java/org/apache/log4j/test/xml/fallback1.xml deleted file mode 100644 index 2ba20018e4..0000000000 --- a/src/java/org/apache/log4j/test/xml/fallback1.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/java/org/apache/log4j/test/xml/stressAsyncAppender.xml b/src/java/org/apache/log4j/test/xml/stressAsyncAppender.xml deleted file mode 100644 index d8c3dd9aae..0000000000 --- a/src/java/org/apache/log4j/test/xml/stressAsyncAppender.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 9948bb5a50465e6d6dc801fada6c1d371a65d0d2 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 21 Feb 2007 21:07:23 +0000 Subject: [PATCH 241/342] Bug 41219: Stacktraces of exceptions disappear occassionally git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510214 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/spi/NullWriter.java | 39 +++++ .../log4j/spi/ThrowableInformation.java | 121 +++----------- .../org/apache/log4j/spi/VectorWriter.java | 94 +++++++++++ .../log4j/spi/ThrowableInformationTest.java | 154 +++++++++++++----- 4 files changed, 271 insertions(+), 137 deletions(-) create mode 100644 src/java/org/apache/log4j/spi/NullWriter.java create mode 100644 src/java/org/apache/log4j/spi/VectorWriter.java diff --git a/src/java/org/apache/log4j/spi/NullWriter.java b/src/java/org/apache/log4j/spi/NullWriter.java new file mode 100644 index 0000000000..a578910893 --- /dev/null +++ b/src/java/org/apache/log4j/spi/NullWriter.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.log4j.spi; +import java.io.Writer; + +/** + * NullWriter is an obsolete class provided only for + * binary compatibility with earlier versions of log4j and should not be used. + * + * @deprecated + */ +class NullWriter extends Writer { + + public void close() { + // blank + } + + public void flush() { + // blank + } + + public void write(char[] cbuf, int off, int len) { + // blank + } +} diff --git a/src/java/org/apache/log4j/spi/ThrowableInformation.java b/src/java/org/apache/log4j/spi/ThrowableInformation.java index 69f15cb3ea..4d0929c848 100644 --- a/src/java/org/apache/log4j/spi/ThrowableInformation.java +++ b/src/java/org/apache/log4j/spi/ThrowableInformation.java @@ -16,9 +16,12 @@ package org.apache.log4j.spi; -import java.io.Writer; +import java.io.IOException; +import java.io.LineNumberReader; import java.io.PrintWriter; -import java.util.Vector; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.ArrayList; /** * ThrowableInformation is log4j's internal representation of @@ -39,7 +42,7 @@ public class ThrowableInformation implements java.io.Serializable { private transient Throwable throwable; private String[] rep; - + public ThrowableInformation(Throwable throwable) { this.throwable = throwable; @@ -49,105 +52,33 @@ public class ThrowableInformation implements java.io.Serializable { Throwable getThrowable() { return throwable; } - + public String[] getThrowableStrRep() { if(rep != null) { return (String[]) rep.clone(); } else { - VectorWriter vw = new VectorWriter(); - throwable.printStackTrace(vw); - rep = vw.toStringArray(); - return rep; + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + throwable.printStackTrace(pw); + pw.flush(); + LineNumberReader reader = new LineNumberReader( + new StringReader(sw.toString())); + ArrayList lines = new ArrayList(); + try { + String line = reader.readLine(); + while(line != null) { + lines.add(line); + line = reader.readLine(); + } + } catch(IOException ex) { + lines.add(ex.toString()); + } + rep = new String[lines.size()]; + lines.toArray(rep); } + return rep; } } -/** - * VectorWriter is a seemingly trivial implemtantion of PrintWriter. - * The throwable instance that we are trying to represent is asked to - * print itself to a VectorWriter. - * - * By our design choice, our string representation of the throwable - * does not contain any line separators. It follows that println() - * methods of VectorWriter ignore the 'ln' part. - * */ -class VectorWriter extends PrintWriter { - - private Vector v; - - VectorWriter() { - super(new NullWriter()); - v = new Vector(); - } - - public void print(Object o) { - v.addElement(String.valueOf(o)); - } - - public void print(char[] chars) { - v.addElement(new String(chars)); - } - - public void print(String s) { - v.addElement(s); - } - - public void println(Object o) { - v.addElement(String.valueOf(o)); - } - - // JDK 1.1.x apprenly uses this form of println while in - // printStackTrace() - public - void println(char[] chars) { - v.addElement(new String(chars)); - } - - public - void println(String s) { - v.addElement(s); - } - - public void write(char[] chars) { - v.addElement(new String(chars)); - } - - public void write(char[] chars, int off, int len) { - v.addElement(new String(chars, off, len)); - } - - public void write(String s, int off, int len) { - v.addElement(s.substring(off, off+len)); - } - - public void write(String s) { - v.addElement(s); - } - - public String[] toStringArray() { - int len = v.size(); - String[] sa = new String[len]; - for(int i = 0; i < len; i++) { - sa[i] = (String) v.elementAt(i); - } - return sa; - } - -} - -class NullWriter extends Writer { - - public void close() { - // blank - } - - public void flush() { - // blank - } - - public void write(char[] cbuf, int off, int len) { - // blank - } -} diff --git a/src/java/org/apache/log4j/spi/VectorWriter.java b/src/java/org/apache/log4j/spi/VectorWriter.java new file mode 100644 index 0000000000..3e288605ac --- /dev/null +++ b/src/java/org/apache/log4j/spi/VectorWriter.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.log4j.spi; + +import java.io.PrintWriter; +import java.util.Vector; + +/** + * VectorWriter is an obsolete class provided only for + * binary compatibility with earlier versions of log4j and should not be used. + * + * @deprecated + */ +class VectorWriter extends PrintWriter { + + private Vector v; + + /** + * @deprecated + */ + VectorWriter() { + super(new NullWriter()); + v = new Vector(); + } + + public void print(Object o) { + v.addElement(String.valueOf(o)); + } + + public void print(char[] chars) { + v.addElement(new String(chars)); + } + + public void print(String s) { + v.addElement(s); + } + + public void println(Object o) { + v.addElement(String.valueOf(o)); + } + + // JDK 1.1.x apprenly uses this form of println while in + // printStackTrace() + public + void println(char[] chars) { + v.addElement(new String(chars)); + } + + public + void println(String s) { + v.addElement(s); + } + + public void write(char[] chars) { + v.addElement(new String(chars)); + } + + public void write(char[] chars, int off, int len) { + v.addElement(new String(chars, off, len)); + } + + public void write(String s, int off, int len) { + v.addElement(s.substring(off, off+len)); + } + + public void write(String s) { + v.addElement(s); + } + + public String[] toStringArray() { + int len = v.size(); + String[] sa = new String[len]; + for(int i = 0; i < len; i++) { + sa[i] = (String) v.elementAt(i); + } + return sa; + } + +} + diff --git a/tests/src/java/org/apache/log4j/spi/ThrowableInformationTest.java b/tests/src/java/org/apache/log4j/spi/ThrowableInformationTest.java index dc1e5a3431..a0881b0840 100644 --- a/tests/src/java/org/apache/log4j/spi/ThrowableInformationTest.java +++ b/tests/src/java/org/apache/log4j/spi/ThrowableInformationTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -13,7 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.log4j.spi; import junit.framework.TestCase; @@ -70,16 +70,11 @@ public void printStackTrace(final PrintWriter s) { public void testOverriddenBehavior() { ThrowableInformation ti = new ThrowableInformation(new OverriddenThrowable()); String[] rep = ti.getThrowableStrRep(); - assertEquals(9, rep.length); - assertEquals("print(Object)", rep[0]); - assertEquals("print(char[])", rep[1]); - assertEquals("print(String)", rep[2]); - assertEquals("println(Object)", rep[3]); - assertEquals("println(char[])", rep[4]); - assertEquals("println(String)", rep[5]); - assertEquals("write(char[])", rep[6]); - assertEquals("ite(char", rep[7]); - assertEquals("ite(Stri", rep[8]); + assertEquals(4, rep.length); + assertEquals("print(Object)print(char[])print(String)println(Object)", rep[0]); + assertEquals("println(char[])", rep[1]); + assertEquals("println(String)", rep[2]); + assertEquals("write(char[])ite(charite(Stri", rep[3]); } /** @@ -122,27 +117,21 @@ public void printStackTrace(final PrintWriter s) { public void testNotOverriddenBehavior() { ThrowableInformation ti = new ThrowableInformation(new NotOverriddenThrowable()); String[] rep = ti.getThrowableStrRep(); - // - // The results under log4j 1.2.14 could change depending on implementation - // of java.io.PrintWriter - // - assertEquals(10, rep.length); - assertEquals(String.valueOf(true), rep[0]); -// Calls to print(char) are discarded -// assertEquals("a", rep[1]); - assertEquals(String.valueOf(1), rep[1]); - assertEquals(String.valueOf(2L), rep[2]); - assertEquals(String.valueOf(Float.MAX_VALUE), rep[3]); - assertEquals(String.valueOf(Double.MIN_VALUE), rep[4]); - assertEquals(String.valueOf(true), rep[5]); -// Calls to println(char) are discarded -// assertEquals("a", rep[7]); - assertEquals(String.valueOf(1), rep[6]); - assertEquals(String.valueOf(2L), rep[7]); - assertEquals(String.valueOf(Float.MAX_VALUE), rep[8]); - assertEquals(String.valueOf(Double.MIN_VALUE), rep[9]); -// output to write(int) are discarded -// assertEquals("C", rep[12]); + assertEquals(7, rep.length); + StringBuffer buf = new StringBuffer(String.valueOf(true)); + buf.append('a'); + buf.append(String.valueOf(1)); + buf.append(String.valueOf(2L)); + buf.append(String.valueOf(Float.MAX_VALUE)); + buf.append(String.valueOf(Double.MIN_VALUE)); + buf.append(String.valueOf(true)); + assertEquals(buf.toString(), rep[0]); + assertEquals("a", rep[1]); + assertEquals(String.valueOf(1), rep[2]); + assertEquals(String.valueOf(2L), rep[3]); + assertEquals(String.valueOf(Float.MAX_VALUE), rep[4]); + assertEquals(String.valueOf(Double.MIN_VALUE), rep[5]); + assertEquals("C", rep[6]); } /** @@ -177,11 +166,10 @@ public void printStackTrace(final PrintWriter s) { public void testNull() { ThrowableInformation ti = new ThrowableInformation(new NullThrowable()); String[] rep = ti.getThrowableStrRep(); - assertEquals(4, rep.length); - assertEquals(String.valueOf((Object) null), rep[0]); - assertNull(rep[1]); - assertEquals(String.valueOf((Object) null), rep[2]); - assertNull(rep[3]); + assertEquals(2, rep.length); + String nullStr = String.valueOf((Object) null); + assertEquals(nullStr + nullStr + nullStr, rep[0]); + assertEquals(nullStr, rep[1]); } /** @@ -213,4 +201,86 @@ public void testEmpty() { String[] rep = ti.getThrowableStrRep(); assertEquals(0, rep.length); } + + /** + * Custom throwable that emits a specified string in printStackTrace. + */ + private static final class StringThrowable extends Throwable { + /** + * Stack trace. + */ + private final String stackTrace; + /** + * Create new instance. + * @param trace stack trace. + */ + public StringThrowable(final String trace) { + stackTrace = trace; + } + + /** + * Print stack trace. + * + * @param s print writer. + */ + public void printStackTrace(final PrintWriter s) { + s.print(stackTrace); + } + } + + /** + * Test capturing stack trace from throwable that just has a line feed. + */ + public void testLineFeed() { + ThrowableInformation ti = new ThrowableInformation(new StringThrowable("\n")); + String[] rep = ti.getThrowableStrRep(); + assertEquals(1, rep.length); + assertEquals("", rep[0]); + } + + /** + * Test capturing stack trace from throwable that just has a carriage return. + */ + public void testCarriageReturn() { + ThrowableInformation ti = new ThrowableInformation(new StringThrowable("\r")); + String[] rep = ti.getThrowableStrRep(); + assertEquals(1, rep.length); + assertEquals("", rep[0]); + } + + /** + * Test parsing of line breaks. + */ + public void testParsing() { + ThrowableInformation ti = new ThrowableInformation( + new StringThrowable("Line1\rLine2\nLine3\r\nLine4\n\rLine6")); + String[] rep = ti.getThrowableStrRep(); + assertEquals(6, rep.length); + assertEquals("Line1", rep[0]); + assertEquals("Line2", rep[1]); + assertEquals("Line3", rep[2]); + assertEquals("Line4", rep[3]); + assertEquals("", rep[4]); + assertEquals("Line6", rep[5]); + } + + /** + * Test capturing stack trace from throwable that a line feed followed by blank. + */ + public void testLineFeedBlank() { + ThrowableInformation ti = new ThrowableInformation(new StringThrowable("\n ")); + String[] rep = ti.getThrowableStrRep(); + assertEquals(2, rep.length); + assertEquals("", rep[0]); + assertEquals(" ", rep[1]); + } + + /** + * Test that getThrowable returns the throwable provided to the constructor. + */ + public void testGetThrowable() { + Throwable t = new StringThrowable("Hello, World"); + ThrowableInformation ti = new ThrowableInformation(t); + assertSame(t, ti.getThrowable()); + } } From 210059990075fc61e68c286b5a9ac4c06b77b4af Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 21 Feb 2007 22:45:33 +0000 Subject: [PATCH 242/342] Bug 37282: SyslogAppender leaks descriptors git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510279 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/log4j/helpers/SyslogWriter.java | 9 ++-- .../org/apache/log4j/net/SyslogAppender.java | 11 +++-- .../apache/log4j/net/SyslogAppenderTest.java | 44 ++++++++++++++++--- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/java/org/apache/log4j/helpers/SyslogWriter.java b/src/java/org/apache/log4j/helpers/SyslogWriter.java index 0ff910f0c0..f30301b804 100644 --- a/src/java/org/apache/log4j/helpers/SyslogWriter.java +++ b/src/java/org/apache/log4j/helpers/SyslogWriter.java @@ -101,7 +101,7 @@ public class SyslogWriter extends Writer { this.ds = new DatagramSocket(); } catch (SocketException e) { - e.printStackTrace(); + e.printStackTrace(); LogLog.error("Could not instantiate DatagramSocket to " + host + ". All logging will FAIL.", e); } @@ -128,6 +128,9 @@ void write(String string) throws IOException { public void flush() {} - public - void close() {} + public void close() { + if (ds != null) { + ds.close(); + } + } } diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/java/org/apache/log4j/net/SyslogAppender.java index 335fc96aae..0dd1327a7c 100644 --- a/src/java/org/apache/log4j/net/SyslogAppender.java +++ b/src/java/org/apache/log4j/net/SyslogAppender.java @@ -121,9 +121,14 @@ public class SyslogAppender extends AppenderSkeleton { public void close() { closed = true; - // A SyslogWriter is UDP based and needs no opening. Hence, it - // can't be closed. We just unset the variables here. - sqw = null; + if (sqw != null) { + try { + sqw.close(); + sqw = null; + } catch(java.io.IOException ex) { + sqw = null; + } + } } private diff --git a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java index 087767b99f..402f53f0b1 100644 --- a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java +++ b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java @@ -25,6 +25,14 @@ import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.VectorErrorHandler; +import org.apache.log4j.helpers.SyslogWriter; + +import java.util.StringTokenizer; +import java.io.IOException; +import java.net.DatagramSocket; +import java.net.DatagramPacket; +import java.net.InetAddress; +import java.net.UnknownHostException; /** @@ -342,7 +350,7 @@ public void testAppend() { /** * Tests SyslogAppender with IPv6 address. - */ + */ public void testIPv6() { SyslogAppender appender = new SyslogAppender(); appender.setSyslogHost("::1"); @@ -350,7 +358,7 @@ public void testIPv6() { /** * Tests SyslogAppender with IPv6 address enclosed in square brackets. - */ + */ public void testIPv6InBrackets() { SyslogAppender appender = new SyslogAppender(); appender.setSyslogHost("[::1]"); @@ -359,7 +367,7 @@ public void testIPv6InBrackets() { /** * Tests SyslogAppender with IPv6 address enclosed in square brackets * followed by port specification. - */ + */ public void testIPv6AndPort() { SyslogAppender appender = new SyslogAppender(); appender.setSyslogHost("[::1]:1514"); @@ -368,7 +376,7 @@ public void testIPv6AndPort() { /** * Tests SyslogAppender with host name enclosed in square brackets * followed by port specification. - */ + */ public void testHostNameAndPort() { SyslogAppender appender = new SyslogAppender(); appender.setSyslogHost("localhost:1514"); @@ -377,9 +385,35 @@ public void testHostNameAndPort() { /** * Tests SyslogAppender with IPv4 address followed by port specification. - */ + */ public void testIPv4AndPort() { SyslogAppender appender = new SyslogAppender(); appender.setSyslogHost("127.0.0.1:1514"); } + + + public void testActualLogging() throws Exception { + DatagramSocket ds = new DatagramSocket(); + ds.setSoTimeout(2000); + DatagramPacket p = new DatagramPacket(new byte[1000], 0, 1000); + + SyslogAppender appender = new SyslogAppender(); + appender.setSyslogHost("localhost:" + ds.getLocalPort()); + appender.setName("name"); + PatternLayout pl = new PatternLayout("%m"); + appender.setLayout(pl); + appender.activateOptions(); + + Logger l = Logger.getRootLogger(); + l.addAppender(appender); + l.info("greetings"); + appender.close(); + ds.receive(p); + ds.close(); + String s = new String(p.getData(), 0, p.getLength()); + StringTokenizer st = new StringTokenizer(s, "<>() "); + assertEquals("14", st.nextToken()); + assertEquals("greetings", st.nextToken()); + } + } From a62d7f759f56671df2021807ec6fae0b557059e2 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 21 Feb 2007 23:37:32 +0000 Subject: [PATCH 243/342] Bug 40502: SyslogAppender assumes all stack trace lines start with tab git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510307 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/net/SyslogAppender.java | 12 ++-- .../apache/log4j/net/SyslogAppenderTest.java | 64 ++++++++++++++++--- 2 files changed, 61 insertions(+), 15 deletions(-) diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/java/org/apache/log4j/net/SyslogAppender.java index 0dd1327a7c..6920b0c143 100644 --- a/src/java/org/apache/log4j/net/SyslogAppender.java +++ b/src/java/org/apache/log4j/net/SyslogAppender.java @@ -261,12 +261,12 @@ void append(LoggingEvent event) { if (layout.ignoresThrowable()) { String[] s = event.getThrowableStrRep(); if (s != null) { - int len = s.length; - if(len > 0) { - sqw.write(s[0]); - for(int i = 1; i < len; i++) { - sqw.write(TAB+s[i].substring(1)); - } + for(int i = 0; i < s.length; i++) { + if (s[i].startsWith("\t")) { + sqw.write(TAB+s[i].substring(1)); + } else { + sqw.write(s[i]); + } } } } diff --git a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java index 402f53f0b1..4b2b269d48 100644 --- a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java +++ b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java @@ -25,14 +25,10 @@ import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.VectorErrorHandler; -import org.apache.log4j.helpers.SyslogWriter; import java.util.StringTokenizer; -import java.io.IOException; import java.net.DatagramSocket; import java.net.DatagramPacket; -import java.net.InetAddress; -import java.net.UnknownHostException; /** @@ -391,8 +387,9 @@ public void testIPv4AndPort() { appender.setSyslogHost("127.0.0.1:1514"); } - - public void testActualLogging() throws Exception { + private static String[] log(final String msg, + final Exception ex, + final int packets) throws Exception { DatagramSocket ds = new DatagramSocket(); ds.setSoTimeout(2000); DatagramPacket p = new DatagramPacket(new byte[1000], 0, 1000); @@ -406,14 +403,63 @@ public void testActualLogging() throws Exception { Logger l = Logger.getRootLogger(); l.addAppender(appender); - l.info("greetings"); + if (ex == null) { + l.info(msg); + } else { + l.error(msg, ex); + } appender.close(); - ds.receive(p); + String[] retval = new String[packets]; + for(int i = 0; i < packets; i++) { + ds.receive(p); + retval[i] = new String(p.getData(), 0, p.getLength()); + } ds.close(); - String s = new String(p.getData(), 0, p.getLength()); + return retval; + } + + public void testActualLogging() throws Exception { + String s = log("greetings", null, 1)[0]; StringTokenizer st = new StringTokenizer(s, "<>() "); assertEquals("14", st.nextToken()); assertEquals("greetings", st.nextToken()); } + /** + * Exception with printStackTrace that breaks earlier SyslogAppender. + */ + private static class MishandledException extends Exception { + /* + * Create new instance. + */ + public MishandledException() { + } + + /** + * Print stack trace. + * @param w print writer, may not be null. + */ + public void printStackTrace(final java.io.PrintWriter w) { + w.println("Mishandled stack trace follows:"); + w.println(""); + w.println("No tab here"); + w.println("\ttab here"); + } + } + + /** + * Tests fix for bug 40502. + * @throws Exception on IOException. + */ + public void testBadTabbing() throws Exception { + String[] s = log("greetings", new MishandledException(), 5); + StringTokenizer st = new StringTokenizer(s[0], "<>() "); + assertEquals("11", st.nextToken()); + assertEquals("greetings", st.nextToken()); + assertEquals("<11>Mishandled stack trace follows:", s[1]); + assertEquals("<11>", s[2]); + assertEquals("<11>No tab here", s[3]); + assertEquals("<11>" + SyslogAppender.TAB + "tab here", s[4]); + } + } From f1c135e5e6b85ac17cbe5a7cc3b0d73e1245d44f Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 22 Feb 2007 21:43:36 +0000 Subject: [PATCH 244/342] Bug 41040: SyslogAppender should prefix message with TIMESTAMP and local hostname git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510660 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/log4j/helpers/SyslogWriter.java | 2 +- .../org/apache/log4j/net/SyslogAppender.java | 104 ++++++++++++++++-- .../apache/log4j/net/SyslogAppenderTest.java | 57 +++++++++- 3 files changed, 150 insertions(+), 13 deletions(-) diff --git a/src/java/org/apache/log4j/helpers/SyslogWriter.java b/src/java/org/apache/log4j/helpers/SyslogWriter.java index f30301b804..ccf1144ac4 100644 --- a/src/java/org/apache/log4j/helpers/SyslogWriter.java +++ b/src/java/org/apache/log4j/helpers/SyslogWriter.java @@ -56,7 +56,7 @@ public class SyslogWriter extends Writer { */ public SyslogWriter(final String syslogHost) { - this.syslogHost = syslogHost; + SyslogWriter.syslogHost = syslogHost; if (syslogHost == null) { throw new NullPointerException("syslogHost"); } diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/java/org/apache/log4j/net/SyslogAppender.java index 6920b0c143..a797ddb28f 100644 --- a/src/java/org/apache/log4j/net/SyslogAppender.java +++ b/src/java/org/apache/log4j/net/SyslogAppender.java @@ -17,10 +17,16 @@ package org.apache.log4j.net; import org.apache.log4j.AppenderSkeleton; -import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.Layout; -import org.apache.log4j.helpers.SyslogWriter; import org.apache.log4j.helpers.SyslogQuietWriter; +import org.apache.log4j.helpers.SyslogWriter; +import org.apache.log4j.spi.LoggingEvent; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.net.InetAddress; +import java.net.UnknownHostException; // Contributors: Yves Bossel // Christopher Taylor @@ -94,6 +100,23 @@ public class SyslogAppender extends AppenderSkeleton { SyslogQuietWriter sqw; String syslogHost; + /** + * If true, the appender will generate the HEADER (timestamp and host name) + * part of the syslog packet. + * @since 1.2.15 + */ + private boolean header = false; + /** + * Date format used if header = true. + * @since 1.2.15 + */ + private final SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd HH:mm:ss ", Locale.ENGLISH); + /** + * Host name used to identify messages from this appender. + * @since 1.2.15 + */ + private String localHostname; + public SyslogAppender() { this.initSyslogFacilityStr(); @@ -252,20 +275,28 @@ void append(LoggingEvent event) { return; } - String buffer = (facilityPrinting? facilityStr : "") + - layout.format(event); + String hdr = getPacketHeader(event.timeStamp); + String packet = layout.format(event); + if(facilityPrinting || hdr.length() > 0) { + StringBuffer buf = new StringBuffer(hdr); + if(facilityPrinting) { + buf.append(facilityStr); + } + buf.append(packet); + packet = buf.toString(); + } sqw.setLevel(event.getLevel().getSyslogEquivalent()); - sqw.write(buffer); + sqw.write(packet); if (layout.ignoresThrowable()) { String[] s = event.getThrowableStrRep(); if (s != null) { for(int i = 0; i < s.length; i++) { if (s[i].startsWith("\t")) { - sqw.write(TAB+s[i].substring(1)); + sqw.write(hdr+TAB+s[i].substring(1)); } else { - sqw.write(s[i]); + sqw.write(hdr+s[i]); } } } @@ -278,6 +309,9 @@ void append(LoggingEvent event) { */ public void activateOptions() { + if (header) { + getLocalHostname(); + } } /** @@ -369,4 +403,60 @@ void setFacilityPrinting(boolean on) { boolean getFacilityPrinting() { return facilityPrinting; } + + /** + * If true, the appender will generate the HEADER part (that is, timestamp and host name) + * of the syslog packet. Default value is false for compatibility with existing behavior, + * however should be true unless there is a specific justification. + * @since 1.2.15 + */ + public final boolean getHeader() { + return header; + } + + /** + * Returns whether the appender produces the HEADER part (that is, timestamp and host name) + * of the syslog packet. + * @since 1.2.15 + */ + public final void setHeader(final boolean val) { + header = val; + } + + /** + * Get the host name used to identify this appender. + * @return local host name + * @since 1.2.15 + */ + private String getLocalHostname() { + if (localHostname == null) { + try { + InetAddress addr = InetAddress.getLocalHost(); + localHostname = addr.getHostName(); + } catch (UnknownHostException uhe) { + localHostname = "UNKNOWN_HOST"; + } + } + return localHostname; + } + + /** + * Gets HEADER portion of packet. + * @param timeStamp number of milliseconds after the standard base time. + * @return HEADER portion of packet, will be zero-length string if header is false. + * @since 1.2.15 + */ + private String getPacketHeader(final long timeStamp) { + if (header) { + StringBuffer buf = new StringBuffer(dateFormat.format(new Date(timeStamp))); + // RFC 3164 says leading space, not leading zero on days 1-9 + if (buf.charAt(4) == '0') { + buf.setCharAt(4, ' '); + } + buf.append(getLocalHostname()); + buf.append(' '); + return buf.toString(); + } + return ""; + } } diff --git a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java index 4b2b269d48..36474c3e19 100644 --- a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java +++ b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java @@ -29,13 +29,17 @@ import java.util.StringTokenizer; import java.net.DatagramSocket; import java.net.DatagramPacket; +import java.text.SimpleDateFormat; +import java.util.Locale; +import java.util.Date; +import java.util.Calendar; /** * Tests for SyslogAppender * - * @author Curt Arnold - **/ + * + * */ public class SyslogAppenderTest extends TestCase { /** * Create new instance of SyslogAppenderTest. @@ -387,7 +391,8 @@ public void testIPv4AndPort() { appender.setSyslogHost("127.0.0.1:1514"); } - private static String[] log(final String msg, + private static String[] log(final boolean header, + final String msg, final Exception ex, final int packets) throws Exception { DatagramSocket ds = new DatagramSocket(); @@ -397,6 +402,7 @@ private static String[] log(final String msg, SyslogAppender appender = new SyslogAppender(); appender.setSyslogHost("localhost:" + ds.getLocalPort()); appender.setName("name"); + appender.setHeader(header); PatternLayout pl = new PatternLayout("%m"); appender.setLayout(pl); appender.activateOptions(); @@ -419,7 +425,7 @@ private static String[] log(final String msg, } public void testActualLogging() throws Exception { - String s = log("greetings", null, 1)[0]; + String s = log(false, "greetings", null, 1)[0]; StringTokenizer st = new StringTokenizer(s, "<>() "); assertEquals("14", st.nextToken()); assertEquals("greetings", st.nextToken()); @@ -444,6 +450,7 @@ public void printStackTrace(final java.io.PrintWriter w) { w.println(""); w.println("No tab here"); w.println("\ttab here"); + w.println("\t"); } } @@ -452,7 +459,7 @@ public void printStackTrace(final java.io.PrintWriter w) { * @throws Exception on IOException. */ public void testBadTabbing() throws Exception { - String[] s = log("greetings", new MishandledException(), 5); + String[] s = log(false, "greetings", new MishandledException(), 6); StringTokenizer st = new StringTokenizer(s[0], "<>() "); assertEquals("11", st.nextToken()); assertEquals("greetings", st.nextToken()); @@ -460,6 +467,46 @@ public void testBadTabbing() throws Exception { assertEquals("<11>", s[2]); assertEquals("<11>No tab here", s[3]); assertEquals("<11>" + SyslogAppender.TAB + "tab here", s[4]); + assertEquals("<11>" + SyslogAppender.TAB, s[5]); + } + + /** + * Tests presence of timestamp if header = true. + * + * @throws Exception if IOException. + */ + public void testHeaderLogging() throws Exception { + Date preDate = new Date(); + String s = log(true, "greetings", null, 1)[0]; + Date postDate = new Date(); + assertEquals("<14>", s.substring(0, 4)); + + String syslogDateStr = s.substring(4, 20); + SimpleDateFormat fmt = new SimpleDateFormat("MMM dd HH:mm:ss ", Locale.ENGLISH); + Date syslogDate = fmt.parse(syslogDateStr); + Calendar cal = Calendar.getInstance(Locale.ENGLISH); + cal.setTime(syslogDate); + int syslogMonth = cal.get(Calendar.MONTH); + int syslogDay = cal.get(Calendar.DATE); + if (syslogDay < 10) { + assertEquals(' ', syslogDateStr.charAt(4)); + } + cal.setTime(preDate); + int preMonth = cal.get(Calendar.MONTH); + cal.set(Calendar.MILLISECOND, 0); + preDate = cal.getTime(); + int syslogYear; + if (preMonth == syslogMonth) { + syslogYear = cal.get(Calendar.YEAR); + } else { + cal.setTime(postDate); + syslogYear = cal.get(Calendar.YEAR); + } + cal.setTime(syslogDate); + cal.set(Calendar.YEAR, syslogYear); + syslogDate = cal.getTime(); + assertTrue(syslogDate.compareTo(preDate) >= 0); + assertTrue(syslogDate.compareTo(postDate) <= 0); } } From 3331c967c4dc5f28f098f7b288b9c3bcdd85edfd Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 22 Feb 2007 22:35:24 +0000 Subject: [PATCH 245/342] Bug 40161: SyslogAppender is not logging header of the layout git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510695 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/net/SyslogAppender.java | 40 +++++++++++++++++++ .../apache/log4j/net/SyslogAppenderTest.java | 33 +++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/java/org/apache/log4j/net/SyslogAppender.java index a797ddb28f..2bb6942eef 100644 --- a/src/java/org/apache/log4j/net/SyslogAppender.java +++ b/src/java/org/apache/log4j/net/SyslogAppender.java @@ -117,6 +117,11 @@ public class SyslogAppender extends AppenderSkeleton { */ private String localHostname; + /** + * Set to true after the header of the layout has been sent or if it has none. + */ + private boolean layoutHeaderChecked = false; + public SyslogAppender() { this.initSyslogFacilityStr(); @@ -146,6 +151,9 @@ void close() { closed = true; if (sqw != null) { try { + if (layoutHeaderChecked && layout != null && layout.getFooter() != null) { + sendLayoutMessage(layout.getFooter()); + } sqw.close(); sqw = null; } catch(java.io.IOException ex) { @@ -275,6 +283,13 @@ void append(LoggingEvent event) { return; } + if (!layoutHeaderChecked) { + if (layout != null && layout.getHeader() != null) { + sendLayoutMessage(layout.getHeader()); + } + layoutHeaderChecked = true; + } + String hdr = getPacketHeader(event.timeStamp); String packet = layout.format(event); if(facilityPrinting || hdr.length() > 0) { @@ -312,6 +327,10 @@ void activateOptions() { if (header) { getLocalHostname(); } + if (layout != null && layout.getHeader() != null) { + sendLayoutMessage(layout.getHeader()); + } + layoutHeaderChecked = true; } /** @@ -459,4 +478,25 @@ private String getPacketHeader(final long timeStamp) { } return ""; } + + /** + * Set header or footer of layout. + * @param msg message body, may not be null. + */ + private void sendLayoutMessage(final String msg) { + if (sqw != null) { + String packet = msg; + String hdr = getPacketHeader(new Date().getTime()); + if(facilityPrinting || hdr.length() > 0) { + StringBuffer buf = new StringBuffer(hdr); + if(facilityPrinting) { + buf.append(facilityStr); + } + buf.append(msg); + packet = buf.toString(); + } + sqw.setLevel(6); + sqw.write(packet); + } + } } diff --git a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java index 36474c3e19..ea98d2fe47 100644 --- a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java +++ b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java @@ -25,6 +25,7 @@ import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.VectorErrorHandler; +import org.apache.log4j.HTMLLayout; import java.util.StringTokenizer; import java.net.DatagramSocket; @@ -509,4 +510,36 @@ public void testHeaderLogging() throws Exception { assertTrue(syslogDate.compareTo(postDate) <= 0); } + + /** + * Tests that any header or footer in layout is sent. + * @throws Exception if exception during test. + */ + public void testLayoutHeader() throws Exception { + DatagramSocket ds = new DatagramSocket(); + ds.setSoTimeout(2000); + DatagramPacket p = new DatagramPacket(new byte[1000], 0, 1000); + + SyslogAppender appender = new SyslogAppender(); + appender.setSyslogHost("localhost:" + ds.getLocalPort()); + appender.setName("name"); + appender.setHeader(false); + HTMLLayout pl = new HTMLLayout(); + appender.setLayout(pl); + appender.activateOptions(); + + Logger l = Logger.getRootLogger(); + l.addAppender(appender); + l.info("Hello, World"); + appender.close(); + String[] s = new String[3]; + for(int i = 0; i < 3; i++) { + ds.receive(p); + s[i] = new String(p.getData(), 0, p.getLength()); + } + ds.close(); + assertEquals("<14>
    ", s[2].substring(0,12)); + } + } From 6faddc887151cdb2974c3011410036aa5bf25e24 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 22 Feb 2007 23:29:10 +0000 Subject: [PATCH 246/342] Bug 40937: Use String.toUpper/Lower case with locale git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510707 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/Level.java | 4 +++ .../src/java/org/apache/log4j/LevelTest.java | 23 ++++++++++++++++ .../java/org/apache/log4j/PriorityTest.java | 26 +++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/src/java/org/apache/log4j/Level.java b/src/java/org/apache/log4j/Level.java index f1efb3c8d8..3e3649e2a7 100644 --- a/src/java/org/apache/log4j/Level.java +++ b/src/java/org/apache/log4j/Level.java @@ -166,6 +166,10 @@ Level toLevel(String sArg, Level defaultLevel) { if(s.equals("FATAL")) return Level.FATAL; if(s.equals("OFF")) return Level.OFF; if(s.equals("TRACE")) return Level.TRACE; + // + // For Turkish i problem, see bug 40937 + // + if(s.equals("\u0130NFO")) return Level.INFO; return defaultLevel; } diff --git a/tests/src/java/org/apache/log4j/LevelTest.java b/tests/src/java/org/apache/log4j/LevelTest.java index 64903eaa88..acd959ea0f 100644 --- a/tests/src/java/org/apache/log4j/LevelTest.java +++ b/tests/src/java/org/apache/log4j/LevelTest.java @@ -19,6 +19,7 @@ import junit.framework.TestCase; import org.apache.log4j.util.SerializationTestHelper; +import java.util.Locale; /** @@ -239,4 +240,26 @@ public void testToLevelNull() { assertEquals("FATAL", level.toString()); } + /** + * Test that dotless lower I + "nfo" is recognized as INFO. + */ + public void testDotlessLowerI() { + Level level = Level.toLevel("\u0131nfo"); + assertEquals("INFO", level.toString()); + } + + /** + * Test that dotted lower I + "nfo" is recognized as INFO + * even in Turkish locale. + */ + public void testDottedLowerI() { + Locale defaultLocale = Locale.getDefault(); + Locale turkey = new Locale("tr"); + Locale.setDefault(turkey); + Level level = Level.toLevel("info"); + Locale.setDefault(defaultLocale); + assertEquals("INFO", level.toString()); + } + + } diff --git a/tests/src/java/org/apache/log4j/PriorityTest.java b/tests/src/java/org/apache/log4j/PriorityTest.java index fe1105a712..d79a6d8520 100644 --- a/tests/src/java/org/apache/log4j/PriorityTest.java +++ b/tests/src/java/org/apache/log4j/PriorityTest.java @@ -18,6 +18,8 @@ import junit.framework.TestCase; +import java.util.Locale; + /** * Tests of Priority. @@ -182,4 +184,28 @@ public void testToPriorityStringPriority() { public void testToPriorityIntPriority() { assertTrue(Priority.toPriority(17, Priority.DEBUG) == Priority.DEBUG); } + + /** + * Test that dotless lower I + "nfo" is recognized as INFO. + * @deprecated + */ + public void testDotlessLowerI() { + Priority level = Priority.toPriority("\u0131nfo"); + assertEquals("INFO", level.toString()); + } + + /** + * Test that dotted lower I + "nfo" is recognized as INFO + * even in Turkish locale. + * @deprecated + */ + public void testDottedLowerI() { + Locale defaultLocale = Locale.getDefault(); + Locale turkey = new Locale("tr"); + Locale.setDefault(turkey); + Priority level = Priority.toPriority("info"); + Locale.setDefault(defaultLocale); + assertEquals("INFO", level.toString()); + } + } From 500031453aee3ef5c418871823afa90243d63715 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 22 Feb 2007 23:39:55 +0000 Subject: [PATCH 247/342] Bug 41339: Javadoc of PatternLayout should use %n in TTCC layout examples git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510710 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/PatternLayout.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/log4j/PatternLayout.java b/src/java/org/apache/log4j/PatternLayout.java index 034431b038..526c90565c 100644 --- a/src/java/org/apache/log4j/PatternLayout.java +++ b/src/java/org/apache/log4j/PatternLayout.java @@ -369,10 +369,10 @@ reached. The default is to pad on the left (right justify) but you

    -

    %r [%t] %-5p %c %x - %m\n +

    %r [%t] %-5p %c %x - %m%n

    This is essentially the TTCC layout. -

    %-6r [%15.15t] %-5p %30.30c %x - %m\n +

    %-6r [%15.15t] %-5p %30.30c %x - %m%n

    Similar to the TTCC layout except that the relative time is right padded if less than 6 digits, thread name is right padded if From 49ba18f09bc7a5c4c263875715df15a9abc3cc19 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 22 Feb 2007 23:52:25 +0000 Subject: [PATCH 248/342] Bug 41373: DateLayoutTest fails if default Locale is not en_US git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510719 13f79535-47bb-0310-9956-ffa450edef68 --- tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java b/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java index 5608a314ec..704fb7127e 100644 --- a/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java +++ b/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java @@ -242,7 +242,9 @@ public void testDateTimeFormat() { calendar.clear(); calendar.set(1970, 0, 1, 0, 0, 0); String actual = format.format(calendar.getTime()); - assertEquals("01 Jan 1970 00:00:00,000", actual); + SimpleDateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm:ss,SSS"); + String expected = df.format(calendar.getTime()); + assertEquals(expected, actual); } /** From 3d4f2add66afc35cc8c0ccc76a3dd6e6bf269202 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 23 Feb 2007 00:06:40 +0000 Subject: [PATCH 249/342] Bug 41487: Warning when configuring inner-class logger git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510723 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/xml/log4j.dtd | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/java/org/apache/log4j/xml/log4j.dtd b/src/java/org/apache/log4j/xml/log4j.dtd index d92a6e7bc6..0b3957aa34 100644 --- a/src/java/org/apache/log4j/xml/log4j.dtd +++ b/src/java/org/apache/log4j/xml/log4j.dtd @@ -27,7 +27,7 @@ element. --> @@ -45,7 +45,7 @@ element. --> @@ -71,7 +71,7 @@ element. --> @@ -109,7 +109,7 @@ element. --> @@ -120,7 +120,7 @@ element. --> From 9783c8611ad5a1cbfe3471c72e51bcf5d00f10de Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 23 Feb 2007 03:22:09 +0000 Subject: [PATCH 250/342] Remove stray .cvsignores git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510790 13f79535-47bb-0310-9956-ffa450edef68 --- .cvsignore | 2 -- build/.cvsignore | 1 - docs/.cvsignore | 1 - examples/.cvsignore | 1 - src/java/org/apache/log4j/xml/.cvsignore | 1 - src/java/org/apache/log4j/xml/examples/.cvsignore | 1 - src/java/org/apache/log4j/xml/test/.cvsignore | 3 --- 7 files changed, 10 deletions(-) delete mode 100644 .cvsignore delete mode 100644 build/.cvsignore delete mode 100644 docs/.cvsignore delete mode 100644 examples/.cvsignore delete mode 100644 src/java/org/apache/log4j/xml/.cvsignore delete mode 100644 src/java/org/apache/log4j/xml/examples/.cvsignore delete mode 100644 src/java/org/apache/log4j/xml/test/.cvsignore diff --git a/.cvsignore b/.cvsignore deleted file mode 100644 index a618cc229c..0000000000 --- a/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -goEnv* -dist \ No newline at end of file diff --git a/build/.cvsignore b/build/.cvsignore deleted file mode 100644 index 8c25bff4e7..0000000000 --- a/build/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -velocity.log \ No newline at end of file diff --git a/docs/.cvsignore b/docs/.cvsignore deleted file mode 100644 index 9e5bfb42d2..0000000000 --- a/docs/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -api \ No newline at end of file diff --git a/examples/.cvsignore b/examples/.cvsignore deleted file mode 100644 index f590ca415d..0000000000 --- a/examples/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -doc-files \ No newline at end of file diff --git a/src/java/org/apache/log4j/xml/.cvsignore b/src/java/org/apache/log4j/xml/.cvsignore deleted file mode 100644 index f590ca415d..0000000000 --- a/src/java/org/apache/log4j/xml/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -doc-files \ No newline at end of file diff --git a/src/java/org/apache/log4j/xml/examples/.cvsignore b/src/java/org/apache/log4j/xml/examples/.cvsignore deleted file mode 100644 index f590ca415d..0000000000 --- a/src/java/org/apache/log4j/xml/examples/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -doc-files \ No newline at end of file diff --git a/src/java/org/apache/log4j/xml/test/.cvsignore b/src/java/org/apache/log4j/xml/test/.cvsignore deleted file mode 100644 index 31efc8c599..0000000000 --- a/src/java/org/apache/log4j/xml/test/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -output* -temp* -current.reg \ No newline at end of file From 75aed2cf444f0654fd7f596dbd3e0e5bf24f9416 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 23 Feb 2007 05:09:14 +0000 Subject: [PATCH 251/342] Bug 40944: PropertyConfigurator.configure(URL) does not close the resource stream git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510831 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/log4j/PropertyConfigurator.java | 28 ++++++- tests/.cvsignore | 5 -- .../java/org/apache/log4j/CoreTestSuite.java | 1 + .../log4j/PropertyConfiguratorTest.java | 82 +++++++++++++++++++ 4 files changed, 107 insertions(+), 9 deletions(-) delete mode 100644 tests/.cvsignore create mode 100644 tests/src/java/org/apache/log4j/PropertyConfiguratorTest.java diff --git a/src/java/org/apache/log4j/PropertyConfigurator.java b/src/java/org/apache/log4j/PropertyConfigurator.java index 074637d4fe..82eef0d53e 100644 --- a/src/java/org/apache/log4j/PropertyConfigurator.java +++ b/src/java/org/apache/log4j/PropertyConfigurator.java @@ -38,6 +38,7 @@ import java.util.Properties; import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.util.StringTokenizer; import java.util.Hashtable; @@ -302,15 +303,24 @@ public class PropertyConfigurator implements Configurator { public void doConfigure(String configFileName, LoggerRepository hierarchy) { Properties props = new Properties(); + FileInputStream istream = null; try { - FileInputStream istream = new FileInputStream(configFileName); + istream = new FileInputStream(configFileName); props.load(istream); istream.close(); } - catch (IOException e) { + catch (Exception e) { LogLog.error("Could not read configuration file ["+configFileName+"].", e); LogLog.error("Ignoring configuration file [" + configFileName+"]."); return; + } finally { + if(istream != null) { + try { + istream.close(); + } catch(Throwable ignore) { + } + + } } // If we reach here, then the config file is alright. doConfigure(props, hierarchy); @@ -429,15 +439,25 @@ void doConfigure(Properties properties, LoggerRepository hierarchy) { void doConfigure(java.net.URL configURL, LoggerRepository hierarchy) { Properties props = new Properties(); LogLog.debug("Reading configuration from URL " + configURL); + InputStream istream = null; try { - props.load(configURL.openStream()); + istream = configURL.openStream(); + props.load(istream); } - catch (java.io.IOException e) { + catch (Exception e) { LogLog.error("Could not read configuration file from URL [" + configURL + "].", e); LogLog.error("Ignoring configuration file [" + configURL +"]."); return; } + finally { + if (istream != null) { + try { + istream.close(); + } catch(Exception ignore) { + } + } + } doConfigure(props, hierarchy); } diff --git a/tests/.cvsignore b/tests/.cvsignore deleted file mode 100644 index d67211993a..0000000000 --- a/tests/.cvsignore +++ /dev/null @@ -1,5 +0,0 @@ -output -classes -build.properties -coverage -log4j.db* diff --git a/tests/src/java/org/apache/log4j/CoreTestSuite.java b/tests/src/java/org/apache/log4j/CoreTestSuite.java index 204ee8986c..fafe496393 100644 --- a/tests/src/java/org/apache/log4j/CoreTestSuite.java +++ b/tests/src/java/org/apache/log4j/CoreTestSuite.java @@ -47,6 +47,7 @@ public static Test suite() { s.addTestSuite(org.apache.log4j.PatternLayoutTest.class); s.addTestSuite(org.apache.log4j.spi.LoggingEventTest.class); s.addTestSuite(org.apache.log4j.spi.ThrowableInformationTest.class); + s.addTestSuite(org.apache.log4j.PropertyConfigurator.class); return s; } } diff --git a/tests/src/java/org/apache/log4j/PropertyConfiguratorTest.java b/tests/src/java/org/apache/log4j/PropertyConfiguratorTest.java new file mode 100644 index 0000000000..23c4b573e8 --- /dev/null +++ b/tests/src/java/org/apache/log4j/PropertyConfiguratorTest.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.log4j; +import java.io.*; +import junit.framework.*; +import org.apache.log4j.PropertyConfigurator; +import java.net.URL; + +/** + * Test property configurator. + * + */ +public class PropertyConfiguratorTest extends TestCase { + public PropertyConfiguratorTest(final String testName) { + super(testName); + } + + /** + * Test for bug 19108. + * Did not catch IllegalArgumentException on Properties.load + * and close input stream. + * @throws IOException if IOException creating properties file. + */ + public void testBadUnicodeEscape() throws IOException { + String fileName = "output/badescape.properties"; + FileWriter writer = new FileWriter(fileName); + writer.write("log4j.rootLogger=\\uXX41"); + writer.close(); + PropertyConfigurator.configure(fileName); + File file = new File(fileName); + assertTrue(file.delete()) ; + assertFalse(file.exists()); + } + + /** + * Test for bug 19108. + * configure(URL) never closed opened stream. + * @throws IOException if IOException creating properties file. + */ + public void testURL() throws IOException { + File file = new File("output/unclosed.properties"); + FileWriter writer = new FileWriter(file); + writer.write("log4j.rootLogger=debug"); + writer.close(); + URL url = file.toURL(); + PropertyConfigurator.configure(url); + assertTrue(file.delete()); + assertFalse(file.exists()); + } + + /** + * Test for bug 19108. + * configure(URL) did not catch IllegalArgumentException and + * did not close stream. + * @throws IOException if IOException creating properties file. + */ + public void testURLBadEscape() throws IOException { + File file = new File("output/urlbadescape.properties"); + FileWriter writer = new FileWriter(file); + writer.write("log4j.rootLogger=\\uXX41"); + writer.close(); + URL url = file.toURL(); + PropertyConfigurator.configure(url); + assertTrue(file.delete()); + assertFalse(file.exists()); + } + +} From b9d98bf548f0869133ff59aad4aacec24662598f Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 23 Feb 2007 06:18:39 +0000 Subject: [PATCH 252/342] Bug 40944: PropertyConfigurator.configure(URL) does not close resource stream git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@510845 13f79535-47bb-0310-9956-ffa450edef68 --- tests/src/java/org/apache/log4j/CoreTestSuite.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/src/java/org/apache/log4j/CoreTestSuite.java b/tests/src/java/org/apache/log4j/CoreTestSuite.java index fafe496393..51ebfb0630 100644 --- a/tests/src/java/org/apache/log4j/CoreTestSuite.java +++ b/tests/src/java/org/apache/log4j/CoreTestSuite.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -47,7 +48,7 @@ public static Test suite() { s.addTestSuite(org.apache.log4j.PatternLayoutTest.class); s.addTestSuite(org.apache.log4j.spi.LoggingEventTest.class); s.addTestSuite(org.apache.log4j.spi.ThrowableInformationTest.class); - s.addTestSuite(org.apache.log4j.PropertyConfigurator.class); + s.addTestSuite(org.apache.log4j.PropertyConfiguratorTest.class); return s; } } From e4bb5e96052e534613fcd43f74efba6e12339d32 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 23 Feb 2007 17:48:53 +0000 Subject: [PATCH 253/342] Bug 40755: Update source per ASF Header Policy git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@511036 13f79535-47bb-0310-9956-ffa450edef68 --- NOTICE | 7 +++++-- build.properties.sample | 15 +++++++++++++++ build.xml | 17 +++++++++++++++++ contribs/CekiGulcu/AppenderTable.java | 11 ++++++----- contribs/CekiGulcu/Transform.java | 11 ++++++----- contribs/EirikLygre/DailyFileAppender1.java | 11 ++++++----- contribs/JamesHouse/LogTextPanel.java | 11 ++++++----- contribs/JamesHouse/LogTextPanelExample.java | 11 ++++++----- contribs/JamesHouse/TextPanelAppender.java | 11 ++++++----- contribs/Jamie Tsao/JMSQueueAppender.java | 11 ++++++----- contribs/JimMoore/LoggingOutputStream.java | 11 ++++++----- .../KevinSteppe/CompositeRollingAppender.java | 11 ++++++----- contribs/KevinSteppe/JDBCTest.java | 11 ++++++----- .../KitchingSimon/DatagramStringAppender.java | 11 ++++++----- .../KitchingSimon/DatagramStringWriter.java | 11 ++++++----- .../SingleLineTracerPrintWriter.java | 11 ++++++----- contribs/LeosLiterak/TempFileAppender.java | 11 ++++++----- contribs/MarkDouglas/SocketNode2.java | 11 ++++++----- contribs/MarkDouglas/SocketServer2.java | 11 ++++++----- contribs/SvenReimers/gui/JListView.java | 11 ++++++----- contribs/SvenReimers/gui/JTableAppender.java | 11 ++++++----- .../SvenReimers/gui/TextPaneAppender.java | 11 ++++++----- .../gui/examples/TextPaneAppenderExample.java | 11 ++++++----- contribs/ThomasFenner/JDBCAppender.java | 11 ++++++----- .../ThomasFenner/JDBCConnectionHandler.java | 11 ++++++----- contribs/ThomasFenner/JDBCIDHandler.java | 11 ++++++----- contribs/ThomasFenner/JDBCLogger.java | 11 ++++++----- contribs/ThomasFenner/Log4JTest.java | 11 ++++++----- contribs/ThomasFenner/code_example1.java | 11 ++++++----- contribs/ThomasFenner/code_example2.java | 11 ++++++----- .../VolkerMentzner/HTTPRequestHandler.java | 11 ++++++----- .../VolkerMentzner/Log4jRequestHandler.java | 11 ++++++----- .../VolkerMentzner/PluggableHTTPServer.java | 11 ++++++----- .../VolkerMentzner/RootRequestHandler.java | 11 ++++++----- .../UserDialogRequestHandler.java | 11 ++++++----- examples/MyPatternLayout.java | 11 ++++++----- examples/MyPatternParser.java | 11 ++++++----- examples/NumberCruncher.java | 11 ++++++----- examples/NumberCruncherClient.java | 11 ++++++----- examples/NumberCruncherServer.java | 11 ++++++----- examples/Sort.java | 11 ++++++----- examples/SortAlgo.java | 11 ++++++----- examples/Trivial.java | 11 ++++++----- examples/customLevel/XLevel.java | 11 ++++++----- examples/factor.html | 17 +++++++++++++++++ examples/factor.lcf | 18 ++++++++++++++++++ .../InitUsingDefaultConfigurator.java | 11 ++++++----- .../InitUsingLog4JProperties.java | 11 ++++++----- .../InitUsingMultipleAppenders.java | 11 ++++++----- .../InitUsingPropertiesFile.java | 11 ++++++----- .../InitUsingXMLPropertiesFile.java | 11 ++++++----- .../CustomizedLogLevels.java | 11 ++++++----- .../UsingLogMonitorAdapter.java | 11 ++++++----- .../UsingSocketAppenders.java | 11 ++++++----- examples/mycat.bad | 14 ++++++++++++++ examples/mycat.good | 16 ++++++++++++++++ examples/package.html | 17 +++++++++++++++++ examples/sort1.properties | 16 ++++++++++++++++ examples/sort2.properties | 16 ++++++++++++++++ examples/sort3.properties | 16 ++++++++++++++++ examples/sort4.properties | 16 ++++++++++++++++ examples/subclass/MyLogger.java | 11 ++++++----- examples/subclass/MyLoggerFactory.java | 11 ++++++----- examples/subclass/MyLoggerTest.java | 11 ++++++----- pom.xml | 2 +- src/java/org/apache/log4j/Appender.java | 11 ++++++----- .../org/apache/log4j/AppenderSkeleton.java | 11 ++++++----- src/java/org/apache/log4j/AsyncAppender.java | 11 ++++++----- .../org/apache/log4j/BasicConfigurator.java | 11 ++++++----- src/java/org/apache/log4j/Category.java | 11 ++++++----- src/java/org/apache/log4j/CategoryKey.java | 11 ++++++----- .../org/apache/log4j/ConsoleAppender.java | 11 ++++++----- .../log4j/DailyRollingFileAppender.java | 11 ++++++----- .../apache/log4j/DefaultCategoryFactory.java | 11 ++++++----- src/java/org/apache/log4j/Dispatcher.java | 11 ++++++----- src/java/org/apache/log4j/FileAppender.java | 11 ++++++----- src/java/org/apache/log4j/HTMLLayout.java | 11 ++++++----- src/java/org/apache/log4j/Hierarchy.java | 11 ++++++----- src/java/org/apache/log4j/Layout.java | 11 ++++++----- src/java/org/apache/log4j/Level.java | 11 ++++++----- src/java/org/apache/log4j/LogManager.java | 11 ++++++----- src/java/org/apache/log4j/Logger.java | 11 ++++++----- src/java/org/apache/log4j/MDC.java | 11 ++++++----- src/java/org/apache/log4j/NDC.java | 11 ++++++----- src/java/org/apache/log4j/PatternLayout.java | 11 ++++++----- src/java/org/apache/log4j/Priority.java | 11 ++++++----- .../apache/log4j/PropertyConfigurator.java | 11 ++++++----- src/java/org/apache/log4j/ProvisionNode.java | 11 ++++++----- .../org/apache/log4j/RollingFileAppender.java | 11 ++++++----- src/java/org/apache/log4j/SimpleLayout.java | 11 ++++++----- src/java/org/apache/log4j/TTCCLayout.java | 11 ++++++----- src/java/org/apache/log4j/WriterAppender.java | 11 ++++++----- .../apache/log4j/chainsaw/ControlPanel.java | 11 ++++++----- .../apache/log4j/chainsaw/DetailPanel.java | 11 ++++++----- .../apache/log4j/chainsaw/EventDetails.java | 11 ++++++----- .../org/apache/log4j/chainsaw/ExitAction.java | 11 ++++++----- .../apache/log4j/chainsaw/LoadXMLAction.java | 11 ++++++----- .../log4j/chainsaw/LoggingReceiver.java | 11 ++++++----- src/java/org/apache/log4j/chainsaw/Main.java | 11 ++++++----- .../apache/log4j/chainsaw/MyTableModel.java | 11 ++++++----- .../apache/log4j/chainsaw/XMLFileHandler.java | 11 ++++++----- .../apache/log4j/config/PropertyGetter.java | 11 ++++++----- .../apache/log4j/config/PropertyPrinter.java | 11 ++++++----- .../apache/log4j/config/PropertySetter.java | 11 ++++++----- .../log4j/config/PropertySetterException.java | 11 ++++++----- .../log4j/helpers/AbsoluteTimeDateFormat.java | 11 ++++++----- .../log4j/helpers/AppenderAttachableImpl.java | 11 ++++++----- .../org/apache/log4j/helpers/BoundedFIFO.java | 11 ++++++----- .../log4j/helpers/CountingQuietWriter.java | 11 ++++++----- .../apache/log4j/helpers/CyclicBuffer.java | 11 ++++++----- .../org/apache/log4j/helpers/DateLayout.java | 11 ++++++----- .../log4j/helpers/DateTimeDateFormat.java | 11 ++++++----- .../apache/log4j/helpers/FileWatchdog.java | 11 ++++++----- .../apache/log4j/helpers/FormattingInfo.java | 11 ++++++----- .../log4j/helpers/ISO8601DateFormat.java | 11 ++++++----- src/java/org/apache/log4j/helpers/Loader.java | 11 ++++++----- src/java/org/apache/log4j/helpers/LogLog.java | 11 ++++++----- .../apache/log4j/helpers/NullEnumeration.java | 11 ++++++----- .../log4j/helpers/OnlyOnceErrorHandler.java | 11 ++++++----- .../apache/log4j/helpers/OptionConverter.java | 11 ++++++----- .../log4j/helpers/PatternConverter.java | 11 ++++++----- .../apache/log4j/helpers/PatternParser.java | 11 ++++++----- .../org/apache/log4j/helpers/QuietWriter.java | 11 ++++++----- .../log4j/helpers/RelativeTimeDateFormat.java | 11 ++++++----- .../log4j/helpers/SyslogQuietWriter.java | 11 ++++++----- .../apache/log4j/helpers/SyslogWriter.java | 11 ++++++----- .../apache/log4j/helpers/ThreadLocalMap.java | 11 ++++++----- .../org/apache/log4j/helpers/Transform.java | 11 ++++++----- .../org/apache/log4j/jdbc/JDBCAppender.java | 11 ++++++----- .../log4j/jmx/AbstractDynamicMBean.java | 11 ++++++----- src/java/org/apache/log4j/jmx/Agent.java | 11 ++++++----- .../log4j/jmx/AppenderDynamicMBean.java | 11 ++++++----- .../log4j/jmx/HierarchyDynamicMBean.java | 11 ++++++----- .../apache/log4j/jmx/LayoutDynamicMBean.java | 11 ++++++----- .../apache/log4j/jmx/LoggerDynamicMBean.java | 11 ++++++----- .../org/apache/log4j/jmx/MethodUnion.java | 11 ++++++----- .../apache/log4j/lf5/AppenderFinalizer.java | 11 ++++++----- .../log4j/lf5/DefaultLF5Configurator.java | 11 ++++++----- .../org/apache/log4j/lf5/LF5Appender.java | 11 ++++++----- .../org/apache/log4j/lf5/Log4JLogRecord.java | 11 ++++++----- src/java/org/apache/log4j/lf5/LogLevel.java | 11 ++++++----- .../log4j/lf5/LogLevelFormatException.java | 11 ++++++----- src/java/org/apache/log4j/lf5/LogRecord.java | 11 ++++++----- .../org/apache/log4j/lf5/LogRecordFilter.java | 11 ++++++----- .../log4j/lf5/PassingLogRecordFilter.java | 11 ++++++----- .../org/apache/log4j/lf5/StartLogFactor5.java | 11 ++++++----- .../log4j/lf5/util/AdapterLogRecord.java | 11 ++++++----- .../log4j/lf5/util/DateFormatManager.java | 11 ++++++----- .../apache/log4j/lf5/util/LogFileParser.java | 11 ++++++----- .../log4j/lf5/util/LogMonitorAdapter.java | 11 ++++++----- .../org/apache/log4j/lf5/util/Resource.java | 11 ++++++----- .../apache/log4j/lf5/util/ResourceUtils.java | 11 ++++++----- .../apache/log4j/lf5/util/StreamUtils.java | 11 ++++++----- .../lf5/viewer/FilteredLogTableModel.java | 11 ++++++----- .../log4j/lf5/viewer/LF5SwingUtils.java | 11 ++++++----- .../log4j/lf5/viewer/LogBrokerMonitor.java | 11 ++++++----- .../log4j/lf5/viewer/LogFactor5Dialog.java | 11 ++++++----- .../lf5/viewer/LogFactor5ErrorDialog.java | 11 ++++++----- .../lf5/viewer/LogFactor5InputDialog.java | 11 ++++++----- .../lf5/viewer/LogFactor5LoadingDialog.java | 11 ++++++----- .../org/apache/log4j/lf5/viewer/LogTable.java | 11 ++++++----- .../log4j/lf5/viewer/LogTableColumn.java | 11 ++++++----- .../viewer/LogTableColumnFormatException.java | 11 ++++++----- .../log4j/lf5/viewer/LogTableModel.java | 11 ++++++----- .../log4j/lf5/viewer/LogTableRowRenderer.java | 11 ++++++----- .../viewer/TrackingAdjustmentListener.java | 11 ++++++----- .../CategoryAbstractCellEditor.java | 11 ++++++----- .../categoryexplorer/CategoryElement.java | 11 ++++++----- .../CategoryExplorerLogRecordFilter.java | 11 ++++++----- .../CategoryExplorerModel.java | 11 ++++++----- .../CategoryExplorerTree.java | 11 ++++++----- .../CategoryImmediateEditor.java | 11 ++++++----- .../viewer/categoryexplorer/CategoryNode.java | 11 ++++++----- .../categoryexplorer/CategoryNodeEditor.java | 11 ++++++----- .../CategoryNodeEditorRenderer.java | 11 ++++++----- .../CategoryNodeRenderer.java | 11 ++++++----- .../viewer/categoryexplorer/CategoryPath.java | 11 ++++++----- .../categoryexplorer/TreeModelAdapter.java | 11 ++++++----- .../configure/ConfigurationManager.java | 11 ++++++----- .../lf5/viewer/configure/MRUFileManager.java | 11 ++++++----- .../org/apache/log4j/net/JMSAppender.java | 11 ++++++----- src/java/org/apache/log4j/net/JMSSink.java | 11 ++++++----- .../org/apache/log4j/net/SMTPAppender.java | 11 ++++++----- .../apache/log4j/net/SimpleSocketServer.java | 11 ++++++----- .../org/apache/log4j/net/SocketAppender.java | 11 ++++++----- .../apache/log4j/net/SocketHubAppender.java | 11 ++++++----- src/java/org/apache/log4j/net/SocketNode.java | 11 ++++++----- .../org/apache/log4j/net/SocketServer.java | 11 ++++++----- .../org/apache/log4j/net/SyslogAppender.java | 11 ++++++----- .../org/apache/log4j/net/TelnetAppender.java | 11 ++++++----- src/java/org/apache/log4j/net/test/Loop.java | 11 ++++++----- .../org/apache/log4j/net/test/SMTPMin.java | 11 ++++++----- .../org/apache/log4j/net/test/SocketMin.java | 11 ++++++----- .../org/apache/log4j/net/test/SyslogMin.java | 11 ++++++----- .../apache/log4j/nt/NTEventLogAppender.java | 11 ++++++----- .../org/apache/log4j/nt/NTEventLogAppender.rc | 4 ++-- src/java/org/apache/log4j/nt/nteventlog.cpp | 11 ++++++----- .../org/apache/log4j/or/DefaultRenderer.java | 11 ++++++----- .../org/apache/log4j/or/ObjectRenderer.java | 11 ++++++----- src/java/org/apache/log4j/or/RendererMap.java | 11 ++++++----- .../apache/log4j/or/ThreadGroupRenderer.java | 11 ++++++----- .../apache/log4j/or/jms/MessageRenderer.java | 11 ++++++----- .../log4j/or/sax/AttributesRenderer.java | 11 ++++++----- .../log4j/performance/ListVsVector.java | 11 ++++++----- .../apache/log4j/performance/NOPWriter.java | 11 ++++++----- .../apache/log4j/performance/NewVsSetLen.java | 11 ++++++----- .../log4j/performance/NullAppender.java | 11 ++++++----- .../apache/log4j/performance/SystemTime.java | 11 ++++++----- .../apache/log4j/spi/AppenderAttachable.java | 11 ++++++----- .../org/apache/log4j/spi/Configurator.java | 11 ++++++----- .../log4j/spi/DefaultRepositorySelector.java | 11 ++++++----- src/java/org/apache/log4j/spi/ErrorCode.java | 11 ++++++----- .../org/apache/log4j/spi/ErrorHandler.java | 11 ++++++----- src/java/org/apache/log4j/spi/Filter.java | 11 ++++++----- .../log4j/spi/HierarchyEventListener.java | 11 ++++++----- .../org/apache/log4j/spi/LocationInfo.java | 11 ++++++----- .../org/apache/log4j/spi/LoggerFactory.java | 11 ++++++----- .../apache/log4j/spi/LoggerRepository.java | 11 ++++++----- .../org/apache/log4j/spi/LoggingEvent.java | 11 ++++++----- .../org/apache/log4j/spi/OptionHandler.java | 11 ++++++----- .../org/apache/log4j/spi/RendererSupport.java | 11 ++++++----- .../apache/log4j/spi/RepositorySelector.java | 11 ++++++----- .../org/apache/log4j/spi/RootCategory.java | 11 ++++++----- src/java/org/apache/log4j/spi/RootLogger.java | 11 ++++++----- .../log4j/spi/ThrowableInformation.java | 11 ++++++----- .../log4j/spi/TriggeringEventEvaluator.java | 11 ++++++----- .../org/apache/log4j/varia/DenyAllFilter.java | 11 ++++++----- .../varia/ExternallyRolledFileAppender.java | 11 ++++++----- .../log4j/varia/FallbackErrorHandler.java | 11 ++++++----- .../apache/log4j/varia/LevelMatchFilter.java | 11 ++++++----- .../apache/log4j/varia/LevelRangeFilter.java | 11 ++++++----- .../org/apache/log4j/varia/NullAppender.java | 11 ++++++----- .../varia/ReloadingPropertyConfigurator.java | 11 ++++++----- src/java/org/apache/log4j/varia/Roller.java | 11 ++++++----- .../apache/log4j/varia/StringMatchFilter.java | 11 ++++++----- .../org/apache/log4j/varia/test/Loop.java | 11 ++++++----- .../org/apache/log4j/xml/DOMConfigurator.java | 11 ++++++----- .../apache/log4j/xml/Log4jEntityResolver.java | 11 ++++++----- .../org/apache/log4j/xml/SAXErrorHandler.java | 11 ++++++----- src/java/org/apache/log4j/xml/XMLLayout.java | 11 ++++++----- .../log4j/xml/examples/ReportParserError.java | 11 ++++++----- .../apache/log4j/xml/examples/XMLSample.java | 11 ++++++----- .../org/apache/log4j/xml/test/DOMTest.java | 11 ++++++----- src/xdocs/contactUs.xml | 17 +++++++++++++++++ src/xdocs/contributors.xml | 17 +++++++++++++++++ src/xdocs/documentation.xml | 17 +++++++++++++++++ src/xdocs/download.xml | 17 +++++++++++++++++ src/xdocs/earlier.xml | 17 +++++++++++++++++ src/xdocs/history.xml | 17 +++++++++++++++++ src/xdocs/index.xml | 17 +++++++++++++++++ src/xdocs/lf5/configuration.xml | 17 +++++++++++++++++ src/xdocs/lf5/examples.xml | 17 +++++++++++++++++ src/xdocs/lf5/faq.xml | 17 +++++++++++++++++ src/xdocs/lf5/features.xml | 17 +++++++++++++++++ src/xdocs/lf5/overview.xml | 17 +++++++++++++++++ src/xdocs/lf5/readingfiles.xml | 17 +++++++++++++++++ src/xdocs/lf5/trouble.xml | 17 +++++++++++++++++ src/xdocs/plan.xml | 17 +++++++++++++++++ src/xdocs/stylesheets/lf5.xml | 17 +++++++++++++++++ src/xdocs/stylesheets/project.xml | 17 +++++++++++++++++ src/xdocs/stylesheets/site.vsl | 19 ++++++++++++++++++- tests/build.properties.sample | 15 +++++++++++++++ tests/build.xml | 17 +++++++++++++++++ .../apache/log4j/AsyncAppenderTestCase.java | 11 ++++++----- .../java/org/apache/log4j/CategoryTest.java | 11 ++++++----- .../java/org/apache/log4j/DRFATestCase.java | 11 ++++++----- .../org/apache/log4j/FileAppenderTest.java | 11 ++++++----- .../java/org/apache/log4j/HTMLLayoutTest.java | 11 ++++++----- .../log4j/HierarchyThresholdTestCase.java | 11 ++++++----- tests/src/java/org/apache/log4j/Last.java | 11 ++++++----- .../src/java/org/apache/log4j/LayoutTest.java | 11 ++++++----- .../src/java/org/apache/log4j/LevelTest.java | 11 ++++++----- .../java/org/apache/log4j/LogManagerTest.java | 11 ++++++----- .../java/org/apache/log4j/LoggerTestCase.java | 11 ++++++----- .../org/apache/log4j/MinimumTestCase.java | 11 ++++++----- .../org/apache/log4j/MyPatternLayout.java | 11 ++++++----- .../org/apache/log4j/MyPatternParser.java | 11 ++++++----- .../org/apache/log4j/PatternLayoutTest.java | 11 ++++++----- .../apache/log4j/PatternLayoutTestCase.java | 11 ++++++----- .../java/org/apache/log4j/PriorityTest.java | 11 ++++++----- .../java/org/apache/log4j/RFATestCase.java | 11 ++++++----- .../java/org/apache/log4j/StressCategory.java | 11 ++++++----- .../java/org/apache/log4j/TTCCLayoutTest.java | 11 ++++++----- .../java/org/apache/log4j/VectorAppender.java | 11 ++++++----- .../org/apache/log4j/VectorErrorHandler.java | 11 ++++++----- .../apache/log4j/customLogger/XLogger.java | 11 ++++++----- .../log4j/customLogger/XLoggerTestCase.java | 11 ++++++----- .../apache/log4j/defaultInit/TestCase1.java | 11 ++++++----- .../apache/log4j/defaultInit/TestCase2.java | 11 ++++++----- .../apache/log4j/defaultInit/TestCase3.java | 11 ++++++----- .../apache/log4j/defaultInit/TestCase4.java | 11 ++++++----- .../log4j/helpers/BoundedFIFOTestCase.java | 11 ++++++----- .../log4j/helpers/CyclicBufferTestCase.java | 11 ++++++----- .../apache/log4j/helpers/DateLayoutTest.java | 11 ++++++----- .../org/apache/log4j/helpers/LogLogTest.java | 11 ++++++----- .../helpers/OptionConverterTestCase.java | 11 ++++++----- .../log4j/helpers/PatternParserTestCase.java | 11 ++++++----- .../apache/log4j/net/ShortSocketServer.java | 11 ++++++----- .../log4j/net/SocketServerTestCase.java | 11 ++++++----- .../apache/log4j/net/SyslogAppenderTest.java | 11 ++++++----- .../java/org/apache/log4j/or/ORTestCase.java | 11 ++++++----- .../apache/log4j/spi/LoggingEventTest.java | 11 ++++++----- .../log4j/util/AbsoluteDateAndTimeFilter.java | 11 ++++++----- .../apache/log4j/util/AbsoluteTimeFilter.java | 11 ++++++----- .../java/org/apache/log4j/util/Compare.java | 11 ++++++----- .../org/apache/log4j/util/ControlFilter.java | 11 ++++++----- .../java/org/apache/log4j/util/Filter.java | 11 ++++++----- .../org/apache/log4j/util/ISO8601Filter.java | 11 ++++++----- .../log4j/util/JunitTestRunnerFilter.java | 11 ++++++----- .../apache/log4j/util/LineNumberFilter.java | 11 ++++++----- .../apache/log4j/util/RelativeTimeFilter.java | 11 ++++++----- .../log4j/util/SerializationTestHelper.java | 11 ++++++----- .../apache/log4j/util/SunReflectFilter.java | 11 ++++++----- .../org/apache/log4j/util/Transformer.java | 11 ++++++----- .../log4j/util/UnexpectedFormatException.java | 11 ++++++----- .../log4j/util/XMLLineAttributeFilter.java | 11 ++++++----- .../apache/log4j/util/XMLTimestampFilter.java | 11 ++++++----- .../org/apache/log4j/varia/ERFATestCase.java | 11 ++++++----- .../log4j/varia/ErrorHandlerTestCase.java | 11 ++++++----- .../log4j/varia/LevelMatchFilterTestCase.java | 11 ++++++----- .../apache/log4j/xml/CustomLevelTestCase.java | 11 ++++++----- .../org/apache/log4j/xml/DOMTestCase.java | 11 ++++++----- .../src/java/org/apache/log4j/xml/XLevel.java | 11 ++++++----- .../org/apache/log4j/xml/XMLLayoutTest.java | 11 ++++++----- .../apache/log4j/xml/XMLLayoutTestCase.java | 11 ++++++----- 325 files changed, 2271 insertions(+), 1461 deletions(-) diff --git a/NOTICE b/NOTICE index 3f59805ce4..0375732360 100644 --- a/NOTICE +++ b/NOTICE @@ -1,2 +1,5 @@ -This product includes software developed by -The Apache Software Foundation (http://www.apache.org/). +Apache log4j +Copyright 2007 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). \ No newline at end of file diff --git a/build.properties.sample b/build.properties.sample index d295517007..02a54d46ae 100644 --- a/build.properties.sample +++ b/build.properties.sample @@ -1,3 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# # # base location of support directories # diff --git a/build.xml b/build.xml index 2ec4f801c5..b592fa97a0 100644 --- a/build.xml +++ b/build.xml @@ -1,3 +1,20 @@ + diff --git a/contribs/CekiGulcu/AppenderTable.java b/contribs/CekiGulcu/AppenderTable.java index 383efce07b..fbb18f5aee 100644 --- a/contribs/CekiGulcu/AppenderTable.java +++ b/contribs/CekiGulcu/AppenderTable.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/CekiGulcu/Transform.java b/contribs/CekiGulcu/Transform.java index c83752ec40..dcd9c15396 100644 --- a/contribs/CekiGulcu/Transform.java +++ b/contribs/CekiGulcu/Transform.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/EirikLygre/DailyFileAppender1.java b/contribs/EirikLygre/DailyFileAppender1.java index 1f8c1da331..eb0a3d216c 100644 --- a/contribs/EirikLygre/DailyFileAppender1.java +++ b/contribs/EirikLygre/DailyFileAppender1.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/JamesHouse/LogTextPanel.java b/contribs/JamesHouse/LogTextPanel.java index c1e7f01b67..b8190ce6b7 100644 --- a/contribs/JamesHouse/LogTextPanel.java +++ b/contribs/JamesHouse/LogTextPanel.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/JamesHouse/LogTextPanelExample.java b/contribs/JamesHouse/LogTextPanelExample.java index 42dd1cd032..c8898eec32 100644 --- a/contribs/JamesHouse/LogTextPanelExample.java +++ b/contribs/JamesHouse/LogTextPanelExample.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/JamesHouse/TextPanelAppender.java b/contribs/JamesHouse/TextPanelAppender.java index 25e3614eb3..bb46064935 100644 --- a/contribs/JamesHouse/TextPanelAppender.java +++ b/contribs/JamesHouse/TextPanelAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/Jamie Tsao/JMSQueueAppender.java b/contribs/Jamie Tsao/JMSQueueAppender.java index f90c0ae644..9e762f5e29 100644 --- a/contribs/Jamie Tsao/JMSQueueAppender.java +++ b/contribs/Jamie Tsao/JMSQueueAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/JimMoore/LoggingOutputStream.java b/contribs/JimMoore/LoggingOutputStream.java index 489de7ff09..bc084b30db 100644 --- a/contribs/JimMoore/LoggingOutputStream.java +++ b/contribs/JimMoore/LoggingOutputStream.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/KevinSteppe/CompositeRollingAppender.java b/contribs/KevinSteppe/CompositeRollingAppender.java index 4d2ace8d69..3957f1658e 100644 --- a/contribs/KevinSteppe/CompositeRollingAppender.java +++ b/contribs/KevinSteppe/CompositeRollingAppender.java @@ -1,11 +1,12 @@ package org.apache.log4j; /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/KevinSteppe/JDBCTest.java b/contribs/KevinSteppe/JDBCTest.java index 4948b380dd..8df3d18a23 100644 --- a/contribs/KevinSteppe/JDBCTest.java +++ b/contribs/KevinSteppe/JDBCTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/KitchingSimon/DatagramStringAppender.java b/contribs/KitchingSimon/DatagramStringAppender.java index e66cede1aa..f718580880 100644 --- a/contribs/KitchingSimon/DatagramStringAppender.java +++ b/contribs/KitchingSimon/DatagramStringAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/KitchingSimon/DatagramStringWriter.java b/contribs/KitchingSimon/DatagramStringWriter.java index 37dd45eb7d..0120863999 100644 --- a/contribs/KitchingSimon/DatagramStringWriter.java +++ b/contribs/KitchingSimon/DatagramStringWriter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/KitchingSimon/SingleLineTracerPrintWriter.java b/contribs/KitchingSimon/SingleLineTracerPrintWriter.java index 4b80fbfc61..50f8da24d1 100644 --- a/contribs/KitchingSimon/SingleLineTracerPrintWriter.java +++ b/contribs/KitchingSimon/SingleLineTracerPrintWriter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/LeosLiterak/TempFileAppender.java b/contribs/LeosLiterak/TempFileAppender.java index 0a204f0e04..0d8562a4af 100644 --- a/contribs/LeosLiterak/TempFileAppender.java +++ b/contribs/LeosLiterak/TempFileAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/MarkDouglas/SocketNode2.java b/contribs/MarkDouglas/SocketNode2.java index 0a625ab9b1..60f63e755f 100644 --- a/contribs/MarkDouglas/SocketNode2.java +++ b/contribs/MarkDouglas/SocketNode2.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/MarkDouglas/SocketServer2.java b/contribs/MarkDouglas/SocketServer2.java index 2ab82fe0f5..96caf0ea26 100644 --- a/contribs/MarkDouglas/SocketServer2.java +++ b/contribs/MarkDouglas/SocketServer2.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/SvenReimers/gui/JListView.java b/contribs/SvenReimers/gui/JListView.java index ffd3beddb7..6a93ed08e6 100644 --- a/contribs/SvenReimers/gui/JListView.java +++ b/contribs/SvenReimers/gui/JListView.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/SvenReimers/gui/JTableAppender.java b/contribs/SvenReimers/gui/JTableAppender.java index ed6e0af88b..32cc23ac83 100644 --- a/contribs/SvenReimers/gui/JTableAppender.java +++ b/contribs/SvenReimers/gui/JTableAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/SvenReimers/gui/TextPaneAppender.java b/contribs/SvenReimers/gui/TextPaneAppender.java index 841ef7c5b8..6b8fce523d 100644 --- a/contribs/SvenReimers/gui/TextPaneAppender.java +++ b/contribs/SvenReimers/gui/TextPaneAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/SvenReimers/gui/examples/TextPaneAppenderExample.java b/contribs/SvenReimers/gui/examples/TextPaneAppenderExample.java index 5073c30a2f..bd5f9d3a16 100644 --- a/contribs/SvenReimers/gui/examples/TextPaneAppenderExample.java +++ b/contribs/SvenReimers/gui/examples/TextPaneAppenderExample.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/ThomasFenner/JDBCAppender.java b/contribs/ThomasFenner/JDBCAppender.java index 3e27e89209..ac4808a599 100644 --- a/contribs/ThomasFenner/JDBCAppender.java +++ b/contribs/ThomasFenner/JDBCAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/ThomasFenner/JDBCConnectionHandler.java b/contribs/ThomasFenner/JDBCConnectionHandler.java index 581e88f1d0..40bc1ab519 100644 --- a/contribs/ThomasFenner/JDBCConnectionHandler.java +++ b/contribs/ThomasFenner/JDBCConnectionHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/ThomasFenner/JDBCIDHandler.java b/contribs/ThomasFenner/JDBCIDHandler.java index f5edd2877b..cdb707e29c 100644 --- a/contribs/ThomasFenner/JDBCIDHandler.java +++ b/contribs/ThomasFenner/JDBCIDHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/ThomasFenner/JDBCLogger.java b/contribs/ThomasFenner/JDBCLogger.java index d3f4c26294..e3c4f61534 100644 --- a/contribs/ThomasFenner/JDBCLogger.java +++ b/contribs/ThomasFenner/JDBCLogger.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/ThomasFenner/Log4JTest.java b/contribs/ThomasFenner/Log4JTest.java index fd02798f50..d7bb30f720 100644 --- a/contribs/ThomasFenner/Log4JTest.java +++ b/contribs/ThomasFenner/Log4JTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/ThomasFenner/code_example1.java b/contribs/ThomasFenner/code_example1.java index 41bc8cfea7..8d6f7d8c25 100644 --- a/contribs/ThomasFenner/code_example1.java +++ b/contribs/ThomasFenner/code_example1.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/ThomasFenner/code_example2.java b/contribs/ThomasFenner/code_example2.java index 668a361242..40bb71d8c7 100644 --- a/contribs/ThomasFenner/code_example2.java +++ b/contribs/ThomasFenner/code_example2.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/VolkerMentzner/HTTPRequestHandler.java b/contribs/VolkerMentzner/HTTPRequestHandler.java index 276eba8e96..d426e86867 100644 --- a/contribs/VolkerMentzner/HTTPRequestHandler.java +++ b/contribs/VolkerMentzner/HTTPRequestHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/VolkerMentzner/Log4jRequestHandler.java b/contribs/VolkerMentzner/Log4jRequestHandler.java index 096b0bb4bf..bf231a04d3 100644 --- a/contribs/VolkerMentzner/Log4jRequestHandler.java +++ b/contribs/VolkerMentzner/Log4jRequestHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/VolkerMentzner/PluggableHTTPServer.java b/contribs/VolkerMentzner/PluggableHTTPServer.java index 0e079a2c8d..12aa063786 100644 --- a/contribs/VolkerMentzner/PluggableHTTPServer.java +++ b/contribs/VolkerMentzner/PluggableHTTPServer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/VolkerMentzner/RootRequestHandler.java b/contribs/VolkerMentzner/RootRequestHandler.java index 76fbabca11..121d39b0e3 100644 --- a/contribs/VolkerMentzner/RootRequestHandler.java +++ b/contribs/VolkerMentzner/RootRequestHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/contribs/VolkerMentzner/UserDialogRequestHandler.java b/contribs/VolkerMentzner/UserDialogRequestHandler.java index 57d100d7a9..4a5124dd8b 100644 --- a/contribs/VolkerMentzner/UserDialogRequestHandler.java +++ b/contribs/VolkerMentzner/UserDialogRequestHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/MyPatternLayout.java b/examples/MyPatternLayout.java index 5775b5b3e6..8cb563da8e 100644 --- a/examples/MyPatternLayout.java +++ b/examples/MyPatternLayout.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/MyPatternParser.java b/examples/MyPatternParser.java index 6255c06397..4f1de85a73 100644 --- a/examples/MyPatternParser.java +++ b/examples/MyPatternParser.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/NumberCruncher.java b/examples/NumberCruncher.java index ff5e003c50..84ba303c28 100644 --- a/examples/NumberCruncher.java +++ b/examples/NumberCruncher.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/NumberCruncherClient.java b/examples/NumberCruncherClient.java index c2c04fc181..191e09459b 100644 --- a/examples/NumberCruncherClient.java +++ b/examples/NumberCruncherClient.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/NumberCruncherServer.java b/examples/NumberCruncherServer.java index da39d4a5b1..03bc1ff844 100644 --- a/examples/NumberCruncherServer.java +++ b/examples/NumberCruncherServer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/Sort.java b/examples/Sort.java index 9f21a5c505..a8e8e762e3 100644 --- a/examples/Sort.java +++ b/examples/Sort.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/SortAlgo.java b/examples/SortAlgo.java index aa579b0cea..dde9ce811c 100644 --- a/examples/SortAlgo.java +++ b/examples/SortAlgo.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/Trivial.java b/examples/Trivial.java index 36bc792a59..99e9978125 100644 --- a/examples/Trivial.java +++ b/examples/Trivial.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/customLevel/XLevel.java b/examples/customLevel/XLevel.java index 9c5126eff0..179c750d7e 100644 --- a/examples/customLevel/XLevel.java +++ b/examples/customLevel/XLevel.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/factor.html b/examples/factor.html index bf9f27ffd0..af593c7425 100644 --- a/examples/factor.html +++ b/examples/factor.html @@ -1,4 +1,21 @@ + diff --git a/examples/factor.lcf b/examples/factor.lcf index 3ad3607ba8..bc43ba0324 100644 --- a/examples/factor.lcf +++ b/examples/factor.lcf @@ -1,3 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# # For the general syntax of property based configuration files see the # documenation of org.apache.log4j.PropertyConfigurator. diff --git a/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java b/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java index 8af4460bdf..1c54f3d733 100644 --- a/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java +++ b/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java b/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java index c05eeb40c4..3e6fae23f9 100644 --- a/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java +++ b/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java b/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java index c026f0279b..6aac063676 100644 --- a/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java +++ b/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java b/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java index 4125485637..d1968ca3aa 100644 --- a/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java +++ b/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java b/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java index e46716f4fe..c02e8c7baa 100644 --- a/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java +++ b/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java b/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java index fd63a99b1c..b0e9942e74 100644 --- a/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java +++ b/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java b/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java index 77ae264e64..1ca208fe1f 100644 --- a/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java +++ b/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java b/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java index fcba9d5dc2..d7967df985 100644 --- a/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java +++ b/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/mycat.bad b/examples/mycat.bad index fcfdc6164a..27ceb9ea44 100644 --- a/examples/mycat.bad +++ b/examples/mycat.bad @@ -1,3 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. # The usual stuff. Note that A1 is configured in root not in "some.cat" log4j.rootLogger=DEBUG, A1 diff --git a/examples/mycat.good b/examples/mycat.good index c2e02ee7ca..76697fae7a 100644 --- a/examples/mycat.good +++ b/examples/mycat.good @@ -1,3 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + # Setting the logger factory to MyLoggerFactory solves the # ClassCastException problem encountered with the "mycat.bad" # configuration file. diff --git a/examples/package.html b/examples/package.html index def43d8851..944341b6fe 100644 --- a/examples/package.html +++ b/examples/package.html @@ -1,4 +1,21 @@ + diff --git a/examples/sort1.properties b/examples/sort1.properties index 77943f313a..5f676d357e 100644 --- a/examples/sort1.properties +++ b/examples/sort1.properties @@ -1,3 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + # An example log4j configuration file that outputs to System.out. The # output information consists of relative time, log level, thread # name, logger name, nested diagnostic context and the message in that diff --git a/examples/sort2.properties b/examples/sort2.properties index 1bacdb92dd..b55de06929 100644 --- a/examples/sort2.properties +++ b/examples/sort2.properties @@ -1,3 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + # An example log4j configuration file that outputs both to System.out # and a file named 'test'. diff --git a/examples/sort3.properties b/examples/sort3.properties index 906285f003..91b172dfab 100644 --- a/examples/sort3.properties +++ b/examples/sort3.properties @@ -1,3 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + # An example log4j configuration file that directs its logging output # to a SocketAppender. The SocketAppender is configuted to send its # output to a server running on the localhost port number 12345. diff --git a/examples/sort4.properties b/examples/sort4.properties index b4f02acebf..72d8a19f7e 100644 --- a/examples/sort4.properties +++ b/examples/sort4.properties @@ -1,3 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + # Attach appender A1 to root. Set root level to Level.DEBUG. log4j.rootLogger=DEBUG, A1 diff --git a/examples/subclass/MyLogger.java b/examples/subclass/MyLogger.java index c57611e901..39fd2336d3 100644 --- a/examples/subclass/MyLogger.java +++ b/examples/subclass/MyLogger.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/subclass/MyLoggerFactory.java b/examples/subclass/MyLoggerFactory.java index 14ffdc235e..8f859a1121 100644 --- a/examples/subclass/MyLoggerFactory.java +++ b/examples/subclass/MyLoggerFactory.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/examples/subclass/MyLoggerTest.java b/examples/subclass/MyLoggerTest.java index 996614fb2b..f0074b8c85 100644 --- a/examples/subclass/MyLoggerTest.java +++ b/examples/subclass/MyLoggerTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/pom.xml b/pom.xml index a5c962261f..dcfb73ede9 100644 --- a/pom.xml +++ b/pom.xml @@ -1 +1 @@ - 4.0.0 log4j log4j jar Log4j 1.2.14 Log4j http://logging.apache.org/log4j/docs/ Bugzilla http://issues.apache.org/bugzilla 1999 log4j-user log4j-user-subscribe@logging.apache.org log4j-user-unsubscribe@logging.apache.org log4j-user@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-user&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.user log4j-dev log4j-dev-subscribe@logging.apache.org log4j-dev-unsubscribe@logging.apache.org log4j-dev@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-dev&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.devel The Apache Software License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt repo scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_14/ Apache Software Foundation http://www.apache.org \ No newline at end of file + 4.0.0 log4j log4j jar Log4j 1.2.14 Log4j http://logging.apache.org/log4j/docs/ Bugzilla http://issues.apache.org/bugzilla 1999 log4j-user log4j-user-subscribe@logging.apache.org log4j-user-unsubscribe@logging.apache.org log4j-user@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-user&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.user log4j-dev log4j-dev-subscribe@logging.apache.org log4j-dev-unsubscribe@logging.apache.org log4j-dev@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-dev&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.devel The Apache Software License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt repo scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_14/ Apache Software Foundation http://www.apache.org \ No newline at end of file diff --git a/src/java/org/apache/log4j/Appender.java b/src/java/org/apache/log4j/Appender.java index 665d0f9f97..67703f523b 100644 --- a/src/java/org/apache/log4j/Appender.java +++ b/src/java/org/apache/log4j/Appender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/AppenderSkeleton.java b/src/java/org/apache/log4j/AppenderSkeleton.java index cdccff975b..49563a7e08 100644 --- a/src/java/org/apache/log4j/AppenderSkeleton.java +++ b/src/java/org/apache/log4j/AppenderSkeleton.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/AsyncAppender.java b/src/java/org/apache/log4j/AsyncAppender.java index 967dd13544..2a03eb63a6 100644 --- a/src/java/org/apache/log4j/AsyncAppender.java +++ b/src/java/org/apache/log4j/AsyncAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2006 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/BasicConfigurator.java b/src/java/org/apache/log4j/BasicConfigurator.java index 211b39bcfb..2d859cf436 100644 --- a/src/java/org/apache/log4j/BasicConfigurator.java +++ b/src/java/org/apache/log4j/BasicConfigurator.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/Category.java b/src/java/org/apache/log4j/Category.java index 2d4850d1a1..e28d12ff6e 100644 --- a/src/java/org/apache/log4j/Category.java +++ b/src/java/org/apache/log4j/Category.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/CategoryKey.java b/src/java/org/apache/log4j/CategoryKey.java index e6be750149..fe0fff7970 100644 --- a/src/java/org/apache/log4j/CategoryKey.java +++ b/src/java/org/apache/log4j/CategoryKey.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/ConsoleAppender.java b/src/java/org/apache/log4j/ConsoleAppender.java index e937c32899..b44fd5fddc 100644 --- a/src/java/org/apache/log4j/ConsoleAppender.java +++ b/src/java/org/apache/log4j/ConsoleAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/DailyRollingFileAppender.java b/src/java/org/apache/log4j/DailyRollingFileAppender.java index 48f4f030fb..0da3150dca 100644 --- a/src/java/org/apache/log4j/DailyRollingFileAppender.java +++ b/src/java/org/apache/log4j/DailyRollingFileAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/DefaultCategoryFactory.java b/src/java/org/apache/log4j/DefaultCategoryFactory.java index 7e152939f4..c7bb0c4668 100644 --- a/src/java/org/apache/log4j/DefaultCategoryFactory.java +++ b/src/java/org/apache/log4j/DefaultCategoryFactory.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/Dispatcher.java b/src/java/org/apache/log4j/Dispatcher.java index 2ba2164d68..e879ff0abf 100644 --- a/src/java/org/apache/log4j/Dispatcher.java +++ b/src/java/org/apache/log4j/Dispatcher.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/FileAppender.java b/src/java/org/apache/log4j/FileAppender.java index b987db2774..8fe61d3eb0 100644 --- a/src/java/org/apache/log4j/FileAppender.java +++ b/src/java/org/apache/log4j/FileAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/HTMLLayout.java b/src/java/org/apache/log4j/HTMLLayout.java index 0b15e0599e..93925e0e7d 100644 --- a/src/java/org/apache/log4j/HTMLLayout.java +++ b/src/java/org/apache/log4j/HTMLLayout.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/Hierarchy.java b/src/java/org/apache/log4j/Hierarchy.java index e73afbf5a5..2c5c0dd408 100644 --- a/src/java/org/apache/log4j/Hierarchy.java +++ b/src/java/org/apache/log4j/Hierarchy.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/Layout.java b/src/java/org/apache/log4j/Layout.java index ee8cfe11e7..798dd8ec0a 100644 --- a/src/java/org/apache/log4j/Layout.java +++ b/src/java/org/apache/log4j/Layout.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/Level.java b/src/java/org/apache/log4j/Level.java index 3e3649e2a7..502886242a 100644 --- a/src/java/org/apache/log4j/Level.java +++ b/src/java/org/apache/log4j/Level.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/LogManager.java b/src/java/org/apache/log4j/LogManager.java index 311aa97826..9f129e7190 100644 --- a/src/java/org/apache/log4j/LogManager.java +++ b/src/java/org/apache/log4j/LogManager.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/Logger.java b/src/java/org/apache/log4j/Logger.java index 67c4f2f531..aa4af73426 100644 --- a/src/java/org/apache/log4j/Logger.java +++ b/src/java/org/apache/log4j/Logger.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/MDC.java b/src/java/org/apache/log4j/MDC.java index a12df2e3a2..c770670b82 100644 --- a/src/java/org/apache/log4j/MDC.java +++ b/src/java/org/apache/log4j/MDC.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/NDC.java b/src/java/org/apache/log4j/NDC.java index b061293e13..703cfc5b60 100644 --- a/src/java/org/apache/log4j/NDC.java +++ b/src/java/org/apache/log4j/NDC.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/PatternLayout.java b/src/java/org/apache/log4j/PatternLayout.java index 526c90565c..33bd2a589b 100644 --- a/src/java/org/apache/log4j/PatternLayout.java +++ b/src/java/org/apache/log4j/PatternLayout.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/Priority.java b/src/java/org/apache/log4j/Priority.java index fb3a9bd9ec..53e94b4d4e 100644 --- a/src/java/org/apache/log4j/Priority.java +++ b/src/java/org/apache/log4j/Priority.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/PropertyConfigurator.java b/src/java/org/apache/log4j/PropertyConfigurator.java index 82eef0d53e..b9ed5148ee 100644 --- a/src/java/org/apache/log4j/PropertyConfigurator.java +++ b/src/java/org/apache/log4j/PropertyConfigurator.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/ProvisionNode.java b/src/java/org/apache/log4j/ProvisionNode.java index 09ffdbfe83..96539f8043 100644 --- a/src/java/org/apache/log4j/ProvisionNode.java +++ b/src/java/org/apache/log4j/ProvisionNode.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/RollingFileAppender.java b/src/java/org/apache/log4j/RollingFileAppender.java index 8901d28a9b..5795e8851d 100644 --- a/src/java/org/apache/log4j/RollingFileAppender.java +++ b/src/java/org/apache/log4j/RollingFileAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/SimpleLayout.java b/src/java/org/apache/log4j/SimpleLayout.java index 72a26d259c..5699661ba6 100644 --- a/src/java/org/apache/log4j/SimpleLayout.java +++ b/src/java/org/apache/log4j/SimpleLayout.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/TTCCLayout.java b/src/java/org/apache/log4j/TTCCLayout.java index 99ce7374ab..3b0e98f967 100644 --- a/src/java/org/apache/log4j/TTCCLayout.java +++ b/src/java/org/apache/log4j/TTCCLayout.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/WriterAppender.java b/src/java/org/apache/log4j/WriterAppender.java index 4decf71b4a..5e197d9cf7 100644 --- a/src/java/org/apache/log4j/WriterAppender.java +++ b/src/java/org/apache/log4j/WriterAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/chainsaw/ControlPanel.java b/src/java/org/apache/log4j/chainsaw/ControlPanel.java index 711dbcaffa..53b0b1b5fa 100644 --- a/src/java/org/apache/log4j/chainsaw/ControlPanel.java +++ b/src/java/org/apache/log4j/chainsaw/ControlPanel.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/chainsaw/DetailPanel.java b/src/java/org/apache/log4j/chainsaw/DetailPanel.java index 2b5815c67c..1f5dfe2c83 100644 --- a/src/java/org/apache/log4j/chainsaw/DetailPanel.java +++ b/src/java/org/apache/log4j/chainsaw/DetailPanel.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/chainsaw/EventDetails.java b/src/java/org/apache/log4j/chainsaw/EventDetails.java index da06bddc89..4b3ad94a6a 100644 --- a/src/java/org/apache/log4j/chainsaw/EventDetails.java +++ b/src/java/org/apache/log4j/chainsaw/EventDetails.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/chainsaw/ExitAction.java b/src/java/org/apache/log4j/chainsaw/ExitAction.java index f1343c0759..55a100e29f 100644 --- a/src/java/org/apache/log4j/chainsaw/ExitAction.java +++ b/src/java/org/apache/log4j/chainsaw/ExitAction.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java b/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java index 17d5796d88..33e5d13cf2 100644 --- a/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java +++ b/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java b/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java index 5c88570f52..ca087adcc0 100644 --- a/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java +++ b/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/chainsaw/Main.java b/src/java/org/apache/log4j/chainsaw/Main.java index 9426d06516..c0c9aad71a 100644 --- a/src/java/org/apache/log4j/chainsaw/Main.java +++ b/src/java/org/apache/log4j/chainsaw/Main.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/chainsaw/MyTableModel.java b/src/java/org/apache/log4j/chainsaw/MyTableModel.java index 6f572ccf35..0d43272c9a 100644 --- a/src/java/org/apache/log4j/chainsaw/MyTableModel.java +++ b/src/java/org/apache/log4j/chainsaw/MyTableModel.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java b/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java index 3e09f3da9e..2f9af5125e 100644 --- a/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java +++ b/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/config/PropertyGetter.java b/src/java/org/apache/log4j/config/PropertyGetter.java index 0354c3296b..01f7d775de 100644 --- a/src/java/org/apache/log4j/config/PropertyGetter.java +++ b/src/java/org/apache/log4j/config/PropertyGetter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/config/PropertyPrinter.java b/src/java/org/apache/log4j/config/PropertyPrinter.java index d993561f7d..fd577deaea 100644 --- a/src/java/org/apache/log4j/config/PropertyPrinter.java +++ b/src/java/org/apache/log4j/config/PropertyPrinter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/config/PropertySetter.java b/src/java/org/apache/log4j/config/PropertySetter.java index 6e080018b2..559923df51 100644 --- a/src/java/org/apache/log4j/config/PropertySetter.java +++ b/src/java/org/apache/log4j/config/PropertySetter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/config/PropertySetterException.java b/src/java/org/apache/log4j/config/PropertySetterException.java index b4554b0770..f0059fcec0 100644 --- a/src/java/org/apache/log4j/config/PropertySetterException.java +++ b/src/java/org/apache/log4j/config/PropertySetterException.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java b/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java index ab9b44acb1..9b43e7c8c0 100644 --- a/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java +++ b/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java b/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java index aba2751efc..0e8cd38283 100644 --- a/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java +++ b/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/BoundedFIFO.java b/src/java/org/apache/log4j/helpers/BoundedFIFO.java index 865de6af56..e5ce96ce02 100644 --- a/src/java/org/apache/log4j/helpers/BoundedFIFO.java +++ b/src/java/org/apache/log4j/helpers/BoundedFIFO.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/CountingQuietWriter.java b/src/java/org/apache/log4j/helpers/CountingQuietWriter.java index cf440a181f..55199e47a3 100644 --- a/src/java/org/apache/log4j/helpers/CountingQuietWriter.java +++ b/src/java/org/apache/log4j/helpers/CountingQuietWriter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/CyclicBuffer.java b/src/java/org/apache/log4j/helpers/CyclicBuffer.java index e0a68010f4..9077847dc9 100644 --- a/src/java/org/apache/log4j/helpers/CyclicBuffer.java +++ b/src/java/org/apache/log4j/helpers/CyclicBuffer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/DateLayout.java b/src/java/org/apache/log4j/helpers/DateLayout.java index 099eb16320..2e0eca8e34 100644 --- a/src/java/org/apache/log4j/helpers/DateLayout.java +++ b/src/java/org/apache/log4j/helpers/DateLayout.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java b/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java index 2fe8aec8dc..2afd27a32a 100644 --- a/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java +++ b/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/FileWatchdog.java b/src/java/org/apache/log4j/helpers/FileWatchdog.java index 33337516ea..82c6a92736 100644 --- a/src/java/org/apache/log4j/helpers/FileWatchdog.java +++ b/src/java/org/apache/log4j/helpers/FileWatchdog.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/FormattingInfo.java b/src/java/org/apache/log4j/helpers/FormattingInfo.java index 9f17977e0e..e158243235 100644 --- a/src/java/org/apache/log4j/helpers/FormattingInfo.java +++ b/src/java/org/apache/log4j/helpers/FormattingInfo.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java b/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java index a8323d65f3..89ad2cf2a1 100644 --- a/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java +++ b/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/Loader.java b/src/java/org/apache/log4j/helpers/Loader.java index d82eae1265..f32ca84e7c 100644 --- a/src/java/org/apache/log4j/helpers/Loader.java +++ b/src/java/org/apache/log4j/helpers/Loader.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/LogLog.java b/src/java/org/apache/log4j/helpers/LogLog.java index e93dca6c28..a7bd588ff1 100644 --- a/src/java/org/apache/log4j/helpers/LogLog.java +++ b/src/java/org/apache/log4j/helpers/LogLog.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/NullEnumeration.java b/src/java/org/apache/log4j/helpers/NullEnumeration.java index 6516db0c3c..0f4310ddfa 100644 --- a/src/java/org/apache/log4j/helpers/NullEnumeration.java +++ b/src/java/org/apache/log4j/helpers/NullEnumeration.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java b/src/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java index 349e4b03d2..33ed0f9242 100644 --- a/src/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java +++ b/src/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/OptionConverter.java b/src/java/org/apache/log4j/helpers/OptionConverter.java index e533cc2f49..1d2d7dc18c 100644 --- a/src/java/org/apache/log4j/helpers/OptionConverter.java +++ b/src/java/org/apache/log4j/helpers/OptionConverter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/PatternConverter.java b/src/java/org/apache/log4j/helpers/PatternConverter.java index 5c1fbd10fd..2b46db7fee 100644 --- a/src/java/org/apache/log4j/helpers/PatternConverter.java +++ b/src/java/org/apache/log4j/helpers/PatternConverter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/PatternParser.java b/src/java/org/apache/log4j/helpers/PatternParser.java index 8f63c7245c..489c1c1ba0 100644 --- a/src/java/org/apache/log4j/helpers/PatternParser.java +++ b/src/java/org/apache/log4j/helpers/PatternParser.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/QuietWriter.java b/src/java/org/apache/log4j/helpers/QuietWriter.java index 766cb4238d..68a96da8d1 100644 --- a/src/java/org/apache/log4j/helpers/QuietWriter.java +++ b/src/java/org/apache/log4j/helpers/QuietWriter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java b/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java index ecb2e34a8f..950061e0a2 100644 --- a/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java +++ b/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/SyslogQuietWriter.java b/src/java/org/apache/log4j/helpers/SyslogQuietWriter.java index 5faf168942..62e933e40d 100644 --- a/src/java/org/apache/log4j/helpers/SyslogQuietWriter.java +++ b/src/java/org/apache/log4j/helpers/SyslogQuietWriter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/SyslogWriter.java b/src/java/org/apache/log4j/helpers/SyslogWriter.java index ccf1144ac4..1dbe7ce870 100644 --- a/src/java/org/apache/log4j/helpers/SyslogWriter.java +++ b/src/java/org/apache/log4j/helpers/SyslogWriter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/ThreadLocalMap.java b/src/java/org/apache/log4j/helpers/ThreadLocalMap.java index a83abfb7e9..da60c86ff4 100644 --- a/src/java/org/apache/log4j/helpers/ThreadLocalMap.java +++ b/src/java/org/apache/log4j/helpers/ThreadLocalMap.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/helpers/Transform.java b/src/java/org/apache/log4j/helpers/Transform.java index 7633223b52..184cbbf554 100644 --- a/src/java/org/apache/log4j/helpers/Transform.java +++ b/src/java/org/apache/log4j/helpers/Transform.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/jdbc/JDBCAppender.java b/src/java/org/apache/log4j/jdbc/JDBCAppender.java index b4c856600f..fed81de4f5 100644 --- a/src/java/org/apache/log4j/jdbc/JDBCAppender.java +++ b/src/java/org/apache/log4j/jdbc/JDBCAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/jmx/AbstractDynamicMBean.java b/src/java/org/apache/log4j/jmx/AbstractDynamicMBean.java index 2891a69ec3..b2674f5106 100644 --- a/src/java/org/apache/log4j/jmx/AbstractDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/AbstractDynamicMBean.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/jmx/Agent.java b/src/java/org/apache/log4j/jmx/Agent.java index 2da4bd84e5..835af8f71a 100644 --- a/src/java/org/apache/log4j/jmx/Agent.java +++ b/src/java/org/apache/log4j/jmx/Agent.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java b/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java index a5ab45f5d1..407c183b48 100644 --- a/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java b/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java index 3471e43ce0..a79e7f41b9 100644 --- a/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/jmx/LayoutDynamicMBean.java b/src/java/org/apache/log4j/jmx/LayoutDynamicMBean.java index d7fecdded7..022b9f4152 100644 --- a/src/java/org/apache/log4j/jmx/LayoutDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/LayoutDynamicMBean.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java b/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java index 27cd797f44..f5d45fb9a8 100644 --- a/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/jmx/MethodUnion.java b/src/java/org/apache/log4j/jmx/MethodUnion.java index e2e6ded59a..e9f2fb2c52 100644 --- a/src/java/org/apache/log4j/jmx/MethodUnion.java +++ b/src/java/org/apache/log4j/jmx/MethodUnion.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/AppenderFinalizer.java b/src/java/org/apache/log4j/lf5/AppenderFinalizer.java index 8ceefb8006..a2a7019208 100644 --- a/src/java/org/apache/log4j/lf5/AppenderFinalizer.java +++ b/src/java/org/apache/log4j/lf5/AppenderFinalizer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/DefaultLF5Configurator.java b/src/java/org/apache/log4j/lf5/DefaultLF5Configurator.java index fe4e000e43..31d7f5bfc5 100644 --- a/src/java/org/apache/log4j/lf5/DefaultLF5Configurator.java +++ b/src/java/org/apache/log4j/lf5/DefaultLF5Configurator.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/LF5Appender.java b/src/java/org/apache/log4j/lf5/LF5Appender.java index b32e7b9692..a577a4c330 100644 --- a/src/java/org/apache/log4j/lf5/LF5Appender.java +++ b/src/java/org/apache/log4j/lf5/LF5Appender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/Log4JLogRecord.java b/src/java/org/apache/log4j/lf5/Log4JLogRecord.java index a2f7c7b9ef..4393eb586d 100644 --- a/src/java/org/apache/log4j/lf5/Log4JLogRecord.java +++ b/src/java/org/apache/log4j/lf5/Log4JLogRecord.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/LogLevel.java b/src/java/org/apache/log4j/lf5/LogLevel.java index e8723d47e7..b168cc9cf0 100644 --- a/src/java/org/apache/log4j/lf5/LogLevel.java +++ b/src/java/org/apache/log4j/lf5/LogLevel.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/LogLevelFormatException.java b/src/java/org/apache/log4j/lf5/LogLevelFormatException.java index fdabff118f..1109e23836 100644 --- a/src/java/org/apache/log4j/lf5/LogLevelFormatException.java +++ b/src/java/org/apache/log4j/lf5/LogLevelFormatException.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/LogRecord.java b/src/java/org/apache/log4j/lf5/LogRecord.java index 5c7bf9707b..4f4097f20a 100644 --- a/src/java/org/apache/log4j/lf5/LogRecord.java +++ b/src/java/org/apache/log4j/lf5/LogRecord.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/LogRecordFilter.java b/src/java/org/apache/log4j/lf5/LogRecordFilter.java index 0291b68fc2..25a3e53c2e 100644 --- a/src/java/org/apache/log4j/lf5/LogRecordFilter.java +++ b/src/java/org/apache/log4j/lf5/LogRecordFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/PassingLogRecordFilter.java b/src/java/org/apache/log4j/lf5/PassingLogRecordFilter.java index 8515769a77..178f6cb67c 100644 --- a/src/java/org/apache/log4j/lf5/PassingLogRecordFilter.java +++ b/src/java/org/apache/log4j/lf5/PassingLogRecordFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/StartLogFactor5.java b/src/java/org/apache/log4j/lf5/StartLogFactor5.java index e787cb33f5..1ea28c3c72 100644 --- a/src/java/org/apache/log4j/lf5/StartLogFactor5.java +++ b/src/java/org/apache/log4j/lf5/StartLogFactor5.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/util/AdapterLogRecord.java b/src/java/org/apache/log4j/lf5/util/AdapterLogRecord.java index 20e615d04b..2e4ee6f02f 100644 --- a/src/java/org/apache/log4j/lf5/util/AdapterLogRecord.java +++ b/src/java/org/apache/log4j/lf5/util/AdapterLogRecord.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/util/DateFormatManager.java b/src/java/org/apache/log4j/lf5/util/DateFormatManager.java index 09d7e2a3b6..6bed9cc862 100644 --- a/src/java/org/apache/log4j/lf5/util/DateFormatManager.java +++ b/src/java/org/apache/log4j/lf5/util/DateFormatManager.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/util/LogFileParser.java b/src/java/org/apache/log4j/lf5/util/LogFileParser.java index da2f224906..9fd1317d41 100644 --- a/src/java/org/apache/log4j/lf5/util/LogFileParser.java +++ b/src/java/org/apache/log4j/lf5/util/LogFileParser.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java b/src/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java index 270fda51a4..904c179dd3 100644 --- a/src/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java +++ b/src/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/util/Resource.java b/src/java/org/apache/log4j/lf5/util/Resource.java index d03566fe7a..66293cfcab 100644 --- a/src/java/org/apache/log4j/lf5/util/Resource.java +++ b/src/java/org/apache/log4j/lf5/util/Resource.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/util/ResourceUtils.java b/src/java/org/apache/log4j/lf5/util/ResourceUtils.java index a834251a3e..5f022b6729 100644 --- a/src/java/org/apache/log4j/lf5/util/ResourceUtils.java +++ b/src/java/org/apache/log4j/lf5/util/ResourceUtils.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/util/StreamUtils.java b/src/java/org/apache/log4j/lf5/util/StreamUtils.java index 6a3cdbb103..0d673583ab 100644 --- a/src/java/org/apache/log4j/lf5/util/StreamUtils.java +++ b/src/java/org/apache/log4j/lf5/util/StreamUtils.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java b/src/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java index baa3fc4802..2c68180975 100644 --- a/src/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java +++ b/src/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java b/src/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java index 36e1a311b5..a00f2c30f5 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java +++ b/src/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java b/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java index 6ad5286938..550a7b93ed 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java b/src/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java index 61e65ed404..bb203172d9 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java b/src/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java index 5d8a63f269..41ef07528a 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java b/src/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java index 02e9e996d7..890e6dbfea 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java b/src/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java index 2489576d8e..a08bf329bd 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTable.java b/src/java/org/apache/log4j/lf5/viewer/LogTable.java index 9af517e0a8..f7d28743a9 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTable.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTable.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java b/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java index 63599a9c8d..7d178889e3 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java b/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java index 92dec1e69e..e7a59e00a1 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java b/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java index ef6e549965..2e672808b7 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java b/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java index d0fc48326d..6322195a7d 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java b/src/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java index 97e78f5795..8d1408ffc9 100644 --- a/src/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java +++ b/src/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java index 7e2aae9092..f3fc522fea 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java index 754dded388..1391fd574a 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java index d34fb43167..63f91aef2d 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java index 54119e1281..05cd1c0e23 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java index 432a4a8def..57cc12a38c 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java index 33866bf8c3..f5bbfb3854 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java index 3ef0008c8f..64fd42e6e7 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java index 541e150b85..a4a9bdc99e 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java index d8508e24be..d95d47658a 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java index 0f47440948..28fc22e5bb 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java index bf73260e09..3863c0b8b2 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java index 32f64b063c..7323dcc08e 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java b/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java index 3487ef6076..94cc063373 100644 --- a/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java +++ b/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java b/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java index ea78d1727c..8c10ee28a1 100644 --- a/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java +++ b/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/JMSAppender.java b/src/java/org/apache/log4j/net/JMSAppender.java index 0d098e3387..dd11a91b35 100644 --- a/src/java/org/apache/log4j/net/JMSAppender.java +++ b/src/java/org/apache/log4j/net/JMSAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/JMSSink.java b/src/java/org/apache/log4j/net/JMSSink.java index e4e31d4d17..c847d68190 100644 --- a/src/java/org/apache/log4j/net/JMSSink.java +++ b/src/java/org/apache/log4j/net/JMSSink.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/SMTPAppender.java b/src/java/org/apache/log4j/net/SMTPAppender.java index cfdf82c318..237facd69f 100644 --- a/src/java/org/apache/log4j/net/SMTPAppender.java +++ b/src/java/org/apache/log4j/net/SMTPAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/SimpleSocketServer.java b/src/java/org/apache/log4j/net/SimpleSocketServer.java index d15d880362..f7e5b782b4 100644 --- a/src/java/org/apache/log4j/net/SimpleSocketServer.java +++ b/src/java/org/apache/log4j/net/SimpleSocketServer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/SocketAppender.java b/src/java/org/apache/log4j/net/SocketAppender.java index fa8ced9e0a..a3782b4229 100644 --- a/src/java/org/apache/log4j/net/SocketAppender.java +++ b/src/java/org/apache/log4j/net/SocketAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/SocketHubAppender.java b/src/java/org/apache/log4j/net/SocketHubAppender.java index bad3ed7daa..836e3ffb59 100644 --- a/src/java/org/apache/log4j/net/SocketHubAppender.java +++ b/src/java/org/apache/log4j/net/SocketHubAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/SocketNode.java b/src/java/org/apache/log4j/net/SocketNode.java index c344eba8e5..94d56ca1a8 100644 --- a/src/java/org/apache/log4j/net/SocketNode.java +++ b/src/java/org/apache/log4j/net/SocketNode.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/SocketServer.java b/src/java/org/apache/log4j/net/SocketServer.java index ae7f5f66db..4d8e6d0616 100644 --- a/src/java/org/apache/log4j/net/SocketServer.java +++ b/src/java/org/apache/log4j/net/SocketServer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/java/org/apache/log4j/net/SyslogAppender.java index 2bb6942eef..76bd2d53f5 100644 --- a/src/java/org/apache/log4j/net/SyslogAppender.java +++ b/src/java/org/apache/log4j/net/SyslogAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/TelnetAppender.java b/src/java/org/apache/log4j/net/TelnetAppender.java index c089844108..b4dbe14b3c 100644 --- a/src/java/org/apache/log4j/net/TelnetAppender.java +++ b/src/java/org/apache/log4j/net/TelnetAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/test/Loop.java b/src/java/org/apache/log4j/net/test/Loop.java index 4a2aee4ec8..3b06b88165 100644 --- a/src/java/org/apache/log4j/net/test/Loop.java +++ b/src/java/org/apache/log4j/net/test/Loop.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/test/SMTPMin.java b/src/java/org/apache/log4j/net/test/SMTPMin.java index 26f4ffaf5a..f9961a6c6d 100644 --- a/src/java/org/apache/log4j/net/test/SMTPMin.java +++ b/src/java/org/apache/log4j/net/test/SMTPMin.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/test/SocketMin.java b/src/java/org/apache/log4j/net/test/SocketMin.java index 162005ed2b..b3a2fee8c8 100644 --- a/src/java/org/apache/log4j/net/test/SocketMin.java +++ b/src/java/org/apache/log4j/net/test/SocketMin.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/net/test/SyslogMin.java b/src/java/org/apache/log4j/net/test/SyslogMin.java index 9221f1cf79..23a93f1ea4 100644 --- a/src/java/org/apache/log4j/net/test/SyslogMin.java +++ b/src/java/org/apache/log4j/net/test/SyslogMin.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/nt/NTEventLogAppender.java b/src/java/org/apache/log4j/nt/NTEventLogAppender.java index c0c3a7a151..1d8f3dc30d 100644 --- a/src/java/org/apache/log4j/nt/NTEventLogAppender.java +++ b/src/java/org/apache/log4j/nt/NTEventLogAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/nt/NTEventLogAppender.rc b/src/java/org/apache/log4j/nt/NTEventLogAppender.rc index 8c09b42053..6d06474745 100755 --- a/src/java/org/apache/log4j/nt/NTEventLogAppender.rc +++ b/src/java/org/apache/log4j/nt/NTEventLogAppender.rc @@ -96,9 +96,9 @@ BEGIN VALUE "FileDescription", "Platform methods for NTEventLogAppender" VALUE "FileVersion", "1, 2, 15, 1" VALUE "InternalName", "NTEventLogAppender" - VALUE "LegalCopyright", "Copyright (C) 2005, Apache Software Foundation" + VALUE "LegalCopyright", "Licensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." VALUE "OriginalFilename", "NTEventLogAppender.dll" - VALUE "ProductName", "log4j" + VALUE "ProductName", "Apache log4j" VALUE "ProductVersion", "1, 2, 15, 1" END END diff --git a/src/java/org/apache/log4j/nt/nteventlog.cpp b/src/java/org/apache/log4j/nt/nteventlog.cpp index a134c9bfc4..c994adb57e 100644 --- a/src/java/org/apache/log4j/nt/nteventlog.cpp +++ b/src/java/org/apache/log4j/nt/nteventlog.cpp @@ -1,9 +1,10 @@ /* - * Copyright 1999-2006 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/or/DefaultRenderer.java b/src/java/org/apache/log4j/or/DefaultRenderer.java index 5acada45e9..bf6ee79320 100644 --- a/src/java/org/apache/log4j/or/DefaultRenderer.java +++ b/src/java/org/apache/log4j/or/DefaultRenderer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/or/ObjectRenderer.java b/src/java/org/apache/log4j/or/ObjectRenderer.java index 32f089a7b5..8ad99439e8 100644 --- a/src/java/org/apache/log4j/or/ObjectRenderer.java +++ b/src/java/org/apache/log4j/or/ObjectRenderer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/or/RendererMap.java b/src/java/org/apache/log4j/or/RendererMap.java index 25cbb5ee78..f60bd5a967 100644 --- a/src/java/org/apache/log4j/or/RendererMap.java +++ b/src/java/org/apache/log4j/or/RendererMap.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/or/ThreadGroupRenderer.java b/src/java/org/apache/log4j/or/ThreadGroupRenderer.java index 30a85d32b3..8dd70ccc59 100644 --- a/src/java/org/apache/log4j/or/ThreadGroupRenderer.java +++ b/src/java/org/apache/log4j/or/ThreadGroupRenderer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/or/jms/MessageRenderer.java b/src/java/org/apache/log4j/or/jms/MessageRenderer.java index 6460917bf1..e3140cbba5 100644 --- a/src/java/org/apache/log4j/or/jms/MessageRenderer.java +++ b/src/java/org/apache/log4j/or/jms/MessageRenderer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/or/sax/AttributesRenderer.java b/src/java/org/apache/log4j/or/sax/AttributesRenderer.java index 0fd9bbdfab..136fa97abb 100644 --- a/src/java/org/apache/log4j/or/sax/AttributesRenderer.java +++ b/src/java/org/apache/log4j/or/sax/AttributesRenderer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/performance/ListVsVector.java b/src/java/org/apache/log4j/performance/ListVsVector.java index 569893e50b..7f9c8a4486 100644 --- a/src/java/org/apache/log4j/performance/ListVsVector.java +++ b/src/java/org/apache/log4j/performance/ListVsVector.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/performance/NOPWriter.java b/src/java/org/apache/log4j/performance/NOPWriter.java index d35592832c..14e932bbf8 100644 --- a/src/java/org/apache/log4j/performance/NOPWriter.java +++ b/src/java/org/apache/log4j/performance/NOPWriter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/performance/NewVsSetLen.java b/src/java/org/apache/log4j/performance/NewVsSetLen.java index 2927889ced..3275bdb1a9 100644 --- a/src/java/org/apache/log4j/performance/NewVsSetLen.java +++ b/src/java/org/apache/log4j/performance/NewVsSetLen.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/performance/NullAppender.java b/src/java/org/apache/log4j/performance/NullAppender.java index 366b056ccb..32c057ad3b 100644 --- a/src/java/org/apache/log4j/performance/NullAppender.java +++ b/src/java/org/apache/log4j/performance/NullAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/performance/SystemTime.java b/src/java/org/apache/log4j/performance/SystemTime.java index 3e0794c6b2..9d83a6d9a3 100644 --- a/src/java/org/apache/log4j/performance/SystemTime.java +++ b/src/java/org/apache/log4j/performance/SystemTime.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/AppenderAttachable.java b/src/java/org/apache/log4j/spi/AppenderAttachable.java index b0ec94739c..89d7ef4209 100644 --- a/src/java/org/apache/log4j/spi/AppenderAttachable.java +++ b/src/java/org/apache/log4j/spi/AppenderAttachable.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/Configurator.java b/src/java/org/apache/log4j/spi/Configurator.java index ae4ba70d2c..32ff72dcea 100644 --- a/src/java/org/apache/log4j/spi/Configurator.java +++ b/src/java/org/apache/log4j/spi/Configurator.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/DefaultRepositorySelector.java b/src/java/org/apache/log4j/spi/DefaultRepositorySelector.java index c64b62fb2f..4b307524e4 100644 --- a/src/java/org/apache/log4j/spi/DefaultRepositorySelector.java +++ b/src/java/org/apache/log4j/spi/DefaultRepositorySelector.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/ErrorCode.java b/src/java/org/apache/log4j/spi/ErrorCode.java index 2e63f4d08e..b0e57f1fe7 100644 --- a/src/java/org/apache/log4j/spi/ErrorCode.java +++ b/src/java/org/apache/log4j/spi/ErrorCode.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/ErrorHandler.java b/src/java/org/apache/log4j/spi/ErrorHandler.java index 11a949344e..d629a2dbd2 100644 --- a/src/java/org/apache/log4j/spi/ErrorHandler.java +++ b/src/java/org/apache/log4j/spi/ErrorHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/Filter.java b/src/java/org/apache/log4j/spi/Filter.java index e64ee0b426..b54d875ce9 100644 --- a/src/java/org/apache/log4j/spi/Filter.java +++ b/src/java/org/apache/log4j/spi/Filter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/HierarchyEventListener.java b/src/java/org/apache/log4j/spi/HierarchyEventListener.java index d3162671e6..9215926913 100644 --- a/src/java/org/apache/log4j/spi/HierarchyEventListener.java +++ b/src/java/org/apache/log4j/spi/HierarchyEventListener.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/LocationInfo.java b/src/java/org/apache/log4j/spi/LocationInfo.java index 68d73ee6d9..699b3bd2f7 100644 --- a/src/java/org/apache/log4j/spi/LocationInfo.java +++ b/src/java/org/apache/log4j/spi/LocationInfo.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/LoggerFactory.java b/src/java/org/apache/log4j/spi/LoggerFactory.java index 0326f68447..568c41fe19 100644 --- a/src/java/org/apache/log4j/spi/LoggerFactory.java +++ b/src/java/org/apache/log4j/spi/LoggerFactory.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/LoggerRepository.java b/src/java/org/apache/log4j/spi/LoggerRepository.java index 5f4d8cc75e..46701a61c8 100644 --- a/src/java/org/apache/log4j/spi/LoggerRepository.java +++ b/src/java/org/apache/log4j/spi/LoggerRepository.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/LoggingEvent.java b/src/java/org/apache/log4j/spi/LoggingEvent.java index 071951f7ed..f87a7b7a8d 100644 --- a/src/java/org/apache/log4j/spi/LoggingEvent.java +++ b/src/java/org/apache/log4j/spi/LoggingEvent.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/OptionHandler.java b/src/java/org/apache/log4j/spi/OptionHandler.java index 64f16e0af3..2c90226825 100644 --- a/src/java/org/apache/log4j/spi/OptionHandler.java +++ b/src/java/org/apache/log4j/spi/OptionHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/RendererSupport.java b/src/java/org/apache/log4j/spi/RendererSupport.java index 42e09f3e99..e6ac0d97cc 100644 --- a/src/java/org/apache/log4j/spi/RendererSupport.java +++ b/src/java/org/apache/log4j/spi/RendererSupport.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/RepositorySelector.java b/src/java/org/apache/log4j/spi/RepositorySelector.java index 2ef61ec2cf..9a70d6203c 100644 --- a/src/java/org/apache/log4j/spi/RepositorySelector.java +++ b/src/java/org/apache/log4j/spi/RepositorySelector.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/RootCategory.java b/src/java/org/apache/log4j/spi/RootCategory.java index 2f33f20b4b..1682751811 100644 --- a/src/java/org/apache/log4j/spi/RootCategory.java +++ b/src/java/org/apache/log4j/spi/RootCategory.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/RootLogger.java b/src/java/org/apache/log4j/spi/RootLogger.java index 5e2dbae2a0..02f7cd31e8 100644 --- a/src/java/org/apache/log4j/spi/RootLogger.java +++ b/src/java/org/apache/log4j/spi/RootLogger.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/ThrowableInformation.java b/src/java/org/apache/log4j/spi/ThrowableInformation.java index 4d0929c848..e4b3eb7355 100644 --- a/src/java/org/apache/log4j/spi/ThrowableInformation.java +++ b/src/java/org/apache/log4j/spi/ThrowableInformation.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/spi/TriggeringEventEvaluator.java b/src/java/org/apache/log4j/spi/TriggeringEventEvaluator.java index 545a316e04..67f4fcd01d 100644 --- a/src/java/org/apache/log4j/spi/TriggeringEventEvaluator.java +++ b/src/java/org/apache/log4j/spi/TriggeringEventEvaluator.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/varia/DenyAllFilter.java b/src/java/org/apache/log4j/varia/DenyAllFilter.java index c86d7ab3b0..6c9e949396 100644 --- a/src/java/org/apache/log4j/varia/DenyAllFilter.java +++ b/src/java/org/apache/log4j/varia/DenyAllFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java b/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java index 6c466ae5f8..5a39ce8b71 100644 --- a/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java +++ b/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/varia/FallbackErrorHandler.java b/src/java/org/apache/log4j/varia/FallbackErrorHandler.java index 2485311253..dc51347e38 100644 --- a/src/java/org/apache/log4j/varia/FallbackErrorHandler.java +++ b/src/java/org/apache/log4j/varia/FallbackErrorHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/varia/LevelMatchFilter.java b/src/java/org/apache/log4j/varia/LevelMatchFilter.java index f683440ded..832ca29f2c 100644 --- a/src/java/org/apache/log4j/varia/LevelMatchFilter.java +++ b/src/java/org/apache/log4j/varia/LevelMatchFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/varia/LevelRangeFilter.java b/src/java/org/apache/log4j/varia/LevelRangeFilter.java index 322bf81b58..213c759f58 100644 --- a/src/java/org/apache/log4j/varia/LevelRangeFilter.java +++ b/src/java/org/apache/log4j/varia/LevelRangeFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/varia/NullAppender.java b/src/java/org/apache/log4j/varia/NullAppender.java index 40ed919a9f..8435e8ca04 100644 --- a/src/java/org/apache/log4j/varia/NullAppender.java +++ b/src/java/org/apache/log4j/varia/NullAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java b/src/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java index c6fe5af914..b29e84761b 100644 --- a/src/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java +++ b/src/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/varia/Roller.java b/src/java/org/apache/log4j/varia/Roller.java index fb25ff39fc..7ef3aee610 100644 --- a/src/java/org/apache/log4j/varia/Roller.java +++ b/src/java/org/apache/log4j/varia/Roller.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/varia/StringMatchFilter.java b/src/java/org/apache/log4j/varia/StringMatchFilter.java index 49bd099838..6ee7ec473b 100644 --- a/src/java/org/apache/log4j/varia/StringMatchFilter.java +++ b/src/java/org/apache/log4j/varia/StringMatchFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/varia/test/Loop.java b/src/java/org/apache/log4j/varia/test/Loop.java index f56c0eca6e..0fa1c36053 100644 --- a/src/java/org/apache/log4j/varia/test/Loop.java +++ b/src/java/org/apache/log4j/varia/test/Loop.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index ecf2e084ca..eff3f0d1c6 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/xml/Log4jEntityResolver.java b/src/java/org/apache/log4j/xml/Log4jEntityResolver.java index b2a46cc57a..fc18757d2e 100644 --- a/src/java/org/apache/log4j/xml/Log4jEntityResolver.java +++ b/src/java/org/apache/log4j/xml/Log4jEntityResolver.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/xml/SAXErrorHandler.java b/src/java/org/apache/log4j/xml/SAXErrorHandler.java index 45cbf46eca..43e851bb6c 100644 --- a/src/java/org/apache/log4j/xml/SAXErrorHandler.java +++ b/src/java/org/apache/log4j/xml/SAXErrorHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/xml/XMLLayout.java b/src/java/org/apache/log4j/xml/XMLLayout.java index ac67ca41de..98da0acf41 100644 --- a/src/java/org/apache/log4j/xml/XMLLayout.java +++ b/src/java/org/apache/log4j/xml/XMLLayout.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/xml/examples/ReportParserError.java b/src/java/org/apache/log4j/xml/examples/ReportParserError.java index cdf3190e12..007d4cbd77 100644 --- a/src/java/org/apache/log4j/xml/examples/ReportParserError.java +++ b/src/java/org/apache/log4j/xml/examples/ReportParserError.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/xml/examples/XMLSample.java b/src/java/org/apache/log4j/xml/examples/XMLSample.java index 4f1197141b..dfb8792398 100644 --- a/src/java/org/apache/log4j/xml/examples/XMLSample.java +++ b/src/java/org/apache/log4j/xml/examples/XMLSample.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/java/org/apache/log4j/xml/test/DOMTest.java b/src/java/org/apache/log4j/xml/test/DOMTest.java index 6e0a673c9b..1683e6a8c2 100644 --- a/src/java/org/apache/log4j/xml/test/DOMTest.java +++ b/src/java/org/apache/log4j/xml/test/DOMTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/xdocs/contactUs.xml b/src/xdocs/contactUs.xml index a88d9c0f59..67947bd439 100644 --- a/src/xdocs/contactUs.xml +++ b/src/xdocs/contactUs.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/contributors.xml b/src/xdocs/contributors.xml index b28c204088..7bb186b3fc 100644 --- a/src/xdocs/contributors.xml +++ b/src/xdocs/contributors.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index 2209a1c7b8..d0c2e301a5 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index fd702fac51..8d01c06f00 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/earlier.xml b/src/xdocs/earlier.xml index 8edc59a419..0ea4979da9 100644 --- a/src/xdocs/earlier.xml +++ b/src/xdocs/earlier.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/history.xml b/src/xdocs/history.xml index fbe5480d4b..72b303d73a 100644 --- a/src/xdocs/history.xml +++ b/src/xdocs/history.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/index.xml b/src/xdocs/index.xml index c6555d4fc7..6a7f03b5f0 100644 --- a/src/xdocs/index.xml +++ b/src/xdocs/index.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/lf5/configuration.xml b/src/xdocs/lf5/configuration.xml index d01914d5c4..499a869358 100644 --- a/src/xdocs/lf5/configuration.xml +++ b/src/xdocs/lf5/configuration.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/lf5/examples.xml b/src/xdocs/lf5/examples.xml index 09c6b0ba6b..b049937542 100644 --- a/src/xdocs/lf5/examples.xml +++ b/src/xdocs/lf5/examples.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/lf5/faq.xml b/src/xdocs/lf5/faq.xml index 7729b8fb5d..25c3540bc8 100644 --- a/src/xdocs/lf5/faq.xml +++ b/src/xdocs/lf5/faq.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/lf5/features.xml b/src/xdocs/lf5/features.xml index 149b7cdb52..0eba16fe0d 100644 --- a/src/xdocs/lf5/features.xml +++ b/src/xdocs/lf5/features.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/lf5/overview.xml b/src/xdocs/lf5/overview.xml index 1222fc0ca8..356578f2a0 100644 --- a/src/xdocs/lf5/overview.xml +++ b/src/xdocs/lf5/overview.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/lf5/readingfiles.xml b/src/xdocs/lf5/readingfiles.xml index 5725828b8c..3f853dbb98 100644 --- a/src/xdocs/lf5/readingfiles.xml +++ b/src/xdocs/lf5/readingfiles.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/lf5/trouble.xml b/src/xdocs/lf5/trouble.xml index 99daaf5d54..6c12597e36 100644 --- a/src/xdocs/lf5/trouble.xml +++ b/src/xdocs/lf5/trouble.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/plan.xml b/src/xdocs/plan.xml index 1c10af3a34..efadd0c7ff 100644 --- a/src/xdocs/plan.xml +++ b/src/xdocs/plan.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/stylesheets/lf5.xml b/src/xdocs/stylesheets/lf5.xml index de5263e7e8..a18b8eb918 100644 --- a/src/xdocs/stylesheets/lf5.xml +++ b/src/xdocs/stylesheets/lf5.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/stylesheets/project.xml b/src/xdocs/stylesheets/project.xml index 875c81d6d4..c5be9a9bbb 100644 --- a/src/xdocs/stylesheets/project.xml +++ b/src/xdocs/stylesheets/project.xml @@ -1,4 +1,21 @@ + diff --git a/src/xdocs/stylesheets/site.vsl b/src/xdocs/stylesheets/site.vsl index bfd12ba0f0..6fb18ea57d 100755 --- a/src/xdocs/stylesheets/site.vsl +++ b/src/xdocs/stylesheets/site.vsl @@ -225,6 +225,23 @@ #macro (document) #set ($properties = $root.getChild("properties") ) + @@ -299,7 +316,7 @@
    - Copyright © 1999-2006, Apache Software Foundation.
    + Copyright © 1999-2007, Apache Software Foundation.
    Licensed under the Apache License, Version 2.0.
    diff --git a/tests/build.properties.sample b/tests/build.properties.sample index 3c99de9967..5f0f1b879d 100644 --- a/tests/build.properties.sample +++ b/tests/build.properties.sample @@ -1,3 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# # # by default assume that all necessary dependencies # are relative to the user's home directory diff --git a/tests/build.xml b/tests/build.xml index 09ae64862e..5b784bf34d 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -1,3 +1,20 @@ + diff --git a/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java b/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java index 027e6ea640..85e75be33d 100644 --- a/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java +++ b/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/CategoryTest.java b/tests/src/java/org/apache/log4j/CategoryTest.java index bbc474a340..cd65e2703c 100644 --- a/tests/src/java/org/apache/log4j/CategoryTest.java +++ b/tests/src/java/org/apache/log4j/CategoryTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/DRFATestCase.java b/tests/src/java/org/apache/log4j/DRFATestCase.java index 71d018baf4..e6f80d89bc 100644 --- a/tests/src/java/org/apache/log4j/DRFATestCase.java +++ b/tests/src/java/org/apache/log4j/DRFATestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2006 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/FileAppenderTest.java b/tests/src/java/org/apache/log4j/FileAppenderTest.java index 0b7b433c69..5792986eb2 100644 --- a/tests/src/java/org/apache/log4j/FileAppenderTest.java +++ b/tests/src/java/org/apache/log4j/FileAppenderTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/HTMLLayoutTest.java b/tests/src/java/org/apache/log4j/HTMLLayoutTest.java index b19925c21f..396235257a 100644 --- a/tests/src/java/org/apache/log4j/HTMLLayoutTest.java +++ b/tests/src/java/org/apache/log4j/HTMLLayoutTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/HierarchyThresholdTestCase.java b/tests/src/java/org/apache/log4j/HierarchyThresholdTestCase.java index d354985c66..55d689c8ef 100644 --- a/tests/src/java/org/apache/log4j/HierarchyThresholdTestCase.java +++ b/tests/src/java/org/apache/log4j/HierarchyThresholdTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/Last.java b/tests/src/java/org/apache/log4j/Last.java index 7d05e2bb2f..4286ab8ebe 100644 --- a/tests/src/java/org/apache/log4j/Last.java +++ b/tests/src/java/org/apache/log4j/Last.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/LayoutTest.java b/tests/src/java/org/apache/log4j/LayoutTest.java index 4743f42f2a..0d2cac679a 100644 --- a/tests/src/java/org/apache/log4j/LayoutTest.java +++ b/tests/src/java/org/apache/log4j/LayoutTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/LevelTest.java b/tests/src/java/org/apache/log4j/LevelTest.java index acd959ea0f..ca477be30e 100644 --- a/tests/src/java/org/apache/log4j/LevelTest.java +++ b/tests/src/java/org/apache/log4j/LevelTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/LogManagerTest.java b/tests/src/java/org/apache/log4j/LogManagerTest.java index 514f638ddc..0319fda712 100644 --- a/tests/src/java/org/apache/log4j/LogManagerTest.java +++ b/tests/src/java/org/apache/log4j/LogManagerTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/LoggerTestCase.java b/tests/src/java/org/apache/log4j/LoggerTestCase.java index 36d65e90c1..ccfac8f31b 100644 --- a/tests/src/java/org/apache/log4j/LoggerTestCase.java +++ b/tests/src/java/org/apache/log4j/LoggerTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/MinimumTestCase.java b/tests/src/java/org/apache/log4j/MinimumTestCase.java index 9d53c3daa5..57a7303643 100644 --- a/tests/src/java/org/apache/log4j/MinimumTestCase.java +++ b/tests/src/java/org/apache/log4j/MinimumTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/MyPatternLayout.java b/tests/src/java/org/apache/log4j/MyPatternLayout.java index edb9c4127b..d7cc8ff0ca 100644 --- a/tests/src/java/org/apache/log4j/MyPatternLayout.java +++ b/tests/src/java/org/apache/log4j/MyPatternLayout.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/MyPatternParser.java b/tests/src/java/org/apache/log4j/MyPatternParser.java index e5328f632d..25379fca38 100644 --- a/tests/src/java/org/apache/log4j/MyPatternParser.java +++ b/tests/src/java/org/apache/log4j/MyPatternParser.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/PatternLayoutTest.java b/tests/src/java/org/apache/log4j/PatternLayoutTest.java index 7371023595..6d8f03bff4 100644 --- a/tests/src/java/org/apache/log4j/PatternLayoutTest.java +++ b/tests/src/java/org/apache/log4j/PatternLayoutTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java index 0d80064337..d7c4a90d3b 100644 --- a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/PriorityTest.java b/tests/src/java/org/apache/log4j/PriorityTest.java index d79a6d8520..ce35100877 100644 --- a/tests/src/java/org/apache/log4j/PriorityTest.java +++ b/tests/src/java/org/apache/log4j/PriorityTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/RFATestCase.java b/tests/src/java/org/apache/log4j/RFATestCase.java index 0a91cb14f4..c2ff55bc62 100644 --- a/tests/src/java/org/apache/log4j/RFATestCase.java +++ b/tests/src/java/org/apache/log4j/RFATestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 2005-2006 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/StressCategory.java b/tests/src/java/org/apache/log4j/StressCategory.java index a99bd7f693..551a922885 100644 --- a/tests/src/java/org/apache/log4j/StressCategory.java +++ b/tests/src/java/org/apache/log4j/StressCategory.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/TTCCLayoutTest.java b/tests/src/java/org/apache/log4j/TTCCLayoutTest.java index 73889fda54..35f6d1ec06 100644 --- a/tests/src/java/org/apache/log4j/TTCCLayoutTest.java +++ b/tests/src/java/org/apache/log4j/TTCCLayoutTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/VectorAppender.java b/tests/src/java/org/apache/log4j/VectorAppender.java index ca2d191af3..a87ab521fc 100644 --- a/tests/src/java/org/apache/log4j/VectorAppender.java +++ b/tests/src/java/org/apache/log4j/VectorAppender.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/VectorErrorHandler.java b/tests/src/java/org/apache/log4j/VectorErrorHandler.java index 0cbab34856..a08726c2f0 100644 --- a/tests/src/java/org/apache/log4j/VectorErrorHandler.java +++ b/tests/src/java/org/apache/log4j/VectorErrorHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/customLogger/XLogger.java b/tests/src/java/org/apache/log4j/customLogger/XLogger.java index 56f7d6fa40..c24828dd2b 100644 --- a/tests/src/java/org/apache/log4j/customLogger/XLogger.java +++ b/tests/src/java/org/apache/log4j/customLogger/XLogger.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/customLogger/XLoggerTestCase.java b/tests/src/java/org/apache/log4j/customLogger/XLoggerTestCase.java index e26fd62226..f80103c854 100644 --- a/tests/src/java/org/apache/log4j/customLogger/XLoggerTestCase.java +++ b/tests/src/java/org/apache/log4j/customLogger/XLoggerTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java index e20339d29f..24669b691b 100644 --- a/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase1.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java index b80f83075d..d5da315359 100644 --- a/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase2.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java index eec2051463..2c9abc478c 100644 --- a/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase3.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java b/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java index 35503d4bb8..dff7813ec5 100644 --- a/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java +++ b/tests/src/java/org/apache/log4j/defaultInit/TestCase4.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java b/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java index d83e0412f0..1412fab62f 100644 --- a/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/BoundedFIFOTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java b/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java index 0810676fec..d46adb16bb 100644 --- a/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/CyclicBufferTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java b/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java index 704fb7127e..9a3b62f9fd 100644 --- a/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java +++ b/tests/src/java/org/apache/log4j/helpers/DateLayoutTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/helpers/LogLogTest.java b/tests/src/java/org/apache/log4j/helpers/LogLogTest.java index d664f9d794..3eab58fc3b 100644 --- a/tests/src/java/org/apache/log4j/helpers/LogLogTest.java +++ b/tests/src/java/org/apache/log4j/helpers/LogLogTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/helpers/OptionConverterTestCase.java b/tests/src/java/org/apache/log4j/helpers/OptionConverterTestCase.java index ff829236c3..739a76b87a 100644 --- a/tests/src/java/org/apache/log4j/helpers/OptionConverterTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/OptionConverterTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java b/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java index e288f90c5c..872e15faa0 100644 --- a/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java +++ b/tests/src/java/org/apache/log4j/helpers/PatternParserTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/net/ShortSocketServer.java b/tests/src/java/org/apache/log4j/net/ShortSocketServer.java index 348706a8c8..4b590cdc9a 100644 --- a/tests/src/java/org/apache/log4j/net/ShortSocketServer.java +++ b/tests/src/java/org/apache/log4j/net/ShortSocketServer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java index e50b78224e..74296d70e1 100644 --- a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java +++ b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java index ea98d2fe47..3982c7aa0c 100644 --- a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java +++ b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/or/ORTestCase.java b/tests/src/java/org/apache/log4j/or/ORTestCase.java index 7c800b96f9..4b40f6c892 100644 --- a/tests/src/java/org/apache/log4j/or/ORTestCase.java +++ b/tests/src/java/org/apache/log4j/or/ORTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java index 961ca8ada9..790dbb9a66 100644 --- a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java +++ b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/AbsoluteDateAndTimeFilter.java b/tests/src/java/org/apache/log4j/util/AbsoluteDateAndTimeFilter.java index 8195f1eeca..55cc500493 100644 --- a/tests/src/java/org/apache/log4j/util/AbsoluteDateAndTimeFilter.java +++ b/tests/src/java/org/apache/log4j/util/AbsoluteDateAndTimeFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/AbsoluteTimeFilter.java b/tests/src/java/org/apache/log4j/util/AbsoluteTimeFilter.java index 633fa288ac..73e203a2cf 100644 --- a/tests/src/java/org/apache/log4j/util/AbsoluteTimeFilter.java +++ b/tests/src/java/org/apache/log4j/util/AbsoluteTimeFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/Compare.java b/tests/src/java/org/apache/log4j/util/Compare.java index d0ba35e01e..3f20534aaa 100644 --- a/tests/src/java/org/apache/log4j/util/Compare.java +++ b/tests/src/java/org/apache/log4j/util/Compare.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/ControlFilter.java b/tests/src/java/org/apache/log4j/util/ControlFilter.java index 00edb9e390..9b4b732455 100644 --- a/tests/src/java/org/apache/log4j/util/ControlFilter.java +++ b/tests/src/java/org/apache/log4j/util/ControlFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/Filter.java b/tests/src/java/org/apache/log4j/util/Filter.java index 1adac84270..3534b2039c 100644 --- a/tests/src/java/org/apache/log4j/util/Filter.java +++ b/tests/src/java/org/apache/log4j/util/Filter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/ISO8601Filter.java b/tests/src/java/org/apache/log4j/util/ISO8601Filter.java index 7b5a0c8b02..2f0156b65d 100644 --- a/tests/src/java/org/apache/log4j/util/ISO8601Filter.java +++ b/tests/src/java/org/apache/log4j/util/ISO8601Filter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java b/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java index 65c7362fae..601a97f175 100644 --- a/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java +++ b/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/LineNumberFilter.java b/tests/src/java/org/apache/log4j/util/LineNumberFilter.java index 14cc8e2f84..c47b9b7a3a 100644 --- a/tests/src/java/org/apache/log4j/util/LineNumberFilter.java +++ b/tests/src/java/org/apache/log4j/util/LineNumberFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/RelativeTimeFilter.java b/tests/src/java/org/apache/log4j/util/RelativeTimeFilter.java index f3818145ad..9b04d6cd36 100644 --- a/tests/src/java/org/apache/log4j/util/RelativeTimeFilter.java +++ b/tests/src/java/org/apache/log4j/util/RelativeTimeFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/SerializationTestHelper.java b/tests/src/java/org/apache/log4j/util/SerializationTestHelper.java index 8ed3a14805..f592a83421 100644 --- a/tests/src/java/org/apache/log4j/util/SerializationTestHelper.java +++ b/tests/src/java/org/apache/log4j/util/SerializationTestHelper.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/SunReflectFilter.java b/tests/src/java/org/apache/log4j/util/SunReflectFilter.java index 3d67144ea0..75cd75ab79 100644 --- a/tests/src/java/org/apache/log4j/util/SunReflectFilter.java +++ b/tests/src/java/org/apache/log4j/util/SunReflectFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/Transformer.java b/tests/src/java/org/apache/log4j/util/Transformer.java index 61b63ce13e..523c3a1658 100644 --- a/tests/src/java/org/apache/log4j/util/Transformer.java +++ b/tests/src/java/org/apache/log4j/util/Transformer.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2006 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/UnexpectedFormatException.java b/tests/src/java/org/apache/log4j/util/UnexpectedFormatException.java index 73da477d64..0cda8c809f 100644 --- a/tests/src/java/org/apache/log4j/util/UnexpectedFormatException.java +++ b/tests/src/java/org/apache/log4j/util/UnexpectedFormatException.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/XMLLineAttributeFilter.java b/tests/src/java/org/apache/log4j/util/XMLLineAttributeFilter.java index a16a4d9e50..bdab05591b 100644 --- a/tests/src/java/org/apache/log4j/util/XMLLineAttributeFilter.java +++ b/tests/src/java/org/apache/log4j/util/XMLLineAttributeFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/util/XMLTimestampFilter.java b/tests/src/java/org/apache/log4j/util/XMLTimestampFilter.java index 1e44c77fc3..443d0a72b0 100644 --- a/tests/src/java/org/apache/log4j/util/XMLTimestampFilter.java +++ b/tests/src/java/org/apache/log4j/util/XMLTimestampFilter.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/varia/ERFATestCase.java b/tests/src/java/org/apache/log4j/varia/ERFATestCase.java index da50a77661..e122631b2d 100644 --- a/tests/src/java/org/apache/log4j/varia/ERFATestCase.java +++ b/tests/src/java/org/apache/log4j/varia/ERFATestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 2006 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java b/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java index aa01e6dd48..7eea034008 100644 --- a/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java +++ b/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/varia/LevelMatchFilterTestCase.java b/tests/src/java/org/apache/log4j/varia/LevelMatchFilterTestCase.java index 164c6237e7..1afc0d502c 100644 --- a/tests/src/java/org/apache/log4j/varia/LevelMatchFilterTestCase.java +++ b/tests/src/java/org/apache/log4j/varia/LevelMatchFilterTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/xml/CustomLevelTestCase.java b/tests/src/java/org/apache/log4j/xml/CustomLevelTestCase.java index d234c2fccf..fda9ddbe8d 100644 --- a/tests/src/java/org/apache/log4j/xml/CustomLevelTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/CustomLevelTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java index 322cf579ed..3cb0053871 100644 --- a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/xml/XLevel.java b/tests/src/java/org/apache/log4j/xml/XLevel.java index 8a415d4d35..7779a8edec 100644 --- a/tests/src/java/org/apache/log4j/xml/XLevel.java +++ b/tests/src/java/org/apache/log4j/xml/XLevel.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTest.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTest.java index a7fa2c4e13..81aebe4e0e 100644 --- a/tests/src/java/org/apache/log4j/xml/XMLLayoutTest.java +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTest.java @@ -1,9 +1,10 @@ /* - * Copyright 1999,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java index cc8b656d10..564e21eec9 100644 --- a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java @@ -1,9 +1,10 @@ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * From 9e3b3ea4fb7a731b3e1895f8b8cb5a832e18b1a8 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 26 Feb 2007 21:14:22 +0000 Subject: [PATCH 254/342] Bug 40951: log4j 1.2.15 release git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@512013 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 162 ++++++++++++++++++++++++++--------------- build/manifest.mf | 2 +- docs/HISTORY.txt | 25 +++++++ pom.xml | 2 +- src/xdocs/download.xml | 56 +++++--------- src/xdocs/plan.xml | 9 +-- 6 files changed, 149 insertions(+), 107 deletions(-) diff --git a/build.xml b/build.xml index b592fa97a0..928c7cd445 100644 --- a/build.xml +++ b/build.xml @@ -20,10 +20,6 @@ - - - - @@ -34,7 +30,7 @@ - + @@ -60,6 +56,7 @@ + @@ -95,12 +92,6 @@ - - - - - - @@ -422,11 +413,11 @@ - + - + - + - + @@ -470,6 +461,22 @@ + + + + + + + + + + + + + + @@ -653,9 +660,9 @@ - + - + - - - - - + includes="apache-log4j-${version}/**" /> @@ -704,53 +711,68 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + - + - + - + + + + + + + + + + + + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + - - - - @@ -782,7 +804,27 @@ classname="org.apache.log4j.net.SMTPAppender" classpath="${jar.dest}/${jar.filename}"/> - + + + + + + + + + + + + + + + + + + + + + 4.0.0 log4j log4j jar Log4j 1.2.14 Log4j http://logging.apache.org/log4j/docs/ Bugzilla http://issues.apache.org/bugzilla 1999 log4j-user log4j-user-subscribe@logging.apache.org log4j-user-unsubscribe@logging.apache.org log4j-user@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-user&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.user log4j-dev log4j-dev-subscribe@logging.apache.org log4j-dev-unsubscribe@logging.apache.org log4j-dev@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-dev&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.devel The Apache Software License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt repo scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_14 http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_14/ Apache Software Foundation http://www.apache.org \ No newline at end of file + 4.0.0 log4j log4j jar Apache Log4j 1.2.15 Apache Log4j http://logging.apache.org/log4j/docs/ Bugzilla http://issues.apache.org/bugzilla 1999 log4j-user log4j-user-subscribe@logging.apache.org log4j-user-unsubscribe@logging.apache.org log4j-user@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-user&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.user log4j-dev log4j-dev-subscribe@logging.apache.org log4j-dev-unsubscribe@logging.apache.org log4j-dev@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-dev&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.devel The Apache Software License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt repo scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15 scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15 http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_15/ Apache Software Foundation http://www.apache.org \ No newline at end of file diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 8d01c06f00..8906b30a2e 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -26,7 +26,7 @@ -
    +

    Log4j is available for download from a number of mirrors. Please @@ -34,52 +34,30 @@ bandwidth.

    -

    Changes in log4j 1.2.14: +

    Changes in log4j 1.2.15:

      -
    • AsyncAppender was rewritten to eliminate reported deadlocks (bugs 26224, 28006, 37904, 38137), - and to add an option to not block if the event queue becomes full (bug 38982).
    • - -
    • SyslogAppender can now accept a port specification (bug 39687) in its syslogHost attribute.
    • - -
    • SMPTAppender can now accept cc and bcc addresses (bug 19125) and perform password authentication (bug 24969).
    • +
    • SyslogAppender now supports a "header" property which if true, causes the appender to produce the HEADER part (timestamp and hostname) of the syslog + packet. Default value is false for compatibility with previous behavior. The SyslogAppender also now sends any header from the associated layout when + activateOptions is called or the first logging event is send and any footer when the appender is closed.
    • The following bugs were fixed:
        -
      • 40159: NullPointerException in org.apache.log4j.NDC.get. -
      • 36787: org.apache.log4j.lf5.util.DateFormatManager.setTimeZone assignment error. -
      • 38559: Monthly logs not generated at midnight with DailyRollingFileAppender. -
      • 40145: PatternLayout specifier %r is not consistent with documentation. -
      • 37119: Space after log level causes default level to be used. -
      • 39135: Bad patterns in ISO8601DateFormat and DateTimeDateFormat. -
      • 35743: SyslogAppender throws NullPointerException upon misconfiguration. -
      • 15501: FallbackErrorHandler throws NullPointerException if no loggers are set. -
      • 38564: Bad documentation for WriterAppender.encoding. -
      • 37866: NTEventLogAppender not build, tested and placed in distribution. -
      • 38662: SMTPAppender does not output newlines between stack trace lines. -
      • 30294: SMTPAppender will not run within sandbox. -
      • 16922: MDC with SMTPAppender doesn't work. -
      • 31507: Misspelling in HierarchyDynamicMBean. -
      • 35123: Additivity not exported by PropertyPrinter. -
      • 31003: RollingFileAppender, if removed, can cause NullPointerExceptions. -
      • 23021: AsyncAppender blocks on thread death. -
      • 40412: NOTICE file added to distribution and jar. -
      • 40378: Chainsaw of log4j 1.2 does not show TRACE level. -
      • 40501: TRACE level missing in short introduction to log4j. -
      • 37960: Update site generation to velocity 1.4 and remove dependency on logging/site project. -
      +
    • 40944: PropertyConfigurator.configure(URL) does not close resource stream.
    • +
    • 40937: In Turkish locale level "info" is not equivalent to "INFO"
    • +
    • 41339: Javadoc of PatternLayout should use %n in TTCC layout examples
    • +
    • 41219: Stacktraces of exceptions disappear occassionally
    • +
    • 38680: Incorrect message when specified custom level class does not implement toLevel
    • +
    • 37282: SyslogAppender leaks descriptors
    • +
    • 41040: SyslogAppender should prefix message with TIMESTAMP and local hostname
    • +
    • 40502: SyslogAppender assumes all lines start with tab
    • +
    • 41169: NTEventLogAppender.dll :: "missing" event description
    • +
    • 41487: Warning when configuring inner-class logger
    • +
    • 41186: AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts
    • +

    -

    The next major release of log4j will be version 1.3. It will contain - many new features and changes, and if you have written custom code, it may - need to be modified to work with it. Please see the document entitled preparing - for log4j 1.3 for a more detailed discussion. -

    - - -

    We also maintain earlier diff --git a/src/xdocs/plan.xml b/src/xdocs/plan.xml index efadd0c7ff..5270fe669c 100644 --- a/src/xdocs/plan.xml +++ b/src/xdocs/plan.xml @@ -46,14 +46,11 @@

    -
    +

    Expected timeframe: As needed

    -

    log4j 1.2.14 was released in September 2006. log4j 1.2 is continuing to be maintained - in response to reported, but no active development is anticipated in the near future. Backporting - the org.apache.log4j.rolling package from log4j 1.3 might be desirable since usage problems - with the original org.apache.log4j.RollingFileAppender and org.apache.log4j.DailyRollingFileAppender - are commonly reported.

    +

    log4j 1.2.15 was released in March 2007. log4j 1.2 is continuing to be maintained + in response to reported issues and requests for back-ported features from log4j 1.3.

    From 91cbfdeee637bf66c9c9c08cc1ae926923815122 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 26 Feb 2007 23:14:43 +0000 Subject: [PATCH 255/342] Bug 37864: Add target to generate binary and source compatibility report git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@512067 13f79535-47bb-0310-9956-ffa450edef68 --- build.properties.sample | 8 +++ build.xml | 35 ++++++++++- docs/HISTORY.txt | 1 + src/xdocs/download.xml | 1 + src/xdocs/stylesheets/compatibility.xslt | 77 ++++++++++++++++++++++++ 5 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 src/xdocs/stylesheets/compatibility.xslt diff --git a/build.properties.sample b/build.properties.sample index 02a54d46ae..3b9345b99e 100644 --- a/build.properties.sample +++ b/build.properties.sample @@ -54,3 +54,11 @@ velocity.jar=${lib.home.dir}/velocity-1.4/velocity-dep-1.4.jar # but Velocity 1.4 is not compatible with JDOM 1.0, but beta 8 works okay # download for http://www.jdom.org/dist/binary/archive jdom.jar=${lib.home.dir}/jdom-b8/build/jdom.jar + + +# +# CLIRR binary compatibility checker +# http://clirr.sourceforge.net +clirr-core.jar=${lib.home.dir}/clirr-0.6/clirr-core-0.6.jar +# bcel 5.1 will throw NullPointerExceptions +bcel.jar=${lib.home.dir}/bcel-5.2/bcel-5.2.jar diff --git a/build.xml b/build.xml index 928c7cd445..96fc2dad7e 100644 --- a/build.xml +++ b/build.xml @@ -511,7 +511,7 @@ doctitle="log4j version ${version}<br>API Specification" windowtitle="Log4j Version ${version}" header="<b>Log4j ${version}</b>" - bottom="Copyright 2000-2005 Apache Software Foundation."> + bottom="Copyright 2000-2007 Apache Software Foundation."> @@ -553,6 +553,39 @@ + + + + + + -Dclirr-core.jar=PATH must be specified. + -Dbcel.jar=PATH must be specified. + -Dreference.jar=PATH must be specified. + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index aedd5c0275..d15989052e 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -28,6 +28,7 @@ 41169: NTEventLogAppender.dll :: "missing" event description 41487: Warning when configuring inner-class logger 41186: AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts + 37864: Add target to generate binary and source compatibility report September 18th, 2006 diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 8906b30a2e..66a1beeaf1 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -53,6 +53,7 @@
  • 41169: NTEventLogAppender.dll :: "missing" event description
  • 41487: Warning when configuring inner-class logger
  • 41186: AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts
  • +
  • 37864: Add target to generate binary and source compatibility report
  • diff --git a/src/xdocs/stylesheets/compatibility.xslt b/src/xdocs/stylesheets/compatibility.xslt new file mode 100644 index 0000000000..606aa2d523 --- /dev/null +++ b/src/xdocs/stylesheets/compatibility.xslt @@ -0,0 +1,77 @@ + + + + + + + + Apache log4j compatibility report + + +

    Apache log4j compatibility report

    + + + +
    + + + + +
    +
    + + + + + + o.a.l. + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + o.a.l. + + + +
    \ No newline at end of file From 9b83dcfdbc613a281c1e30d7c148eff4038db25e Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 26 Feb 2007 23:51:43 +0000 Subject: [PATCH 256/342] Bug 41708: PropertyPrinter.printOptions breaking signature change in log4j 1.2.9 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@512082 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 1 + .../apache/log4j/config/PropertyPrinter.java | 18 ++++++++++++++---- src/xdocs/download.xml | 1 + 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index d15989052e..4f4aa6b5eb 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -29,6 +29,7 @@ 41487: Warning when configuring inner-class logger 41186: AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts 37864: Add target to generate binary and source compatibility report + 41708: PropertyPrinter.printOptions breaking signature change in log4j 1.2.9 September 18th, 2006 diff --git a/src/java/org/apache/log4j/config/PropertyPrinter.java b/src/java/org/apache/log4j/config/PropertyPrinter.java index fd577deaea..6462e3a741 100644 --- a/src/java/org/apache/log4j/config/PropertyPrinter.java +++ b/src/java/org/apache/log4j/config/PropertyPrinter.java @@ -17,9 +17,15 @@ package org.apache.log4j.config; -import java.io.*; -import java.util.*; -import org.apache.log4j.*; +import org.apache.log4j.Appender; +import org.apache.log4j.Category; +import org.apache.log4j.Level; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; + +import java.io.PrintWriter; +import java.util.Enumeration; +import java.util.Hashtable; /** Prints the configuration of the log4j default hierarchy @@ -85,7 +91,7 @@ void print(PrintWriter out) { } protected - void printOptions(PrintWriter out, Logger cat) { + void printOptions(PrintWriter out, Category cat) { Enumeration appenders = cat.getAllAppenders(); Level prio = cat.getLevel(); String appenderString = (prio == null ? "" : prio.toString()); @@ -119,6 +125,10 @@ void printOptions(PrintWriter out, Logger cat) { out.println("log4j.additivity." + cat.getName() + "=false"); } } + + protected void printOptions(PrintWriter out, Logger cat) { + printOptions(out, (Category) cat); + } protected void printOptions(PrintWriter out, Object obj, String fullname) { diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 66a1beeaf1..396ff33d23 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -54,6 +54,7 @@
  • 41487: Warning when configuring inner-class logger
  • 41186: AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts
  • 37864: Add target to generate binary and source compatibility report
  • +
  • 41708: PropertyPrinter.printOptions breaking signature change in log4j 1.2.9
  • From 981d3b9e60a5ea4e1226b18bec04b011d6caed48 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 27 Feb 2007 00:55:18 +0000 Subject: [PATCH 257/342] Bug 40755: Update source per ASF Header Policy git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@512093 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/nt/NTEventLogAppender.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/nt/NTEventLogAppender.rc b/src/java/org/apache/log4j/nt/NTEventLogAppender.rc index 6d06474745..f5e2eb1e5f 100755 --- a/src/java/org/apache/log4j/nt/NTEventLogAppender.rc +++ b/src/java/org/apache/log4j/nt/NTEventLogAppender.rc @@ -96,7 +96,7 @@ BEGIN VALUE "FileDescription", "Platform methods for NTEventLogAppender" VALUE "FileVersion", "1, 2, 15, 1" VALUE "InternalName", "NTEventLogAppender" - VALUE "LegalCopyright", "Licensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + VALUE "LegalCopyright", "Licensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the ""License""); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an ""AS IS"" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." VALUE "OriginalFilename", "NTEventLogAppender.dll" VALUE "ProductName", "Apache log4j" VALUE "ProductVersion", "1, 2, 15, 1" From 90d4e78e7ab65cb2588808474355cb6907f37111 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 27 Feb 2007 01:05:10 +0000 Subject: [PATCH 258/342] Bug 40937: new Locale(String) introduced in JDK 1.4 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@512099 13f79535-47bb-0310-9956-ffa450edef68 --- tests/src/java/org/apache/log4j/LevelTest.java | 2 +- tests/src/java/org/apache/log4j/PriorityTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/src/java/org/apache/log4j/LevelTest.java b/tests/src/java/org/apache/log4j/LevelTest.java index ca477be30e..e0bd814306 100644 --- a/tests/src/java/org/apache/log4j/LevelTest.java +++ b/tests/src/java/org/apache/log4j/LevelTest.java @@ -255,7 +255,7 @@ public void testDotlessLowerI() { */ public void testDottedLowerI() { Locale defaultLocale = Locale.getDefault(); - Locale turkey = new Locale("tr"); + Locale turkey = new Locale("tr", "TR"); Locale.setDefault(turkey); Level level = Level.toLevel("info"); Locale.setDefault(defaultLocale); diff --git a/tests/src/java/org/apache/log4j/PriorityTest.java b/tests/src/java/org/apache/log4j/PriorityTest.java index ce35100877..68c748202a 100644 --- a/tests/src/java/org/apache/log4j/PriorityTest.java +++ b/tests/src/java/org/apache/log4j/PriorityTest.java @@ -202,7 +202,7 @@ public void testDotlessLowerI() { */ public void testDottedLowerI() { Locale defaultLocale = Locale.getDefault(); - Locale turkey = new Locale("tr"); + Locale turkey = new Locale("tr", "TR"); Locale.setDefault(turkey); Priority level = Priority.toPriority("info"); Locale.setDefault(defaultLocale); From c4a748ac5a13d4deed5ce9f7cc03951d7a29bcd7 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 27 Feb 2007 05:21:06 +0000 Subject: [PATCH 259/342] Bug 40502: Fix syslog tests to not reuse packets, fails on jdk 1.3 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@512139 13f79535-47bb-0310-9956-ffa450edef68 --- tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java index 3982c7aa0c..0a8e8a8c8c 100644 --- a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java +++ b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java @@ -399,7 +399,6 @@ private static String[] log(final boolean header, final int packets) throws Exception { DatagramSocket ds = new DatagramSocket(); ds.setSoTimeout(2000); - DatagramPacket p = new DatagramPacket(new byte[1000], 0, 1000); SyslogAppender appender = new SyslogAppender(); appender.setSyslogHost("localhost:" + ds.getLocalPort()); @@ -418,7 +417,9 @@ private static String[] log(final boolean header, } appender.close(); String[] retval = new String[packets]; + byte[] buf = new byte[1000]; for(int i = 0; i < packets; i++) { + DatagramPacket p = new DatagramPacket(buf, 0, buf.length); ds.receive(p); retval[i] = new String(p.getData(), 0, p.getLength()); } @@ -519,7 +520,6 @@ public void testHeaderLogging() throws Exception { public void testLayoutHeader() throws Exception { DatagramSocket ds = new DatagramSocket(); ds.setSoTimeout(2000); - DatagramPacket p = new DatagramPacket(new byte[1000], 0, 1000); SyslogAppender appender = new SyslogAppender(); appender.setSyslogHost("localhost:" + ds.getLocalPort()); @@ -534,7 +534,9 @@ public void testLayoutHeader() throws Exception { l.info("Hello, World"); appender.close(); String[] s = new String[3]; + byte[] buf = new byte[1000]; for(int i = 0; i < 3; i++) { + DatagramPacket p = new DatagramPacket(buf, 0, buf.length); ds.receive(p); s[i] = new String(p.getData(), 0, p.getLength()); } From b5fb3a40caa865c4f19e83ac05d541248de55c1d Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 27 Feb 2007 05:51:10 +0000 Subject: [PATCH 260/342] Bug 41169: Add instructions to remove registry key to allow support DLL to register itself git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@512145 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 6 ++++++ src/xdocs/download.xml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 4f4aa6b5eb..47e245e231 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -15,6 +15,12 @@ SyslogAppender also now sends any header from the associated layout when activateOptions is called or first logging event is sent and any footer when the appender is closed. + + NTEventLogAppender: Updated NTEventLogAppender.dll which corrects missing event messages + and which should work with earlier releases of log4j. If replacing + a previously used NTEventLogAppender.dll, the registry key + HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J + should be removed to allow the new DLL to properly register itself. - Fixed following bugs: 40944: PropertyConfigurator.configure(URL) does not close resource stream. diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 396ff33d23..17c33e7530 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -40,6 +40,12 @@ packet. Default value is false for compatibility with previous behavior. The SyslogAppender also now sends any header from the associated layout when activateOptions is called or the first logging event is send and any footer when the appender is closed. +
  • NTEventLogAppender: Updated NTEventLogAppender.dll which corrects missing event messages + and which should work with earlier releases of log4j. If replacing + a previously used NTEventLogAppender.dll, the registry key + HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J + should be removed to allow the new DLL to properly register itself.
  • +
  • The following bugs were fixed:
    • 40944: PropertyConfigurator.configure(URL) does not close resource stream.
    • From 86fa0a78ba8d9cc4898020dd313499be7a6699ca Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 27 Feb 2007 06:02:27 +0000 Subject: [PATCH 261/342] Bug 40951: Update label to 1.2.15 on link to API documentation git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@512147 13f79535-47bb-0310-9956-ffa450edef68 --- src/xdocs/documentation.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml index d0c2e301a5..f6b760527b 100644 --- a/src/xdocs/documentation.xml +++ b/src/xdocs/documentation.xml @@ -44,7 +44,7 @@

    • - javadoc: 1.2.14, 1.3 (alpha) + javadoc: 1.2.15, 1.3 (alpha)
    • From ba22e3525cfbe4e9fa29588b6920522b3efe1a6c Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 27 Feb 2007 06:42:06 +0000 Subject: [PATCH 262/342] Bug 40951: Add MSG00001.bin to dist, ASF notice to Javadoc git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@512155 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/build.xml b/build.xml index 96fc2dad7e..cc5c9d9c3f 100644 --- a/build.xml +++ b/build.xml @@ -510,7 +510,21 @@ overview="${docs.dest}/overview.html" doctitle="log4j version ${version}<br>API Specification" windowtitle="Log4j Version ${version}" - header="<b>Log4j ${version}</b>" + header='<b>Log4j ${version}</b><!-- Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the 'License'); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an 'AS IS' BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-->' bottom="Copyright 2000-2007 Apache Software Foundation."> @@ -718,7 +732,7 @@ ${dist.dir}/classes/org/**, src/java/org/apache/log4j/test/**/*, **/.#*, - **/*.o, **/*.res, **/*.bin, **/*.h, **/EventLogCategories.rc"/> + **/*.o, **/*.res, **/*.h, **/EventLogCategories.rc"/> From 176da82c099c925f520b4493561e3ad736f36cbe Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 28 Feb 2007 21:29:35 +0000 Subject: [PATCH 263/342] Bug 41169: Add DllRegisterServer and DllUnregisterServer entry points git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@512980 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/nt/nteventlog.cpp | 56 +++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/java/org/apache/log4j/nt/nteventlog.cpp b/src/java/org/apache/log4j/nt/nteventlog.cpp index c994adb57e..e5a9e12fed 100644 --- a/src/java/org/apache/log4j/nt/nteventlog.cpp +++ b/src/java/org/apache/log4j/nt/nteventlog.cpp @@ -200,4 +200,60 @@ jint handle) } +// +// Entry point which registers default event source (Log4j) +// when invoked using regsvr32 tool. +// +// +STDAPI __declspec(dllexport) DllRegisterServer(void) { + HRESULT hr = E_FAIL; + HMODULE hmodule = GetModuleHandleW(L"NTEventLogAppender.dll"); + if (hmodule != NULL) { + wchar_t modpath[_MAX_PATH]; + DWORD modlen = GetModuleFileNameW(hmodule, modpath, _MAX_PATH - 1); + if (modlen > 0) { + modpath[modlen] = 0; + const wchar_t key[] = L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\Log4j"; + DWORD disposition; + HKEY hkey = 0; + + LONG stat = RegCreateKeyExW(HKEY_LOCAL_MACHINE, key, 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, + &hkey, &disposition); + if (stat == ERROR_SUCCESS) { + stat = RegSetValueExW(hkey, L"EventMessageFile", 0, REG_EXPAND_SZ, + (LPBYTE) modpath, (wcslen(modpath) + 1) * sizeof(wchar_t)); + if(stat == ERROR_SUCCESS) { + stat = RegSetValueExW(hkey, L"CategoryMessageFile", 0, REG_EXPAND_SZ, + (LPBYTE) modpath, (wcslen(modpath) + 1) * sizeof(wchar_t)); + } + if(stat == ERROR_SUCCESS) { + DWORD value = 7; + stat == RegSetValueExW(hkey, L"TypesSupported", 0, REG_DWORD, (LPBYTE)&value, sizeof(DWORD)); + } + if(stat == ERROR_SUCCESS) { + DWORD value = 6; + stat == RegSetValueExW(hkey, L"CategoryCount", 0, REG_DWORD, (LPBYTE)&value, sizeof(DWORD)); + } + LONG closeStat = RegCloseKey(hkey); + if (stat == ERROR_SUCCESS && closeStat == ERROR_SUCCESS) { + hr = S_OK; + } + } + } + } + return hr; +} + + +// +// Entry point which unregisters default event source (Log4j) +// when invoked using regsvr32 tool with /u option. +// +// +STDAPI __declspec(dllexport) DllUnregisterServer(void) { + LONG stat = RegDeleteKeyW(HKEY_LOCAL_MACHINE, + L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\Log4j"); + return (stat == ERROR_SUCCESS || stat == ERROR_FILE_NOT_FOUND) ? S_OK : E_FAIL; +} #endif From 17e458cde3b5a8282ed23662809519a23b459796 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 28 Feb 2007 21:38:34 +0000 Subject: [PATCH 264/342] Bug 41169: Add DllRegisterServer and DllUnregisterServer entry points git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@512992 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 10 ++++++---- src/xdocs/download.xml | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 47e245e231..260495a6ab 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -17,10 +17,12 @@ any footer when the appender is closed. NTEventLogAppender: Updated NTEventLogAppender.dll which corrects missing event messages - and which should work with earlier releases of log4j. If replacing - a previously used NTEventLogAppender.dll, the registry key - HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J - should be removed to allow the new DLL to properly register itself. + and which should work with earlier releases of log4j. + NTEventLogAppender.dll also now supports registration and unregistration + using regsvr32. If replacing an existing copy of NTEventLogAppender, + use "regsvr32 NTDllEventLogAppender.dll" or manually remove the + HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J + registry key. - Fixed following bugs: 40944: PropertyConfigurator.configure(URL) does not close resource stream. diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index 17c33e7530..b15af8bdb0 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -41,10 +41,12 @@ activateOptions is called or the first logging event is send and any footer when the appender is closed.
    • NTEventLogAppender: Updated NTEventLogAppender.dll which corrects missing event messages - and which should work with earlier releases of log4j. If replacing - a previously used NTEventLogAppender.dll, the registry key - HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J - should be removed to allow the new DLL to properly register itself.
    • + and which should work with earlier releases of log4j. + NTEventLogAppender.dll also now supports registration and unregistration + using regsvr32. If replacing an existing copy of NTEventLogAppender, + use "regsvr32 NTDllEventLogAppender.dll" or manually remove the + HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J + registry key.
    • The following bugs were fixed:
        From cf4d8a2be2ccf6919037be7070526a79e02c223e Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 2 Mar 2007 06:58:38 +0000 Subject: [PATCH 265/342] Bug 41735: RollingFileAppender may delete files during rollover git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@513638 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 1 + .../org/apache/log4j/RollingFileAppender.java | 45 +++++-- src/xdocs/download.xml | 1 + .../java/org/apache/log4j/RFATestCase.java | 121 ++++++++++++++++++ 4 files changed, 160 insertions(+), 8 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 260495a6ab..3b9e3faed9 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -38,6 +38,7 @@ 41186: AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts 37864: Add target to generate binary and source compatibility report 41708: PropertyPrinter.printOptions breaking signature change in log4j 1.2.9 + 41735: RollingFileAppender may delete files during rollover September 18th, 2006 diff --git a/src/java/org/apache/log4j/RollingFileAppender.java b/src/java/org/apache/log4j/RollingFileAppender.java index 5795e8851d..4ad42e9285 100644 --- a/src/java/org/apache/log4j/RollingFileAppender.java +++ b/src/java/org/apache/log4j/RollingFileAppender.java @@ -47,6 +47,8 @@ public class RollingFileAppender extends FileAppender { */ protected int maxBackupIndex = 1; + private long nextRollover = 0; + /** The default constructor simply calls its {@link FileAppender#FileAppender parents constructor}. */ @@ -120,27 +122,33 @@ void rollOver() { File file; if (qw != null) { - LogLog.debug("rolling over count=" + ((CountingQuietWriter) qw).getCount()); + long size = ((CountingQuietWriter) qw).getCount(); + LogLog.debug("rolling over count=" + size); + // if operation fails, do not roll again until + // maxFileSize more bytes are written + nextRollover = size + maxFileSize; } LogLog.debug("maxBackupIndex="+maxBackupIndex); + boolean renameSucceeded = true; // If maxBackups <= 0, then there is no file renaming to be done. if(maxBackupIndex > 0) { // Delete the oldest file, to keep Windows happy. file = new File(fileName + '.' + maxBackupIndex); if (file.exists()) - file.delete(); + renameSucceeded = file.delete(); // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2} - for (int i = maxBackupIndex - 1; i >= 1; i--) { + for (int i = maxBackupIndex - 1; i >= 1 && renameSucceeded; i--) { file = new File(fileName + "." + i); if (file.exists()) { target = new File(fileName + '.' + (i + 1)); LogLog.debug("Renaming file " + file + " to " + target); - file.renameTo(target); + renameSucceeded = file.renameTo(target); } } + if(renameSucceeded) { // Rename fileName to fileName.1 target = new File(fileName + "." + 1); @@ -148,17 +156,35 @@ void rollOver() { file = new File(fileName); LogLog.debug("Renaming file " + file + " to " + target); - file.renameTo(target); + renameSucceeded = file.renameTo(target); + // + // if file rename failed, reopen file with append = true + // + if (!renameSucceeded) { + try { + this.setFile(fileName, true, bufferedIO, bufferSize); + } + catch(IOException e) { + LogLog.error("setFile("+fileName+", true) call failed.", e); + } + } + } } + // + // if all renames were successful, then + // + if (renameSucceeded) { try { // This will also close the file. This is OK since multiple // close operations are safe. this.setFile(fileName, false, bufferedIO, bufferSize); + nextRollover = 0; } catch(IOException e) { LogLog.error("setFile("+fileName+", false) call failed.", e); } + } } public @@ -235,8 +261,11 @@ void setQWForFiles(Writer writer) { protected void subAppend(LoggingEvent event) { super.subAppend(event); - if((fileName != null) && - ((CountingQuietWriter) qw).getCount() >= maxFileSize) - this.rollOver(); + if(fileName != null && qw != null) { + long size = ((CountingQuietWriter) qw).getCount(); + if (size >= maxFileSize && size >= nextRollover) { + rollOver(); + } + } } } diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index b15af8bdb0..c565fcaf5a 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -63,6 +63,7 @@
      • 41186: AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts
      • 37864: Add target to generate binary and source compatibility report
      • 41708: PropertyPrinter.printOptions breaking signature change in log4j 1.2.9
      • +
      • 41735: RollingFileAppender may delete files during rollover
    diff --git a/tests/src/java/org/apache/log4j/RFATestCase.java b/tests/src/java/org/apache/log4j/RFATestCase.java index c2ff55bc62..0d11fc200d 100644 --- a/tests/src/java/org/apache/log4j/RFATestCase.java +++ b/tests/src/java/org/apache/log4j/RFATestCase.java @@ -20,6 +20,7 @@ import junit.framework.TestCase; import java.io.File; +import java.io.FileWriter; import java.io.IOException; /** @@ -113,4 +114,124 @@ public void test3ParamConstructor() throws IOException { assertEquals(1, appender.getMaxBackupIndex()); } + /** + * Test locking of .1 file. + */ + public void testLockDotOne() throws Exception { + Logger logger = Logger.getLogger(RFATestCase.class); + Logger root = Logger.getRootLogger(); + PatternLayout layout = new PatternLayout("%m\n"); + org.apache.log4j.RollingFileAppender rfa = + new org.apache.log4j.RollingFileAppender(); + rfa.setName("ROLLING"); + rfa.setLayout(layout); + rfa.setAppend(false); + rfa.setMaxBackupIndex(10); + rfa.setMaximumFileSize(100); + rfa.setFile("output/RFA-dot1.log"); + rfa.activateOptions(); + root.addAppender(rfa); + + new File("output/RFA-dot1.log.2").delete(); + + FileWriter dot1 = new FileWriter("output/RFA-dot1.log.1"); + dot1.write("Locked file"); + FileWriter dot5 = new FileWriter("output/RFA-dot1.log.5"); + dot5.write("Unlocked file"); + dot5.close(); + + // Write exactly 10 bytes with each log + for (int i = 0; i < 15; i++) { + if (i < 10) { + logger.debug("Hello---" + i); + } else if (i < 100) { + logger.debug("Hello--" + i); + } + } + dot1.close(); + + for (int i = 15; i < 25; i++) { + logger.debug("Hello--" + i); + } + rfa.close(); + + + assertTrue(new File("output/RFA-dot1.log.7").exists()); + // + // if .2 is the locked file then + // renaming wasn't successful until the file was closed + if (new File("output/RFA-dot1.log.2").length() < 15) { + assertEquals(50, new File("output/RFA-dot1.log").length()); + assertEquals(200, new File("output/RFA-dot1.log.1").length()); + } else { + assertTrue(new File("output/RFA-dot1.log").exists()); + assertTrue(new File("output/RFA-dot1.log.1").exists()); + assertTrue(new File("output/RFA-dot1.log.2").exists()); + assertTrue(new File("output/RFA-dot1.log.3").exists()); + assertFalse(new File("output/RFA-dot1.log.4").exists()); + } + } + + + /** + * Test locking of .3 file. + */ + public void testLockDotThree() throws Exception { + Logger logger = Logger.getLogger(RFATestCase.class); + Logger root = Logger.getRootLogger(); + PatternLayout layout = new PatternLayout("%m\n"); + org.apache.log4j.RollingFileAppender rfa = + new org.apache.log4j.RollingFileAppender(); + rfa.setName("ROLLING"); + rfa.setLayout(layout); + rfa.setAppend(false); + rfa.setMaxBackupIndex(10); + rfa.setMaximumFileSize(100); + rfa.setFile("output/RFA-dot3.log"); + rfa.activateOptions(); + root.addAppender(rfa); + + new File("output/RFA-dot3.log.1").delete(); + new File("output/RFA-dot3.log.2").delete(); + new File("output/RFA-dot3.log.4").delete(); + + FileWriter dot3 = new FileWriter("output/RFA-dot3.log.3"); + dot3.write("Locked file"); + FileWriter dot5 = new FileWriter("output/RFA-dot3.log.5"); + dot5.write("Unlocked file"); + dot5.close(); + + // Write exactly 10 bytes with each log + for (int i = 0; i < 15; i++) { + if (i < 10) { + logger.debug("Hello---" + i); + } else if (i < 100) { + logger.debug("Hello--" + i); + } + } + dot3.close(); + + for (int i = 15; i < 35; i++) { + logger.debug("Hello--" + i); + } + rfa.close(); + + assertTrue(new File("output/RFA-dot3.log.8").exists()); + // + // if .3 is the locked file then + // renaming wasn't successful until file was closed + if (new File("output/RFA-dot3.log.5").exists()) { + assertEquals(50, new File("output/RFA-dot3.log").length()); + assertEquals(100, new File("output/RFA-dot3.log.1").length()); + assertEquals(200, new File("output/RFA-dot3.log.2").length()); + } else { + assertTrue(new File("output/RFA-dot3.log").exists()); + assertTrue(new File("output/RFA-dot3.log.1").exists()); + assertTrue(new File("output/RFA-dot3.log.2").exists()); + assertTrue(new File("output/RFA-dot3.log.3").exists()); + assertFalse(new File("output/RFA-dot3.log.4").exists()); + } + } + + } From 62b212cdcf5864ab2c88d845ef8801133c34e7c9 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 23 Mar 2007 21:05:14 +0000 Subject: [PATCH 266/342] Bug 33708: XMLConfiguration of loggerFactory does not work git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@521903 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 3 +- .../org/apache/log4j/xml/DOMConfigurator.java | 19 ++- src/java/org/apache/log4j/xml/log4j.dtd | 6 +- src/xdocs/download.xml | 1 + tests/input/xml/categoryfactory1.xml | 35 +++++ tests/input/xml/categoryfactory2.xml | 38 +++++ tests/input/xml/loggerfactory1.xml | 35 +++++ .../org/apache/log4j/xml/DOMTestCase.java | 138 ++++++++++++++++-- 8 files changed, 259 insertions(+), 16 deletions(-) create mode 100644 tests/input/xml/categoryfactory1.xml create mode 100644 tests/input/xml/categoryfactory2.xml create mode 100644 tests/input/xml/loggerfactory1.xml diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 3b9e3faed9..1bafe72a37 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -5,7 +5,7 @@ client code. [***] Changes requiring important modifications to existing client code. - March 5th, 2007 + TBD, 2007 - Release of version 1.2.15 @@ -39,6 +39,7 @@ 37864: Add target to generate binary and source compatibility report 41708: PropertyPrinter.printOptions breaking signature change in log4j 1.2.9 41735: RollingFileAppender may delete files during rollover + 33708: XMLConfiguration of loggerFactory does not work September 18th, 2006 diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index eff3f0d1c6..4c2213dbc5 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -80,6 +80,7 @@ public class DOMConfigurator implements Configurator { static final String LOGGER = "logger"; static final String LOGGER_REF = "logger-ref"; static final String CATEGORY_FACTORY_TAG = "categoryFactory"; + static final String LOGGER_FACTORY_TAG = "loggerFactory"; static final String NAME_ATTR = "name"; static final String CLASS_ATTR = "class"; static final String VALUE_ATTR = "value"; @@ -109,6 +110,8 @@ public class DOMConfigurator implements Configurator { Properties props; LoggerRepository repository; + protected LoggerFactory catFactory = null; + /** No argument constructor. */ @@ -258,7 +261,8 @@ void parseErrorHandler(Element element, Appender appender) { eh.setBackupAppender(findAppenderByReference(currentElement)); } else if(tagName.equals(LOGGER_REF)) { String loggerName = currentElement.getAttribute(REF_ATTR); - Logger logger = repository.getLogger(loggerName); + Logger logger = (catFactory == null) ? repository.getLogger(loggerName) + : repository.getLogger(loggerName, catFactory); eh.setLogger(logger); } else if(tagName.equals(ROOT_REF)) { Logger root = repository.getRootLogger(); @@ -317,7 +321,7 @@ void parseCategory (Element loggerElement) { if(EMPTY_STR.equals(className)) { LogLog.debug("Retreiving an instance of org.apache.log4j.Logger."); - cat = repository.getLogger(catName); + cat = (catFactory == null) ? repository.getLogger(catName) : repository.getLogger(catName, catFactory); } else { LogLog.debug("Desired logger sub-class: ["+className+']'); @@ -361,10 +365,15 @@ void parseCategoryFactory(Element factoryElement) { } else { LogLog.debug("Desired category factory: ["+className+']'); - Object catFactory = OptionConverter.instantiateByClassName(className, + Object factory = OptionConverter.instantiateByClassName(className, LoggerFactory.class, null); - PropertySetter propSetter = new PropertySetter(catFactory); + if (factory instanceof LoggerFactory) { + catFactory = (LoggerFactory) factory; + } else { + LogLog.error("Category Factory class " + className + " does not implement org.apache.log4j.LoggerFactory"); + } + PropertySetter propSetter = new PropertySetter(factory); Element currentElement = null; Node currentNode = null; @@ -812,7 +821,7 @@ void parse(Element element) { currentElement = (Element) currentNode; tagName = currentElement.getTagName(); - if (tagName.equals(CATEGORY_FACTORY_TAG)) { + if (tagName.equals(CATEGORY_FACTORY_TAG) || tagName.equals(LOGGER_FACTORY_TAG)) { parseCategoryFactory(currentElement); } } diff --git a/src/java/org/apache/log4j/xml/log4j.dtd b/src/java/org/apache/log4j/xml/log4j.dtd index 0b3957aa34..39993be1d7 100644 --- a/src/java/org/apache/log4j/xml/log4j.dtd +++ b/src/java/org/apache/log4j/xml/log4j.dtd @@ -9,7 +9,7 @@ elements,appender elements, categories and an optional root element. --> + (categoryFactory|loggerFactory)?)> @@ -118,6 +118,10 @@ element. --> + + + 37864: Add target to generate binary and source compatibility report
  • 41708: PropertyPrinter.printOptions breaking signature change in log4j 1.2.9
  • 41735: RollingFileAppender may delete files during rollover
  • +
  • 33708: XML configuration of loggerFactory does not work
  • diff --git a/tests/input/xml/categoryfactory1.xml b/tests/input/xml/categoryfactory1.xml new file mode 100644 index 0000000000..369e7c9474 --- /dev/null +++ b/tests/input/xml/categoryfactory1.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/input/xml/categoryfactory2.xml b/tests/input/xml/categoryfactory2.xml new file mode 100644 index 0000000000..146e5f2429 --- /dev/null +++ b/tests/input/xml/categoryfactory2.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/input/xml/loggerfactory1.xml b/tests/input/xml/loggerfactory1.xml new file mode 100644 index 0000000000..c2514a7631 --- /dev/null +++ b/tests/input/xml/loggerfactory1.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java index 3cb0053871..6a98d93e93 100644 --- a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java @@ -18,19 +18,20 @@ package org.apache.log4j.xml; import junit.framework.TestCase; -import junit.framework.TestSuite; -import junit.framework.Test; - -import org.apache.log4j.Logger; +import org.apache.log4j.Appender; import org.apache.log4j.Level; -import org.apache.log4j.util.Filter; -import org.apache.log4j.util.LineNumberFilter; +import org.apache.log4j.Logger; +import org.apache.log4j.spi.ErrorHandler; +import org.apache.log4j.spi.LoggerFactory; +import org.apache.log4j.spi.LoggingEvent; +import org.apache.log4j.util.Compare; import org.apache.log4j.util.ControlFilter; +import org.apache.log4j.util.Filter; import org.apache.log4j.util.ISO8601Filter; -import org.apache.log4j.util.Transformer; -import org.apache.log4j.util.Compare; -import org.apache.log4j.util.SunReflectFilter; import org.apache.log4j.util.JunitTestRunnerFilter; +import org.apache.log4j.util.LineNumberFilter; +import org.apache.log4j.util.SunReflectFilter; +import org.apache.log4j.util.Transformer; public class DOMTestCase extends TestCase { @@ -159,4 +160,123 @@ void common() { root.error("Message " + i, e); } + + + /** + * CustomLogger implementation for testCategoryFactory1 and 2. + */ + private static class CustomLogger extends Logger { + /** + * Creates new instance. + * @param name logger name. + */ + public CustomLogger(final String name) { + super(name); + } + } + + /** + * Creates new instances of CustomLogger. + */ + public static class CustomLoggerFactory implements LoggerFactory { + /** + * Addivity, expected to be set false in configuration file. + */ + private boolean additivity; + + /** + * Create new instance of factory. + */ + public CustomLoggerFactory() { + additivity = true; + } + + /** + * Create new logger. + * @param name logger name. + * @return new logger. + */ + public Logger makeNewLoggerInstance(final String name) { + Logger logger = new CustomLogger(name); + assertFalse(additivity); + return logger; + } + + /** + * Set additivity. + * @param newVal new value of additivity. + */ + public void setAdditivity(final boolean newVal) { + additivity = newVal; + } + } + + /** + * CustomErrorHandler for testCategoryFactory2. + */ + public static class CustomErrorHandler implements ErrorHandler { + public CustomErrorHandler() {} + public void activateOptions() {} + public void setLogger(final Logger logger) {} + public void error(String message, Exception e, int errorCode) {} + public void error(String message) {} + public void error(String message, Exception e, int errorCode, LoggingEvent event) {} + public void setAppender(Appender appender) {} + public void setBackupAppender(Appender appender) {} + } + + /** + * Tests that loggers mentioned in logger elements + * use the specified categoryFactory. See bug 33708. + */ + public void testCategoryFactory1() { + DOMConfigurator.configure("input/xml/categoryfactory1.xml"); + // + // logger explicitly mentioned in configuration, + // should be a CustomLogger + Logger logger1 = Logger.getLogger("org.apache.log4j.xml.DOMTestCase.testCategoryFactory1.1"); + assertTrue(logger1 instanceof CustomLogger); + // + // logger not explicitly mentioned in configuration, + // should use default factory + Logger logger2 = Logger.getLogger("org.apache.log4j.xml.DOMTestCase.testCategoryFactory1.2"); + assertFalse(logger2 instanceof CustomLogger); + } + + /** + * Tests that loggers mentioned in logger-ref elements + * use the specified categoryFactory. See bug 33708. + */ + public void testCategoryFactory2() { + DOMConfigurator.configure("input/xml/categoryfactory2.xml"); + // + // logger explicitly mentioned in configuration, + // should be a CustomLogger + Logger logger1 = Logger.getLogger("org.apache.log4j.xml.DOMTestCase.testCategoryFactory2.1"); + assertTrue(logger1 instanceof CustomLogger); + // + // logger not explicitly mentioned in configuration, + // should use default factory + Logger logger2 = Logger.getLogger("org.apache.log4j.xml.DOMTestCase.testCategoryFactory2.2"); + assertFalse(logger2 instanceof CustomLogger); + } + + /** + * Tests that loggers mentioned in logger elements + * use the specified loggerFactory. See bug 33708. + */ + public void testLoggerFactory1() { + DOMConfigurator.configure("input/xml/loggerfactory1.xml"); + // + // logger explicitly mentioned in configuration, + // should be a CustomLogger + Logger logger1 = Logger.getLogger("org.apache.log4j.xml.DOMTestCase.testLoggerFactory1.1"); + assertTrue(logger1 instanceof CustomLogger); + // + // logger not explicitly mentioned in configuration, + // should use default factory + Logger logger2 = Logger.getLogger("org.apache.log4j.xml.DOMTestCase.testLoggerFactory1.2"); + assertFalse(logger2 instanceof CustomLogger); + } + } From 135a710305ae6e32f93340eb15660c4ec03a96cc Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 12 Apr 2007 22:19:25 +0000 Subject: [PATCH 267/342] Bug 42108: Add log4j 1.3 style accessors to LoggingEvent git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@528257 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/AppenderSkeleton.java | 20 +++ .../org/apache/log4j/net/SocketAppender.java | 3 +- .../org/apache/log4j/spi/LocationInfo.java | 27 +++ .../org/apache/log4j/spi/LoggingEvent.java | 164 ++++++++++++++++++ .../log4j/spi/ThrowableInformation.java | 12 ++ 5 files changed, 225 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/AppenderSkeleton.java b/src/java/org/apache/log4j/AppenderSkeleton.java index 49563a7e08..7bf34ff945 100644 --- a/src/java/org/apache/log4j/AppenderSkeleton.java +++ b/src/java/org/apache/log4j/AppenderSkeleton.java @@ -64,6 +64,26 @@ public abstract class AppenderSkeleton implements Appender, OptionHandler { */ protected boolean closed = false; + /** + * Create new instance. + */ + public AppenderSkeleton() { + super(); + } + + /** + * Create new instance. + * Provided for compatibility with log4j 1.3. + * + * @param isActive true if appender is ready for use upon construction. + * Not used in log4j 1.2.x. + * @since 1.2.15 + */ + protected AppenderSkeleton(final boolean isActive) { + super(); + } + + /** Derived appenders should override this method if option structure diff --git a/src/java/org/apache/log4j/net/SocketAppender.java b/src/java/org/apache/log4j/net/SocketAppender.java index a3782b4229..af81918ecb 100644 --- a/src/java/org/apache/log4j/net/SocketAppender.java +++ b/src/java/org/apache/log4j/net/SocketAppender.java @@ -102,8 +102,9 @@ public class SocketAppender extends AppenderSkeleton { /** The default port number of remote logging server (4560). + @since 1.2.15 */ - static final int DEFAULT_PORT = 4560; + static public final int DEFAULT_PORT = 4560; /** The default reconnection delay (30000 milliseconds or 30 seconds). diff --git a/src/java/org/apache/log4j/spi/LocationInfo.java b/src/java/org/apache/log4j/spi/LocationInfo.java index 699b3bd2f7..b3ccf0d369 100644 --- a/src/java/org/apache/log4j/spi/LocationInfo.java +++ b/src/java/org/apache/log4j/spi/LocationInfo.java @@ -64,6 +64,14 @@ public class LocationInfo implements java.io.Serializable { static final long serialVersionUID = -1325822038990805636L; + /** + * NA_LOCATION_INFO is provided for compatibility with log4j 1.3. + * @since 1.2.15 + */ + public static final LocationInfo NA_LOCATION_INFO = + new LocationInfo(NA, NA, NA, NA); + + // Check if we are running in IBM's visual age. static boolean inVisualAge = false; @@ -146,6 +154,25 @@ public LocationInfo(Throwable t, String fqnOfCallingClass) { this.fullInfo = s.substring(ibegin, iend); } + + /** + * Create new instance. + * @param file source file name + * @param classname class name + * @param method method + * @param line source line number + */ + public LocationInfo( + final String file, + final String classname, + final String method, + final String line) { + this.fileName = file; + this.className = classname; + this.methodName = method; + this.lineNumber = line; + } + /** Return the fully qualified class name of the caller making the logging request. diff --git a/src/java/org/apache/log4j/spi/LoggingEvent.java b/src/java/org/apache/log4j/spi/LoggingEvent.java index f87a7b7a8d..6fa29b7d59 100644 --- a/src/java/org/apache/log4j/spi/LoggingEvent.java +++ b/src/java/org/apache/log4j/spi/LoggingEvent.java @@ -25,6 +25,10 @@ import java.io.ObjectOutputStream; import java.io.ObjectInputStream; import java.util.Hashtable; +import java.util.Set; +import java.util.Collections; +import java.util.Map; +import java.util.HashMap; // Contributors: Nelson Minar // Wolf Siberski @@ -183,6 +187,56 @@ public LoggingEvent(String fqnOfCategoryClass, Category logger, this.timeStamp = timeStamp; } + /** + Create new instance. + @since 1.2.15 + @param fqnOfCategoryClass Fully qualified class name + of Logger implementation. + @param logger The logger generating this event. + @param timeStamp the timestamp of this logging event + @param level The level of this event. + @param message The message of this event. + @param threadName thread name + @param throwable The throwable of this event. + @param ndc Nested diagnostic context + @param info Location info + @param properties MDC properties + */ + public LoggingEvent(final String fqnOfCategoryClass, + final Logger logger, + final long timeStamp, + final Level level, + final Object message, + final String threadName, + final ThrowableInformation throwable, + final String ndc, + final LocationInfo info, + final java.util.Map properties) { + super(); + this.fqnOfCategoryClass = fqnOfCategoryClass; + this.logger = logger; + if (logger != null) { + categoryName = logger.getName(); + } else { + categoryName = null; + } + this.level = level; + this.message = message; + if(throwable != null) { + this.throwableInfo = throwable; + } + + this.timeStamp = timeStamp; + this.threadName = threadName; + ndcLookupRequired = false; + this.ndc = ndc; + this.locationInfo = info; + mdcCopyLookupRequired = false; + if (properties != null) { + mdcCopy = new java.util.Hashtable(properties); + } + } + /** Set the location information for this logging event. The collected information is cached for future use. @@ -427,4 +481,114 @@ void writeLevel(ObjectOutputStream oos) throws java.io.IOException { } } + /** + * Set value for MDC property. + * This adds the specified MDC property to the event. + * Access to the MDC is not synchronized, so this + * method should only be called when it is known that + * no other threads are accessing the MDC. + * @since 1.2.15 + * @param propName + * @param propValue + */ + public final void setProperty(final String propName, + final String propValue) { + if (mdcCopy == null) { + getMDCCopy(); + } + if (mdcCopy == null) { + mdcCopy = new Hashtable(); + } + mdcCopy.put(propName, propValue); + } + + /** + * Return a property for this event. The return value can be null. + * + * Equivalent to getMDC(String) in log4j 1.2. Provided + * for compatibility with log4j 1.3. + * + * @param key property name + * @return property value or null if property not set + * @since 1.2.15 + */ + public final String getProperty(final String key) { + Object value = getMDC(key); + String retval = null; + if (value != null) { + retval = value.toString(); + } + return retval; + } + + /** + * Check for the existence of location information without creating it + * (a byproduct of calling getLocationInformation). + * @return true if location information has been extracted. + * @since 1.2.15 + */ + public final boolean locationInformationExists() { + return (locationInfo != null); + } + + /** + * Getter for the event's time stamp. The time stamp is calculated starting + * from 1970-01-01 GMT. + * @return timestamp + * + * @since 1.2.15 + */ + public final long getTimeStamp() { + return timeStamp; + } + + /** + * Returns the set of the key values in the properties + * for the event. + * + * The returned set is unmodifiable by the caller. + * + * Provided for compatibility with log4j 1.3 + * + * @return Set an unmodifiable set of the property keys. + * @since 1.2.15 + */ + public Set getPropertyKeySet() { + return getProperties().keySet(); + } + + /** + * Returns the set of properties + * for the event. + * + * The returned set is unmodifiable by the caller. + * + * Provided for compatibility with log4j 1.3 + * + * @return Set an unmodifiable map of the properties. + * @since 1.2.15 + */ + public Map getProperties() { + getMDCCopy(); + Map properties; + if (mdcCopy == null) { + properties = new HashMap(); + } else { + properties = mdcCopy; + } + return Collections.unmodifiableMap(properties); + } + + /** + * Get the fully qualified name of the calling logger sub-class/wrapper. + * Provided for compatibility with log4j 1.3 + * @return fully qualified class name, may be null. + * @since 1.2.15 + */ + public String getFQNOfLoggerClass() { + return fqnOfCategoryClass; + } + + + } diff --git a/src/java/org/apache/log4j/spi/ThrowableInformation.java b/src/java/org/apache/log4j/spi/ThrowableInformation.java index e4b3eb7355..b98d0f5d1f 100644 --- a/src/java/org/apache/log4j/spi/ThrowableInformation.java +++ b/src/java/org/apache/log4j/spi/ThrowableInformation.java @@ -49,6 +49,18 @@ public class ThrowableInformation implements java.io.Serializable { this.throwable = throwable; } + /** + * Create new instance. + * @since 1.2.15 + * @param r String representation of throwable. + */ + public ThrowableInformation(final String[] r) { + if (r != null) { + rep = (String[]) r.clone(); + } + } + + public Throwable getThrowable() { return throwable; From e799dad21436ca242a590919876d3d766b94b132 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 16 Apr 2007 16:12:19 +0000 Subject: [PATCH 268/342] Bug 40944: Correct bug number in comments git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@529304 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/java/org/apache/log4j/PropertyConfiguratorTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/src/java/org/apache/log4j/PropertyConfiguratorTest.java b/tests/src/java/org/apache/log4j/PropertyConfiguratorTest.java index 23c4b573e8..78e032c1ad 100644 --- a/tests/src/java/org/apache/log4j/PropertyConfiguratorTest.java +++ b/tests/src/java/org/apache/log4j/PropertyConfiguratorTest.java @@ -30,7 +30,7 @@ public PropertyConfiguratorTest(final String testName) { } /** - * Test for bug 19108. + * Test for bug 40944. * Did not catch IllegalArgumentException on Properties.load * and close input stream. * @throws IOException if IOException creating properties file. @@ -47,7 +47,7 @@ public void testBadUnicodeEscape() throws IOException { } /** - * Test for bug 19108. + * Test for bug 40944. * configure(URL) never closed opened stream. * @throws IOException if IOException creating properties file. */ @@ -63,7 +63,7 @@ public void testURL() throws IOException { } /** - * Test for bug 19108. + * Test for bug 40944. * configure(URL) did not catch IllegalArgumentException and * did not close stream. * @throws IOException if IOException creating properties file. From 25d6aed165192bba00212628c572597e48e4d91c Mon Sep 17 00:00:00 2001 From: Paul Jeffrey Smith Date: Sat, 21 Apr 2007 03:05:51 +0000 Subject: [PATCH 269/342] Port portion of revision 310506 of LoggingEvent from trunk(1.3) so that when fqnOfCategoryClass is null, no LocationInfo object is automatically created. Reviewed by: Curt Arnold git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@530973 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/spi/LoggingEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/spi/LoggingEvent.java b/src/java/org/apache/log4j/spi/LoggingEvent.java index 6fa29b7d59..812ea3e657 100644 --- a/src/java/org/apache/log4j/spi/LoggingEvent.java +++ b/src/java/org/apache/log4j/spi/LoggingEvent.java @@ -242,7 +242,7 @@ public LoggingEvent(final String fqnOfCategoryClass, information is cached for future use. */ public LocationInfo getLocationInformation() { - if(locationInfo == null) { + if(locationInfo == null && fqnOfCategoryClass != null) { locationInfo = new LocationInfo(new Throwable(), fqnOfCategoryClass); } return locationInfo; From 397e5f50c3313f8c757495beb771d6ed9db92838 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 21 Apr 2007 03:27:00 +0000 Subject: [PATCH 270/342] Bug 41186: Eliminate NPE on getLocationInfo() when FQCN is null git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@530974 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/spi/LocationInfo.java | 2 +- .../apache/log4j/spi/LoggingEventTest.java | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/spi/LocationInfo.java b/src/java/org/apache/log4j/spi/LocationInfo.java index b3ccf0d369..dcd03e6b7c 100644 --- a/src/java/org/apache/log4j/spi/LocationInfo.java +++ b/src/java/org/apache/log4j/spi/LocationInfo.java @@ -105,7 +105,7 @@ public class LocationInfo implements java.io.Serializable { */ public LocationInfo(Throwable t, String fqnOfCallingClass) { - if(t == null) + if(t == null || fqnOfCallingClass == null) return; String s; diff --git a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java index 790dbb9a66..f8a78a349c 100644 --- a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java +++ b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java @@ -215,5 +215,29 @@ public void testLevel() { assertEquals(Level.ERROR, event.level); } + /** + * Tests LoggingEvent.getLocationInfo() when no FQCN is specified. + * See bug 41186. + */ + public void testLocationInfoNoFQCN() { + Category root = Logger.getRootLogger(); + Priority level = Level.INFO; + LoggingEvent event = + new LoggingEvent( + null, root, 0L, level, "Hello, world.", null); + LocationInfo info = event.getLocationInformation(); + // + // log4j 1.2 returns an object, its layout doesn't check for nulls. + // log4j 1.3 returns a null. + // + assertNotNull(info); + if (info != null) { + assertEquals("?", info.getLineNumber()); + assertEquals("?", info.getClassName()); + assertEquals("?", info.getFileName()); + assertEquals("?", info.getMethodName()); + } + } + } From c6b4fcb791c4d0f46974a1515f317858e6eeab55 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 21 Apr 2007 03:46:53 +0000 Subject: [PATCH 271/342] Bug 41186: Reverting backport of log4j 1.3 fix, rest of log4j 1.2 doesn't check for null return value git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@530977 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/spi/LoggingEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/spi/LoggingEvent.java b/src/java/org/apache/log4j/spi/LoggingEvent.java index 812ea3e657..6fa29b7d59 100644 --- a/src/java/org/apache/log4j/spi/LoggingEvent.java +++ b/src/java/org/apache/log4j/spi/LoggingEvent.java @@ -242,7 +242,7 @@ public LoggingEvent(final String fqnOfCategoryClass, information is cached for future use. */ public LocationInfo getLocationInformation() { - if(locationInfo == null && fqnOfCategoryClass != null) { + if(locationInfo == null) { locationInfo = new LocationInfo(new Throwable(), fqnOfCategoryClass); } return locationInfo; From 4c77e0a0b8489c67c96c5973363b0432e9414494 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 21 Apr 2007 07:10:22 +0000 Subject: [PATCH 272/342] Bug 42087: SyslogAppender packets not limited to 1024 bytes git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@530990 13f79535-47bb-0310-9956-ffa450edef68 --- docs/HISTORY.txt | 1 + .../apache/log4j/helpers/SyslogWriter.java | 20 ++++++--- .../org/apache/log4j/net/SyslogAppender.java | 27 ++++++++++- src/xdocs/download.xml | 1 + .../apache/log4j/net/SyslogAppenderTest.java | 45 +++++++++++++++++++ 5 files changed, 87 insertions(+), 7 deletions(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 1bafe72a37..5cf719ef14 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -40,6 +40,7 @@ 41708: PropertyPrinter.printOptions breaking signature change in log4j 1.2.9 41735: RollingFileAppender may delete files during rollover 33708: XMLConfiguration of loggerFactory does not work + 42087: SyslogAppender does not limit packet size to 1024 bytes September 18th, 2006 diff --git a/src/java/org/apache/log4j/helpers/SyslogWriter.java b/src/java/org/apache/log4j/helpers/SyslogWriter.java index 1dbe7ce870..d6ce4bf6de 100644 --- a/src/java/org/apache/log4j/helpers/SyslogWriter.java +++ b/src/java/org/apache/log4j/helpers/SyslogWriter.java @@ -116,13 +116,21 @@ void write(char[] buf, int off, int len) throws IOException { } public - void write(String string) throws IOException { - byte[] bytes = string.getBytes(); - DatagramPacket packet = new DatagramPacket(bytes, bytes.length, - address, port); + void write(final String string) throws IOException { - if(this.ds != null && this.address != null) - ds.send(packet); + if(this.ds != null && this.address != null) { + byte[] bytes = string.getBytes(); + // + // syslog packets must be less than 1024 bytes + // + int bytesLength = bytes.length; + if (bytesLength >= 1024) { + bytesLength = 1024; + } + DatagramPacket packet = new DatagramPacket(bytes, bytesLength, + address, port); + ds.send(packet); + } } diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/java/org/apache/log4j/net/SyslogAppender.java index 76bd2d53f5..151f514bd9 100644 --- a/src/java/org/apache/log4j/net/SyslogAppender.java +++ b/src/java/org/apache/log4j/net/SyslogAppender.java @@ -271,6 +271,22 @@ int getFacility(String facilityName) { } } + + private void splitPacket(final String pri, final String packet) { + int byteCount = packet.getBytes().length; + // + // if packet is less than RFC 3164 limit + // of 1024 bytes, then write it + // + if (byteCount <= 1024) { + sqw.write(packet); + } else { + int split = pri.length() + (packet.length() - pri.length())/2; + splitPacket(pri, packet.substring(0, split) + "..."); + splitPacket(pri, pri + "..." + packet.substring(split)); + } + } + public void append(LoggingEvent event) { @@ -292,18 +308,27 @@ void append(LoggingEvent event) { } String hdr = getPacketHeader(event.timeStamp); + String pri = hdr; String packet = layout.format(event); if(facilityPrinting || hdr.length() > 0) { StringBuffer buf = new StringBuffer(hdr); if(facilityPrinting) { buf.append(facilityStr); + pri = buf.toString(); } buf.append(packet); packet = buf.toString(); } sqw.setLevel(event.getLevel().getSyslogEquivalent()); - sqw.write(packet); + // + // if message has a remote likelihood of exceeding 1024 bytes + // when encoded, consider splitting message into multiple packets + if (packet.length() > 256) { + splitPacket(pri, packet); + } else { + sqw.write(packet); + } if (layout.ignoresThrowable()) { String[] s = event.getThrowableStrRep(); diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml index a2291beb56..95ae804843 100644 --- a/src/xdocs/download.xml +++ b/src/xdocs/download.xml @@ -65,6 +65,7 @@
  • 41708: PropertyPrinter.printOptions breaking signature change in log4j 1.2.9
  • 41735: RollingFileAppender may delete files during rollover
  • 33708: XML configuration of loggerFactory does not work
  • +
  • 42087: SyslogAppender does not limit packet size to 1024 bytes
  • diff --git a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java index 0a8e8a8c8c..8fbf024241 100644 --- a/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java +++ b/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java @@ -545,4 +545,49 @@ public void testLayoutHeader() throws Exception { assertEquals("<14>", s[2].substring(0,12)); } + /** + * Tests that syslog packets do not exceed 1024 bytes. + * See bug 42087. + * @throws Exception if exception during test. + */ + public void testBigPackets() throws Exception { + DatagramSocket ds = new DatagramSocket(); + ds.setSoTimeout(2000); + + SyslogAppender appender = new SyslogAppender(); + appender.setSyslogHost("localhost:" + ds.getLocalPort()); + appender.setName("name"); + appender.setHeader(false); + PatternLayout pl = new PatternLayout("%m"); + appender.setLayout(pl); + appender.activateOptions(); + + Logger l = Logger.getRootLogger(); + l.addAppender(appender); + StringBuffer msgbuf = new StringBuffer(); + while(msgbuf.length() < 8000) { + msgbuf.append("0123456789"); + } + String msg = msgbuf.toString(); + l.info(msg); + appender.close(); + String[] s = new String[8]; + byte[] buf = new byte[1200]; + for(int i = 0; i < 8; i++) { + DatagramPacket p = new DatagramPacket(buf, 0, buf.length); + ds.receive(p); + assertTrue(p.getLength() <= 1024); + s[i] = new String(p.getData(), 0, p.getLength()); + } + ds.close(); + StringBuffer rcvbuf = new StringBuffer(s[0]); + rcvbuf.delete(0, 4); + for(int i = 1; i < 8; i++) { + rcvbuf.setLength(rcvbuf.length() - 3); + rcvbuf.append(s[i].substring(s[i].indexOf("...") + 3)); + } + assertEquals(msg.length(), rcvbuf.length()); + assertEquals(msg, rcvbuf.toString()); + } + } From e77d444625310ed38cdc743f661b5858dfdcbc75 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 21 Apr 2007 15:25:43 +0000 Subject: [PATCH 273/342] Bug 42087: Compensated for 5 chars in PRI section on splitMessage, dropped facility on continuations git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@531049 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/net/SyslogAppender.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/java/org/apache/log4j/net/SyslogAppender.java index 151f514bd9..fb9ae75939 100644 --- a/src/java/org/apache/log4j/net/SyslogAppender.java +++ b/src/java/org/apache/log4j/net/SyslogAppender.java @@ -272,18 +272,19 @@ int getFacility(String facilityName) { } - private void splitPacket(final String pri, final String packet) { + private void splitPacket(final String header, final String packet) { int byteCount = packet.getBytes().length; // // if packet is less than RFC 3164 limit // of 1024 bytes, then write it - // - if (byteCount <= 1024) { + // (must allow for up 5to 5 characters in the PRI section + // added by SyslogQuietWriter) + if (byteCount <= 1019) { sqw.write(packet); } else { - int split = pri.length() + (packet.length() - pri.length())/2; - splitPacket(pri, packet.substring(0, split) + "..."); - splitPacket(pri, pri + "..." + packet.substring(split)); + int split = header.length() + (packet.length() - header.length())/2; + splitPacket(header, packet.substring(0, split) + "..."); + splitPacket(header, header + "..." + packet.substring(split)); } } @@ -308,13 +309,11 @@ void append(LoggingEvent event) { } String hdr = getPacketHeader(event.timeStamp); - String pri = hdr; String packet = layout.format(event); if(facilityPrinting || hdr.length() > 0) { StringBuffer buf = new StringBuffer(hdr); if(facilityPrinting) { buf.append(facilityStr); - pri = buf.toString(); } buf.append(packet); packet = buf.toString(); @@ -325,7 +324,7 @@ void append(LoggingEvent event) { // if message has a remote likelihood of exceeding 1024 bytes // when encoded, consider splitting message into multiple packets if (packet.length() > 256) { - splitPacket(pri, packet); + splitPacket(hdr, packet); } else { sqw.write(packet); } From 2009597d4051efbf4860c678946cc93921674f84 Mon Sep 17 00:00:00 2001 From: Paul Jeffrey Smith Date: Mon, 23 Apr 2007 22:06:43 +0000 Subject: [PATCH 274/342] Bug 29227 - reduce the 'nastiness' of a connection exception by downgrading the level to warn, and dropping the stack trace. This is some what inline with what is already in trunk(1.3), which has already dropped the exception, but because there were other changes to the internal LogLog->Logger infrastructure change that allowed an ERROR level internal event to be generated, the 1.2 version needs to be slightly different, since LogLog does not have an error level. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@531629 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/net/SocketAppender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/net/SocketAppender.java b/src/java/org/apache/log4j/net/SocketAppender.java index af81918ecb..386b01d01f 100644 --- a/src/java/org/apache/log4j/net/SocketAppender.java +++ b/src/java/org/apache/log4j/net/SocketAppender.java @@ -211,7 +211,7 @@ void connect(InetAddress address, int port) { msg += " We will try again later."; fireConnector(); // fire the connector thread } - LogLog.error(msg, e); + LogLog.warn(msg); } } From 93b7a36e051535898a0bc8f4818e6bdc2c68be6f Mon Sep 17 00:00:00 2001 From: Paul Jeffrey Smith Date: Mon, 23 Apr 2007 22:08:00 +0000 Subject: [PATCH 275/342] Bug #29227 Seriously, I needed more coffee, clearly there IS an error level generation method for LogLog. This is now much closer to what is in trunk. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@531630 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/net/SocketAppender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/log4j/net/SocketAppender.java b/src/java/org/apache/log4j/net/SocketAppender.java index 386b01d01f..69f36ffd99 100644 --- a/src/java/org/apache/log4j/net/SocketAppender.java +++ b/src/java/org/apache/log4j/net/SocketAppender.java @@ -211,7 +211,7 @@ void connect(InetAddress address, int port) { msg += " We will try again later."; fireConnector(); // fire the connector thread } - LogLog.warn(msg); + LogLog.error(msg); } } From 6597935ecca5747572a6f07caf19037c3970de52 Mon Sep 17 00:00:00 2001 From: Paul Jeffrey Smith Date: Mon, 23 Apr 2007 23:08:53 +0000 Subject: [PATCH 276/342] Bug 42017 Added if check for existence of an MBean name already. Patch (sort of) supplied by Francesco Dalan. git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@531643 13f79535-47bb-0310-9956-ffa450edef68 --- .../log4j/jmx/AppenderDynamicMBean.java | 13 ++++---- .../log4j/jmx/HierarchyDynamicMBean.java | 30 ++++++++----------- .../apache/log4j/jmx/LoggerDynamicMBean.java | 13 ++++---- 3 files changed, 23 insertions(+), 33 deletions(-) diff --git a/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java b/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java index 407c183b48..55e38845a2 100644 --- a/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java @@ -193,14 +193,11 @@ void registerLayoutMBean(Layout layout) { try { LayoutDynamicMBean appenderMBean = new LayoutDynamicMBean(layout); objectName = new ObjectName("log4j:appender="+name); - server.registerMBean(appenderMBean, objectName); - - dAttributes.add(new MBeanAttributeInfo("appender="+name, - "javax.management.ObjectName", - "The "+name+" layout.", - true, - true, - false)); + if (!server.isRegistered(objectName)) { + server.registerMBean(appenderMBean, objectName); + dAttributes.add(new MBeanAttributeInfo("appender=" + name, "javax.management.ObjectName", + "The " + name + " layout.", true, true, false)); + } } catch(Exception e) { cat.error("Could not add DynamicLayoutMBean for ["+name+"].", e); diff --git a/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java b/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java index a79e7f41b9..66492e1698 100644 --- a/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java @@ -118,23 +118,19 @@ ObjectName addLoggerMBean(Logger logger) { try { LoggerDynamicMBean loggerMBean = new LoggerDynamicMBean(logger); objectName = new ObjectName("log4j", "logger", name); - server.registerMBean(loggerMBean, objectName); - - NotificationFilterSupport nfs = new NotificationFilterSupport(); - nfs.enableType(ADD_APPENDER+logger.getName()); - - log.debug("---Adding logger ["+name+"] as listener."); - - nbs.addNotificationListener(loggerMBean, nfs, null); - - - vAttributes.add(new MBeanAttributeInfo("logger="+name, - "javax.management.ObjectName", - "The "+name+" logger.", - true, - true, // this makes the object - // clickable - false)); + + if (!server.isRegistered(objectName)) { + server.registerMBean(loggerMBean, objectName); + NotificationFilterSupport nfs = new NotificationFilterSupport(); + nfs.enableType(ADD_APPENDER + logger.getName()); + log.debug("---Adding logger [" + name + "] as listener."); + nbs.addNotificationListener(loggerMBean, nfs, null); + vAttributes.add(new MBeanAttributeInfo("logger=" + name, "javax.management.ObjectName", + "The " + name + " logger.", true, true, // this makes the object + // clickable + false)); + + } } catch(Exception e) { log.error("Could not add loggerMBean for ["+name+"].", e); diff --git a/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java b/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java index f5d45fb9a8..f97d948a93 100644 --- a/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java +++ b/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java @@ -258,14 +258,11 @@ void registerAppenderMBean(Appender appender) { try { AppenderDynamicMBean appenderMBean = new AppenderDynamicMBean(appender); objectName = new ObjectName("log4j", "appender", name); - server.registerMBean(appenderMBean, objectName); - - dAttributes.add(new MBeanAttributeInfo("appender="+name, - "javax.management.ObjectName", - "The "+name+" appender.", - true, - true, - false)); + if (!server.isRegistered(objectName)) { + server.registerMBean(appenderMBean, objectName); + dAttributes.add(new MBeanAttributeInfo("appender=" + name, "javax.management.ObjectName", + "The " + name + " appender.", true, true, false)); + } } catch(Exception e) { cat.error("Could not add appenderMBean for ["+name+"].", e); From 30268820bbe0c30197b14cdf16102dcbfbf54c63 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 24 Apr 2007 06:34:17 +0000 Subject: [PATCH 277/342] Bug 37930: Update pom.xml to successfully build and unsuccessfully run tests git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@531783 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 174 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d24cc8b5ea..3b7a961552 100644 --- a/pom.xml +++ b/pom.xml @@ -1 +1,174 @@ - 4.0.0 log4j log4j jar Apache Log4j 1.2.15 Apache Log4j http://logging.apache.org/log4j/docs/ Bugzilla http://issues.apache.org/bugzilla 1999 log4j-user log4j-user-subscribe@logging.apache.org log4j-user-unsubscribe@logging.apache.org log4j-user@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-user&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.user log4j-dev log4j-dev-subscribe@logging.apache.org log4j-dev-unsubscribe@logging.apache.org log4j-dev@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ http://marc.theaimsgroup.com/?l=log4j-dev&r=1&w=2 http://dir.gmane.org/gmane.comp.jakarta.log4j.devel The Apache Software License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt repo scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15 scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15 http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_15/ Apache Software Foundation http://www.apache.org \ No newline at end of file + + + 4.0.0 + log4j + log4j + jar + Apache Log4j + 1.2.15 + Apache Log4j + http://logging.apache.org/log4j/docs/ + + Bugzilla + http://issues.apache.org/bugzilla + + + Gump + http://vmgump.apache.org/gump/public/logging-log4j-12/logging-log4j-12/index.html + + 1999 + + + log4j-user + log4j-user-subscribe@logging.apache.org + log4j-user-unsubscribe@logging.apache.org + log4j-user@logging.apache.org + http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ + + http://marc.theaimsgroup.com/?l=log4j-user&r=1&w=2 + http://dir.gmane.org/gmane.comp.jakarta.log4j.user + + + + log4j-dev + log4j-dev-subscribe@logging.apache.org + log4j-dev-unsubscribe@logging.apache.org + log4j-dev@logging.apache.org + http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ + + http://marc.theaimsgroup.com/?l=log4j-dev&r=1&w=2 + http://dir.gmane.org/gmane.comp.jakarta.log4j.devel + + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15 + scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15 + http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_15/ + + + Apache Software Foundation + http://www.apache.org + + + + + maven-checkstyle-plugin + + + log4j + log4j + 1.2.14 + + + + + org.apache.maven.plugins + maven-surefire-plugin + + tests + + + + maven-compiler-plugin + + 1.3 + 1.3 + + + + src/java + tests/src/java + + + + java.net + https://maven-repository.dev.java.net/nonav/repository + legacy + + + + + javaee + javaee-api + 5 + + + com.sun.jdmk + jmxtools + 1.2.1 + + + oro + oro + 2.0.8 + test + + + junit + junit + 3.8.1 + test + + + + + + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + org.codehaus.mojo + jxr-maven-plugin + + + org.apache.maven.plugins + maven-changes-plugin + + + + changes-report + + + + + %URL%/show_bug.cgi?id=%ISSUE% + + + + + + + apache.website + scp://people.apache.org/home/carnold/public_html/log4j/1.2.15 + + + From ad2ce478c2a813edebdcba9526635581ba0d0368 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 24 Apr 2007 16:12:50 +0000 Subject: [PATCH 278/342] Bug 42108: Fix LocationInfo(String fileName, ...) and add unit test git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@531995 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/spi/LocationInfo.java | 28 ++++++++++++ .../java/org/apache/log4j/CoreTestSuite.java | 1 + .../apache/log4j/spi/LocationInfoTest.java | 45 +++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 tests/src/java/org/apache/log4j/spi/LocationInfoTest.java diff --git a/src/java/org/apache/log4j/spi/LocationInfo.java b/src/java/org/apache/log4j/spi/LocationInfo.java index dcd03e6b7c..1d41dccf09 100644 --- a/src/java/org/apache/log4j/spi/LocationInfo.java +++ b/src/java/org/apache/log4j/spi/LocationInfo.java @@ -154,6 +154,22 @@ public LocationInfo(Throwable t, String fqnOfCallingClass) { this.fullInfo = s.substring(ibegin, iend); } + /** + * Appends a location fragment to a buffer to build the + * full location info. + * @param buf StringBuffer to receive content. + * @param fragment fragment of location (class, method, file, line), + * if null the value of NA will be appended. + * @since 1.2.15 + */ + private static final void appendFragment(final StringBuffer buf, + final String fragment) { + if (fragment == null) { + buf.append(NA); + } else { + buf.append(fragment); + } + } /** * Create new instance. @@ -161,6 +177,8 @@ public LocationInfo(Throwable t, String fqnOfCallingClass) { * @param classname class name * @param method method * @param line source line number + * + * @since 1.2.15 */ public LocationInfo( final String file, @@ -171,6 +189,16 @@ public LocationInfo( this.className = classname; this.methodName = method; this.lineNumber = line; + StringBuffer buf = new StringBuffer(); + appendFragment(buf, classname); + buf.append("."); + appendFragment(buf, method); + buf.append("("); + appendFragment(buf, file); + buf.append(":"); + appendFragment(buf, line); + buf.append(")"); + this.fullInfo = buf.toString(); } /** diff --git a/tests/src/java/org/apache/log4j/CoreTestSuite.java b/tests/src/java/org/apache/log4j/CoreTestSuite.java index 51ebfb0630..cf2f3a15b3 100644 --- a/tests/src/java/org/apache/log4j/CoreTestSuite.java +++ b/tests/src/java/org/apache/log4j/CoreTestSuite.java @@ -48,6 +48,7 @@ public static Test suite() { s.addTestSuite(org.apache.log4j.PatternLayoutTest.class); s.addTestSuite(org.apache.log4j.spi.LoggingEventTest.class); s.addTestSuite(org.apache.log4j.spi.ThrowableInformationTest.class); + s.addTestSuite(org.apache.log4j.spi.LocationInfoTest.class); s.addTestSuite(org.apache.log4j.PropertyConfiguratorTest.class); return s; } diff --git a/tests/src/java/org/apache/log4j/spi/LocationInfoTest.java b/tests/src/java/org/apache/log4j/spi/LocationInfoTest.java new file mode 100644 index 0000000000..9bee5ff39a --- /dev/null +++ b/tests/src/java/org/apache/log4j/spi/LocationInfoTest.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.log4j.spi; + +import junit.framework.TestCase; + +/** + * Tests for LocationInfo. + */ +public class LocationInfoTest extends TestCase { + + /** + * Tests four parameter constructor. + */ + public void testFourParamConstructor() { + final String className = LocationInfoTest.class.getName(); + final String methodName = "testFourParamConstructor"; + final String fileName = "LocationInfoTest.java"; + final String lineNumber = "41"; + LocationInfo li = new LocationInfo(fileName, + className, methodName, lineNumber); + assertEquals(className, li.getClassName()); + assertEquals(methodName, li.getMethodName()); + assertEquals(fileName, li.getFileName()); + assertEquals(lineNumber, li.getLineNumber()); + assertEquals(className + "." + methodName + + "(" + fileName + ":" + lineNumber + ")", + li.fullInfo); + } + +} From 276783e5e3fed57c3e7b96212a287bfea441314f Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 26 Apr 2007 04:22:16 +0000 Subject: [PATCH 279/342] Bug 42257: Unrecognized element handling for DOMConfigurator git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@532603 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- .../org/apache/log4j/xml/DOMConfigurator.java | 215 +++++++++++++++--- .../log4j/xml/UnrecognizedElementHandler.java | 42 ++++ src/java/org/apache/log4j/xml/log4j.dtd | 25 +- 4 files changed, 247 insertions(+), 37 deletions(-) create mode 100644 src/java/org/apache/log4j/xml/UnrecognizedElementHandler.java diff --git a/pom.xml b/pom.xml index 3b7a961552..1114df1acb 100644 --- a/pom.xml +++ b/pom.xml @@ -103,7 +103,7 @@ src/java - tests/src/java + diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index 4c2213dbc5..06ac2f74c8 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -17,28 +17,45 @@ package org.apache.log4j.xml; -import java.util.*; - -import java.net.URL; - -import org.w3c.dom.*; -import java.lang.reflect.Method; -import org.apache.log4j.*; -import org.apache.log4j.spi.*; -import org.apache.log4j.or.RendererMap; -import org.apache.log4j.helpers.*; +import org.apache.log4j.Appender; +import org.apache.log4j.Layout; +import org.apache.log4j.Level; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.config.PropertySetter; - +import org.apache.log4j.helpers.FileWatchdog; +import org.apache.log4j.helpers.Loader; +import org.apache.log4j.helpers.LogLog; +import org.apache.log4j.helpers.OptionConverter; +import org.apache.log4j.or.RendererMap; +import org.apache.log4j.spi.AppenderAttachable; +import org.apache.log4j.spi.Configurator; +import org.apache.log4j.spi.ErrorHandler; +import org.apache.log4j.spi.Filter; +import org.apache.log4j.spi.LoggerFactory; +import org.apache.log4j.spi.LoggerRepository; +import org.apache.log4j.spi.OptionHandler; +import org.apache.log4j.spi.RendererSupport; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.FactoryConfigurationError; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.io.Reader; -import java.io.IOException; +import java.lang.reflect.Method; import java.net.URL; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.FactoryConfigurationError; +import java.util.Hashtable; +import java.util.Properties; // Contributors: Mark Womack // Arun Katkere @@ -167,6 +184,48 @@ Appender findAppenderByReference(Element appenderRef) { return findAppenderByName(doc, appenderName); } + /** + * Delegates unrecognized content to created instance if + * it supports UnrecognizedElementParser. + * @since 1.2.15 + * @param instance instance, may be null. + * @param element element, may not be null. + * @param props properties + * @throws IOException thrown if configuration of owner object + * should be abandoned. + */ + private static void parseUnrecognizedElement(final Object instance, + final Element element, + final Properties props) throws Exception { + boolean recognized = false; + if (instance instanceof UnrecognizedElementHandler) { + recognized = ((UnrecognizedElementHandler) instance).parseUnrecognizedElement( + element, props); + } + if (!recognized) { + LogLog.warn("Unrecognized element " + element.getNodeName()); + } + } + + /** + * Delegates unrecognized content to created instance if + * it supports UnrecognizedElementParser and catches and + * logs any exception. + * @since 1.2.15 + * @param instance instance, may be null. + * @param element element, may not be null. + * @param props properties + */ + private static void quietParseUnrecognizedElement(final Object instance, + final Element element, + final Properties props) { + try { + parseUnrecognizedElement(instance, element, props); + } catch (Exception ex) { + LogLog.error("Error in extension content: ", ex); + } + } + /** Used internally to parse an appender element. */ @@ -218,7 +277,9 @@ else if (currentElement.getTagName().equals(APPENDER_REF_TAG)) { refName+ "] to appender named ["+ appender.getName()+ "] which does not implement org.apache.log4j.spi.AppenderAttachable."); } - } + } else { + parseUnrecognizedElement(instance, appenderElement, props); + } } } propSetter.activate(); @@ -267,7 +328,9 @@ void parseErrorHandler(Element element, Appender appender) { } else if(tagName.equals(ROOT_REF)) { Logger root = repository.getRootLogger(); eh.setLogger(root); - } + } else { + quietParseUnrecognizedElement(eh, element, props); + } } } propSetter.activate(); @@ -296,7 +359,9 @@ void parseFilters(Element element, Appender appender) { String tagName = currentElement.getTagName(); if(tagName.equals(PARAM_TAG)) { setParameter(currentElement, propSetter); - } + } else { + quietParseUnrecognizedElement(filter, element, props); + } } } propSetter.activate(); @@ -386,7 +451,9 @@ void parseCategoryFactory(Element factoryElement) { currentElement = (Element)currentNode; if (currentElement.getTagName().equals(PARAM_TAG)) { setParameter(currentElement, propSetter); - } + } else { + quietParseUnrecognizedElement(factory, factoryElement, props); + } } } } @@ -448,7 +515,9 @@ void parseChildrenOfLoggerElement(Element catElement, parseLevel(currentElement, cat, isRoot); } else if(tagName.equals(PARAM_TAG)) { setParameter(currentElement, propSetter); - } + } else { + quietParseUnrecognizedElement(cat, catElement, props); + } } } propSetter.activate(); @@ -476,7 +545,9 @@ Layout parseLayout (Element layout_element) { String tagName = currentElement.getTagName(); if(tagName.equals(PARAM_TAG)) { setParameter(currentElement, propSetter); - } + } else { + parseUnrecognizedElement(instance, layout_element, props); + } } } @@ -544,10 +615,7 @@ void parseLevel(Element element, Logger logger, boolean isRoot) { protected void setParameter(Element elem, PropertySetter propSetter) { - String name = subst(elem.getAttribute(NAME_ATTR)); - String value = (elem.getAttribute(VALUE_ATTR)); - value = subst(OptionConverter.convertSpecialChars(value)); - propSetter.setProperty(name, value); + setParameter(elem, propSetter, props); } @@ -839,27 +907,106 @@ void parse(Element element) { parseRoot(currentElement); } else if(tagName.equals(RENDERER_TAG)) { parseRenderer(currentElement); - } + } else if (!tagName.equals(CATEGORY_FACTORY_TAG)) { + quietParseUnrecognizedElement(repository, currentElement, props); + } } } } protected - String subst(String value) { - try { - return OptionConverter.substVars(value, props); - } catch(IllegalArgumentException e) { - LogLog.warn("Could not perform variable substitution.", e); - return value; - } + String subst(final String value) { + return subst(value, props); } + + /** + * Substitutes property value for any references in expression. + * + * @param value value from configuration file, may contain + * literal text, property references or both + * @param props properties. + * @return evaluated expression, may still contain expressions + * if unable to expand. + * @since 1.2.15 + */ + public static String subst(final String value, final Properties props) { + try { + return OptionConverter.substVars(value, props); + } catch (IllegalArgumentException e) { + LogLog.warn("Could not perform variable substitution.", e); + return value; + } + } + + + /** + * Sets a parameter based from configuration file content. + * + * @param elem param element, may not be null. + * @param propSetter property setter, may not be null. + * @param props properties + * @since 1.2.15 + */ + public static void setParameter(final Element elem, + final PropertySetter propSetter, + final Properties props) { + String name = subst(elem.getAttribute("name"), props); + String value = (elem.getAttribute("value")); + value = subst(OptionConverter.convertSpecialChars(value), props); + propSetter.setProperty(name, value); + } + + /** + * Creates an OptionHandler and processes any nested param elements + * but does not call activateOptions. If the class also supports + * UnrecognizedElementParser, the parseUnrecognizedElement method + * will be call for any child elements other than param. + * + * @param element element, may not be null. + * @param props properties + * @param expectedClass interface or class expected to be implemented + * by created class + * @return created class or null. + * @throws Exception thrown if the contain object should be abandoned. + * @since 1.2.15 + */ + public static OptionHandler parseElement(final Element element, + final Properties props, + final Class expectedClass) throws Exception { + String clazz = subst(element.getAttribute("class"), props); + Object instance = OptionConverter.instantiateByClassName(clazz, + expectedClass, null); + + if (instance instanceof OptionHandler) { + OptionHandler optionHandler = (OptionHandler) instance; + PropertySetter propSetter = new PropertySetter(optionHandler); + NodeList children = element.getChildNodes(); + final int length = children.getLength(); + + for (int loop = 0; loop < length; loop++) { + Node currentNode = children.item(loop); + if (currentNode.getNodeType() == Node.ELEMENT_NODE) { + Element currentElement = (Element) currentNode; + String tagName = currentElement.getTagName(); + if (tagName.equals("param")) { + setParameter(currentElement, propSetter, props); + } else { + parseUnrecognizedElement(instance, currentElement, props); + } + } + } + return optionHandler; + } + return null; + } + } class XMLWatchdog extends FileWatchdog { - XMLWatchdog(String filename) { + XMLWatchdog(String filename) { super(filename); } diff --git a/src/java/org/apache/log4j/xml/UnrecognizedElementHandler.java b/src/java/org/apache/log4j/xml/UnrecognizedElementHandler.java new file mode 100644 index 0000000000..463d5d989d --- /dev/null +++ b/src/java/org/apache/log4j/xml/UnrecognizedElementHandler.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.log4j.xml; + +import org.w3c.dom.Element; +import java.util.Properties; + +/** + * When implemented by an object configured by DOMConfigurator, + * the handle method will be called when an unrecognized child + * element is encountered. Unrecognized child elements of + * the log4j:configuration element will be dispatched to + * the logger repository if it supports this interface. + * + * @since 1.2.15 + */ +public interface UnrecognizedElementHandler { + /** + * Called to inform a configured object when + * an unrecognized child element is encountered. + * @param element element, may not be null. + * @param props properties in force, may be null. + * @return true if configured object recognized the element + * @throws Exception throw an exception to prevent activation + * of the configured object. + */ + boolean parseUnrecognizedElement(Element element, Properties props) throws Exception; +} \ No newline at end of file diff --git a/src/java/org/apache/log4j/xml/log4j.dtd b/src/java/org/apache/log4j/xml/log4j.dtd index 39993be1d7..b20ac1e277 100644 --- a/src/java/org/apache/log4j/xml/log4j.dtd +++ b/src/java/org/apache/log4j/xml/log4j.dtd @@ -8,7 +8,7 @@ elements,appender elements, categories and an optional root element. --> - @@ -43,7 +43,8 @@ element. --> - + ref CDATA #REQUIRED > + + + + + + + + + + + From 1c74f988fd560834de3c1336e1ad10fe3865f2dd Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 26 Apr 2007 18:03:07 +0000 Subject: [PATCH 280/342] Bug 42257: Tweaks on unrecognized element delegation git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@532826 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/log4j/xml/DOMConfigurator.java | 6 ++++-- src/java/org/apache/log4j/xml/log4j.dtd | 8 ++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index 06ac2f74c8..9b1623d7eb 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -278,7 +278,7 @@ else if (currentElement.getTagName().equals(APPENDER_REF_TAG)) { "] which does not implement org.apache.log4j.spi.AppenderAttachable."); } } else { - parseUnrecognizedElement(instance, appenderElement, props); + parseUnrecognizedElement(instance, currentElement, props); } } } @@ -907,7 +907,9 @@ void parse(Element element) { parseRoot(currentElement); } else if(tagName.equals(RENDERER_TAG)) { parseRenderer(currentElement); - } else if (!tagName.equals(CATEGORY_FACTORY_TAG)) { + } else if (!(tagName.equals(APPENDER_TAG) + || tagName.equals(CATEGORY_FACTORY_TAG) + || tagName.equals(LOGGER_FACTORY_TAG))) { quietParseUnrecognizedElement(repository, currentElement, props); } } diff --git a/src/java/org/apache/log4j/xml/log4j.dtd b/src/java/org/apache/log4j/xml/log4j.dtd index b20ac1e277..9527734f7d 100644 --- a/src/java/org/apache/log4j/xml/log4j.dtd +++ b/src/java/org/apache/log4j/xml/log4j.dtd @@ -136,14 +136,14 @@ element. --> > - - From 72d5475d001dcd8bfd9ea01cd34aecd8434a71ef Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 26 Apr 2007 19:46:58 +0000 Subject: [PATCH 281/342] Bug 21796: SocketAppender doesn't fall back with FallbackErrorHandler git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@532842 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/net/SocketAppender.java | 7 ++ tests/build.xml | 12 ++- tests/input/xml/SocketAppenderTestConfig.xml | 61 ++++++++++++ .../apache/log4j/net/SocketAppenderTest.java | 97 +++++++++++++++++++ 4 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 tests/input/xml/SocketAppenderTestConfig.xml create mode 100644 tests/src/java/org/apache/log4j/net/SocketAppenderTest.java diff --git a/src/java/org/apache/log4j/net/SocketAppender.java b/src/java/org/apache/log4j/net/SocketAppender.java index 69f36ffd99..7d8c351299 100644 --- a/src/java/org/apache/log4j/net/SocketAppender.java +++ b/src/java/org/apache/log4j/net/SocketAppender.java @@ -26,6 +26,7 @@ import java.io.ObjectOutputStream; import org.apache.log4j.helpers.LogLog; +import org.apache.log4j.spi.ErrorCode; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.AppenderSkeleton; @@ -210,6 +211,9 @@ void connect(InetAddress address, int port) { if(reconnectionDelay > 0) { msg += " We will try again later."; fireConnector(); // fire the connector thread + } else { + msg += " We are not retrying."; + errorHandler.error(msg, e, ErrorCode.GENERIC_FAILURE); } LogLog.error(msg); } @@ -246,6 +250,9 @@ public void append(LoggingEvent event) { LogLog.warn("Detected problem with connection: "+e); if(reconnectionDelay > 0) { fireConnector(); + } else { + errorHandler.error("Detected problem with connection, not reconnecting.", e, + ErrorCode.GENERIC_FAILURE); } } } diff --git a/tests/build.xml b/tests/build.xml index 5b784bf34d..acfd79df6f 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -154,7 +154,8 @@ OptionConverter, BoundedFIFO, CyclicBuffer, OR, LevelMatchFilter, PatternParser, - PatternLayout, RFA, ERFA, DRFA, NTEventLogAppender, Syslog"/> + PatternLayout, RFA, ERFA, DRFA, + NTEventLogAppender, Syslog, Socket"/> @@ -415,6 +416,15 @@ + + + + + + + + + diff --git a/tests/input/xml/SocketAppenderTestConfig.xml b/tests/input/xml/SocketAppenderTestConfig.xml new file mode 100644 index 0000000000..2930b7b258 --- /dev/null +++ b/tests/input/xml/SocketAppenderTestConfig.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/src/java/org/apache/log4j/net/SocketAppenderTest.java b/tests/src/java/org/apache/log4j/net/SocketAppenderTest.java new file mode 100644 index 0000000000..e85f140c46 --- /dev/null +++ b/tests/src/java/org/apache/log4j/net/SocketAppenderTest.java @@ -0,0 +1,97 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.log4j.net; + +import junit.framework.TestCase; + +import org.apache.log4j.Appender; +import org.apache.log4j.AppenderSkeleton; +import org.apache.log4j.Logger; +import org.apache.log4j.spi.LoggingEvent; +import org.apache.log4j.xml.DOMConfigurator; + +public class SocketAppenderTest extends TestCase { + + /** + * Create new instance. + */ + public SocketAppenderTest(final String testName) { + super(testName); + } + + /* JUnit's setUp and tearDown */ + + protected void setUp() { + DOMConfigurator.configure("input/xml/SocketAppenderTestConfig.xml"); + + logger = Logger.getLogger(SocketAppenderTest.class); + primary = logger.getAppender("remote"); + secondary = (LastOnlyAppender) Logger.getLogger( + "org.apache.log4j.net.SocketAppenderTestDummy").getAppender("lastOnly"); + } + + protected void tearDown() { + } + + /* Tests */ + + public void testFallbackErrorHandlerWhenStarting() { + String msg = "testFallbackErrorHandlerWhenStarting"; + logger.debug(msg); + + // above debug log will fail and shoul be redirected to secondary appender + assertEquals("SocketAppender with FallbackErrorHandler", msg, secondary.getLastMessage()); + } + + /* Fields */ + + private static Logger logger; + private static Appender primary; + private static LastOnlyAppender secondary; + + /* Inner classes */ + + /** + * Inner-class For debugging purposes only Saves last LoggerEvent + */ + static public class LastOnlyAppender extends AppenderSkeleton { + protected void append(LoggingEvent event) { + this.lastEvent = event; + } + + public boolean requiresLayout() { + return false; + } + + public void close() { + this.closed = true; + } + + /** + * @return last appended LoggingEvent's message + */ + public String getLastMessage() { + if (this.lastEvent != null) + return this.lastEvent.getMessage().toString(); + else + return ""; + } + + private LoggingEvent lastEvent; + }; + +} \ No newline at end of file From 0449324c8c918bab2560b34620695c17d23397e8 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 27 Apr 2007 17:27:10 +0000 Subject: [PATCH 282/342] Bug 42281: Unit test fixes for java-gcj git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@533171 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/MinimumTestCase.java | 6 +++-- .../apache/log4j/PatternLayoutTestCase.java | 27 ++++++++++--------- .../log4j/net/SocketServerTestCase.java | 17 ++++++------ .../log4j/util/JunitTestRunnerFilter.java | 2 ++ .../org/apache/log4j/xml/DOMTestCase.java | 10 ++++--- 5 files changed, 35 insertions(+), 27 deletions(-) diff --git a/tests/src/java/org/apache/log4j/MinimumTestCase.java b/tests/src/java/org/apache/log4j/MinimumTestCase.java index 57a7303643..a4f613ac62 100644 --- a/tests/src/java/org/apache/log4j/MinimumTestCase.java +++ b/tests/src/java/org/apache/log4j/MinimumTestCase.java @@ -36,6 +36,7 @@ public class MinimumTestCase extends TestCase { static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; static String EXCEPTION4 = "\\s*at .*\\(.*Compiled Code\\)"; + static String EXCEPTION5 = "\\s*at .*\\(.*libgcj.*\\)"; //18 fevr. 2002 20:02:41,551 [main] FATAL ERR - Message 0 @@ -85,8 +86,9 @@ public void ttcc() throws Exception { root.addAppender(appender); common(); - ControlFilter cf1 = new ControlFilter(new String[]{TTCC_PAT, TTCC2_PAT, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + ControlFilter cf1 = new ControlFilter(new String[]{TTCC_PAT, + TTCC2_PAT, EXCEPTION1, EXCEPTION2, + EXCEPTION3, EXCEPTION4, EXCEPTION5 }); Transformer.transform( "output/ttcc", FILTERED, diff --git a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java index d7c4a90d3b..551d459aeb 100644 --- a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java @@ -50,6 +50,7 @@ public class PatternLayoutTestCase extends TestCase { static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; static String EXCEPTION4 = "\\s*at .*\\(.*Compiled Code\\)"; + static String EXCEPTION5 = "\\s*at .*\\(.*libgcj.*\\)"; static String PAT0 = "\\[main]\\ (TRACE|DEBUG|INFO |WARN |ERROR|FATAL) .* - Message \\d{1,2}"; static String PAT1 = Filter.ISO8601_PAT + " " + PAT0; @@ -102,7 +103,7 @@ public void test2() throws Exception { PropertyConfigurator.configure("input/patternLayout2.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT1, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -116,7 +117,7 @@ public void test3() throws Exception { PropertyConfigurator.configure("input/patternLayout3.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT1, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -132,7 +133,7 @@ public void test4() throws Exception { PropertyConfigurator.configure("input/patternLayout4.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT2, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -146,7 +147,7 @@ public void test5() throws Exception { PropertyConfigurator.configure("input/patternLayout5.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT2, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -161,7 +162,7 @@ public void test6() throws Exception { PropertyConfigurator.configure("input/patternLayout6.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT3, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -176,7 +177,7 @@ public void test7() throws Exception { PropertyConfigurator.configure("input/patternLayout7.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT3, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -190,7 +191,7 @@ public void test8() throws Exception { PropertyConfigurator.configure("input/patternLayout8.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT4, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -204,7 +205,7 @@ public void test9() throws Exception { PropertyConfigurator.configure("input/patternLayout9.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT5, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -218,7 +219,7 @@ public void test10() throws Exception { PropertyConfigurator.configure("input/patternLayout10.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT6, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -232,7 +233,7 @@ public void test11() throws Exception { PropertyConfigurator.configure("input/patternLayout11.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT11a, PAT11b, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -246,7 +247,7 @@ public void test12() throws Exception { PropertyConfigurator.configure("input/patternLayout12.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT12, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -260,7 +261,7 @@ public void test13() throws Exception { PropertyConfigurator.configure("input/patternLayout13.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT13, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -274,7 +275,7 @@ public void test14() throws Exception { PropertyConfigurator.configure("input/patternLayout14.properties"); common(); ControlFilter cf1 = new ControlFilter(new String[]{PAT14, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { diff --git a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java index 74296d70e1..5620cc1e16 100644 --- a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java +++ b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java @@ -84,6 +84,7 @@ public class SocketServerTestCase extends TestCase { static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; static String EXCEPTION4 = "\\s*at .*\\(.*Compiled Code\\)"; + static String EXCEPTION5 = "\\s*at .*\\(.*libgcj.*\\)"; static Logger logger = Logger.getLogger(SocketServerTestCase.class); @@ -116,7 +117,7 @@ public void test1() throws Exception { common("T1", "key1", "MDC-TEST1"); delay(1); ControlFilter cf = new ControlFilter(new String[]{PAT1, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, @@ -140,7 +141,7 @@ public void test2() throws Exception { common("T2", "key2", "MDC-TEST2"); delay(1); ControlFilter cf = new ControlFilter(new String[]{PAT2, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, @@ -163,7 +164,7 @@ public void test3() throws Exception { common("T3", "key3", "MDC-TEST3"); delay(1); ControlFilter cf = new ControlFilter(new String[]{PAT3, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, @@ -194,7 +195,7 @@ public void test4() throws Exception { if(!System.getProperty("java.version").startsWith("1.1.")) { ControlFilter cf = new ControlFilter(new String[]{PAT4, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, new Filter[] { cf, new LineNumberFilter(), @@ -236,7 +237,7 @@ public void test5() throws Exception { // requires JDK 1.2 or later if(!System.getProperty("java.version").startsWith("1.1.")) { ControlFilter cf = new ControlFilter(new String[]{PAT5, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, @@ -273,7 +274,7 @@ public void test6() throws Exception { // requires JDK 1.2 or later if(!System.getProperty("java.version").startsWith("1.1.")) { ControlFilter cf = new ControlFilter(new String[]{PAT6, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, @@ -306,7 +307,7 @@ public void test7() throws Exception { // requires JDK 1.2 or later if(!System.getProperty("java.version").startsWith("1.1.")) { ControlFilter cf = new ControlFilter(new String[]{PAT7, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, @@ -336,7 +337,7 @@ public void test8() throws Exception { // requires JDK 1.2 or later if(!System.getProperty("java.version").startsWith("1.1.")) { ControlFilter cf = new ControlFilter(new String[]{PAT8, EXCEPTION1, - EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP, FILTERED, diff --git a/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java b/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java index 601a97f175..341bd3481c 100644 --- a/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java +++ b/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java @@ -42,6 +42,8 @@ public String filter(String in) { return null; } else if (in.indexOf("at junit.") >= 0 && in.indexOf("ui.TestRunner") >= 0) { return null; + } else if (util.match("/\\sat /", in)) { + return "\t" + in.trim(); } else { return in; } diff --git a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java index 6a98d93e93..3fcb176dc1 100644 --- a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java @@ -45,6 +45,8 @@ public class DOMTestCase extends TestCase { static String EXCEPTION2 = "\\s*at .*\\(.*:\\d{1,4}\\)"; static String EXCEPTION3 = "\\s*at .*\\(Native Method\\)"; static String EXCEPTION4 = "\\s*at .*\\(.*Compiled Code\\)"; + static String EXCEPTION5 = "\\s*at .*\\(.*libgcj.*\\)"; + static String TEST1_1A_PAT = "(TRACE|DEBUG|INFO |WARN |ERROR|FATAL) \\w*\\.\\w* - Message \\d"; @@ -77,10 +79,10 @@ public void test1() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{TEST1_1A_PAT, TEST1_1B_PAT, - EXCEPTION1, EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION1, EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); ControlFilter cf2 = new ControlFilter(new String[]{TEST1_2_PAT, - EXCEPTION1, EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION1, EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP_A1, FILTERED_A1, @@ -108,10 +110,10 @@ public void test4() throws Exception { common(); ControlFilter cf1 = new ControlFilter(new String[]{TEST1_1A_PAT, TEST1_1B_PAT, - EXCEPTION1, EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION1, EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); ControlFilter cf2 = new ControlFilter(new String[]{TEST1_2_PAT, - EXCEPTION1, EXCEPTION2, EXCEPTION3, EXCEPTION4}); + EXCEPTION1, EXCEPTION2, EXCEPTION3, EXCEPTION4, EXCEPTION5}); Transformer.transform( TEMP_A1 + ".4", FILTERED_A1 + ".4", From 8eaf0e103c97c6c358d8b8d6325eecd2a7eaece7 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 27 Apr 2007 18:19:24 +0000 Subject: [PATCH 283/342] Bug 42281: Explicitly set thread name to pass tests on JRockit git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@533183 13f79535-47bb-0310-9956-ffa450edef68 --- .../log4j/HierarchyThresholdTestCase.java | 5 +++++ .../java/org/apache/log4j/MinimumTestCase.java | 4 ++++ .../apache/log4j/PatternLayoutTestCase.java | 5 +++++ .../apache/log4j/net/SocketServerTestCase.java | 5 +++++ .../java/org/apache/log4j/xml/DOMTestCase.java | 4 ++++ .../apache/log4j/xml/XMLLayoutTestCase.java | 18 ++++++++++++++++++ 6 files changed, 41 insertions(+) diff --git a/tests/src/java/org/apache/log4j/HierarchyThresholdTestCase.java b/tests/src/java/org/apache/log4j/HierarchyThresholdTestCase.java index 55d689c8ef..d5307c5d1b 100644 --- a/tests/src/java/org/apache/log4j/HierarchyThresholdTestCase.java +++ b/tests/src/java/org/apache/log4j/HierarchyThresholdTestCase.java @@ -98,12 +98,17 @@ public void test8() throws Exception { static void common() { + String oldThreadName = Thread.currentThread().getName(); + Thread.currentThread().setName("main"); + logger.log(XLevel.TRACE, "m0"); logger.debug("m1"); logger.info("m2"); logger.warn("m3"); logger.error("m4"); logger.fatal("m5"); + + Thread.currentThread().setName(oldThreadName); } public static Test suite() { diff --git a/tests/src/java/org/apache/log4j/MinimumTestCase.java b/tests/src/java/org/apache/log4j/MinimumTestCase.java index a4f613ac62..7b3b268805 100644 --- a/tests/src/java/org/apache/log4j/MinimumTestCase.java +++ b/tests/src/java/org/apache/log4j/MinimumTestCase.java @@ -84,7 +84,11 @@ public void ttcc() throws Exception { Layout layout = new TTCCLayout(AbsoluteTimeDateFormat.DATE_AND_TIME_DATE_FORMAT); Appender appender = new FileAppender(layout, "output/ttcc", false); root.addAppender(appender); + + String oldName = Thread.currentThread().getName(); + Thread.currentThread().setName("main"); common(); + Thread.currentThread().setName(oldName); ControlFilter cf1 = new ControlFilter(new String[]{TTCC_PAT, TTCC2_PAT, EXCEPTION1, EXCEPTION2, diff --git a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java index 551d459aeb..df4c32e25d 100644 --- a/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/PatternLayoutTestCase.java @@ -286,6 +286,9 @@ cf1, new LineNumberFilter(), new SunReflectFilter(), } void common() { + String oldThreadName = Thread.currentThread().getName(); + Thread.currentThread().setName("main"); + int i = -1; logger.trace("Message " + ++i); @@ -313,6 +316,8 @@ void common() { logger.warn("Message " + ++i , e); logger.error("Message " + ++i, e); logger.log(Level.FATAL, "Message " + ++i, e); + + Thread.currentThread().setName(oldThreadName); } diff --git a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java index 5620cc1e16..9352396322 100644 --- a/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java +++ b/tests/src/java/org/apache/log4j/net/SocketServerTestCase.java @@ -350,6 +350,9 @@ public void test8() throws Exception { static void common(String dc, String key, Object o) { + String oldThreadName = Thread.currentThread().getName(); + Thread.currentThread().setName("main"); + int i = -1; NDC.push(dc); MDC.put(key, o); @@ -376,6 +379,8 @@ void common(String dc, String key, Object o) { root.error("Message " + ++i, e); NDC.pop(); MDC.remove(key); + + Thread.currentThread().setName(oldThreadName); } public void delay(int secs) { diff --git a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java index 3fcb176dc1..e6b02ebf1b 100644 --- a/tests/src/java/org/apache/log4j/xml/DOMTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/DOMTestCase.java @@ -134,6 +134,9 @@ cf2, new LineNumberFilter(), new ISO8601Filter(), } void common() { + String oldThreadName = Thread.currentThread().getName(); + Thread.currentThread().setName("main"); + int i = -1; logger.trace("Message " + ++i); @@ -161,6 +164,7 @@ void common() { logger.error("Message " + ++i, e); root.error("Message " + i, e); + Thread.currentThread().setName(oldThreadName); } diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java index 564e21eec9..881f4b07fa 100644 --- a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java @@ -94,10 +94,15 @@ public void testCDATA() throws Exception { XMLLayout xmlLayout = new XMLLayout(); xmlLayout.setLocationInfo(true); root.addAppender(new FileAppender(xmlLayout, TEMP, false)); + + String oldThreadName = Thread.currentThread().getName(); + Thread.currentThread().setName("main"); logger.trace("Message with embedded hi]]>."); logger.debug("Message with embedded hi]]>."); + Thread.currentThread().setName(oldThreadName); + Transformer.transform( TEMP, FILTERED, new Filter[] { @@ -117,10 +122,17 @@ public void testCDATA() throws Exception { public void testNull() throws Exception { XMLLayout xmlLayout = new XMLLayout(); root.addAppender(new FileAppender(xmlLayout, TEMP, false)); + + String oldThreadName = Thread.currentThread().getName(); + Thread.currentThread().setName("main"); + logger.debug("hi"); logger.debug(null); Exception e = new Exception((String) null); logger.debug("hi", e); + + Thread.currentThread().setName(oldThreadName); + Transformer.transform( TEMP, FILTERED, new Filter[] { new LineNumberFilter(), @@ -131,6 +143,9 @@ public void testNull() throws Exception { } void common() { + String oldThreadName = Thread.currentThread().getName(); + Thread.currentThread().setName("main"); + int i = -1; X x = new X(); @@ -159,6 +174,9 @@ void common() { logger.error("Message " + ++i, e); root.error("Message " + i, e); + + + Thread.currentThread().setName(oldThreadName); } public static Test suite() { From 8145af757cb7b0c590eabb11d7c77c041ae1a370 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 27 Apr 2007 19:53:22 +0000 Subject: [PATCH 284/342] Bug 42283: Eclipse compiler warning cleanup git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@533199 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/log4j/util/Compare.java | 4 +--- .../org/apache/log4j/util/ControlFilter.java | 2 -- .../org/apache/log4j/util/ISO8601Filter.java | 2 -- .../apache/log4j/util/RelativeTimeFilter.java | 2 -- .../org/apache/log4j/util/Transformer.java | 17 +++++++-------- .../log4j/util/UnexpectedFormatException.java | 1 + .../log4j/util/XMLLineAttributeFilter.java | 2 -- .../apache/log4j/util/XMLTimestampFilter.java | 2 -- .../apache/log4j/xml/CustomLevelTestCase.java | 9 +------- .../src/java/org/apache/log4j/xml/XLevel.java | 2 +- .../apache/log4j/xml/XMLLayoutTestCase.java | 21 ++++++++----------- 11 files changed, 21 insertions(+), 43 deletions(-) diff --git a/tests/src/java/org/apache/log4j/util/Compare.java b/tests/src/java/org/apache/log4j/util/Compare.java index 3f20534aaa..9b4146660b 100644 --- a/tests/src/java/org/apache/log4j/util/Compare.java +++ b/tests/src/java/org/apache/log4j/util/Compare.java @@ -17,11 +17,9 @@ package org.apache.log4j.util; -import java.io.InputStream; -import java.io.FileInputStream; -import java.io.FileReader; import java.io.BufferedReader; import java.io.FileNotFoundException; +import java.io.FileReader; import java.io.IOException; public class Compare { diff --git a/tests/src/java/org/apache/log4j/util/ControlFilter.java b/tests/src/java/org/apache/log4j/util/ControlFilter.java index 9b4b732455..821d104378 100644 --- a/tests/src/java/org/apache/log4j/util/ControlFilter.java +++ b/tests/src/java/org/apache/log4j/util/ControlFilter.java @@ -17,8 +17,6 @@ package org.apache.log4j.util; -import java.io.*; - import org.apache.oro.text.perl.Perl5Util; public class ControlFilter implements Filter { diff --git a/tests/src/java/org/apache/log4j/util/ISO8601Filter.java b/tests/src/java/org/apache/log4j/util/ISO8601Filter.java index 2f0156b65d..50479f65fa 100644 --- a/tests/src/java/org/apache/log4j/util/ISO8601Filter.java +++ b/tests/src/java/org/apache/log4j/util/ISO8601Filter.java @@ -17,8 +17,6 @@ package org.apache.log4j.util; -import java.io.*; - import org.apache.oro.text.perl.Perl5Util; public class ISO8601Filter implements Filter { diff --git a/tests/src/java/org/apache/log4j/util/RelativeTimeFilter.java b/tests/src/java/org/apache/log4j/util/RelativeTimeFilter.java index 9b04d6cd36..94d6d0eb09 100644 --- a/tests/src/java/org/apache/log4j/util/RelativeTimeFilter.java +++ b/tests/src/java/org/apache/log4j/util/RelativeTimeFilter.java @@ -17,8 +17,6 @@ package org.apache.log4j.util; -import java.io.*; - import org.apache.oro.text.perl.Perl5Util; public class RelativeTimeFilter implements Filter { diff --git a/tests/src/java/org/apache/log4j/util/Transformer.java b/tests/src/java/org/apache/log4j/util/Transformer.java index 523c3a1658..fd8e81d3b1 100644 --- a/tests/src/java/org/apache/log4j/util/Transformer.java +++ b/tests/src/java/org/apache/log4j/util/Transformer.java @@ -17,19 +17,20 @@ package org.apache.log4j.util; -import java.io.*; - -import org.apache.oro.text.perl.Perl5Util; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.PrintStream; public class Transformer { public static - void transform(String in, String out, Filter[] filters) throws FileNotFoundException, - IOException, + void transform(String in, String out, Filter[] filters) throws IOException, UnexpectedFormatException { - Perl5Util util = new Perl5Util(); String line; BufferedReader input = new BufferedReader(new FileReader(in)); PrintStream output = new PrintStream(new FileOutputStream(out, false)); @@ -50,11 +51,9 @@ void transform(String in, String out, Filter[] filters) throws FileNotFoundExcep public static - void transform(String in, String out, Filter filter) throws FileNotFoundException, - IOException, + void transform(String in, String out, Filter filter) throws IOException, UnexpectedFormatException { - Perl5Util util = new Perl5Util(); String line; BufferedReader input = new BufferedReader(new FileReader(in)); PrintStream output = new PrintStream(new FileOutputStream(out)); diff --git a/tests/src/java/org/apache/log4j/util/UnexpectedFormatException.java b/tests/src/java/org/apache/log4j/util/UnexpectedFormatException.java index 0cda8c809f..8ab79ff8b1 100644 --- a/tests/src/java/org/apache/log4j/util/UnexpectedFormatException.java +++ b/tests/src/java/org/apache/log4j/util/UnexpectedFormatException.java @@ -18,6 +18,7 @@ package org.apache.log4j.util; public class UnexpectedFormatException extends Exception { + private static final long serialVersionUID = 1787725660780924147L; public UnexpectedFormatException(String msg) { super(msg); diff --git a/tests/src/java/org/apache/log4j/util/XMLLineAttributeFilter.java b/tests/src/java/org/apache/log4j/util/XMLLineAttributeFilter.java index bdab05591b..877b432717 100644 --- a/tests/src/java/org/apache/log4j/util/XMLLineAttributeFilter.java +++ b/tests/src/java/org/apache/log4j/util/XMLLineAttributeFilter.java @@ -17,8 +17,6 @@ package org.apache.log4j.util; -import java.io.*; - import org.apache.oro.text.perl.Perl5Util; public class XMLLineAttributeFilter implements Filter { diff --git a/tests/src/java/org/apache/log4j/util/XMLTimestampFilter.java b/tests/src/java/org/apache/log4j/util/XMLTimestampFilter.java index 443d0a72b0..dfac8c798c 100644 --- a/tests/src/java/org/apache/log4j/util/XMLTimestampFilter.java +++ b/tests/src/java/org/apache/log4j/util/XMLTimestampFilter.java @@ -17,8 +17,6 @@ package org.apache.log4j.util; -import java.io.*; - import org.apache.oro.text.perl.Perl5Util; public class XMLTimestampFilter implements Filter { diff --git a/tests/src/java/org/apache/log4j/xml/CustomLevelTestCase.java b/tests/src/java/org/apache/log4j/xml/CustomLevelTestCase.java index fda9ddbe8d..52c366ae94 100644 --- a/tests/src/java/org/apache/log4j/xml/CustomLevelTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/CustomLevelTestCase.java @@ -17,17 +17,10 @@ package org.apache.log4j.xml; +import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; -import junit.framework.Test; - import org.apache.log4j.Logger; -import org.apache.log4j.Level; -import org.apache.log4j.util.Filter; -import org.apache.log4j.util.LineNumberFilter; -import org.apache.log4j.util.ControlFilter; -import org.apache.log4j.util.ISO8601Filter; -import org.apache.log4j.util.Transformer; import org.apache.log4j.util.Compare; public class CustomLevelTestCase extends TestCase { diff --git a/tests/src/java/org/apache/log4j/xml/XLevel.java b/tests/src/java/org/apache/log4j/xml/XLevel.java index 7779a8edec..36ff30dc22 100644 --- a/tests/src/java/org/apache/log4j/xml/XLevel.java +++ b/tests/src/java/org/apache/log4j/xml/XLevel.java @@ -18,7 +18,6 @@ package org.apache.log4j.xml; import org.apache.log4j.Level; -import org.apache.log4j.Priority; /** @@ -27,6 +26,7 @@ */ public class XLevel extends Level { + private static final long serialVersionUID = 7288304330257085144L; static public final int TRACE_INT = Level.DEBUG_INT - 1; static public final int LETHAL_INT = Level.FATAL_INT + 1; diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java index 881f4b07fa..a68b2267a3 100644 --- a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java @@ -17,23 +17,20 @@ package org.apache.log4j.xml; +import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; -import junit.framework.Test; - -import org.apache.log4j.Logger; -import org.apache.log4j.Level; import org.apache.log4j.FileAppender; -import org.apache.log4j.xml.XMLLayout; -import org.apache.log4j.util.Filter; -import org.apache.log4j.util.ControlFilter; -import org.apache.log4j.util.XMLTimestampFilter; -import org.apache.log4j.util.XMLLineAttributeFilter; -import org.apache.log4j.util.LineNumberFilter; -import org.apache.log4j.util.Transformer; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; import org.apache.log4j.util.Compare; +import org.apache.log4j.util.Filter; import org.apache.log4j.util.JunitTestRunnerFilter; +import org.apache.log4j.util.LineNumberFilter; import org.apache.log4j.util.SunReflectFilter; +import org.apache.log4j.util.Transformer; +import org.apache.log4j.util.XMLLineAttributeFilter; +import org.apache.log4j.util.XMLTimestampFilter; public class XMLLayoutTestCase extends TestCase { @@ -148,7 +145,7 @@ void common() { int i = -1; - X x = new X(); + new X(); logger.trace("Message " + ++i); root.trace("Message " + i); From e6aade6f7feefd92fbdce88df52f5c0f47387c34 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 27 Apr 2007 19:53:38 +0000 Subject: [PATCH 285/342] Bug 42283: Eclipse compiler warning cleanup git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@533200 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/log4j/AppenderSkeleton.java | 4 +-- .../log4j/DailyRollingFileAppender.java | 1 + src/java/org/apache/log4j/HTMLLayout.java | 2 +- src/java/org/apache/log4j/PatternLayout.java | 2 -- .../apache/log4j/PropertyConfigurator.java | 21 ++++++------ src/java/org/apache/log4j/ProvisionNode.java | 3 +- .../log4j/config/PropertySetterException.java | 1 + .../log4j/helpers/AbsoluteTimeDateFormat.java | 1 + .../log4j/helpers/DateTimeDateFormat.java | 1 + .../apache/log4j/helpers/FileWatchdog.java | 2 +- .../log4j/helpers/ISO8601DateFormat.java | 1 + .../apache/log4j/helpers/PatternParser.java | 1 - .../log4j/helpers/RelativeTimeDateFormat.java | 2 ++ .../org/apache/log4j/helpers/Transform.java | 3 -- src/java/org/apache/log4j/net/JMSSink.java | 32 +++++++------------ .../org/apache/log4j/net/SocketAppender.java | 13 ++++---- .../org/apache/log4j/net/SocketServer.java | 4 +-- .../apache/log4j/nt/NTEventLogAppender.java | 14 +++----- .../org/apache/log4j/spi/LocationInfo.java | 3 +- .../org/apache/log4j/spi/RendererSupport.java | 3 +- .../varia/ExternallyRolledFileAppender.java | 9 +++--- .../org/apache/log4j/varia/NullAppender.java | 7 +--- .../org/apache/log4j/xml/DOMConfigurator.java | 3 +- .../apache/log4j/xml/Log4jEntityResolver.java | 8 ++--- src/java/org/apache/log4j/xml/XMLLayout.java | 6 ++-- 25 files changed, 58 insertions(+), 89 deletions(-) diff --git a/src/java/org/apache/log4j/AppenderSkeleton.java b/src/java/org/apache/log4j/AppenderSkeleton.java index 7bf34ff945..630516e767 100644 --- a/src/java/org/apache/log4j/AppenderSkeleton.java +++ b/src/java/org/apache/log4j/AppenderSkeleton.java @@ -103,7 +103,7 @@ void addFilter(Filter newFilter) { if(headFilter == null) { headFilter = tailFilter = newFilter; } else { - tailFilter.next = newFilter; + tailFilter.setNext(newFilter); tailFilter = newFilter; } } @@ -244,7 +244,7 @@ void doAppend(LoggingEvent event) { switch(f.decide(event)) { case Filter.DENY: return; case Filter.ACCEPT: break FILTER_LOOP; - case Filter.NEUTRAL: f = f.next; + case Filter.NEUTRAL: f = f.getNext(); } } diff --git a/src/java/org/apache/log4j/DailyRollingFileAppender.java b/src/java/org/apache/log4j/DailyRollingFileAppender.java index 0da3150dca..00a4ee5032 100644 --- a/src/java/org/apache/log4j/DailyRollingFileAppender.java +++ b/src/java/org/apache/log4j/DailyRollingFileAppender.java @@ -366,6 +366,7 @@ protected void subAppend(LoggingEvent event) { * start of the next interval. * */ class RollingCalendar extends GregorianCalendar { + private static final long serialVersionUID = -3560331770601814177L; int type = DailyRollingFileAppender.TOP_OF_TROUBLE; diff --git a/src/java/org/apache/log4j/HTMLLayout.java b/src/java/org/apache/log4j/HTMLLayout.java index 93925e0e7d..238dd41d9c 100644 --- a/src/java/org/apache/log4j/HTMLLayout.java +++ b/src/java/org/apache/log4j/HTMLLayout.java @@ -132,7 +132,7 @@ String format(LoggingEvent event) { sbuf.append(Layout.LINE_SEP + "" + Layout.LINE_SEP); sbuf.append(""); - sbuf.append(event.timeStamp - event.getStartTime()); + sbuf.append(event.timeStamp - LoggingEvent.getStartTime()); sbuf.append("" + Layout.LINE_SEP); sbuf.append(""); diff --git a/src/java/org/apache/log4j/PatternLayout.java b/src/java/org/apache/log4j/PatternLayout.java index 33bd2a589b..3cfa286568 100644 --- a/src/java/org/apache/log4j/PatternLayout.java +++ b/src/java/org/apache/log4j/PatternLayout.java @@ -417,8 +417,6 @@ public class PatternLayout extends Layout { private PatternConverter head; - private String timezone; - /** Constructs a PatternLayout using the DEFAULT_LAYOUT_PATTERN. diff --git a/src/java/org/apache/log4j/PropertyConfigurator.java b/src/java/org/apache/log4j/PropertyConfigurator.java index b9ed5148ee..05834b0e4c 100644 --- a/src/java/org/apache/log4j/PropertyConfigurator.java +++ b/src/java/org/apache/log4j/PropertyConfigurator.java @@ -22,26 +22,23 @@ package org.apache.log4j; -import org.apache.log4j.DefaultCategoryFactory; import org.apache.log4j.config.PropertySetter; -//import org.apache.log4j.config.PropertySetterException; -import org.apache.log4j.spi.OptionHandler; +import org.apache.log4j.helpers.FileWatchdog; +import org.apache.log4j.helpers.LogLog; +import org.apache.log4j.helpers.OptionConverter; +import org.apache.log4j.or.RendererMap; import org.apache.log4j.spi.Configurator; import org.apache.log4j.spi.LoggerFactory; import org.apache.log4j.spi.LoggerRepository; +import org.apache.log4j.spi.OptionHandler; import org.apache.log4j.spi.RendererSupport; -import org.apache.log4j.or.RendererMap; -import org.apache.log4j.helpers.LogLog; -import org.apache.log4j.helpers.OptionConverter; -import org.apache.log4j.helpers.FileWatchdog; -import java.util.Enumeration; -import java.util.Properties; import java.io.FileInputStream; -import java.io.IOException; import java.io.InputStream; -import java.util.StringTokenizer; +import java.util.Enumeration; import java.util.Hashtable; +import java.util.Properties; +import java.util.StringTokenizer; /** Allows the configuration of log4j from an external file. See @@ -406,7 +403,7 @@ void doConfigure(Properties properties, LoggerRepository hierarchy) { String value = properties.getProperty(LogLog.DEBUG_KEY); if(value == null) { - value = properties.getProperty(LogLog.CONFIG_DEBUG_KEY); + value = properties.getProperty("log4j.configDebug"); if(value != null) LogLog.warn("[log4j.configDebug] is deprecated. Use [log4j.debug] instead."); } diff --git a/src/java/org/apache/log4j/ProvisionNode.java b/src/java/org/apache/log4j/ProvisionNode.java index 96539f8043..f1126822a1 100644 --- a/src/java/org/apache/log4j/ProvisionNode.java +++ b/src/java/org/apache/log4j/ProvisionNode.java @@ -20,7 +20,8 @@ import java.util.Vector; class ProvisionNode extends Vector { - + private static final long serialVersionUID = -4479121426311014469L; + ProvisionNode(Logger logger) { super(); this.addElement(logger); diff --git a/src/java/org/apache/log4j/config/PropertySetterException.java b/src/java/org/apache/log4j/config/PropertySetterException.java index f0059fcec0..c6314cca41 100644 --- a/src/java/org/apache/log4j/config/PropertySetterException.java +++ b/src/java/org/apache/log4j/config/PropertySetterException.java @@ -25,6 +25,7 @@ * @since 1.1 */ public class PropertySetterException extends Exception { + private static final long serialVersionUID = -1352613734254235861L; protected Throwable rootCause; public diff --git a/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java b/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java index 9b43e7c8c0..4547ecea63 100644 --- a/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java +++ b/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java @@ -35,6 +35,7 @@ @since 0.7.5 */ public class AbsoluteTimeDateFormat extends DateFormat { + private static final long serialVersionUID = -388856345976723342L; /** String constant used to specify {@link diff --git a/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java b/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java index 2afd27a32a..559f731952 100644 --- a/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java +++ b/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java @@ -32,6 +32,7 @@ @since 0.7.5 */ public class DateTimeDateFormat extends AbsoluteTimeDateFormat { + private static final long serialVersionUID = 5547637772208514971L; String[] shortMonths; diff --git a/src/java/org/apache/log4j/helpers/FileWatchdog.java b/src/java/org/apache/log4j/helpers/FileWatchdog.java index 82c6a92736..8fc86339ec 100644 --- a/src/java/org/apache/log4j/helpers/FileWatchdog.java +++ b/src/java/org/apache/log4j/helpers/FileWatchdog.java @@ -101,7 +101,7 @@ void checkAndConfigure() { void run() { while(!interrupted) { try { - Thread.currentThread().sleep(delay); + Thread.sleep(delay); } catch(InterruptedException e) { // no interruption expected } diff --git a/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java b/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java index 89ad2cf2a1..6a131db8fa 100644 --- a/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java +++ b/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java @@ -40,6 +40,7 @@ @since 0.7.5 */ public class ISO8601DateFormat extends AbsoluteTimeDateFormat { + private static final long serialVersionUID = -759840745298755296L; public ISO8601DateFormat() { diff --git a/src/java/org/apache/log4j/helpers/PatternParser.java b/src/java/org/apache/log4j/helpers/PatternParser.java index 489c1c1ba0..73a35a582f 100644 --- a/src/java/org/apache/log4j/helpers/PatternParser.java +++ b/src/java/org/apache/log4j/helpers/PatternParser.java @@ -49,7 +49,6 @@ public class PatternParser { private static final int LITERAL_STATE = 0; private static final int CONVERTER_STATE = 1; - private static final int MINUS_STATE = 2; private static final int DOT_STATE = 3; private static final int MIN_STATE = 4; private static final int MAX_STATE = 5; diff --git a/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java b/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java index 950061e0a2..ab81a34cf5 100644 --- a/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java +++ b/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java @@ -32,6 +32,8 @@ @since 0.7.5 */ public class RelativeTimeDateFormat extends DateFormat { + private static final long serialVersionUID = 7055751607085611984L; + protected final long startTime; diff --git a/src/java/org/apache/log4j/helpers/Transform.java b/src/java/org/apache/log4j/helpers/Transform.java index 184cbbf554..9299bd0504 100644 --- a/src/java/org/apache/log4j/helpers/Transform.java +++ b/src/java/org/apache/log4j/helpers/Transform.java @@ -17,9 +17,6 @@ package org.apache.log4j.helpers; -import org.apache.log4j.spi.LoggingEvent; -import org.apache.log4j.spi.LocationInfo; - /** Utility class for transforming strings. diff --git a/src/java/org/apache/log4j/net/JMSSink.java b/src/java/org/apache/log4j/net/JMSSink.java index c847d68190..78d657efbd 100644 --- a/src/java/org/apache/log4j/net/JMSSink.java +++ b/src/java/org/apache/log4j/net/JMSSink.java @@ -17,35 +17,25 @@ package org.apache.log4j.net; -import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.Logger; -import org.apache.log4j.LogManager; -import org.apache.log4j.spi.RendererSupport; -import org.apache.log4j.spi.LoggerRepository; -import org.apache.log4j.or.jms.MessageRenderer; import org.apache.log4j.PropertyConfigurator; +import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.xml.DOMConfigurator; -import org.apache.log4j.helpers.LogLog; -import javax.jms.Message; -import javax.jms.MessageListener; -import javax.jms.TopicConnection; +import javax.jms.JMSException; +import javax.jms.ObjectMessage; +import javax.jms.Session; import javax.jms.Topic; +import javax.jms.TopicConnection; import javax.jms.TopicConnectionFactory; -import javax.jms.TopicSubscriber; -import javax.jms.Session; import javax.jms.TopicSession; -import javax.jms.ObjectMessage; -import javax.jms.JMSException; - -import java.io.BufferedReader; -import java.io.InputStreamReader; - -import javax.naming.InitialContext; +import javax.jms.TopicSubscriber; import javax.naming.Context; +import javax.naming.InitialContext; import javax.naming.NameNotFoundException; import javax.naming.NamingException; -import java.util.Properties; +import java.io.BufferedReader; +import java.io.InputStreamReader; /** * A simple application that consumes logging events sent by a {@link @@ -72,9 +62,9 @@ static public void main(String[] args) throws Exception { String configFile = args[4]; if(configFile.endsWith(".xml")) { - new DOMConfigurator().configure(configFile); + DOMConfigurator.configure(configFile); } else { - new PropertyConfigurator().configure(configFile); + PropertyConfigurator.configure(configFile); } new JMSSink(tcfBindingName, topicBindingName, username, password); diff --git a/src/java/org/apache/log4j/net/SocketAppender.java b/src/java/org/apache/log4j/net/SocketAppender.java index 7d8c351299..0a9bdb2894 100644 --- a/src/java/org/apache/log4j/net/SocketAppender.java +++ b/src/java/org/apache/log4j/net/SocketAppender.java @@ -19,16 +19,15 @@ package org.apache.log4j.net; -import java.net.InetAddress; -import java.net.Socket; -import java.io.IOException; -import java.io.ObjectOutputStream; -import java.io.ObjectOutputStream; - +import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.helpers.LogLog; import org.apache.log4j.spi.ErrorCode; import org.apache.log4j.spi.LoggingEvent; -import org.apache.log4j.AppenderSkeleton; + +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.net.InetAddress; +import java.net.Socket; /** Sends {@link LoggingEvent} objects to a remote a log server, diff --git a/src/java/org/apache/log4j/net/SocketServer.java b/src/java/org/apache/log4j/net/SocketServer.java index 4d8e6d0616..b30c9db0db 100644 --- a/src/java/org/apache/log4j/net/SocketServer.java +++ b/src/java/org/apache/log4j/net/SocketServer.java @@ -177,7 +177,7 @@ LoggerRepository configureHierarchy(InetAddress inetAddress) { File configFile = new File(dir, key+CONFIG_FILE_EXT); if(configFile.exists()) { - Hierarchy h = new Hierarchy(new RootLogger((Level) Priority.DEBUG)); + Hierarchy h = new Hierarchy(new RootLogger(Level.DEBUG)); hierarchyMap.put(inetAddress, h); new PropertyConfigurator().doConfigure(configFile.getAbsolutePath(), h); @@ -194,7 +194,7 @@ LoggerRepository genericHierarchy() { if(genericHierarchy == null) { File f = new File(dir, GENERIC+CONFIG_FILE_EXT); if(f.exists()) { - genericHierarchy = new Hierarchy(new RootLogger((Level) Priority.DEBUG)); + genericHierarchy = new Hierarchy(new RootLogger(Level.DEBUG)); new PropertyConfigurator().doConfigure(f.getAbsolutePath(), genericHierarchy); } else { cat.warn("Could not find config file ["+f+ diff --git a/src/java/org/apache/log4j/nt/NTEventLogAppender.java b/src/java/org/apache/log4j/nt/NTEventLogAppender.java index 1d8f3dc30d..5921d29270 100644 --- a/src/java/org/apache/log4j/nt/NTEventLogAppender.java +++ b/src/java/org/apache/log4j/nt/NTEventLogAppender.java @@ -17,12 +17,11 @@ package org.apache.log4j.nt; -import org.apache.log4j.*; -import org.apache.log4j.spi.LoggingEvent; -import org.apache.log4j.Level; +import org.apache.log4j.AppenderSkeleton; +import org.apache.log4j.Layout; +import org.apache.log4j.TTCCLayout; import org.apache.log4j.helpers.LogLog; - -import java.io.*; +import org.apache.log4j.spi.LoggingEvent; /** @@ -43,11 +42,6 @@ public class NTEventLogAppender extends AppenderSkeleton { private String source = null; private String server = null; - private static final int FATAL = Level.FATAL.toInt(); - private static final int ERROR = Level.ERROR.toInt(); - private static final int WARN = Level.WARN.toInt(); - private static final int INFO = Level.INFO.toInt(); - private static final int DEBUG = Level.DEBUG.toInt(); public NTEventLogAppender() { this(null, null, null); diff --git a/src/java/org/apache/log4j/spi/LocationInfo.java b/src/java/org/apache/log4j/spi/LocationInfo.java index 1d41dccf09..80df1d02fe 100644 --- a/src/java/org/apache/log4j/spi/LocationInfo.java +++ b/src/java/org/apache/log4j/spi/LocationInfo.java @@ -77,8 +77,7 @@ public class LocationInfo implements java.io.Serializable { static boolean inVisualAge = false; static { try { - Class dummy = Class.forName("com.ibm.uvm.tools.DebugSupport"); - inVisualAge = true; + inVisualAge = Class.forName("com.ibm.uvm.tools.DebugSupport") != null; LogLog.debug("Detected IBM VisualAge environment."); } catch(Throwable e) { // nothing to do diff --git a/src/java/org/apache/log4j/spi/RendererSupport.java b/src/java/org/apache/log4j/spi/RendererSupport.java index e6ac0d97cc..9d69faa731 100644 --- a/src/java/org/apache/log4j/spi/RendererSupport.java +++ b/src/java/org/apache/log4j/spi/RendererSupport.java @@ -18,9 +18,8 @@ package org.apache.log4j.spi; -import org.apache.log4j.*; -import org.apache.log4j.or.RendererMap; import org.apache.log4j.or.ObjectRenderer; +import org.apache.log4j.or.RendererMap; public interface RendererSupport { diff --git a/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java b/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java index 5a39ce8b71..7e284b7e83 100644 --- a/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java +++ b/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java @@ -17,13 +17,14 @@ package org.apache.log4j.varia; -import java.io.*; -import java.net.Socket; -import java.net.ServerSocket; -import org.apache.log4j.helpers.LogLog; import org.apache.log4j.RollingFileAppender; import org.apache.log4j.helpers.LogLog; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.net.ServerSocket; +import java.net.Socket; + /** This appender listens on a socket on the port specified by the Port property for a "RollOver" message. When such a message diff --git a/src/java/org/apache/log4j/varia/NullAppender.java b/src/java/org/apache/log4j/varia/NullAppender.java index 8435e8ca04..5ef78dc3ce 100644 --- a/src/java/org/apache/log4j/varia/NullAppender.java +++ b/src/java/org/apache/log4j/varia/NullAppender.java @@ -17,13 +17,8 @@ package org.apache.log4j.varia; -import org.apache.log4j.Appender; -import org.apache.log4j.Layout; -import org.apache.log4j.spi.OptionHandler; -import org.apache.log4j.spi.LoggingEvent; -import org.apache.log4j.spi.ErrorHandler; -import org.apache.log4j.spi.Filter; import org.apache.log4j.AppenderSkeleton; +import org.apache.log4j.spi.LoggingEvent; /** * A NullAppender merely exists, it never outputs a message to any diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/java/org/apache/log4j/xml/DOMConfigurator.java index 9b1623d7eb..9bf49e4834 100644 --- a/src/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/java/org/apache/log4j/xml/DOMConfigurator.java @@ -22,7 +22,6 @@ import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; -import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.config.PropertySetter; import org.apache.log4j.helpers.FileWatchdog; import org.apache.log4j.helpers.Loader; @@ -1013,7 +1012,7 @@ class XMLWatchdog extends FileWatchdog { } /** - Call {@link PropertyConfigurator#configure(String)} with the + Call {@link DOMConfigurator#configure(String)} with the filename to reconfigure log4j. */ public void doOnChange() { diff --git a/src/java/org/apache/log4j/xml/Log4jEntityResolver.java b/src/java/org/apache/log4j/xml/Log4jEntityResolver.java index fc18757d2e..a1b939e1e5 100644 --- a/src/java/org/apache/log4j/xml/Log4jEntityResolver.java +++ b/src/java/org/apache/log4j/xml/Log4jEntityResolver.java @@ -17,15 +17,11 @@ package org.apache.log4j.xml; -import java.io.InputStream; -import java.io.ByteArrayOutputStream; -import java.io.ByteArrayInputStream; -import java.io.IOException; - +import org.apache.log4j.helpers.LogLog; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; -import org.apache.log4j.helpers.LogLog; +import java.io.InputStream; /** * An {@link EntityResolver} specifically designed to return diff --git a/src/java/org/apache/log4j/xml/XMLLayout.java b/src/java/org/apache/log4j/xml/XMLLayout.java index 98da0acf41..b83f5dcb10 100644 --- a/src/java/org/apache/log4j/xml/XMLLayout.java +++ b/src/java/org/apache/log4j/xml/XMLLayout.java @@ -20,11 +20,9 @@ package org.apache.log4j.xml; import org.apache.log4j.Layout; -import org.apache.log4j.spi.LoggingEvent; -import org.apache.log4j.spi.LocationInfo; -import org.apache.log4j.helpers.OptionConverter; -import org.apache.log4j.helpers.DateLayout; import org.apache.log4j.helpers.Transform; +import org.apache.log4j.spi.LocationInfo; +import org.apache.log4j.spi.LoggingEvent; /** * The output of the XMLLayout consists of a series of log4j:event From 0287ad33d57ba24dc64a942e37fb012131437699 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 27 Apr 2007 20:42:42 +0000 Subject: [PATCH 286/342] Bug 42283: More Eclipse warning fixups git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@533215 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 7 +++++++ examples/MyPatternParser.java | 1 - examples/NumberCruncherClient.java | 3 --- examples/NumberCruncherServer.java | 7 +++---- examples/Sort.java | 1 - examples/customLevel/XLevel.java | 2 +- .../UsingLogMonitorAdapter/UsingLogMonitorAdapter.java | 1 - .../lf5/UsingSocketAppenders/UsingSocketAppenders.java | 2 +- examples/subclass/MyLogger.java | 4 ---- examples/subclass/MyLoggerTest.java | 2 -- src/java/org/apache/log4j/jdbc/JDBCAppender.java | 1 - src/java/org/apache/log4j/lf5/viewer/LogTable.java | 1 + src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java | 1 + .../log4j/lf5/viewer/LogTableColumnFormatException.java | 1 + src/java/org/apache/log4j/lf5/viewer/LogTableModel.java | 1 + .../org/apache/log4j/lf5/viewer/LogTableRowRenderer.java | 1 + .../viewer/categoryexplorer/CategoryExplorerModel.java | 2 ++ .../viewer/categoryexplorer/CategoryExplorerTree.java | 1 + .../log4j/lf5/viewer/categoryexplorer/CategoryNode.java | 1 + .../categoryexplorer/CategoryNodeEditorRenderer.java | 2 ++ .../viewer/categoryexplorer/CategoryNodeRenderer.java | 2 ++ .../log4j/lf5/viewer/configure/ConfigurationManager.java | 3 +-- src/java/org/apache/log4j/net/SimpleSocketServer.java | 4 ++-- src/java/org/apache/log4j/performance/SystemTime.java | 6 ++---- src/java/org/apache/log4j/varia/LevelRangeFilter.java | 2 -- src/java/org/apache/log4j/xml/examples/XMLSample.java | 2 -- tests/build.xml | 9 +++++++++ 27 files changed, 39 insertions(+), 31 deletions(-) diff --git a/build.xml b/build.xml index cc5c9d9c3f..fcdf4311ef 100644 --- a/build.xml +++ b/build.xml @@ -26,6 +26,13 @@ + + + + + + diff --git a/examples/MyPatternParser.java b/examples/MyPatternParser.java index 4f1de85a73..b65746bec8 100644 --- a/examples/MyPatternParser.java +++ b/examples/MyPatternParser.java @@ -17,7 +17,6 @@ package examples; -import org.apache.log4j.*; import org.apache.log4j.helpers.FormattingInfo; import org.apache.log4j.helpers.PatternConverter; import org.apache.log4j.helpers.PatternParser; diff --git a/examples/NumberCruncherClient.java b/examples/NumberCruncherClient.java index 191e09459b..4f58271bc4 100644 --- a/examples/NumberCruncherClient.java +++ b/examples/NumberCruncherClient.java @@ -17,11 +17,8 @@ package examples; -import java.rmi.Remote; -import java.rmi.server.UnicastRemoteObject; import java.rmi.RemoteException; import java.rmi.Naming; -import java.util.Vector; import java.io.*; /** diff --git a/examples/NumberCruncherServer.java b/examples/NumberCruncherServer.java index 03bc1ff844..e981243d64 100644 --- a/examples/NumberCruncherServer.java +++ b/examples/NumberCruncherServer.java @@ -17,13 +17,11 @@ package examples; -import java.rmi.Remote; import java.rmi.server.UnicastRemoteObject; import java.rmi.RemoteException; import java.rmi.Naming; import java.util.Vector; - import org.apache.log4j.Logger; import org.apache.log4j.NDC; import org.apache.log4j.PropertyConfigurator; @@ -62,6 +60,7 @@ */ public class NumberCruncherServer extends UnicastRemoteObject implements NumberCruncher { + private static final long serialVersionUID = 2626753561969426769L; static Logger logger = Logger.getLogger(NumberCruncherServer.class); @@ -75,7 +74,7 @@ int[] factor(int number) throws RemoteException { // The client's host is an important source of information. try { - NDC.push(this.getClientHost()); + NDC.push(getClientHost()); } catch(java.rmi.server.ServerNotActiveException e) { // we are being called from same VM @@ -149,7 +148,7 @@ void usage(String msg) { public static void delay(int millis) { - try{Thread.currentThread().sleep(millis);} + try{Thread.sleep(millis);} catch(InterruptedException e) {} } diff --git a/examples/Sort.java b/examples/Sort.java index a8e8e762e3..7b97225058 100644 --- a/examples/Sort.java +++ b/examples/Sort.java @@ -19,7 +19,6 @@ import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.Logger; -import org.apache.log4j.Priority; /** Example code for log4j to viewed in conjunction with the {@link diff --git a/examples/customLevel/XLevel.java b/examples/customLevel/XLevel.java index 179c750d7e..d4d1b902f3 100644 --- a/examples/customLevel/XLevel.java +++ b/examples/customLevel/XLevel.java @@ -18,7 +18,6 @@ package examples.customLevel; import org.apache.log4j.Level; -import org.apache.log4j.Priority; /** @@ -27,6 +26,7 @@ */ public class XLevel extends Level { + private static final long serialVersionUID = 2626753561969426769L; static public final int TRACE_INT = Level.DEBUG_INT - 1; static public final int LETHAL_INT = Level.FATAL_INT + 1; diff --git a/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java b/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java index 1ca208fe1f..545bf3118f 100644 --- a/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java +++ b/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java @@ -17,7 +17,6 @@ package examples.lf5.UsingLogMonitorAdapter; import org.apache.log4j.lf5.LogLevel; -import org.apache.log4j.lf5.util.AdapterLogRecord; import org.apache.log4j.lf5.util.LogMonitorAdapter; /** diff --git a/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java b/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java index d7967df985..d22a2e0df5 100644 --- a/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java +++ b/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java @@ -120,7 +120,7 @@ public static void main(String argv[]) { // closed. This is done to overcome some basic limitations with the // way the SocketServer and SocketAppender classes manage sockets. try { - Thread.currentThread().sleep(5000); + Thread.sleep(5000); } catch (InterruptedException ie) { } diff --git a/examples/subclass/MyLogger.java b/examples/subclass/MyLogger.java index 39fd2336d3..d2368b03a2 100644 --- a/examples/subclass/MyLogger.java +++ b/examples/subclass/MyLogger.java @@ -18,11 +18,7 @@ package examples.subclass; import org.apache.log4j.*; -import org.apache.log4j.spi.LoggerFactory; -import org.apache.log4j.xml.DOMConfigurator; import examples.customLevel.XLevel; -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.helpers.LogLog; /** A simple example showing logger subclassing. diff --git a/examples/subclass/MyLoggerTest.java b/examples/subclass/MyLoggerTest.java index f0074b8c85..6ea39f5d56 100644 --- a/examples/subclass/MyLoggerTest.java +++ b/examples/subclass/MyLoggerTest.java @@ -18,9 +18,7 @@ package examples.subclass; import org.apache.log4j.*; -import org.apache.log4j.spi.LoggerFactory; import org.apache.log4j.xml.DOMConfigurator; -import examples.customLevel.XLevel; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.helpers.LogLog; diff --git a/src/java/org/apache/log4j/jdbc/JDBCAppender.java b/src/java/org/apache/log4j/jdbc/JDBCAppender.java index fed81de4f5..eca1a3821f 100644 --- a/src/java/org/apache/log4j/jdbc/JDBCAppender.java +++ b/src/java/org/apache/log4j/jdbc/JDBCAppender.java @@ -16,7 +16,6 @@ */ package org.apache.log4j.jdbc; -import org.apache.log4j.*; import org.apache.log4j.spi.*; import org.apache.log4j.PatternLayout; diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTable.java b/src/java/org/apache/log4j/lf5/viewer/LogTable.java index f7d28743a9..2198403738 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTable.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTable.java @@ -41,6 +41,7 @@ // Contributed by ThoughtWorks Inc. public class LogTable extends JTable { + private static final long serialVersionUID = 4867085140195148458L; //-------------------------------------------------------------------------- // Constants: //-------------------------------------------------------------------------- diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java b/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java index 7d178889e3..045212cd5b 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java @@ -31,6 +31,7 @@ // Contributed by ThoughtWorks Inc. public class LogTableColumn implements java.io.Serializable { + private static final long serialVersionUID = -4275827753626456547L; // log4j table columns. public final static LogTableColumn DATE = new LogTableColumn("Date"); diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java b/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java index e7a59e00a1..b161fe7bcb 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java @@ -27,6 +27,7 @@ // Contributed by ThoughtWorks Inc. public class LogTableColumnFormatException extends Exception { + private static final long serialVersionUID = 6529165785030431653L; //-------------------------------------------------------------------------- // Constants: diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java b/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java index 2e672808b7..3b60000bfc 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java @@ -28,6 +28,7 @@ // Contributed by ThoughtWorks Inc. public class LogTableModel extends DefaultTableModel { + private static final long serialVersionUID = 3593300685868700894L; //-------------------------------------------------------------------------- // Constants: //-------------------------------------------------------------------------- diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java b/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java index 6322195a7d..648b25d14c 100644 --- a/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java +++ b/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java @@ -34,6 +34,7 @@ // Contributed by ThoughtWorks Inc. public class LogTableRowRenderer extends DefaultTableCellRenderer { + private static final long serialVersionUID = -3951639953706443213L; //-------------------------------------------------------------------------- // Constants: //-------------------------------------------------------------------------- diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java index 05cd1c0e23..67354690fe 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java @@ -39,6 +39,8 @@ // Contributed by ThoughtWorks Inc. public class CategoryExplorerModel extends DefaultTreeModel { + private static final long serialVersionUID = -3413887384316015901L; + //-------------------------------------------------------------------------- // Constants: //-------------------------------------------------------------------------- diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java index 57cc12a38c..b8416827eb 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java @@ -33,6 +33,7 @@ // Contributed by ThoughtWorks Inc. public class CategoryExplorerTree extends JTree { + private static final long serialVersionUID = 8066257446951323576L; //-------------------------------------------------------------------------- // Constants: //-------------------------------------------------------------------------- diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java index 64fd42e6e7..95bdc4280b 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java @@ -30,6 +30,7 @@ // Contributed by ThoughtWorks Inc. public class CategoryNode extends DefaultMutableTreeNode { + private static final long serialVersionUID = 5958994817693177319L; //-------------------------------------------------------------------------- // Constants: //-------------------------------------------------------------------------- diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java index d95d47658a..d439990850 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java @@ -29,6 +29,8 @@ // Contributed by ThoughtWorks Inc. public class CategoryNodeEditorRenderer extends CategoryNodeRenderer { + private static final long serialVersionUID = -6094804684259929574L; + //-------------------------------------------------------------------------- // Constants: //-------------------------------------------------------------------------- diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java index 28fc22e5bb..4eb461dd43 100644 --- a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java +++ b/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java @@ -31,6 +31,8 @@ // Contributed by ThoughtWorks Inc. public class CategoryNodeRenderer extends DefaultTreeCellRenderer { + private static final long serialVersionUID = -6046702673278595048L; + //-------------------------------------------------------------------------- // Constants: //-------------------------------------------------------------------------- diff --git a/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java b/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java index 94cc063373..2f9f95f005 100644 --- a/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java +++ b/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java @@ -66,7 +66,6 @@ public class ConfigurationManager extends Object { private static final String FIRST_CATEGORY_NAME = "Categories"; private static final String LEVEL = "level"; private static final String COLORLEVEL = "colorlevel"; - private static final String COLOR = "color"; private static final String RED = "red"; private static final String GREEN = "green"; private static final String BLUE = "blue"; @@ -225,7 +224,7 @@ protected void processLogLevels(Document doc) { protected void processLogLevelColors(Document doc) { NodeList nodeList = doc.getElementsByTagName(COLORLEVEL); - Map logLevelColors = LogLevel.getLogLevelColorMap(); + LogLevel.getLogLevelColorMap(); for (int i = 0; i < nodeList.getLength(); i++) { Node n = nodeList.item(i); diff --git a/src/java/org/apache/log4j/net/SimpleSocketServer.java b/src/java/org/apache/log4j/net/SimpleSocketServer.java index f7e5b782b4..d591bd01d1 100644 --- a/src/java/org/apache/log4j/net/SimpleSocketServer.java +++ b/src/java/org/apache/log4j/net/SimpleSocketServer.java @@ -89,9 +89,9 @@ static void init(String portStr, String configFile) { } if(configFile.endsWith(".xml")) { - new DOMConfigurator().configure(configFile); + DOMConfigurator.configure(configFile); } else { - new PropertyConfigurator().configure(configFile); + PropertyConfigurator.configure(configFile); } } } diff --git a/src/java/org/apache/log4j/performance/SystemTime.java b/src/java/org/apache/log4j/performance/SystemTime.java index 9d83a6d9a3..f5ef4d12b5 100644 --- a/src/java/org/apache/log4j/performance/SystemTime.java +++ b/src/java/org/apache/log4j/performance/SystemTime.java @@ -46,9 +46,8 @@ void main(String[] args) { static double systemCurrentTimeLoop() { long before = System.currentTimeMillis(); - long l; for(int i = 0; i < RUN_LENGTH; i++) { - l = System.currentTimeMillis(); + System.currentTimeMillis(); } return (System.currentTimeMillis() - before)*1000.0/RUN_LENGTH; } @@ -56,9 +55,8 @@ void main(String[] args) { static double currentThreadNameloop() { long before = System.currentTimeMillis(); - String t; for(int i = 0; i < RUN_LENGTH; i++) { - t = Thread.currentThread().getName(); + Thread.currentThread().getName(); } return (System.currentTimeMillis() - before)*1000.0/RUN_LENGTH; } diff --git a/src/java/org/apache/log4j/varia/LevelRangeFilter.java b/src/java/org/apache/log4j/varia/LevelRangeFilter.java index 213c759f58..9dfacb1be5 100644 --- a/src/java/org/apache/log4j/varia/LevelRangeFilter.java +++ b/src/java/org/apache/log4j/varia/LevelRangeFilter.java @@ -20,8 +20,6 @@ import org.apache.log4j.Level; import org.apache.log4j.spi.Filter; import org.apache.log4j.spi.LoggingEvent; -import org.apache.log4j.helpers.LogLog; -import org.apache.log4j.helpers.OptionConverter; /** This is a very simple filter based on level matching, which can be diff --git a/src/java/org/apache/log4j/xml/examples/XMLSample.java b/src/java/org/apache/log4j/xml/examples/XMLSample.java index dfb8792398..8ea09f2844 100644 --- a/src/java/org/apache/log4j/xml/examples/XMLSample.java +++ b/src/java/org/apache/log4j/xml/examples/XMLSample.java @@ -19,7 +19,6 @@ import org.apache.log4j.xml.DOMConfigurator; import org.apache.log4j.Logger; -import java.net.*; /** @@ -67,7 +66,6 @@ void init(String configFile) { static void sample() { int i = -1; - Logger root = Logger.getRootLogger(); cat.debug("Message " + ++i); cat.warn ("Message " + ++i); cat.error("Message " + ++i); diff --git a/tests/build.xml b/tests/build.xml index acfd79df6f..16822144a6 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -27,6 +27,15 @@ + + + + + + + + From e7ad79890dfc04ff71427c09b8c22c5e2525b405 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 4 May 2007 21:32:31 +0000 Subject: [PATCH 287/342] Bug 37930: First pass at Maven site building git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@535385 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 40 +- src/changes/changes.xml | 1 + src/site/apt/books.apt | 61 ++ src/site/apt/download.apt | 44 + src/site/apt/index.apt | 135 +++ src/site/apt/roadmap.apt | 61 ++ src/site/fml/faq.fml | 37 + src/site/resources/css/site.css | 1 + src/site/resources/images/logo.jpg | Bin 0 -> 8184 bytes src/site/resources/images/ls-logo.jpg | Bin 0 -> 32725 bytes src/site/resources/images/od.gif | Bin 0 -> 5741 bytes src/site/site.xml | 71 ++ src/site/xdoc/manual.xml | 1239 +++++++++++++++++++++++++ 13 files changed, 1677 insertions(+), 13 deletions(-) create mode 100644 src/changes/changes.xml create mode 100644 src/site/apt/books.apt create mode 100644 src/site/apt/download.apt create mode 100644 src/site/apt/index.apt create mode 100644 src/site/apt/roadmap.apt create mode 100644 src/site/fml/faq.fml create mode 100644 src/site/resources/css/site.css create mode 100644 src/site/resources/images/logo.jpg create mode 100755 src/site/resources/images/ls-logo.jpg create mode 100644 src/site/resources/images/od.gif create mode 100644 src/site/site.xml create mode 100644 src/site/xdoc/manual.xml diff --git a/pom.xml b/pom.xml index 1114df1acb..3f7ee07202 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ Apache Log4j 1.2.15 Apache Log4j - http://logging.apache.org/log4j/docs/ + http://logging.apache.org/log4j/1.2/ Bugzilla http://issues.apache.org/bugzilla @@ -43,7 +43,7 @@ log4j-user@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ - http://marc.theaimsgroup.com/?l=log4j-user&r=1&w=2 + http://marc.info/?l=log4j-user http://dir.gmane.org/gmane.comp.jakarta.log4j.user @@ -54,7 +54,7 @@ log4j-dev@logging.apache.org http://mail-archives.apache.org/mod_mbox/logging-log4j-dev/ - http://marc.theaimsgroup.com/?l=log4j-dev&r=1&w=2 + http://marc.info/?l=log4j-dev http://dir.gmane.org/gmane.comp.jakarta.log4j.devel @@ -67,9 +67,9 @@ - scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15 - scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15 - http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_15/ + scm:svn:http://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch + scm:svn:https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch + http://svn.apache.org/viewcvs.cgi/logging/log4j/branches/v1_2-branch Apache Software Foundation @@ -92,18 +92,19 @@ maven-surefire-plugin tests + true maven-compiler-plugin 1.3 - 1.3 + 1.2 src/java - + tests/src/java @@ -137,13 +138,26 @@ + true - - maven-javadoc-plugin - org.apache.maven.plugins maven-project-info-reports-plugin + + + + scm + dependencies + cim + issue-tracking + mailing-list + license + + + + + + maven-javadoc-plugin org.codehaus.mojo @@ -167,8 +181,8 @@ - apache.website - scp://people.apache.org/home/carnold/public_html/log4j/1.2.15 + log4j12.website + scp://people.apache.org/www/logging.apache.org/test/log4j/1.2/ diff --git a/src/changes/changes.xml b/src/changes/changes.xml new file mode 100644 index 0000000000..aaacbdc42f --- /dev/null +++ b/src/changes/changes.xml @@ -0,0 +1 @@ + Apache log4j 1.2 SyslogAppender: Added "header" property which if set to true will cause the appender to produce the HEADER part (timestamp and hostname) of the syslog packet. Default value is false for compatibility with previous behavior. SyslogAppender also now sends any header from the associated layout when activateOptions is called or first logging event is sent and any footer when the appender is closed. SyslogAppender leaks descriptors SyslogAppender assumes all lines start with tab SyslogAppender does not limit packet size to 1024 bytes NTEventLogAppender: Updated NTEventLogAppender.dll which corrects missing event messages and which should work with earlier releases of log4j. NTEventLogAppender.dll also now supports registration and unregistration using regsvr32. If replacing an existing copy of NTEventLogAppender, use "regsvr32 NTDllEventLogAppender.dll" or manually remove the HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J registry key. PropertyConfigurator.configure(URL) does not close resource stream. In Turkish locale level "info" is not equivalent to "INFO" Javadoc of PatternLayout should use %n in TTCC layout examples Stacktraces of exceptions disappear occassionally Incorrect message when specified custom level class does not implement toLevel Warning when configuring inner-class logger AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts Add target to generate binary and source compatibility report PropertyPrinter.printOptions breaking signature change in log4j 1.2.9 RollingFileAppender may delete files during rollover XMLConfiguration of loggerFactory does not work SyslogAppender does not limit packet size to 1024 bytes \ No newline at end of file diff --git a/src/site/apt/books.apt b/src/site/apt/books.apt new file mode 100644 index 0000000000..16ac21318c --- /dev/null +++ b/src/site/apt/books.apt @@ -0,0 +1,61 @@ + ------ + Maven Features + ------ + Jason van Zyl + ------ + 12 October 2005 + ------ + +Feature Summary + + The following are the key features of Maven in a nutshell: + + * Simple project setup that follows best practices - get a new project or module started in seconds + + * Consistent usage across all projects means no ramp up time for new developers coming onto a project + + * Superior dependency management including automatic updating, dependency closures (also known as transitive dependencies) + + * Able to easily work with multiple projects at the same time + + * A large and growing repository of libraries and metadata to use out of the box, and arrangements in place with the largest Open Source projects for + real-time availability of their latest releases + + * Extensible, with the ability to easily write plugins in Java or scripting languages + + * Instant access to new features with little or no extra configuration + + * Ant tasks for dependency management and deployment outside of Maven + + * Model based builds: + Maven is able to build any number of projects into predefined output types + such as a JAR, WAR, or distribution based on metadata about the project, without + the need to do any scripting in most cases. + + * Coherent site of project information: + Using the same metadata as for the build process, Maven is able to generate a + web site or PDF including any documentation you care to add, and adds to that + standard reports about the state of development of the project. + Examples of this information can be seen at the bottom of the left-hand navigation of + this site under the "Project Information" and "Project Reports" submenus. + + * Release management and distribution publication: + Without much additional configuration, Maven will integrate with your source control + system such as CVS and manage the release of a project based on a certain tag. + It can also publish this to a distribution location for use by other projects. + Maven is able to publish individual outputs such as a JAR, an archive including other + dependencies and documentation, or as a source distribution. + + * Dependency management: + Maven encourages the use of a central repository of JARs and other dependencies. Maven + comes with a mechanism that your project's clients can use to + download any JARs required for building your project from a + central JAR repository much like Perl's CPAN. This allows users + of Maven to reuse JARs across projects and encourages communication + between projects to ensure that backward compatibility issues are + dealt with. We are collaborating with the folks at {{{http://www.ibiblio.org}Ibiblio}} who have graciously + allowed the central repository to live on their servers. + + [] + +~~ this needs to be greatly expanded and is too detailed here ... jvz diff --git a/src/site/apt/download.apt b/src/site/apt/download.apt new file mode 100644 index 0000000000..1af266f55a --- /dev/null +++ b/src/site/apt/download.apt @@ -0,0 +1,44 @@ +~~ Licensed to the Apache Software Foundation (ASF) under one or more +~~ contributor license agreements. See the NOTICE file distributed with +~~ this work for additional information regarding copyright ownership. +~~ The ASF licenses this file to You under the Apache License, Version 2.0 +~~ (the "License"); you may not use this file except in compliance with +~~ the License. You may obtain a copy of the License at +~~ +~~ http://www.apache.org/licenses/LICENSE-2.0 +~~ +~~ Unless required by applicable law or agreed to in writing, software +~~ distributed under the License is distributed on an "AS IS" BASIS, +~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +~~ See the License for the specific language governing permissions and +~~ limitations under the License. + ------ +Download Apache log4j 1.2 + ------ + ------ + ------ + +Download Apache log4j 1.2.14 + + Apache log4j 1.2.14 is distributed under the {{{http://www.apache.org/licenses/LICENSE-2.0.html} Apache License, version 2.0}}. + + The link in the Mirrors column should display a list of available mirrors with a + default selection based on your inferred location. If you do not see that page, + try a different browser. The checksum and signature are links to + the originals on the main distribution server. + +*-------------------------+---------+----------+-----------+ +| | Mirrors | Checksum | Signature | +*-------------------------+---------+----------+-----------+ +| Apache log4j 1.2.14 (tar.gz) | {{{http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.14/logging-log4j-1.2.14.tar.gz} logging-log4j-1.2.14.tar.gz}} | {{{http://www.apache.org/dist/logging/log4j/1.2.14/logging-log4j-1.2.14.tar.gz.md5} logging-log4j-1.2.14.tar.gz.md5}} | {{{http://www.apache.org/dist/logging/log4j/1.2.14/logging-log4j-1.2.14.tar.gz.asc} logging-log4j-1.2.14.tar.gz.asc}} | +*-------------------------+---------+----------+-----------+ +| Apache log4j 1.2.14 (zip) | {{{http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.14/logging-log4j-1.2.14.zip} logging-log4j-1.2.14.zip}} | {{{http://www.apache.org/dist/logging/log4j/1.2.14/logging-log4j-1.2.14.zip.md5} logging-log4j-1.2.14.zip.md5}} | {{{http://www.apache.org/dist/logging/log4j/1.2.14/logging-log4j-1.2.14.zip.asc} logging-log4j-1.2.14.zip.asc}} | +*-------------------------+---------+----------+-----------+ + + Please read {{{http://httpd.apache.org/dev/verification.html}Verifying Apache HTTP Server Releases}} + for more information on why you should verify our releases. + + +* Previous Releases + + All previous releases of Apache log4j can be found in the {{{http://archive.apache.org/dist/logging/log4j}archive repository}}. diff --git a/src/site/apt/index.apt b/src/site/apt/index.apt new file mode 100644 index 0000000000..385a53973f --- /dev/null +++ b/src/site/apt/index.apt @@ -0,0 +1,135 @@ + ------ + What is Maven? + ------ + Jason van Zyl + ------ + 12 October 2005 + ------ + +Introduction + + Maven was originally started as an attempt to simplify the build + processes in the Jakarta Turbine project. There were several + projects each with their own Ant build files that were all slightly + different and JARs were checked into CVS. We wanted a standard way to + build the projects, a clear definition of what the project consisted + of, an easy way to publish project information and a way to share JARs + across several projects. + + The result is a tool that can now be used for building and managing + any Java-based project. We hope that we have created something that + will make the day-to-day work of Java developers easier and generally + help with the comprehension of any Java-based project. + +Maven's Objectives + + Maven's primary goal is to allow a developer to comprehend the + complete state of a development effort in the shortest period of + time. In order to attain this goal there are several areas of concern + that Maven attempts to deal with: + + * Making the build process easy + + * Providing a uniform build system + + * Providing quality project information + + * Providing guidelines for best practices development + + * Allowing transparent migration to new features + +* Making the build process easy + + While using Maven doesn't eliminate the need to know about the + underlying mechanisms, Maven does provide a lot of shielding + from the details. + +* Providing a uniform build system + + Maven allows a project to build using its project object model (POM) and + a set of plugins that are shared by all projects using + Maven, providing a uniform build system. Once you familiarize yourself + with how one Maven project builds you automatically know how all Maven + projects build saving you immense amounts of time when trying to + navigate many projects. + +* Providing quality project information + + Maven provides plenty of useful project information that is in + part taken from your POM and in part generated from your project's + sources. For example, Maven can provide: + + * Change log document created directly from source control + + * Cross referenced sources + + * Mailing lists + + * Dependency list + + * Unit test reports including coverage + + [] + + As Maven improves the information set provided will improve, all of + which will be transparent to users of Maven. + + Other products can also provide Maven plugins to allow their set of + project information alongside some of the standard information given by + Maven, all still based on the POM. + +* Providing guidelines for best practices development + + Maven aims to gather current principles for best practices development, and + make it easy to guide a project in that direction. + + For example, specification, execution, and reporting of unit tests are part of + the normal build cycle using Maven. + Current unit testing best practices were used as guidelines: + + * Keeping your test source code in a separate, but parallel source tree + + * Using test case naming conventions to locate and execute tests + + * Have test cases setup their environment and don't rely on customizing the build for test preparation. + + [] + + Maven also aims to assist in project workflow such as release management and + issue tracking. + + Maven also suggests some guidelines on how to layout your project's directory structure + so that once you learn the layout you can easily navigate any other project that uses + Maven and the same defaults. + +* Allowing transparent migration to new features + + Maven provides an easy way for Maven clients to update their installations + so that they can take advantage of any changes that been made to + Maven itself. + + Installation of new or updated plugins from third parties or Maven itself has + been made trivial for this reason. + +What is Maven Not? + + You may have heard some of the following things about Maven: + + * Maven is a site and documentation tool + + * Maven extends Ant to let you download dependencies + + * Maven is a set of reusable Ant scriptlets + + [] + + While Maven does these things, as you can read above in the "What is Maven?" section, + these are not the only features Maven has, and its objectives are quite different. + + Maven does encourage best practices, but we realise that some projects may not fit with + these ideals for historical reasons. While Maven is designed to be flexible, to an extent, in these + situations and to the needs of different projects, it can not cater to every situation without making + compromises to the integrity of its objectives. + + If you decide to use Maven, and have an unusual build structure that you cannot reorganise, you may + have to forgo some features or the use of Maven altogether. diff --git a/src/site/apt/roadmap.apt b/src/site/apt/roadmap.apt new file mode 100644 index 0000000000..16ac21318c --- /dev/null +++ b/src/site/apt/roadmap.apt @@ -0,0 +1,61 @@ + ------ + Maven Features + ------ + Jason van Zyl + ------ + 12 October 2005 + ------ + +Feature Summary + + The following are the key features of Maven in a nutshell: + + * Simple project setup that follows best practices - get a new project or module started in seconds + + * Consistent usage across all projects means no ramp up time for new developers coming onto a project + + * Superior dependency management including automatic updating, dependency closures (also known as transitive dependencies) + + * Able to easily work with multiple projects at the same time + + * A large and growing repository of libraries and metadata to use out of the box, and arrangements in place with the largest Open Source projects for + real-time availability of their latest releases + + * Extensible, with the ability to easily write plugins in Java or scripting languages + + * Instant access to new features with little or no extra configuration + + * Ant tasks for dependency management and deployment outside of Maven + + * Model based builds: + Maven is able to build any number of projects into predefined output types + such as a JAR, WAR, or distribution based on metadata about the project, without + the need to do any scripting in most cases. + + * Coherent site of project information: + Using the same metadata as for the build process, Maven is able to generate a + web site or PDF including any documentation you care to add, and adds to that + standard reports about the state of development of the project. + Examples of this information can be seen at the bottom of the left-hand navigation of + this site under the "Project Information" and "Project Reports" submenus. + + * Release management and distribution publication: + Without much additional configuration, Maven will integrate with your source control + system such as CVS and manage the release of a project based on a certain tag. + It can also publish this to a distribution location for use by other projects. + Maven is able to publish individual outputs such as a JAR, an archive including other + dependencies and documentation, or as a source distribution. + + * Dependency management: + Maven encourages the use of a central repository of JARs and other dependencies. Maven + comes with a mechanism that your project's clients can use to + download any JARs required for building your project from a + central JAR repository much like Perl's CPAN. This allows users + of Maven to reuse JARs across projects and encourages communication + between projects to ensure that backward compatibility issues are + dealt with. We are collaborating with the folks at {{{http://www.ibiblio.org}Ibiblio}} who have graciously + allowed the central repository to live on their servers. + + [] + +~~ this needs to be greatly expanded and is too detailed here ... jvz diff --git a/src/site/fml/faq.fml b/src/site/fml/faq.fml new file mode 100644 index 0000000000..b2655ee537 --- /dev/null +++ b/src/site/fml/faq.fml @@ -0,0 +1,37 @@ + + + + + + How do I prevent including JARs in WEB-INF/lib? I need a "compile only" scope! + +

    + The scope you should use for this is + provided. This indicates to Maven that the dependency will be + provided at run time by its container or the JDK, for example. +

    +

    + Dependencies with this scope will not be passed on transitively, nor will they be bundled in an package such + as a WAR, or included in the runtime classpath. +

    +
    +
    + +
    +
    diff --git a/src/site/resources/css/site.css b/src/site/resources/css/site.css new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/site/resources/css/site.css @@ -0,0 +1 @@ + diff --git a/src/site/resources/images/logo.jpg b/src/site/resources/images/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5b6ede812f804678811320ecc09e783259198228 GIT binary patch literal 8184 zcmbW5cQjnl+wYIwdx<_mw1{rBU=o5LB6{y67$qWVwCG(BBzha7jy7TRI$HGJTM#uy zbc5@6-@D$s*8S_=`|Q2{*z4?b*7vjaUeDRz=Wh0H6`)j8R#gVDu&{ua_YJsP02Bcn zZ0!H^`@p^Lc!YR(xVU)41O)hmq{O78B*Y{nWaQM8WaL!jBqWsdlvFgdbaZs26b~5a zX&I<#>1hA+5iFehcX08D@bHLe$w#iFB0RR@> zz1sf>{$GKGeXkLpfRKooW3oF@oBWI2sqqm zML#Fz5ppV2chG5%9X%4W{t!$=O#gs^k%^0&hnMfMI9NhbN?Jzog_5$$OI0-;T|IpR zLnC7wTf4XK>>V84KYDn2dHeW=gocGjL`Fp?C4WsxP5bseJ-?t3R#g0>q_n2C4)L?T z0omBu)!l>Y?du;HpO~DQo|&DSUt8b!y}7mhXJ;3E{O{!S?EK>L>OWjq0M375{WsbF z!9{h?g^i1ggG=xqE-Y-X`+-A+i}z3jpZd8Lft4E#hv;WQT7|^C>JB1KG3_Hd>knhZ z^pC{XxX}MW`=4b0cVNN)Uu6Fc_P@F20a6^S`_03l0wBPR7JK%Iv#YVzcxn)H$euDq zg-kT?3S=zo?_i&ce^B5$o}~mxx{k-Ssd>->%kI&yvv!ttV2$G^SkkA(mRIBS#K^wV zV+%!kFB$mcw0j8yfB$R@3~Bj}wN}Z-%p0zbxIWjy`C~%&ou|76n@;fjD2(+r+En{j z)fdkcy+9ozYX_yde*bNQ%=i#m@|H3oRWx@_MQ`KqmUQnmDG?~laXWgySf8$7PBs}}nP=H%odJB#!yZEa(`UPet%%WbUXbko9zgNfFrMKU~O}&kh5{^+ysxIH@9;a zu*$wX0YAvvOAx#Gc>j-A6xXF3Zvs~}%u;%~Ifgnu#t`d*6d*Tx5fvE4quV(9dV};( z;rvAI^_L?y2^O8mQkzVJzoiRDcR=uq-P0`f0ML=znK=WRB_mlM9e42i+pvIhe*N=( z;qsM>Q-ZbStoI~KBR;-ev5RI;1HSisIKKl}_id*i){dRT=@_KyRH?fX8b-*eOS8CZ zIr=7a3mDcXLahp390a}nI&iToV`+OVSJv6R!K-%m+I8y=5DSJmzP^$U;4$EdI1vzh zU@Wn=|S7rjj&vJIFI= zF!6JCx4tK`(2+h}1S%2!DWSG8H}U220+H6tWB}q=sxgJ9(BVfxclTt5e(aM7j8v5f zRCKXCmf|~Yb+d~?jVQT@#dG7Q;KnpdO+SOJwD2}Z4aKfDO1v@?Eb1ym^F+}jLeH@7 z#QK13hQHITGh+b{HA;5I7LDsfJMVz^QLo(&MW$O5xPBF+baXcQ?j|S-^z>2?Fr~@8 zZ-l#PNb)i>BjH>v7qMq~%{u}%Ru};YB$YpV@>WO=QD)lv`>XzJ4~)NFPKs0ZhX2pI z9&h^{n~79c1;M`a{mtjJ`29Pk6kS4*RTtyay8_vILuJm1Uiju04;$H1R>)PRTbqcY zi{lEICYNK+c&FmLAAj)`IngHnikNqy)lvfPPyb69?NJ;}(>FuW%rH^EOXmc&)cp*a z37uigJ2cV9gV*XLZCbBF#{l`_4 z(D$R+SUpt(M-xxE$0Qld;>UflLQa%ehxm{YwctRI!>CKR^n;;d;2lKD=6SXk_|Cw;wE&EeNn>#idFXMY^?RLJ(%w299=y=DT2<5|iAC%b_Du zq{Uy`yNHGu<>Yyupim!lcF zIK*O?vK1;U-7gEeMR5Im@nj0%cp}Z&?I2~zo|YhGvTUOo z(b?7aGPXAjPFAj$Zz04-pg6V%wemvag3WalPlA`VeZM}ezLelMU5K~?YVAu045oX{ zAp(ZJrf4rdKdS1cQ9mniEi!(IYD!>+fusRz0ll}}nq;1`#)i#p!C>-o`@Co=>G^_h zmHy3hxc4hd>(;VRmevxf*4Wb;Xeqhex5MDnX#T&NdBnW=K}`5~x~**yuj|rxy{Ni~ z(-If*e=zbKmzgwFx~>b!}AKPeL`mrwXEER zj|=A*m>0fG%1F;S5Rw`Ac;}x5Zve_r=5G{5MYGf$(3;&^u@SOouB?%eY8MjE?Krfe z^n3r4^s*T#ob|~QW(O04txC55v7-sc*EKKb+*01k`h~iW)Ds-Rg(7;`aE`KJA3Q)b zCWG&Z*vv|0vyD@j(;ibW*Gp~~Lh80r>VM#yM*-1xI$;k!JPY)B=#t2TWY}Jz8@{kO zdtT!#LuRlp841r7&HXrfVl-4IamiAiEcEx0)h;pltej?#b;)@5Myc!*>&XB(nftXT3oB|*^38iWAAd(QgLR`l^MF> zha@qswcY>tF---GxPe3?uNyFX?WcirJSweYfj{M$E;6*2>7vFxGQu0{8&JwqiFbex z4K?8sGEHjWyc~iPFdD#qq!|i7;V<*a-UW-8kc3{p$~`bC%^ep{}3%GT9&ov42&JNXTziTCbq#0(c@l7W^fY%>}w#zGQmL zBjxXaI7^2>hFj*@S#|r?hh7E(X-Ufp%7LqLWgV?7eq_@D5*1r5<b-op6U7|p~JsAMu~%o@gvBmXK(n+ z$TVq;iECqRezh#WU2r(B9bfO>^pi`OylUkrEY`ALbV~BqZj|GEj;07})^X!%O9$vXqna(7^##1wS8XCSh z_@O?vQ`dX-!#CDJ8ysnda(|qj^atPl*E0Ogr?2%L?1&tgliDlQ`8HUrnr8UX&<$*i z$c0bw+>dw=<&qJ0_sznKg+a;R&sc}Nx7(Rb_8@WT)VpuwTK@SY^|O?}ifN^HYrDxW zCt{7_MEG1}T2y!I`GC^Kz!chd5y!7eMfSU<{t3a>F{ zoPG>rs_~39nP`+1JG&X>MxX^leyD;{O@0NTu==@7u>*=^4e|p!q!D+(Q5hbNFnQ+-Hq)FdY7nXsvTz4<{j8t}MfhMR;|4o$%KAhnbsGk*P&|ZV-Nef(-vK1I zPaV^rJayp=MwxsxdUQO9!#*sQjgIG^D9lUKbx$p&IP%S59AshRF(|ay3Mf&RQ9S>K zvtuET@tLts=wYLddT*P3NymBk-UsqLXS~tOqW6JlGLvw)g5*~v!FI3h&*uE=SsWYP z=3F(+-UuHTr)>xAb!l1@lEtbvlmUm66&fNlva@0NN89}HoZjlYLY>@Ksz0~*jnC2P zhy9X1u2e`<%O8&(SDjsc%|W$>9$3g?sE$s~&1I)NN;Zzqk|`fXEoHJ5l5Xr+D8lJZ z79ST@C1se@P7cs`dvRBI_L6_CyY~nF$iuLEdqDOFnsE_x2XF|s-2vu0fq(ED1=o=y zkvYd4dw0O;rqFE=G={!yZr2ymx6>8K##Z)E-u))l?FP9nbaftb+2U`;z9An1K2F%T zxdR@KP~HJE&7h&Z-AfsNW&SNGgIgt$dY=HNt6`x#AhAdDTdTfcxuyHpno>eR6fiy`_F4^hnp=5U z{!g+LBsuSj>B@C|?pi2fbvkH?F1GB+Hlw_{Urm5o_buIVgDF4!b5Dn#V}a}F=Ei_d zg$n7!xqqhfRi;X(#;YBsxaHVkYh+YGmNidstf#!3^5)1o|Mp6PvCIyH9-~D1JXN|_ zb%v)ox;zlQ4qa##DKIz1sE+Uwr-e%&_YEjk3DYV^gFo?tFAc8_S2QLttgCkbh5g`9eyP0Z zIrqEqRhW5X8;y5%ml{G0?_W`kqFXh^uO^vT--DG)9XJyxDw}l7gJ1m%JF-r= z@A*gyFIHmpZe>wD1_Cn~5vLi%)mr*WErG8tPiX1?oFxI(T2Di??%1R4pgb@#Flh5H z7M0?#@lLHMsZA#v-L-eiKJEl&WhPz_@z$j;6 zQs7{Vet1R9EOb`S;OA=ft#WhM+Dx3s^~gN)wdjU^Q^Gfa5nYl zTS4>`M@e#LEF{kY zv@`q`yTW@2ci;peP9gz7lZW%RWiN45{s~6=s3^_>wqs5?UA`~CNu@*@z}zrjDh2p8 zUnMUirDR>#`vTY@k(LvGnY;IY4LLUY#YtH=y*ySp9A0G0zS$c>S?`P$hZmKos%NQb zlu2A+t~pPBvEl#Zs1!7xW~t09poMwRO%%l-&x#7HP@m>*vbQxUldMlESXKx)2(ro+NgNh4 zhg>VNU_7gEiUc4hGAFg)-Pd%}5!(--MtftIIb@x*=FDKYYTW^&W7Y)sP0MPs&e7kn z3XV5(&GX$jUy2^AcaB#c|%`YK}U_6Hl>k|S6QmLV)B z(#2PNM=?2;chF-Y_H*2jkR^*0`5P!|K57+JI z#HJP5rQ?3}987#Tjw3mG?@o{-5`#a1}D9L^eT0&&qFnO7DURVyaIuCF=V&Y^;c<@Rj2H`m&5{Hy2Ei0Ppsc^C6-A$X>4TX| zGU{s!KW9bpGgX~^Ns*i~9M8PT+>qNp4DiJ;-oRw#j*`x`8YJi6=GG_X<1xiL)I0FV zU2UJh^&v-ZT*V(B>2oHweu*0bGJy%ktRp=Z zI7VEPXCr53>aS`VjM7(?=|ZbTkL;A3oKS|3gFXO~7?Nwtxn*y+69Jboa7AJr%|Y^D zhKoc>DmSD4E}_&m!vAxjy^L4Hf&5^R;lj@JrNHlbg=+4N$+c&Ul@_Q#Tt6%{wFRVm znS2aUmMev9s);KCsfsiN;8#|vYH3X68KFMtC)YTdm)Y8o9*3z}=%K78cepS0=H1#} zoZDX}^sFF?Qr7MOGVbqrvt4-uRwmw+f^Vr`zX51DD8A3G0{E&YV9k!enmZs8yRN% zsb~D+Mm7Y8Td!Q^O^AIqJU=n5$$G2{(fzrVRNrh#*C5di1?N$PLsdI5eM{A-wM<)= zJ%o}sLo*lYqs;1|DF^%VB-O)l*?j}LiGh+vBQua~Wkzk2=Rbeh1l9{5bd%l%7ku%; z-D1La;*hacBBBiRq?TN=i-(`%4ygN15FZhJ`U3)`pfKVv?OI!i+$Pr3oPS_XkmP>K zgK&0W15e0vdB2~%=v5lSDB*qWoIjq?Mi}X;$?r$A&|QWTo=7vUBWEuBkF=+6x1?Gh zcz-aN@(}LjDis$iVI*ziGbIn**p&0$YTgx$WB9R#_N)F=SUFRGiO`8YHti@^hLC2x zu8@FljctRlG43$$;NeG-mlB`aG@}(Qu@n?CJ8*(rPL&?8^xNYC?&MB{*)yb4b~jOOTf}CA(-U zd0l}Xb}wq)Ak1mH1eI{}Td2<2qR>n5W|cydmv%|hCz0uIV-@jLcbnSZ%D11xg^s3M ziXaDx;GoGT^Or6~7Bx|$1CX)d0Ml)R-}dT#>e@()>M5#Uw_u55-aq6HpOb%k=$^tK zGTyp=q37=K{>pjkG$lR{&Jo%$l~<)H+`1?xo~KO2!Uml#)=%Y`)9#+$%Cs#k&(W0l zXv=s~^Jh8_;xiQ!cRIf5Zw;Zoh(P_ROzgM1zwA~}Zt;$uK1$3cU?H{5h7JbWV{KtR zO^gY5BQm{56u0y&m@uvvur)X{w9z9wWIgq#`dre~>e1vx?~?$ldF>amWu!I)UTUKk zPmg+gviZ?)%oB=8dIK5m47-QO;1O-WeCb!4+cKDEFix0I=bs3$iuLbZ6ikOl=?)m};o+5>c=bUbWpVA1e$4s^Rk^BQ{u#P&+3GRy zj2cX^Yk12O-FuS={^QYx<7lo|tLRR*M+Ea)*`m%3$t1P3w3)A!RoxIr>rUAJeBb+t zE&nBwMFtfX#GKITZQimsCrh-tB-X*kT0ikI!>%sK@1V}Ii7I$#_dUU;`I(V6!@f<0 znz6#pP7_3|YdXxg(#^yIEn~;YQ>3D`qdx3kD%`$W)#VSVkd+$dKd6&akH#m0?iEw!D8?rZGDJ`Sw=)QXSG z6Z@KsSZsyw0Pa>Vv_}!_sLYVQ-VOXW^soqfV6)Y=w(sCGl-oTv3HJk=sDgwj!wrW4 z0r)%IUf-N+?63Hc0&ZhXQ(S&3Bfj2PI3cDC_3Oix_XV^twU?fsjOCTnxe4gWMN@}@ znKg*fTjB7jhJqc`OnH3myR!$OZq`8m9q?pRzi%6tWhUlg#RSb0a_V3yV|OwycYKhe z?6#%hv|XIY?xYG*Jpau4)Vei#vRSCoPq;;*UPv;sE^5PmqcJ5SdpFm~=wElzV@&JY z4{OTGA9^##G3v10*2mGETR`U`qMPh}%<(1wRK7I*I8y&=X5-tgOE}j=riU?zBBp4~ zAhC>%Zq>}Pzw*g4Pg9#7=?@;Ls=OUaLZ)i|8H>v)>s3yExvbIJV8zpGIg2+)Tv9MB z_Ok_NFtH%S__T$5Jn{(_lzqU?77mzWLG8J%V3>rsRD9Awd_l%Fzt$Y=oQ9a zG5UQ>PM_&pm6dTh6pzpl>M}T{E`XX>j{6)wvXlMzV?Ti2d#1--l^zN2$#YQ9$q?WL zN!@4bv@lj*XV(f}Qh7nQCy5<)d^p?Pv6MCo@agpVq3+r$Nve6}KGtZzVUgRh)d0N{ zDZd;Fl~fI+$?L%rxtCUa%EKB>eu+pJ353M3*Oup77dD=9LkcXh@m!jx*wuJ7fY&?N ztGX@uKv8uz3-WJ4s~P7!dMOt>VywQ7%H6xX=K$5WdsjebILdw zqs|h~#FrNKKL*xh#|XsZb=AHPd*(E&?r!sJ9#~l5b*_5;HHC+X zA4qmG;e{s`D?hBQ3$uzMIDgi=Z33C^&wSfj&pR+}p_t-w`VJP{)k~tD=6MdjKi{Y2 zD+ju_r*a-#a?Gc2Xp%~iJyx`FQGN8%9bjCSL|_`Cl#b=5TF<(p+Qa=fgSH&|bF?vU zE-ovd1A&?`z?&Zp@Rcuo(kY4O#pdH~-_flU@@vlAm@m$xB(vEi{6*$WSmJ{JE;4n* zq$+**jPOw4_jTWGOXLaXq`@x`lRW-Kw1$$$O2mAPVwuTWK^^i7yCo!)#d3S)6kgy# zxTJeJb{Cur(k<)cv2D=#S^qMz_q&j1? zOc+!#-&Y;z&pCruYtBaw@gARK?0jqOS+b|f@((!rdti?Ax2|`zY52^OP&7v?eB*9< zuo6_qUr!+zW&Nv}Vv)CZ$6RM^VDe+vbbU%ZK}ZQJU*9U2VxFLThN@p6JdBjheATWs zi-Y0(GOCI!Y%1YK?6=y!82G*Xa8_0a~Z zO+}BQGN`ZxpU>ywVH)*%Bi!^-s_71!!%iR9=$AkmjzM(&^ovf0@>+GWHu(~Y#eH)hQG7+P`-=v@le|i$`PRj>} z8$MpUo@1Rl1?BoJ!%?y?Hb9U)ea@LeoAW*Dg;!tdmquEg=In>xdm0q*c9ksKo9x!K zN)I`hn7!O5*94PgM|VW@o1~_{CfoppebD_%>Bv^vD)S>`&*bri&`1V!4orA{>u}DGp z2|ImBLwwN_C#Pxr#doQ_1H+jBwng{)lghP8OE=vurANOFUh#|bbNg)ehHF9u9h1Gy zGA^LwkHR30k0Bh8!{{Bo-}EY36ePkR&+KeEn|o8~`ydf?t|Z5vaGhVaFwkN9o^MU( zW@Wt6*Ap&cp)X z5tUJZI0O74)IT`@V4(1?-#<1;q`x*u5GVdCR$;SWc-J~|6cX(uOJOzwy*$M>_8m)uLkU2n!>E?f7h^qEMNd#5dXJ4oPRYR{zLP( z&PR|8062kK`ri`7&p+n>*7W{=V*A@Of2sxm!2fA8B0GKu1$^05A|#2JC$u5DGwqg@uKKMTCPxL_>f_K*K^oL`1>D#lXPAz`#XA z{7e7(`A7JFb1){02m|~1UMu( z6bv*h6a*qW$cP33Nruh}C8A=2LGB#H2923i*dR(liKY6@l%2yRcvcLCDp~Dv=gQ2L z6T7G}gjzgB9VpRX?8b#Nr?G2(-4r@7@4j~rkcNhNuJ)rpy7v9$Zh!B6T zi3Sh?oOKR!8+@~0^+Tar{`wFw_JqXE?$g@l&m{kx$*;TId;1Qs{`L+CEcD)TeEjx2 zp{3gS%|3Gx9CxXi?K!-U!GE2Lx9*P7cKhVi^qwGpxOkISJU5m%@DS=!&i320!q1`q}9RvBPl1-=I7>*Xp zJPAi!ryCc==jwLv0L*a`F`(#M6w^e(-UL25meRA##(DwO!t2ay-FX9<} z-|ad!@ebJYZrC4w7Gz#Rj>uff^*tfh|Nf)@zU4CDQ^r}#=XKNXhSJ+tCU*ry{U;B& zOk4MzGFQLR-t525yxw=#X3Y6F-ges@PtMe&<3MY;*7(J_#-3K$_ev!k-hXnG&z%(B zi5lAuXN&C}O3@Nx4rbjASLvOgGs`F|s{*zAj$kS0r+t1(wN;an2`P!kj~U17dm$SS z1BK61E6YDonnQ}i53gRPbmET%WGA5REyK6LSX)lgd6HBchCg1jlT=&H)g^JAoPEU%&6MH(28 zf7oKWXG++36}PzVZ35jlUO|aLpnq2L4hXgw3Hat8C)-=)xpX!)^HKa0=2_sOj-E$2 ziak?huh?&NO3erfaOA>O``hjTM%!42?;&LuRQJ)al-i?&c>@ChzomLi^Ajw%#0)=W zlsZV?>I%RMd*tK}w^`2l*gm|y1HR<-YT8*tT0qo?=7btZtl#QwvL-w7g^@cOZGAc zp40jpYKtX**7*G|oyi`HXIm-{Nk2&uG5?@MAux zFdvc8oIr#a(;5F_0egLcG_h*`?nZl7rrG5YFnz?sCcEGJ;DQJuf zCXjr7Z60&JoQUov*-E&Me!O%Z34aHmY-C)2zS{tsd+r!?M=ZSCMbMS-$@-OUW2Bcm z(%NNfmiLDC4p6|$gJCA0>VUpqnzSmMX@=oi<;Q&oNSwdfyNyx$P1#1g5_Bow-+pDj ztgP()`SxofK5Loj_SzoVK_kIqmoad-u}(IRoBwI~{25m9=WpRX)mcd~{AK^vZ%*C~ z>j5QNdNo*}-l%P%?D?dH66S1w@}{g+thamhmFTz7xT8?W{LRV9?WP%%pIx2p`Pbph z`{RZdq0P4h^VoMlm;ty9ZKFXAlNnq zm;*=w$^a`++6@$4|E8QkItdW8n*;1Y(E(&}1(hNG-!4N6USlM9r5bg7joyH(=5p@&<4jV_Gg&YZGGbH=`6qQQG~Hxtpl|8R0_9)x(f?jJ5IJughY?#QNKKz6gg`McG^7uC%_D zpDcxu6MMQ|m|p#X)65;X*TXnGn~8nXmQzV%%W(2VZ>Bqp;*aEX<;huZ!-VuNA1o5R zb{fwy*&GO2fWf2WW|3c<>BV*?Cb%MxbpiLP0U#XG}`#$%$rS~i%gI%>+q@a7F}ENykRGVNOswso}9yD`+q zIxZfzc1S_`HaoUR=21Vz)o{xS2oEYy;h{-z(?vqlMN_0kxUH8-0~6TzrG=Fh(F}`nzjQq4|D~xiMsnH-lz~?XTy9(_m5vKFMmSW+NU={N;-eYe#o) z<4?vr64?G6>Ci+0p^w^Wy&J;6zjQw;ny>2R&CPo?%G5Bv%?Qw0XJ`1nUTjK_^7?jH z&QKcRs%y+2HD1Frb#4m76Mik-5O;5UiLi3|5>zxi6Ac`WSvY~I5-p$vNH<|~cM${% z-_$K{VQudtVAKPmiAG{2v^JR1-lOmC>-;v%VJ=j!=%8q6>7>+@0UvkRl`cA$ zP=6r(GFcInCfpUFB1<+G=@tnm?@$;2T`CSd#&cB%ns7Ecn)$Jw~;ikZ%*X z)kLiGR}Eda<}&8XL_}rv09o|yw7_`L3Z2uCO?LTy*5vA#Q`DL~=(cdyo3iEmuhJ)?tXf_906^L@42m3^{5JeO&m$&CRR6Hek6n=&0pOg5GzpZ^bOKlmOIQCr_NAxAJkaBZ)2(*({Z3 zY2h4Tl5`I1kcTDd4&hZ$5zaDU{c=Go^OZ;iO8wH>2Vz)QMztxAfd{K7!zVJ0mcFrP=NOnFw`)Vyh+rc6S=EMl6LQiJQ#3a$z zUi(tlV|-jn_kSrcyw5&dl``0Cz(>n6Iw?yhTPpV@%hr~shGF1hh=9{Jj>Ezf!m8m8 z`~*-Omom(3^RU(NvdOok2Mvu&QCvY$+i>ksd1YjV=Vc{zYHc)Bi}7XFiA}1|FlU}+ zvsR=gUAg^&-MiCd^6d^wOENYNegofs zh2_32zu|I>5Hr;DUi?uU?`!!(R=;q9a&&NC(s`8S$}7B7#dxVkue#Nvx+nh|UHY0l z2V>*)d<$(EjK$W+NN$UcIr?xfbBS>QvkZ%&nGu5{suYJ0zZlHT=AOk+cN9AHs{jG+ zHA}xwVa$0^{GO11HJyo%#I*g8$x0lD;0ePs!xyv0N!F4;R7lg)L3*^Es(KSN-}rU2dq*%VfdPoGPqAaLE~clYr4(P%Fk#Z@~q7m5;UgE~T=zz@e-}>_`H*oaO;bZW>bwqIQc2K$!lVu=Y3F(+22f^z! zC!HiHAJ;ub3sb1Ry3}|ksdtnj@7?gBO#{#!Hgjh+6SN9N!TQS7cg|!@v_C1r(E|qx zipT}ClgL@f%UFUazbLSwPLD0AqG)o%KPq$ct zcE<%GS*F*1G5dhX-J!tSijH+f zggb_;=?-A5tE|a$@dE^wHmge5s>0O%m~oBsYw{FmeH77}maV*hmx=tFyhfgyyqL2Q_i34K^mNnw3II1S_cM z{DPIhk4#G~b|bhKg3FWMc6t_l?TKeTrmK`z1JyQp789-%bk?z9$ym1hf*qM@ezs%{ zIP|Vu6mV=ma_%zFdYgu`ktK)X4hZM3iHa~|3a)^qj`LWKc8w|}v_xmd5E{1q- z=Hb)<<3ssli8r@oWl4uR7}($l9CWb_^kjzO=uVUe z?|{6dQ-|;D2=LWoWIBntZBo;RU6?MVb{5A~B-XV_5Rv7{)G88yk6w7MFZkx88SLxp z6Sk;hU%V;Re#pnF58>5Qb1r?#W6D@?cg_3_@Q~~1I{ei>71ZYRI|W@TaH6?ZF+ItT zoGRM;FobN^wXiH6(ZJDtmd*fsygnJigw_3W=RjG1iF$OxEuYK8a5R>8m48!-9st5p~nySjEAN*3o^u zU2B1lkJVr&0%O`Wd06LQO@=~G?mr^P&35!Pudj~LlV|HFHwVmR_owJ;+_7o9+#1zZ zp)6+VpXKn1*=d#Rfo@ro#^Olld`XOrOnyU%-**qrD`GPDgFxG6{iGp3bb7<#eyZDc zw703*EC~ADW^A8t#Gc08w5_tAv9OS24*(}d5{bC2bfGQNFxxfVMFYb-8dEeWbefkO z>Q$Da?W5t>buz`z$r&}Wyq`U)pe4&;R!$cNgdI=0K<>~P1 z_%4+emO{8v=f@OFq&pa5p(@exf~@$W2v%uPOmT4l zq+6-o(1gUaRC7jXazbXbe+q1(1m_aSR6^?&GbkDjzo(AnO&`94U|h&8Maqjj=?eRq5v|1C0C0iaFK6Fud~O zp^zmk?|@`}Mt>qYgC>2|Y*1)NP^hhwtdm`LXqATdQ-!Mdtf*7Nj<)!G%Z`p)!ak-` zVflf=EIajx7Cwen6c7ph*0~R^5co^>=x*pgPdykCQqyBX5pQTPo$=qMc~kM zfgY$NB1m+5>QRRw!+yQFUj9|U{u}aTdgB#abWTExAF~a24Eu<)714dXWz^rXH$CnM0(Jj4azaM2W!KM;)Eirq=o z`|(^0nzUYTaX)>f8NJNFwl213+huE~V+yWq{I=UT4BieY9oFolwBti=Ts4HPYD2!L z`Dto{Gx&p!DCy>!%}9B3)QOG9z&z1!|`p`A!FN)I9plRhg^0aZOdaIgL@ zGBV;(fIFoz?`YL{;9E%Y1;fP%0aGB;H{b$=i$Y8VH)Mr9W#x*2$ZT&#Z`srgcjEa` z=;_Xy!r}(YTtl~YU?Y!4EGoey&dE3eHYqy!>p4QrD&qI1G}<33gSrlC9zhC(r^l#M zlK?H&-w`zE@ZUP5oSs4j^YnQYR`U&=5!;hK?vfG}s9|OgC*rNbgTpQeMaocA5P{)i z^!Twm>agv+0|a(vMQ==_7SByB^{Dz-b@t7X+pvw9jb*Sxh_2EVS-*#|Et>`z$WURZ zwVTC|<8h=JWE*#Bn5D6O9#mkv^He&asK2Ne|8kZ;6-RL3obSK#sZrY8nv=d9s(A4% z)n_xEMYev?zl30sJL&deyxuhjBVnw=3`iK5SG?-H~AeKgI(pwJ}NIUuXz!7aqdahc!diZVWg^_^#U$i*2`$h#HXLp!H|+pBqK|}4m3x&@T2J~Iw2RTf_>}To z7y(*K1yGy)kks?!EP^(Cjh}f}1?Hi^Ye(%t4NvLpQ!G5kHF37FsJ&vRAc|A zFu{t?Wd%BskQ-18-;=(B4{CfK^>4nuT>P<@6Y}*;=!^Uv{nhSpz#XpcyjuEYx+$E! z<{j>ybeH=l-?|j53}CQga#pBzxl1ZC#DZtz3C)JQnu3@w(h|UA`$&C=&SZ1otbJ`S znR%>RVSyaA4ZgJ{?3{@&4f@#*MeS3okJRSEKHAx=5~1rZTX5#&R6&=1^J+B&1wF4& zEDy4ru8wRG5aNgdnn62e5vbzsag3!m#_tf5?k<5%no2Uns;?Mgxd|Xu7&ZHRK}!x$ zUi4WHC_}70J68?hRhn=*wM0lf>HFCG)dZ5Dfnun$62WkAWn8e5|DoTjjAVGVWGKe} zd|K94Dog61^_ClfzTX{+8)jXOvGG%EwNq$Kbjtd)V_;a;}c;wY7}esnbK2 zmF;SEBx6CJH9qZBTe3$edkZ>4LtX|TZ3r8Ju{$%Lo$!q znVA&d7^aG}dRjMqc??+`g#=rS%-~n!?rfoq5YR8iToOxCXVn9im|mER%+DW z$MxB7k>#4eE6EG6zPIQrp6+el4-w~Q>-i5&oQawnA6-vwoP9rDzQALnWHy`Q;EpGA z8Iis}?G#HV)yt>2b-wNBb*^Z$i=S~M7*^wq*mtD~GFdb&kajVNiaho+^~RIq6D?;F zAaY)xNr#UpGdrPSvCN{$RZkS{b?GpHwR|81reJ`9#ci!DpvN?*Zu5${3dPzJ-b#pi zu9mGiNyfeDJ9Zp*nD%=L@^|b7@=Z}XRXachC8;Z%bLST#IxxW+eoZRu-hTG=OmI5< z7=zQap=fuOO()01*aVgoU5!x9Za#(0g;B3(MQwH9^l8YPjWbWxH|27K5^SN!+&e~2 zeGUsVDRL06XHwRZen@z7h6Q({!90ch%Ze`i)=vN;dHxVf#J2l|ksX&PhR1>P-l#%z zw+`4F_w4D({2PO{pj3^G=Z8~AH!ndS``m=sYVXSPShDef3HYl-N-1CYs97R7{G?2l zcCH5KQfz^V%z66ZV!DKLec_yLp#|ygt!3{2?Ey7&u**uP9+{!e>t@W@(fDV(6l$6+y69x0Ew!`An&A;&bgvpfn1o!wh`|ORQLF%+AqyM@c1$#h_FWR&X zI?$O3;?iRzWK_lD&c2$Tp2&aVkJtE?-fpLZVv*IsI+LZzTC5I)EZ;{+xg_w|21dG~>UYS7~=$=61?Cy^Pr>Ay@%?x#6w>=k&b}}#85Ux(a?kT`%bEE4( z_xRqXOu@zAbN8rr0eWWxe2L|zcIKipGyWDw$IVA|KEP|(phtyo*`Z@|VRpI9b6*sN zfI+2hrO{bJ$Y@pxMPFpNZT8rU3LS1suzg-@i+1!@y*XMgw-0h|iA1~7v=`V0a_r1^x*Ce;Mwn!2Lu9-oXe7N`q;G6nSuu1( zn{cG0h53UOT#0MgkXz^9lEe=5k(DPO)@LXiHK`*G@{FP|CrzTAr$sAeYxD-wW#p&h zu3AcOYc}chYh|R(ox>=NRe=Yzsd^vTQ)r9ozRUk~cfo{2R8yfjn!i)KC@<7IVp1MU zy3-*X7(a=CE5W{%utC;!78h=Zkxk>76{U-nTttXfN!Xk3f2LcIafAMak+<9U(=% zv9)!!II_}8<{M?`CmCxVSJl$Kiltq!&`RexGAdfB_#HOZ2EjUhpFkIMNF?KF=`4ZU z+_z=dV=Rx2g#4H--8x)9I-8O+25tA&W;M7gj+txRz#%pbe;d~v{@YJAm1Jf3=;Tn9 zcYwJH3$+4xe=CTZa&5Z=M%cu zpS$Py_=J-!8te|v_hZ?dzaD3yI_$L?HWnCQ>!E+7{rHRix-LZp>y2GxznUQhL*-Dv zL%BRN_(jw)uI6g)W~mBIl^%(*Q6d}xcep745B+z={((V^_JO~%$lM@>L}!t~>A=8n znyyOj%6`=r#|^jvv8c$Q%WI<*D?d?-l`n&wkADy=c*^Djx!vhF9g4c72ymX2vwhL@M9Tq#AvZ$zJN zdt3wZ%r?ZP&qWtAU8B*DEzC2|A0Yr*Y*Wa+CYgO|>5yl(Qd=3#5+xWRxrJLfRM&#eyE$luGJ@W%6&59TbDv51eCwVNZR+xiCuXKnUvwh?2FPU|-n9%ZzDusYvfcNgC zE$*_a`mqlXtlkb=FptU9;~rg+r8-|y8#CX_L*S<7OuvZV>1QBU8aIjK*>ypWeu<*| zNXl}I1AAzf#(@hFTrOeQQgXk8z+zG5`1p4cVZOXD3DAr{QYR_85n4SAqQnJPP%Tm6 zvH^h3hksbnpEIGq^$W*@Sib$>1JjP}_-Y8TnuV7LiQKS!it#cTusxb80!M>{Iz@kJ zoqpGW2^fQu8 zOB`bw#O(fFLp*TyZq+3U_K| zUFmBvliuO9k%>mL?&{5_x)}D0*FL%^e zLvF?3=F7@xSWX&eEQC!nz4i6ZwTIq`J1v~2#TOqq$H(j5jjsbQ9T5+0uRbqAX94H$ zfEE85@2@9kM(^`~Hw*r3SI`Ss_|sl(Cx+8^gkWhgA-}*iIa9jIh)hb4kZ*}JqTaA` zmR-&@B`QSG|2SsxYCN6O5mAo{E>H_K3fR#%N*PNKd}tcsQWwWe#fjHwQ-+*nlPSUQ zUrpr$GNz{A(4*QESagAVe?Ft?`)&5wA5JW#3(5qiNBRr(Wa zXE*kF<}18vf~%M*&DySobJ$MVDcf2Lq92``b&E-@G^pPJg9Ni{MkkybOcdjfhZi$k zkq`D=*gU&gX*t`;lvAcYz+cbu*K94 zQ}*MhR3=;0fw7dFjkt|zI%8jgPvKJ}YsI6>vw`x8E|qYSh3AS-{p@RoTJ;Y69t4d8 zOk!1E$))$LEJh_!e|pe={gKw(U~Y`x_ZDL>qz4+WL=%LL7I+jWOo(~PFG*Gmar8;l z9|!lIC3$T}@F4(bV%{8u=~cTGBQfW)l}6OZi^Z!dg#z~6d`naiJjoUdp%6(>+G!k1 z=d{(T2fTfd=;#sJ;p;XkX`7Ec%M@$V{+Ew?9INgfXiYIlB0a`n?xdgUTpjUyI~IOt z?XA0B5sP*1Fx};R)JxwaFY5NL4}irrNo}?|HzcoB?HBSuhiGVV=OLsq8^xM{=p1sl zg|nH)Us1RCMp64{N=!=WfoLYIjuQ@vp;yl5hg{+DG{{Mj(EapLC~fE5%r^tm+yHLT ze9)q3_=)h3NCMwM2~lTr@0 z2MgaQ!GbPF>W4N$o=%CSJA(d*o&>y?9@YGTXc5gHp?nk>Eu+e#tcFdGH>(FrgRBFvWLX$uU7v)J<5BDRae1>{(oH`DCT>B_O41bk5;v zMSJjAhjj%#1G@{li@xpim3Dmb!Uv5E=C}Nu_yO=E=Z&**qAi}gvG_TvNq;0J#v-g_ z4d`#XpzU-$m2Q*A!$%0(#NSn`ne`?o8|jSzQ5fCLEv?lN2eMEI3YLXDCN99AD2Hj>){Wv~xXt}VK}{(|FFaL#`o%5jOMw~- z-!ZE?eVEQ?`|)wS53QuME*=AponXx`?rYxLfK^S#cvrkVmqL>MVQ|*Uz5sM~%t&pn z0!?9Dh>8SZlU#;SPtaPtMH0p7vdQyFZ;K>1k~O!y=b3>c9T0%XiVwh-x3RyQ7To_< z4NJx`Pc+W7=~lSf2re&1t69nXiehXIMI9GK38`d;s!5s&ZxA|&3Oj=^vcJJ?y73TC z>mj+?xGp|l)@doW!1RTIG%k?)uDStQz#Y||`CRegPHe2>ZMOaa2E%r8>r%(L!C6}_ zhNO9#Bi6Z+QhjtTki*X1TK&~IO+UNUdU{snv=9b$2rC((l!Wfdx8g)q( z_MjC*?hxxDmb?jF=%)F}d6@BL_Bh`5;qMV>fn{(7Rim4ghXuW>Ng^{Qum#!31-Cma z6|*L961@P`brSskvoDLQgaTi2@tn(ecvZ#d%a!pcyuasqrk@P^xp0MBYH21};0fU! zdUM*>Yy48A>s(IJl__?j_>wllNge7|cDazprbbtO6_obUr<#Pe(dWdq9u_d&<=x}( z$RB?^%oT3m3ac}!07FrfA7q-Wqyjhwg8)D$T{ZDUELlk5uDiA$x$$F6Y8qJw@0$6m zI7RoY_*|UBQO4z59ZN;E$ee%U2QbVH<4*9T;M5rePc-Nk`u>=mMVHbMWZH+LM{>^o zY4;5lS2pj{nEWf%xap6<%*Kh%+RV67$NnYSOqr*`@q1*k9w|Xjk{r``8c${Dsu{ksa zi8#1{fDyH&GN2ISG3Rm;vt^WTGCTZ2q3BWac8%w@CG zTGHhx^cPXMxCoOZI}|V^=*z**dnoHQ0-T|uXetdb-Bm?M@qS0VmT}iIaf&2|OsC1- zK=gVV$EKzvv@u}nw4Uu#txU>ovyJ6*(NnuvkmM1mYj>i_SqF2hik=48^WRN9#xo(W zZsfHwaNBviMdjTcNz_i2uI>&eFp~CO?x63359tht#TVurIZ#YwPPEDpvSD>Vyh+#p z)E(-nSBfEEE=m0IAi$j{sNZzQ`*WcFhqeW1MaSR>v~F!}YLz+py_-T^yu$0n&jIxK z*w9D8i+PO0>gqh?_7s&ae`L3F`svJ&cgtU>(>^!FvTvKKJDi6Xt^$F9!Yffk6D&0t zmNWrP{m`HA#luh%TblUR-pmx&uOL1YZNayan(ey7CQi3~mw(`nNnl9eQFcMgTs6t2 zMOT@Gf)-t4NV%UbAMH`5O<}~lzNE}IOwGSBFx+yLC?GyS>1%h!lNRm##IU%Dw_nQ2 zV|t)@aw(q>`lvl=8G#|t$2t$)=a&tScFOrPy7Cb6UWlCvAHl>Xq@RCovpd_SyB4ZOsz(s?Ct{rDt|c8~MheqZXaC+$k~wRZADI zPRE024tghpWX0z~bj$(((Hf^QAbH^SX&L89eZu>&j8}Tiq>hc4dHVTGKRz|GPM;Wi z>u??dgX_Z-Ck~Ra5h}4R6QBN+DvmU1qcsoa*alsvnB(VzrKN{XE$$~R?Xstk>C~KQ z&Cx4C-r8U5H~A6klf3G4CG2Cy zf}~Z>Z!vqvn`=RJ+;x9Wy1r2&@@&h{&m)iv$?>7F=Jl|4-vaN_lV*jN74Hu@ zE}KIrUMll`SxiH_qmyQ#1M}Mo&Un%s>Y5M$ogHWK!MYg~P&@;@$40`;Yty8%OM&OK zQDLwcNy+MWG|cOA$rNFOdzOay304q@9PIG9Y#LPfu5QBb`f<1e$NP#%r(<|N#UV|S zZ&^R9fwi(^mg|^PwtdbF{-Yyw4ltWieSDz;3_c6M1s?tlfYZEP_6u}F<6TM8w_JgE zv{IQD@px(oBjVz1(fEU$vK`*F;HQhe9-7jjE-(Z~=2iFM(%tlMm77QPrv-_4g|R9; z*Y%Rjo-nsB)~*Ifj+C#%)q8d-F_(2j?3#?VyPbW@7>;CcP^l_yeCHuWdUn>^UYn#l zJq_IBwe1XqUD(F%g9R%X0P2qWV#;)5ncspO9knmw*Lt5Sb~_ztn;v_7GR^4fKu1ZB z*lu)Us`tanNOh@dm%I4h9-xyygrbnee&7{|C-X#|k zuiCyvsKBYYOxvQ^B_a9&f7231bjid9jT66#8gX~l4yfXg6*#P{Xo4Xc=eP@iIlcl_ zm9%^Vkz!yrXDTH~QwBVrA6O#m_e*p{^xG{ZL^|!PRT4EylGE^&v80Ok zle0kVaUVZ}o+ZAh`5Jca>8WHOr=wU!;o;c26SRD+^=qVT|_tKi7gr-hu0c{mEy$hsC{$*#{c#o~crN9}Je3WheJ0y}BVw@R!>*3=M{=)KEi5-mx#Tq% z4_>`EU*bA-*M?Y|^;Xa~re}d>kV)S|ErkTPQOZ8BED=E=N>;RMh;oyKVt@z6x8Gy; z`E1e!q`80js(*3nSaqOjNLdwo9a5lP+bE{{I`8u30A`dAMPG8lq*{)DKW*R7{&xWAF~-Rq z@O$%s%J9DM?+gAvi++a7BJ1kx$m%RC8C5(^RpnAX z8)}y*(CGpeI7P8kaYzus=(AN-QIyk4L<)$&45H}=i$D^$5Mk`X;NaCUJwpI?E5#R{ z;8UkQ6R4S7#f?jVcgXDIbaa|6E#{c4)$V|20egN>*TcvLnnnipd!Dad5-YTPndrG9 z#A_Wi9uKBU5HSLe!wy#p`rg0$V*{Pu$|q?9XU&P{bz|EjBVo7eBTu8b5;ddZ?&Q_p z=ovge3bs0;KPL>_j%}ne-oVpEj0HOv!DkQTUY12VPx^!SC7%WxX_OxYWmc!r#_n<3w=Af|^?+7YBrWU_u?1jwlqnnTK=5%# zd%<)_x2hDHljUxoI*0q|RTuja6wehFD&`0#ef%4iF#|s5>te4G?fwl&mlH7ZrDNsd zkD!J87R(s;Q$X_f>7n_LM-pYD5 zc6^l(qFtEiS}&Y-#Z5-i)>ob51F%2t5Ag%VC3-O^!qrXp3(Ac^A0mDsV36W+xBW+52xZW*{6CrMn`bD$fN6{g6D<(@B~N6Q}IgjrI; z)wxFN*Do)S-)p`Dw&p9%Tuq#v$_4?p#ykmk4r|%I<=)GdjTsJh&e+v<2jj_B-zZk{ zEMkz{%1uqi5N`&T5virz%PY(-iKgAOlB#mxG!M#5lkPt>+7mFE(X78IsRjpa$LBzP< z@6!r((Vozoquge_g_o9Lx|7lY@zIm#LETDfB_z--HC7kzfQ6>xHG^Up8j@tW z4n{s*+@t=Pku6r8)NtaHJ%u*&G?;Y@yIemjj?oUPd^P9}=5G$dSKtdZj)^Nv%L!GM zd5mtza`?BYY0#!7H&DQJ8r7~5gtdkB#cVXS&Pa*53l+%aH~g_w$TzX1QPzfh>-*eH zmyy!FL?p^}6&2D&gcWxka?^Z?q{TEx|Bc@Y9u(al9VxhjF0@zI^9i`bGZE-_&b?|L zjcAbAbx|hGSWV4?whj!%1@B9v6%~xI2)hM%o<#Ys}$3Go)=g`YeMvpJ(NP{>KKRc7t)0A9wv3roiSRjO6)sbbHJ1Rq^Zt&zNB%6WGr zN-L>WnAZ*yYc#upRG9f%@1B)s#qlFE&;ElP$<@rKuu}EUSdeNJzfuT4&`-cwOB@Zk zTVqRlW6Nj@ewD4;-A>Qq#G%aG!=XC%u*$qkHEt=6>DXmM?{he^N(xWqWE^Y4>g;@8 z5|<4cs4nFd7BggYu%3Aov^}(c4RD%XZ96^X=J>`aFjOZ)?3h*OS86D-uBmK3Sx#S1;_A;(GZ?keu)n7n;5;$JuC=HFuc)aBc z9nCBo28G#;ILhM8+%Z_>{>;SA`#nd(Z7TA8JwjeoU^}G*_iuJ?HTQIyE=ifkkN`C2 zl1$K$zDv4wZ?jhzd0@PonHansCXb=kVUEAFJ866%A1qc7e=v)9HR*!I6{rlT1 z?hVoa7JiIAmf3iwNBQDGAepfX7g17+NRl`qx(d93cj^76r9Inz*rv4AlIyHXpQ$GS zk$<9S;<=|~>A3~5|6PYO&;6US>YNN(yhu{X2@<0d3p?k9HTY0+jZ;ZYh%GbsVXt`J z-r(rynop?LXO{(CxTC(AH-pSUB8F^};l$mR(=tjp@J&MzdgkWV#}V-B{27hfH8Zb0 zyNa$v1-j5*Y?^i-OG43A&j{LmukswWljOH>EnY_O;DK4Oo0SI&;y`Ud@(BX%qG!YN zweg=G+K0nHJ>Ic!^1UH!IqBr^SZyX@@r*0V_G_v{tFJqgk8j%@=R8gqV+>O4BNw2r zkEF4hvru1*yIu5@A(6C@d>-#XUw~5)8_g#swlaiY-Hc(+%9hZX!M?^(x_srk!9c`G z&{S-%!578Xn4PtA`+$AJ1*OTM_wyP>Hlqyf+2XJ&2<54`ojLlKg*5A$U0_K$q#T*A zRbHSvGI+QvsjSMswi!#3yA5;9XR&CX+n>O_Z6y%kcz5~J8XBO54+ zdtZ1h6Rb;Elh_w6j)3wS%5X6lt#-KGi4xKA`JuLKjj;}!oq)=5v@RF;U%W01ym~h6 zN~nE5UVTs!&Tb~yMm)SJxxLLD>c~jKI7uLd(If(iDVO<&&ysp91s$X{xZo=b0F@sx zb(gOwQx=ky@+{8e7;yeM)%m~2jougk%M9f2tB0>oQ)BvNfm%bekAtbERn8w47uI7+ zJv;`!ueItnGA2eTV(+Oy%T*o@(`ZP9&5B2X!HY(P?f^Z0MVxi_Qn-gW=X(vZ7SqKR zoJ@)=RuJzFl-4ZQ%!Fz7d_VFQ=v`&;^tJC{)75VYtzwmfAWSGnMNw8p(Cf<{@})n_ zm!IZ(sbQexsH|hqZA=#^iQ~i8h32?ovbpmfgguMxNnZE?O!8#uv{bJBe;RwMpgM!L zTX18+-CcuAaJS&D8@Ip)g1ZEFch}(V5H=fkx8UyX8k}VK=6wIusX0|sQ+@IF#oIUC z)vLRoXRYDOgym7f?3m)|Fyykf}_e4P&7|{e5>OIVsLoXvEV}B&|L9hPf zw1+-6@V+AhIaU*d$>W35gO(>`*w10r@ z*;KH365W<+==&bPO8$3Mq0@3yLjOw)%mZ3V<mZ7#yNUL*TFMpP%TfDlAoDF zILi+xxJ!rg$3xDWD3!0pyTS#_UnK_^QBl+@#oX30vC36h>UtrMa2w#rTYlDaiuEuB z#=342?HC$!eFX;E^C>oO*OpY^+hc+Uy5(eFeArDy)AcG9$g;cS4+f4uo+$3ww%=;< zo4_xuy)}uxEah7I1S7fKyUX#SIP%dK;J@_%J&a~@#dFLDK$uKbfgg#D5B*(q9!Nu z8?&i~Im3qoKaq3Iq8mbRXfBofVOOUaSZtVs{tzkoiLV#?aF#Wwv6=2)aB4VznUan1 zVk?S>2H`li7Z0ydTuyG2cGw#ZbJj*;4~TQKabcK1Ip&LYA%gk z9{z5cnHCK23wDXo@&#K#$$Y(Bq+xjhKr!130A#E7o~8D&*bJF}$`8ebMmMi@iQWc{ zQc8nva22D6R4l0MzT;LZYM&~~7LRI)e+|S{9fEMW})TnT}&3(50$6X(Bb4*e<4^FsZc#&FaaE_k|CY}2h4rAmB@ zFhcnX8*8TB;$U@$wfR`I|$;yIk zp6^%u#~7%GGZeeoYQch%s6g-D8gfZ@>A4FGAu>Q zx0dD?h$g*RAg}pXTD+DKCLPK$GJVF=0n+*bW8N9G?*IxwUnR)tFJ}8itA?}Pym(Gi zD)4cZsWg;gC6I1j$H4W(y88Lyefq)b;b14np81KCWX$-H0J9iFI}N!4BBI z&0<1MtSl>!n$mG>AAF#tpCzB4#h7 zvTALZ=_)Hos*dBY8z3^X$k>_s!Wfx%NmBYg12vn%5t;lkB_Ff*F_XBmAL5;_#E*(F z4_5N;8H4op-=M>1slh2V^@cELgFtrjd=zL=`~U2U|G{kIe~bSo8fSGBjUsH+bE$~g za(8sxYo0F4(~p{h0J*}{5E7DzD~R3PHR(H>-|(>kS= zfVfBBKhEbVE6pM$m8Ss*~x5IvQGE}a9dhh>|HGDdWV4m*(qX+-9?~O@ys3pHj^Uu2S2^W@U)I~SeAga z%;C(u zqvi74J&)R9a^o@Y(3@nsIFfbAzFI>A-HD*wG=!6(fw^?C$|CMohJeKUTQa(Vy-zdy z7qD>X@Fh*p1ZuL*Ppj%RZ5IZr#KkJDz9yP?54mEgT$x6)F{2$&B9RJuOXjoC99N@uNQ<*cr?RyNs=m2zi7tUxTO~p6k|=!Mdt!x+nEgKl2n>{Jn@2 zhN?^&5lWiYRo;F;{qsl+w{-GEe^0BGE#5xn?|k8}brO2-&6n?+m)=UP zCJtscE6A8c!)~3C@N&RMvf&~@f!cgm{TdKjU%@ARGBSY&}%a_9prYw$lAVVPQ_;KQ`-c)we6vsgvw#ZQK9xa9l z%t~!ZKzlYP?Ybrr`w5p@|Ik%VT204AsaxD$5k5X5 z80}CQCx#(2A>-TYaMxH+&gf}Ou;&)!Cy(&dUecXxb&p%^wvX#PSZ3g3&eaM{EEky| zBy(?_K~C2NmQj5|(sDIficGi94ni{RW&NcEU`H|yS84HB<@7Pe7( z7a>V(h?agJ|3<6fO{Tx(48Pvle#cgLvS%l|jxn1NHWRj>x_7>hww|@5w*inK-kn=1 z<9x(!#HNe9(e=yd+xCv*0-?*o*;2ckJ>~pZ-BnYgi}kR${9x1DSE=MfJG8c!5p5PyXPJT9B& zR_(%BndSAG@?f331c;*CJkUp~k6`lZ)@1vdPIaJmc;Pr1Pe_D2V?eqB|B^>afP(3##+Sw+OpJ+%#h>c@oHZ_jFI1fE)57wbrafX@U|Oh(x>CK z8YWB*HTgLkZATbNu`ShXM$@y9>I$26<_D zks+x@!kiFGN-S46OVZHZ{xAi4sdxQhoL!$PlVmm+7(zW+FF4Omu(sQGe&bL zUX9uyycuRhV(rY3C`8hLhyr=4z<2Zr_YB->CP!9-0 zFX!UO!F1o{!1D57Xa+WmtD+%I0a{x-sxqi#q={6FfmFwEW9Bl%2j8Zj0E2n$P)B68 z`MxlokOZyRAfU>re5)p9L91m}OamH&0g&a>kJoSRKrDpAr|?FpiY->{-#oRG<@IJZaa z9MmEZ^6xY#BJ~iuw4@~-J;kJ?*Cfm57{JtA-OO%6hi`&r>e`LDNjc@ImJ%jUaGv?3 zbw-L#tzK{L{ihIlmDiG^xD(g+0ymw@zyx~0MhVN_~dF2yl&_PcIO5jN%7%CA*8L#&G zmHmm#qg($au5_GbbE~ST(Zj~1{b71k1ghVliW#dy{mXzWlBlahX z>bU|5`cW`-YYvlJ-`M27w@b$wD9%Xg##1+TIqyow+4e7!Bl&2S#_G>~Tc2(;mZs0x zPf!z$?*@^7UFjpml4n3oc++u5e~9py-9xd zct8Zl7&N+`QneUGd0wkhUA&*A{I=W@o04y!@S%=rVcXj6`6+Ec|9g~^r5RQoF71&h zGgA`_wN`I{0ay6&tqwcHsrur<^Up7LoxRTHk)e^6TQXa(6>%OBT&_tyV_b7#>1@%I49yID;PbFRKw?{$9vhg9wloQWJG=mw6&Pg#G zY|RK-2up9h>3QFT4ziJqlS@XcH=h3KK18qPK^|qHdin38QoGLnRTDR|+30oUu#Sxf zGFG(ShBVoLCZ<|dGgRe_gX}X65q(x<>)@RT>Cj^>^IK8ej!b+)ePmcDX4Q~D8<)+o zwz!Kcd89m6Pf)8e>eRE=icRJj{l7rCW8kUHROn zfe?>lHG4&)U`{7zLr8!Hg@4N00*RP*W}_}$MSV$oO=2;l5+0Zw>ZMMr+2LfMA@ymldZH}==dMVHtzYMUDV)n_hbLsA={F2%IcB% z2kt@+y&W3TNn_|6O32T2q8<_8t;<~s-s7|1ZC{0ZXPsV?-p#0pisbA)GnV{+xjPX zrIEzgZmi>HE#7vLqogvisV%YN}3ZIS!Ydy@O+mUchb`K@Fa3ry^9rL>U;aJk}+foinng^5bDO2L#p z;5gxK)2sICH8je|M?ySqcFKntvxrJ48vu-3OEi{`l9~7PB)^LF^$$Ast$zS^Lc?e*kI(pXnencup-h2doo$9uap~nzrP33GRO9ra z_Ll6R9|T8JE8Pv#7Pb+SLF&~@f&PQV?X7_dU?TY|vj0iUhF7NC&bZ4yMb{mzz>bo~T<=K%YzL z&^0YZqEFz3`-8#f*p3Al^w1!pcK21jN1lUrX*L|m;l4DetM4(=7)7$PJfTo--d=!~ z;s!N;qBd~Nn(y`-o740W{~jk3hTv<^W1<{1O)KzE6UI;Y3VgbX4??olgiq8&%L#%M zo5%P@VuQX=Bdg5;I5LhhPqw&dQ8l&NP1Pp_Dm^Y>}cSSk?4>X*dnA6has z;;!C!JK(!_YBj|1)<_}YlKe19tCH0tt5c3^pO_kxTO#{9JwgABSUAWV16&@0(j_=l z9IJIwnO^Opte>nG@36GH-oM0_-@TRBp}4 zSJ-pYx!})0&sB~Fq2RG&h)RtrQ2Zlg_UVL8nK$V+ZtKXd9lY6&)em`9Zs#q%!kO)S3kXvuMuU`!3C}sZ&b8shw@d~Ddo|rg1UDfd;N6&}&kM`wz4&~j(U$*5_s{fi>HmzXB>EJz!Zp#Neb30N zmt+YPVEK?;)>Z{-?U6J&)9I~q%Vs3_gY6wGM_icsIZ86t zehh9L^V@B=7$RYpSFq0xNtMH@v%0}jU(#3%VQlFAGWJu?tcXPwa_rU3JUsm#nK?d6 zQ6Y1)z`D}6{lHUeNd(M#i`+iA_8veV94HrSbv>=^bXi$_vbOoUPw z^}^d4zj^RLRQOh!s(te&R|Q`vC?}zi{nzNmfz2t8d#vw#CB{rWEGk3_`+TysVNX@@{cetUo+zs;E7_mfk$}c-kTd6`1g!*|!zmitfjRe2N*% z&dG2Qj)*NX)BCF^kKp2xe1x!SyBUSlOvbR-+of0LllR^;V=ciu`36T$j7&>8NJfcrMdQJ zDe^C}V*)Kc%~YlmiU0ZZ>1=O%u?gCNZ0g94-+p~(qrW|#i{Rd2X@JIJufTuff4!iJb1Kk*dc+Ge^# zN9<2*(%SCZWPY>B)M9!#T*Q}_I{#E9h*i0@i-7S(7+71@*L>Dy5bUtuxxA9>kfRV9 zOUuJ=&a36bZpD?jXZpe_VCbc_@E7hJb?S2jvny^=FAhAW3Z5cbR5Yc-IN)xL)&(Fy zkow`*)GP5j;DF*wxMTaUw>TGvEpa(4;n4O$_|Ie<0f*bqMqA&iujVze2Xp&N6A8gP zuu&pJ!39qKRO4kAEh;b?#KVi~yALeAv?(KLmCY7|>Y-M|reQx5Y@4HKwK%wOv;vsr z#N{I8`k6CmHkv@Vj&Fx5Yl&(=kxH`^r@wNEV@=oH=_;%St!SDdHhh*ed?G|jmpa+> zU4_gx77wIL=E){Q8%|B%h^?ZHI^{7~YV94&=MGVStq%9)qYg>jF$Y>`MhnSq-Ss0k zedq2ayQfxAwqli1#(hp&fe{Xm)X`@KJyNb03kwDYxYe%>QQK~Gj`jRteR{PX81Tfy ztOms=IxKrF7CUvWktcgBU+JXTGH_Ue=qB;tV+mkx8e8=B{=)P%PP5}|&SfYkibJGK zml3276v~T!ui=C9;Dx;}fl@Y2p=jaD z(DG{B1?=Ci;a-Lo)`T1h0%MkN43f$Kfet=;zIX5%u{LmE)ccK%=IWJg>Ac4ClC;tL zszv4^`C>BsWdV3KH{zLBzf~gRF?j&mc7YW@tmQ!@5F_B}vtKLO+jklODNDH*ksz&gWrwn1nxFf{dG{ax|K(_twq%|fl zZHtMgrpf5aYvhugO&C_k{us6mmsxWar<;vpGM{CcSBJjGSTks<_dLkAyWUTEH>P*o z5tGB>3rQJ+i%q>V0y{ge=R-&Qs4O>4WsG(armuoy@fTr4_^HKa&veJNgVB*5gOP03 zFWkcwZsio16%LLF6hTt4gFpU`WjvBjD^LSAy-~SN67i$KALy65RpuXPXI_IH z{{HrRSR zQ`cj)fIqki0zr-PI3fm**>`A6ZQh=V6st5qc7AD!Txz|v1v~LzFCW(v8=a`phwd=P zpK1f(jy_tSff$-z=i6k(=$SytTp-(101{jV2D7#8{G0!LLEWDTpE4?{^o%%fau>U3 zBK|=qj;Xb!lD#911f+XhBi7z0YYw>Ist+Cje zzkHM3W?J2s4TIT#uoKCn5Yq>K3-0)k6dz`CNj*Z+}<@>DPI0K?U1{`Q+!Jh9~eTEe9->az>L4=Gkj>9 z{*j4YUS!RvrNbBg-X4g~1`-X2#YtFRfMggt6*k3VRs9}Ua-`+q`OKWoOa_9JyM|2n z(dR~GnG{&XEY5T$n(AoqC7z5+zNu)Qp4K-I4@|RjGA?q1qM>PfdRyFwz1h&hV*M`F^&E6Q9_g!@YZ3~N72mZ*k=E3@TQR9>i zn-W}0oR$Aqoi~?w=R>cd@ODAGc2yC*_w`TEDekl0;EQ`RoL6K)(XS^0`N zg52(BszRpfp)s+?$t3{07S%t1r!xF%<)!juNADP~+`&L+tI=!>b?Lg*RNfL&+?Pl z`jd)TdX|+Om>P-Iizy|Bl_=C(vV+VAcyai@R*Q(C1loE%7%+MOzJJm$m^m+U`V97t3Bw<4qBs>_%%wtM?V3ZZc{-S02_^gTFdrvZ`ONoh;qEt7%Y5S zYFqn-B`{HynoNlA4iZ^+p$bqfhoy(Da$_bcrFgn36H}Dh(_W8_2zC4MCK=1V%V^5@ z*4YV>f*9E*Cd~XnIH`d73rEtB4$SvRvJH%16jLd0?tj$CI{aq-aRJ!E)S9M<9LqN= zwzf&tPXibaBnT<#V?M+O^|qSWOMH@m^im1gKJ&9mNUtvT9@+#**U(_@IoT|#OzEf~ zgUUHozEwBNh?oztkj$RT*XPEi#HN0>_$p49q8Ld^cB0Lq9g>9~A|(;@K|Pr_&WGbR z1Up6T`n34(5F+APz}7VFpCk;NYO9(cq~TEyrmLvACc19*>N*?j1>XGi1)~@&B4?u& z;EbBy@CL%~wvhc2;kh+I2z~oD8GpTzmd%2-QE*eUI=_lEqwvV`d1u@5fF?(xrAf6| zH!!P)nA)7tidDJ~b2+fOpNEc<-zBtTFKM>O2CWAC4XZT5WL|qFgEE!R{ zou^7Mv~+(`+76ub*ho$XJxu$J6DADY4x{9!(a%7yx{;M~RN4|(ewlL?Kv&28fn#n` zWZa^NEj6wQq=a!uDWf2O`OR~`rPm`BTV+*MZxf{<|DUG)VFmslL%aXIF*g0^9*BOh z2ls(U{H>y5(_^X%fa+vk;L{(G*#%6WnXU*b$Ht9xqr)u|q4}ULQ%zfBE+5`)m2syJ zcb--<8ZIh0CMld1aH;whk5Pv+UX`>BUcqZBj?yb{bApU)W3O4Tic#pTg$K<;kJMsw zHhLG{Tg6cS012$x{+Ehw{{TJbqVLHS!~X#79|bBP$^QUe{`ZW{{{YYJ(f*rj@vn~m z01toG8iwO@&etgWmg_X!${K7#f`D$XtD%+r&#Nkx*Iv8Dt+N z_mS__duiMJ3!DUP;d|&fGxlTao04ddCLlgjQ)s2M4okE!Byl(;*eB-HjeJInNZ0^h zr6j;g6h~yzXi$k~EWggQ?TC{QcWt)X2K9*@GN8X4DO8bX0O0E&?9m1@`oz8tJ(?67%H91QLpMsNSriDqiOsULu+eST&8PmJuWEbSEnUl^ZbMDx zLXSK+%G$Ai*WI@$yA3auxcn$l9+fE>2Wo!U6r6(`^wM}MuR|K^!C-&4;YsBbRX=l` zcqUA*XQ$19o5?(HR?qJZ|8js z2gq|a(m3svJ0+%KECrJ8e15ANBjPukWdof6spj^JY!UaFbnw-ep*6+GlKyO#NW3$r z;$S;w1j=ghPYc@ie1YDX@#^+9KkFC9VsQ%6zTSVAt$=6A;$@HorT>g;Pbv;+Kmg=J zl!BDRHuKk!Z%=oGcQ;JHtSWdjt(bNK#i}arnM&@@Hr-R@clTF={v3CE4*cUG!_}se z&GDC~Gv#%waxGWJHD3`42v!e}d8x@Qg{K%t=|FaH4$cR37Hz`5z~G|KGz)!*#e@Bb zXPRD-LxdIBCQaBag6fzRv-EmvM#^Wrgo+!_!kvTpX)^j&5A*46`kt|vClHZ*dxA9B zEdN9^+v`V<7~6GgEmHqnJ9QTLnO~#`{^6$4~3oS;qgXU)9uDx@f39U!X8J# z!sCL}@!z`StvY59R;B2PdNb%MT$4{6#qp_LbOYCF)rLNv01PXIt3R+Phuw(~P2w7L zmWMV~Z0_+P5Q^xiQ1B-8KE2m#bWIiSE+3MM`xtck({~Gu>A-NkPQ=0Gql?9e5R_xD zIjqFWF?!lB)N86@z2<0FSA;Php9Ogl?u@{xb|;(Nb2*7$N674B+K4zz>D#7ObPA#Gay z9=g%j3H)1$cl3*Am|v^S@!&MDa)x=1h_N%deqS5TTaH(KC>^!!f0iv^VbAt#wA};r z%K<>`p8eqs@43v(X2#rRnh}O#UEdP2SzMTWb)>Z(op^Ml=IXN^gM!qB27~X9vRbju zDO>^?7_;|B4jU4wVA0wctp}`_iy29sajrn7pr}bjhVuLruPD_8>cRFhQNmRxo{&|u zR7y+A=mh05%j;P&aFyq?5tum5Jsotg9*m!KcyutFi#1fBR)o1q%iMxW%&V?+-d`5l zVUyYQu>#|qxYnFwlZ|9N&Narq#zK;lRugORu>LeDQFR)Isc~H=ZSP7W;`C9)Sm}-@ zn4~v33J~=h;JUhSGc6$&6P8W|kvISuT4>U{wZ--!&Mmsx?DE5!3q{FGxG?CTFSyFU z;eEzNe|o5t91gM|I$Zg+9t>O)Nd*EI9dFvrxRlH{SgT5=lFe$5FJ`Wog<&}=2}%G^ z?BVmKLgAivukMo@MijAJp}&G1*$(^#vTWN8^m$f7!CwywgFcHX)qbT{RSLkbKQn=Q z3zdkI^Sm9?uFn3RS8ecZeUVic&@w8`fvatqZSSI&wW=8-?L;iEgd@eB6%0xdgyOK1 zSHI6tnCIN+Zqwy6uyvaGHDpE*5AX#M3pAe2*%&W)8xQ3Zr(5$F4rl%Y{G^#4|7&$g z{e6MF={VL5zy>xNV41GF!IBD>e`!S?^kFwB-@{Au=~n9FPx*a2$;g5IfPi3XxLb%H zPB=pMdv0o_rFn2jc8XI|J~7#6;4(y?HGtn~W9Yh8Va#351EnV2KAFv~?e(N!0|#7# zBJUO(p#{}Jv}m#_)#NiC<`icf7~Sk}3Y(vd9EQl4jcT;Q+d0_GfKpaKwT%gXYmCd9 z5>=hLMR};`4F}}1isSf|A-P?{bFV3ew%Bcy;&0Q`?RV-^n59HKn8^P*jl*QYnf^1W zj@qNP-_~cPvTu8APEqJ2fc03Tspf@O$T9l=)MkZdAU zJzWrcD>}8T8&)m4HifQ?f&sBx*>krgkCA12*E{P`dVFgNu)~~7S1P=?z~;@i@7?eC zfP61FG3n?ln(2{2oi^}G>Gi!=Rpt3Im*~S}ru@iCwX8H|55cyZK3Hi*AYgl#%n7uh7ke(DEIx;V?C?0!+buC3gpR z05|VSl^iJoRduHbirE3=+<@Rzm}7`)h${xiqVRluP&iDjJwq3vtY)4XjJ`|OBxi9} z>Rg^xk4Jz^piK||E(%u|ih2{tTa!lhZ; zkC&i?kyB@}@nL!CsBB{K;y`ZG(#4xGgLdloy&Bt+W7AlzT3rsavC;tqO= za%qmUkVugyg{qIN6;ghL1WWsqX{QAGViU}-y|Iv#9WBJFCHsnA@I5CTe1tY3CZ9w@ z$sS0(KHYbAFItEQd(DS`ut1ngQ#$q2C6@M zMU}ROr+Kng>cYiH`a*hwzv?b^onz{BRxpKyy!k9<&;<6|ImZ2;&220dHEqmrYt|D@ zdV#YY7(UZc8eEJgH(ZVs_j^*{jLPz|>sBmNF>X~G`cn8RI8L~YRJcOuq@NTBjh z5RY@$rCspA_Lib>OoBD$1JdrKaiC?ooJ+ZRFDO|oANIoMK@{bZ#~7<8&yIjegmVmp zZ(1U!S`9DZ=vr~x&^=UT~UpMr;Vz0<0s=&Wg+p{YfpYNu}v2TF_i_8NJraA%n zNpjaP+W>&J_96VI#!~gs#n%n!57(8N1B9Vlb{8Q0Z7p>)xn67y0!NaiLpbHE8vW&s zy!$@@Rb}3Mk3jMb>ygSJIKw?NTGo=%a_ql1=y>Rd^J8rte~*c5%qn)jt)Zm{U3rV$sErMzTGP_HFS zsI!nRz9ueEgAc@AgGlxBDlMqtBUDCCNl3caYPZ>X&u1?#?^rmmrbHK25vMrKo+@=9 zn24EEe(ctbr^|)z^E+GbA^Pl3QVsA0u$~-=3p!-^K?vNi%tm~zWZGfY`mCJw&DI5D zqx+>iscJp>-zW&iQd(g#9+48i;G!gAQDlGns0xd(wJ&@N&7?4_(s^SL&Gt%*$MfL} z`+6Fcd@^hiPq_u3WGNM+vU87j_r6`Vuf^5;-T=Fz3otu&lVRibGGpIQb8det7wo{5BdV%9d8jk)?F+ zZJqB%T{F@OX`qSLFEPyVj^1|qD;ztt*RhN_r16xc)7J30IiNtfM*438>Kh}Yk&n5> z(3MtrX!E>%sw5e5Mj=R^_fRgagdvV4$w*pc(9raLB8oyYU69R{hV`_vG06PW=-TT> zG6^!-QA6>ZRm1lK_D|2L>>~otf#%%-FeRER?*Yro-bXj@XT0|AymQ1GT7Tue_{gdD z(J7d^Zl;GtluP&9Cc75s3gFai+F%5Td3A1B4L(5Hgv*5+Szcj2s0|-xs?_UO|^H zzqB)h>9x&G#TrZo%JCPaK3)V~r_b3#M#`yOD~C*MHw$5(+~;hXx#X|nQX3|u`5?>1 z7aS8BY07IvK{d!M%yl5BN((9q^&Djr>^N2UF!6mh7lq`F< zA%$_B#&xym=kr>$$BxSnFCpsb{*m!ygQ%FU&8m+g%M52Wf6V6dSX0M#r-@s2H+EZ1 z#@s#25*I9wNBY0^h*!WMt=uXte#cS(yRq<7Jc#pra6?#Ij25Wqp*00d;M_jEHRq@H zbvQ0EAPTXebbCb6?Erh6<`gT)r(SUyH=Yw+R`gZU;81h$9?I;#y}9fo4b?U|MrA%+ zXXt3VXRH@j9w+L>3HBy?vneZq==L&(FN;N zZqQ3N`5}_)BbJ;h$SegW8Mgm}yH>kA`};etDFV)sq#~?f*lx^Vo94L$*gy+ zT5H59>Qr^&YA8Q7A`dZzJnENP(tJ-EP*M{cFHRbWb+$h@cObyNc;d5(kEd@U)myK7 zbkh}spBh8F?n)9*b*!DV%~9a?z_p^A1_aztI?d7=eUeALmmK(()2KG!QrJzkA8mS>f>P^95 z*46Q3hcH^_{oX;RF4`iJs^P@v&7e%d8v8ZGMl6V(?feMU=i%>4oNo6I5D9swtP1ex z$H~`TE~fhjC_j1WOxFCUFsjlA{NkV0w1)l~(;M2YN`5(Cx~C209Q_uJ>Nh^E;aZFo z#-$HSJ&uovg_P5EA`9u~OK?ReE6zlyyv%LaEQZ0Prpb!J_;bW@DdIsF=x7!q-V)Xo zN|PocwY>UpW&$10f!I*R7UVt*+JV+}RLf)OL8VTZ61#;!0UZ{{3g5X60&VVMOj2Av zRVUFy+a)Sd0RUc5NO0&)z*yadM_Y0+U-1$q!vGPe4@nIVdcH^v1F&izJEnzsdo|s@ zV3cBUS|ScC(G-^)#XJvN44ky?yFDHmrn#jRo5I#B{XIg8ACXe94u_CW0BGt$pS zUD@0uQi@M3(xIvNBCop@ zFf}6IbCH>Tlrh>Ldrkv;A!`FZ0QyDKu+G-eZ}a?(nn>1tdHUlr;VzInay{PzHGA0m zwY-(WAj#odC7kUB4)UYAVlnzW8~}h`&TY65YAoF&im@fH^*TREGZr z7FuoU*?>0*Uj{u}sB6G%$};>e)WVK6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8Le00930EC2ui08|1X0RRa80RIUbNU)&6g9sBUT*$DY!-o(fN_@DX zqQ#3CGiuz(v7^V2AVZ4mII*P3lPFWFT*n_c!x36D`eE*{L8d&gL!-x|jEKHQKLdS!-LRKtuGUdx+Egzn!*=lE_ zpE0WpExI&S(hYqoy@}K5Kh`!~-(*c2V{4_aSI@?+6E#cAzD)xbPCWBW)wp%Hj$KfB z?&Zn1)?WTRch2k5e+EwpJK^@?slon>mwfze^y<8MQ#Xj5`gHWt=_cRYxO;Pl8W(p~ z&oKXO+x}S>pM0uOG~R(#efOAo@xjL&LHs@E+(zy-SY2!iMwFpR0YXR-gJ$h#UTPq& z_u6{t$p>MH;UVZER2zo);Djui=-_!PrdVNf5!MtVXB2vfUyUnGrXG$wK6v4YHfr|c zi%^#IWRg1~x!R0XVn^hTOWN2QXdaC<1sif`YH8hyY@*lZkt%v=V3c&yQ%==ki-rm% z(ueOsXW^2Nig_uH1e$26od5V~D(g$O6-pVOV|KbwjG=|8YJYjb>7c8pu1O`A$LfeD ziiCPM>$9T;iCL{A>bh%7y-NG*uEDmN>Wl<-`zBw?qPnV+(59OdN9qQ}D`0=Jr|7W~ zo+_+_;4-_azOG8z<6`Xw+!LY%7i{ps2$S@ihW6c8ZMXw!$zXIy78JaeBQB^TRg(Oe?mVO4Tf3 z9t#a-yh__iG)z7d7j;uj*Ed_$PNzIH*7Eku^;~CuU9{FNO>LUlK8np#glG%=F4Q&0 zEqBstr)^fEU%V&bQu**Xg*}lh2xX@dqdB<{!6ZhOqXkKLcS zl&U!BfX4nO+~vXF-u%|wM%tdL$fqZytxQkr`}3ml9x!mrS{(j})L##=+~|M&H}}i4 zFSxVi$1lG8WAVB1W!}3Vnf_YkJpcdX`(ORob2P=|kAHYUVE;%YzW_QAPpx{<0Tp-} z3UVk`dP*L~jMb+oP0)fm10iSpmo*8B&}}Ew5D6=jxfHhRgU>S3zlt(A^^Q`*@Xd){ zp3)-d#OOsXg6fN8@{DBC$Hq2lYl>vtmUpa2$8bT=TaJ3vb((ma0U z_LNngZg-J#q$rOV%UJ#@FcDl|!)Uj?1?o?eaWv8_#S}_Y)^b~M8m5rQCCI!9&waoo zqcDjny-5;tm<1Z37au4~Af}RqqyiA~uH_>@Mo&MO45Tz+xyL%@sE>oPSegEFygtGz zfxQg>+`JNbDH-+VJO46g8BGbtU`pwTlyfH37{;x0mh(_W>SQZ7$w_jOa&roW-k2Pz zEKUI`O?^U>B+rzwZe8r10!rg9BdN}HGR%%@`{px&rldykGfVuMr%frgGjLU`Q8wjc zK@Ez;j2abK)B}-~xD?d$IMqTtMQ2J;g&k9Yk)V5_s4EGn(W5prSrX$ZtExKE-B|Ub zD~&2u|47z;VihS{eWeATq)LW@wM+8E=}4)x(_Hd3o{O^IRWE8rt6oOa z@=K3rg%mC$Ml4CX313p2C`BvUyeWNVrG%X$oC1~7+W6;wyU{5qgH~EUel(BwjHY4! z`PZpz6_BN18?4SYB->32RB?5EX6utyI)-t++EjQ7{ij&@Pu~= zIBf{y|Iiv_{P#O#yO^%SYszvJV0`)t)eAV zTRA+!81Fd6G&bN@{d&trkY(#IaQlb>B@X7AS6lBRaGdF^a>Eiv2L z4tBJsU1M^GyWG~sHN*l-$vtH@jX)xnl6Ay3AfwT`=Uz6qGh6AT($AK7-XdzyeC0Qp z&$->sH&@5a>RTpys@TJ^iodw-cQ@M1B#yJfZzb$^3;f~Bta6*bjQ>lEuldjt4fMtn zqiPkt_~MC<6UHCyPek^+;1AzYbzQu2GN)TVAg6(cS?9>eqrW*} znO5=!{+{N0ti3YxuJPUXJ@Y58yu)EH`QigG`VgFco;&7r=l<_+-?WVU!E+9BHlx{r zcm}w`W=}xq>fZY<^ZR;h*s$rj*0rlG9$Sx$;di z1Y=gGfD6caDTaWS2Z7|lfWK3B7MOtICT$P6ffa;-2G)Hb2zXM4Y$RBMALwKK)q?7i zf+|>nF<5{zXf!qWd^Z?IIfyhnXoEd?fj_u{LCAqa=xs%4Tt~=wNoayg2u@81gHPy$ zQ7D5`=zvvNSXZbWS*V0tm}6ZiDql!}VW@>;SVCn;hG&>qX=sLPm``n}cyEYYama>q z=u35|hIfc+dB|dW_+@?QhJW~CfjAn2cu<8nd50)<|A}aai%58lXo!#Kh>_@WlPG)n zSfq{Hs9&9BimGFbYh-}n_;%O^XhgMbNC-`!2vF+fjq!(122^iQ_>F!DUhL?DRwyds zqKHz+adJ3;?Z<=A7J_1!TP@>-EH{u$NGkydknd-W{HPT}2T7)Nk?kQ;@b*WcMpC3j zhlt@Ds8nhSQaPSjlF?ExOhsA4qEqfME-i^u{}t0a6d87FlO`%Pbndp1poftl2}z|@ zjSM-G?P!r90#zHVVtPB{l#aDmj#ZNrd4d&*lx#9q z@xqk#R$NSpR{bZB5^0or7+vUUaVsD|QSM(-My49BgIhN~kQ%|LHgxODPxt5T{QGd3OV)>Ri8JH~j zdor1peSsABiiTf0tcNdpn6ET%}G3!=;|4Er0lp>VjX*#&WIW*T$19x2H$$}#0dmD9~ zH#uWOd4HsGlyEtm2C0eAaZqj>Ep%AnNAq*TnKx?`-Tq=lm ziiX%SjrTF9c?zaTGfwJRm@34k|AFdp2Eu8hIa-Ixr+R~MfNG^Yia|nlN6a#(ECPHt zgQ%3+r3(U{cLY`Rvww@$QzRuzp($iP=%5UmtRpJ+M+LvV5*Pr@{c|t0zd?r5axu}m4bGYhn&Z(Ga8mz90k=vJK z3PyYJV@qV0OaeHq8^c?4`a_WDlGj%lA38v0%1y{uet7z+dg?#*YJA%&Yv_7SeHO4N zSFWwcjr#hlirBBl$F8ahX_bPl?wYWQ%CDXjuFtw>%BrfKNl>rnCAjx02&<&C%0~=jBNZPbTdbMC{gg4r? z?)S758?{L)wN|T-Y)g4ORJR$sjzJ5f&Gxol>$ZDKwOi`9ZHu;eo3Cq2xG77wiVLYd zdbpuOjzBB7C5yPs*tq}toH3QQb_=%+NV!oeuVv*SptoesYB`+ixG43fm)fX`)ViN* zw#=tti}Xpe*GQS0JE?2AO1ECunn>u!ex!rBll6bfmsHs#Kz@U@R5)>s_OKpFaIt%K z%jjni_q@_;IMXtr|Fi_I$E&<1M7-ZwMcL=CEjw%IIKBb*yU=^Dd3%sqlx7jhzUPOs z==*m-H@^%Uun(k*!1!a%Vssj$TE(Kh_&Xd%r++ldi~n1dMkKj5>8*Ivz%!~t5FC(m z`!y8&QcrZjQyHqc21PsO!I2iXmn&l=%&mPpyeOQ$iOa$$mcpdA!too!E^NZntD^^u z!{OV)J6u%#7=boSt0hE=GTga+db)<@kcb$i6D+Q^RlvLJ#DyD;G*q)VQ>bUFx{b4{ zSS+pjR<=D{PSvVUv0Ay4nP6U=c%~bZ@5_6YTdZ13#?vV;_kya7xTwszvzWSRyxOxb zw8nMJK^U96|Im7<#^b2`3?!UPe%G7F8+A;DOs#yGI)YrEzDasYOoQ>f%f_5nR(!?NXta;{#}zz06w}BF z%|YpE&*Hkg{3&D`#L&eei&2Bhg6p1un9TXxY7YFt9cU-}9Gq9G!VX=rPkhjD7{-tc zpB!Ax{{~#8FAX=exWPj#(>yF!K8({q48tgT!#&-}So*_{E5bY7StS}oN3C{AZPYi7 z)M3iI^!U_sdA~0#(jy(g(Ym_AT+X*CJff(QAdGr0O~=jE)npAORGij<>v?n~#hBX^ z)1=K#DvffiSn?>=m8_^=T-Nz}*Gmk)dpD`m%(oEP&XgD&1LsaRWlwi0PvB{$0=Llg zl(4>XMWKn-aLmq_+SwYkR;_E$lWou#jl_pNucRB9C#%x8T)U$TZ?=oPu3Tx@TgICm z&Y%3+0&B=^M{%F4U5*BvrTY@D8Z?0WmXzVfW$!`k7j ziQE@j+TM-exf|Q0`LHKjJ?X5h&@GP2OkKs4ykU)Mq#Bb7uHyZzuGjQICRW<+EgR|> zPVK~;KKsY0TDnU&nF0=ke=Us+eaZBB;SD;Pja^Uil(gJwt2&pa1a4acJd`Ba#Q5#e zV;$4*e8hj7#1o`CY|YeMM&<*~+b1m2e$Cm23e;|Hk$fyVvV!Jyo`Fs6)H;mkQG?s( zKkb1|-uX#N|V# f4$rw0>WvfO;h5^S8B^u$%hELK=B34$5fA`7p=5$M literal 0 HcmV?d00001 diff --git a/src/site/site.xml b/src/site/site.xml new file mode 100644 index 0000000000..d364441f2b --- /dev/null +++ b/src/site/site.xml @@ -0,0 +1,71 @@ + + + + Apache log4j 1.2 + images/ls-logo.jpg + http://logging.apache.org/log4j/1.2 + + + images/logo.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/site/xdoc/manual.xml b/src/site/xdoc/manual.xml new file mode 100644 index 0000000000..0806f758bd --- /dev/null +++ b/src/site/xdoc/manual.xml @@ -0,0 +1,1239 @@ + + + + + Ceki Gülcü + Short introduction to log4j + + +
    +

    + Copyright © 2000-2002 The Apache Software Foundation. All + rights reserved. This software is published under the terms of + the Apache Software License version 2.0, a copy of which has + been included in the LICENSE file shipped with the log4j + distribution. This document is based on the article "Log4j + delivers control over logging" published in November 2000 + edition of JavaWorld. However, the present article contains more + detailed and up to date information. The present short manual + also borrows some text from "The + complete log4j manual" by the same author (yours + truly).

    + +

    Abstract

    + +

    This document describes the log4j API, its unique features and +design rationale. Log4j is an open source project based on the work of +many authors. It allows the developer to control which log statements +are output with arbitrary granularity. It is fully configurable at +runtime using external configuration files. Best of all, log4j has a +gentle learning curve. Beware: judging from user feedback, it is also +quite addictive.

    + +

    Introduction

    + +

    Almost every large application includes its own logging or tracing +API. In conformance with this rule, the E.U. SEMPER project decided to write its +own tracing API. This was in early 1996. After countless enhancements, +several incarnations and much work that API has evolved to become +log4j, a popular logging package for Java. The package is distributed +under the Apache Software License, a +fully-fledged open source license certified by the open source initiative. The +latest log4j version, including full-source code, class files and +documentation can be found at http://logging.apache.org/log4j/. +By the way, log4j has been ported to the C, C++, C#, Perl, Python, +Ruby, and Eiffel languages.

    + +

    Inserting log statements into code is a low-tech method for +debugging it. It may also be the only way because debuggers are not +always available or applicable. This is usually the case for +multithreaded applications and distributed applications at large.

    + +

    Experience indicates that logging was an important component of the +development cycle. It offeres several advantages. It provides precise +context about a run of the application. Once inserted into +the code, the generation of logging output requires no human +intervention. Moreover, log output can be saved in persistent medium +to be studied at a later time. In addition to its use in the +development cycle, a sufficiently rich logging package can also be +viewed as an auditing tool.

    + +

    As Brian W. Kernighan and Rob Pike put it in their truly excellent +book "The Practice of Programming" +

    +  As personal choice, we tend not to use debuggers beyond getting a
    +  stack trace or the value of a variable or two. One reason is that it
    +  is easy to get lost in details of complicated data structures and
    +  control flow; we find stepping through a program less productive
    +  than thinking harder and adding output statements and self-checking
    +  code at critical places. Clicking over statements takes longer than
    +  scanning the output of judiciously-placed displays. It takes less
    +  time to decide where to put print statements than to single-step to
    +  the critical section of code, even assuming we know where that
    +  is. More important, debugging statements stay with the program;
    +  debugging sessions are transient.
    +

    + +

    Logging does have its drawbacks. It can slow down an +application. If too verbose, it can cause scrolling blindness. To +alleviate these concerns, log4j is designed to be reliable, fast and +extensible. Since logging is rarely the main focus of an application, +the log4j API strives to be simple to understand and to use.

    + +

    Loggers, Appenders and Layouts

    + +

    Log4j has three main components: loggers, +appenders and layouts. These three types of +components work together to enable developers to log messages according +to message type and level, and to control at runtime how these +messages are formatted and where they are reported.

    + +

    Logger hierarchy

    + +

    The first and foremost advantage of any logging API over plain +System.out.println resides in its ability to disable +certain log statements while allowing others to print unhindered. This +capability assumes that the logging space, that is, the space of all +possible logging statements, is categorized according to some +developer-chosen criteria. This observation had previously led us to +choose category as the central concept of the +package. However, since log4j version 1.2, Logger class +has replaced the Category class. For those familiar with +earlier versions of log4j, the Logger class can be +considered as a mere alias to the Category class.

    + +

    Loggers are named entities. Logger names are case-sensitive and +they follow the hierarchical naming rule:

    + +

    + + +
    +
    +
    Named Hierarchy
    + +
    A logger is said to be an ancestor of another + logger if its name followed by a dot is a prefix of the + descendant logger name. A logger is said to be a + parent of a child logger if there are no + ancestors between itself and the descendant logger.
    + + +
    +

    + + +

    For example, the logger named "com.foo" is a parent +of the logger named "com.foo.Bar". Similarly, +"java" is a parent of "java.util" and an +ancestor of "java.util.Vector". This naming scheme +should be familiar to most developers.

    + +

    The root logger resides at the top of the logger hierarchy. It +is exceptional in two ways: + +

      +
    1. it always exists,
    2. +
    3. it cannot be retrieved by name.
    4. +

    +

    Invoking the class static Logger.getRootLogger +method retrieves it. All other loggers are instantiated and +retrieved with the class static Logger.getLogger +method. This method takes the name of the desired logger as a +parameter. Some of the basic methods in the Logger class are listed +below.

    + +

    + + + +
    +
    +  package org.apache.log4j;
    +
    +  public class Logger {
    +
    +    // Creation & retrieval methods:
    +    public static Logger getRootLogger();
    +    public static Logger getLogger(String name);
    +
    +    // printing methods:
    +    public void trace(Object message);
    +    public void debug(Object message);
    +    public void info(Object message);
    +    public void warn(Object message);
    +    public void error(Object message);
    +    public void fatal(Object message);
    +
    +    // generic printing method:
    +    public void log(Level l, Object message);
    +}
    +
    +

    + +

    Loggers may be assigned levels. The set of possible +levels, that is:

    + +TRACE,
    +DEBUG,
    +INFO,
    +WARN,
    +ERROR and
    +FATAL
    +
    + +are defined in the org.apache.log4j.Level +class. Although we do not encourage you to do so, you may define +your own levels by sub-classing the Level class. A +perhaps better approach will be explained later on.

    + +

    If a given logger is not assigned a level, then it inherits +one from its closest ancestor with an assigned level. More +formally:

    + + +

    + + + + +
    +
    +
    Level Inheritance
    + +

    The inherited level for a given logger +C, is equal to the first non-null level in the logger +hierarchy, starting at C and proceeding upwards in the +hierarchy towards the root logger.

    + +
    +

    + +

    To ensure that all loggers can eventually inherit a level, +the root logger always has an assigned level.

    + +

    Below are four tables with various assigned level values and the +resulting inherited levels according to the above rule.

    + +

    + + + + + + + + +
    Logger
    name
    Assigned
    level
    Inherited
    level
    root Proot Proot
    X none Proot
    X.Y none Proot
    X.Y.Z none Proot
    Example 1

    + +

    In example 1 above, only the root logger is assigned a +level. This level value, Proot, is inherited by the +other loggers X, X.Y and +X.Y.Z.

    + + +

    + + + + + + + + +
    Logger
    name
    Assigned
    level
    Inherited
    level
    root Proot Proot
    X Px Px
    X.Y Pxy Pxy
    X.Y.Z Pxyz Pxyz
    Example 2

    + +

    In example 2, all loggers have an assigned level value. There +is no need for level inheritence.

    + +

    + + + + + + + +
    Logger
    name
    Assigned
    level
    Inherited
    level
    root Proot Proot
    X Px Px
    X.Y none Px
    X.Y.Z Pxyz Pxyz
    Example 3

    + +

    In example 3, the loggers root, X and +X.Y.Z are assigned the levels Proot, +Px and Pxyz respectively. The logger +X.Y inherits its level value from its parent +X.

    + + + + + + + + + +
    Logger
    name
    Assigned
    level
    Inherited
    level
    root Proot Proot
    X Px Px
    X.Y none Px
    X.Y.Z none Px
    Example 4
    + +

    In example 4, the loggers root and X +and are assigned the levels Proot and Px +respectively. The loggers X.Y and X.Y.Z +inherits their level value from their nearest parent X +having an assigned level..

    + + +

    Logging requests are made by invoking one of the printing methods +of a logger instance. These printing methods are + + +debug, + +info, + +warn, +error, +fatal + and log.

    + + +

    By definition, the printing method determines the level of a +logging request. For example, if c is a logger +instance, then the statement c.info("..") is a logging +request of level INFO.

    + +

    A logging request is said to be enabled if its level is +higher than or equal to the level of its logger. Otherwise, the +request is said to be disabled. A logger without an +assigned level will inherit one from the hierarchy. This rule is +summarized below.

    + + +

    + + +
    +
    +
    Basic Selection Rule
    + +

    A log request of level p in a logger with + (either assigned or inherited, whichever is appropriate) level q, is enabled if p >= + q.

    +
    +

    + +

    This rule is at the heart of log4j. It assumes that levels are +ordered. For the standard levels, we have DEBUG < INFO +< WARN < ERROR < FATAL.

    + +

    Here is an example of this rule.

    + +

    + +
    +
    +
    +   // get a logger instance named "com.foo"
    +   Logger  logger = Logger.getLogger("com.foo");
    +
    +   // Now set its level. Normally you do not need to set the
    +   // level of a logger programmatically. This is usually done
    +   // in configuration files.
    +   logger.setLevel(Level.INFO);
    +
    +   Logger barlogger = Logger.getLogger("com.foo.Bar");
    +
    +   // This request is enabled, because WARN >= INFO.
    +   logger.warn("Low fuel level.");
    +
    +   // This request is disabled, because DEBUG < INFO.
    +   logger.debug("Starting search for nearest gas station.");
    +
    +   // The logger instance barlogger, named "com.foo.Bar",
    +   // will inherit its level from the logger named
    +   // "com.foo" Thus, the following request is enabled
    +   // because INFO >= INFO.
    +   barlogger.info("Located nearest gas station.");
    +
    +   // This request is disabled, because DEBUG < INFO.
    +   barlogger.debug("Exiting gas station search");
    +
    +

    + +

    Calling the getLogger method with the same name will +always return a reference to the exact same logger object.

    + +

    For example, in + + + +
    +
    +   Logger x = Logger.getLogger("wombat");
    +   Logger y = Logger.getLogger("wombat");
    +
    +x and y refer to exactly the same +logger object.

    + +

    Thus, it is possible to configure a logger and then to retrieve +the same instance somewhere else in the code without passing around +references. In fundamental contradiction to biological parenthood, +where parents always preceed their children, log4j loggers can be +created and configured in any order. In particular, a "parent" +logger will find and link to its descendants even if it is +instantiated after them.

    + +

    Configuration of the log4j environment is typically done at +application initialization. The preferred way is by reading a +configuration file. This approach will be discussed shortly.

    + +

    Log4j makes it easy to name loggers by software +component. This can be accomplished by statically instantiating +a logger in each class, with the logger name equal to the fully +qualified name of the class. This is a useful and straightforward +method of defining loggers. As the log output bears the name of the +generating logger, this naming strategy makes it easy to identify +the origin of a log message. However, this is only one possible, +albeit common, strategy for naming loggers. Log4j does not restrict +the possible set of loggers. The developer is free to name the +loggers as desired.

    + +

    Nevertheless, naming loggers after the class where they are +located seems to be the best strategy known so far.

    + +

    Appenders and Layouts

    + +

    The ability to selectively enable or disable logging requests based +on their logger is only part of the picture. Log4j allows logging +requests to print to multiple destinations. In log4j speak, an output +destination is called an appender. Currently, appenders exist +for the console, files, GUI +components, remote socket +servers, JMS, + + NT +Event Loggers, and remote UNIX Syslog +daemons. It is also possible to log asynchronously.

    + +

    More than one appender can be attached to a logger.

    + +

    The addAppender +method adds an appender to a given logger. + +Each enabled logging +request for a given logger will be forwarded to all the appenders in +that logger as well as the appenders higher in the hierarchy. In +other words, appenders are inherited additively from the logger +hierarchy. For example, if a console appender is added to the root +logger, then all enabled logging requests will at least print on the +console. If in addition a file appender is added to a logger, say +C, then enabled logging requests for C and +C's children will print on a file and on the +console. It is possible to override this default behavior so that +appender accumulation is no longer additive by setting +the additivity flag to false.

    + +

    The rules governing appender additivity are summarized below.

    + +

    + + + +
    +
    +
    Appender Additivity
    + +

    The output of a log statement of logger C will + go to all the appenders in C and its ancestors. This is + the meaning of the term "appender additivity".

    + +

    However, if an ancestor of logger C, say P, + has the additivity flag set to false, then + C's output will be directed to all the appenders in + C and it's ancestors upto and including P but + not the appenders in any of the ancestors of P.

    + +

    Loggers have their additivity flag set to + true by default.

    +

    + + +

    The table below shows an example:

    + +

    + + + + + + + + + + + + + + + + + + + + + + + +
    Logger
    Name
    Added
    Appenders
    Additivity
    Flag
    Output Targets Comment
    root A1 not applicable A1The root logger is anonymous but can be accessed with the + Logger.getRootLogger() method. There is no default appender + attached to root.
    x A-x1, A-x2 true A1, A-x1, A-x2Appenders of "x" and root.
    x.y none true A1, A-x1, A-x2Appenders of "x" and root.
    x.y.z A-xyz1 true A1, A-x1, A-x2, A-xyz1Appenders in "x.y.z", "x" and root.
    security A-sec falseA-secNo appender accumulation since the additivity flag is set to + false.
    security.access none true A-sec Only + appenders of "security" because the additivity flag in "security" is + set to false.
    + + +

    More often than not, users wish to customize not only the output +destination but also the output format. This is accomplished by +associating a layout with an appender. The layout is +responsible for formatting the logging request according to the user's +wishes, whereas an appender takes care of sending the formatted output +to its destination.

    + +The
    PatternLayout, part +of the standard log4j distribution, lets the user specify the output +format according to conversion patterns similar to the C language +printf function.

    + +

    For example, the PatternLayout with the conversion pattern "%r [%t] +%-5p %c - %m%n" will output something akin to:
    + +

    +176 [main] INFO  org.foo.Bar - Located nearest gas station.
    +

    + +

    The first field is the number of milliseconds elapsed since the +start of the program. The second field is the thread making the log +request. The third field is the level of the log statement. The +fourth field is the name of the logger associated with the log +request. The text after the '-' is the message of the statement.

    + +

    Just as importantly, log4j will render the content of the log +message according to user specified criteria. For example, if you +frequently need to log Oranges, an object type used in +your current project, then you can register an +OrangeRenderer that will be invoked whenever an orange +needs to be logged.

    + +

    Object rendering follows the class hierarchy. For example, assuming +oranges are fruits, if you register an FruitRenderer, all +fruits including oranges will be rendered by the +FruitRenderer, unless of course you registered an orange +specific OrangeRenderer.

    + +

    Object renderers have to implement the +ObjectRenderer +interface.

    + + +

    Configuration

    + +

    Inserting log requests into the application code requires a fair +amount of planning and effort. Observation shows that approximately 4 +percent of code is dedicated to logging. Consequently, even moderately +sized applications will have thousands of logging statements embedded +within their code. Given their number, it becomes imperative to +manage these log statements without the need to modify them manually.

    + +

    The log4j environment is fully configurable programmatically. +However, it is far more flexible to configure log4j using +configuration files. Currently, configuration files can be written in +XML or in Java properties (key=value) format.

    + +

    Let us give a taste of how this is done with the help of an +imaginary application MyApp that uses log4j.

    + +

    +
    +
    + import com.foo.Bar;
    +
    + // Import log4j classes.
    + import org.apache.log4j.Logger;
    + import org.apache.log4j.BasicConfigurator;
    +
    + public class MyApp {
    +
    +   // Define a static logger variable so that it references the
    +   // Logger instance named "MyApp".
    +   static Logger logger = Logger.getLogger(MyApp.class);
    +
    +   public static void main(String[] args) {
    +
    +     // Set up a simple configuration that logs on the console.
    +     BasicConfigurator.configure();
    +
    +     logger.info("Entering application.");
    +     Bar bar = new Bar();
    +     bar.doIt();
    +     logger.info("Exiting application.");
    +   }
    + }
    +
    +

    + +

    MyApp begins by importing log4j related classes. It +then defines a static logger variable with the name +MyApp which happens to be the fully qualified name of the +class.

    + +

    MyApp uses the Bar class defined in the +package com.foo.

    + +

    +
    +
    + package com.foo;
    + import org.apache.log4j.Logger;
    +
    + public class Bar {
    +   static Logger logger = Logger.getLogger(Bar.class);
    +
    +   public void doIt() {
    +     logger.debug("Did it again!");
    +   }
    + }
    +
    +

    + +

    The invocation of the BasicConfigurator.configure +method creates a rather simple log4j setup. This method is hardwired +to add to the root logger a +ConsoleAppender. The output will be formatted using a PatternLayout set +to the pattern "%-4r [%t] %-5p %c %x - %m%n".

    + +

    Note that by default, the root logger is assigned to +Level.DEBUG.

    + +

    The output of MyApp is: +

    +0    [main] INFO  MyApp  - Entering application.
    +36   [main] DEBUG com.foo.Bar  - Did it again!
    +51   [main] INFO  MyApp  - Exiting application.
    +

    + +

    The figure below depicts the object diagram of MyApp +after just having called the BasicConfigurator.configure +method.

    + +

    +

    + +

    + +

    As a side note, let me mention that in log4j child loggers link +only to their existing ancestors. In particular, the logger named +com.foo.Bar is linked directly to the root +logger, thereby circumventing the unused com or +com.foo loggers. This significantly increases +performance and reduces log4j's memory footprint.

    + + +

    The MyApp class configures log4j by invoking +BasicConfigurator.configure method. Other classes only +need to import the org.apache.log4j.Logger class, +retrieve the loggers they wish to use, and log away.

    + +

    The previous example always outputs the same log information. +Fortunately, it is easy to modify MyApp so that the log +output can be controlled at run-time. Here is a slightly modified +version.

    + +

    +
    +
    + import com.foo.Bar;
    +
    + import org.apache.log4j.Logger;
    + import org.apache.log4j.PropertyConfigurator;
    +
    + public class MyApp {
    +
    +   static Logger logger = Logger.getLogger(MyApp.class.getName());
    +
    +   public static void main(String[] args) {
    +
    +
    +     // BasicConfigurator replaced with PropertyConfigurator.
    +     PropertyConfigurator.configure(args[0]);
    +
    +     logger.info("Entering application.");
    +     Bar bar = new Bar();
    +     bar.doIt();
    +     logger.info("Exiting application.");
    +   }
    + }
    +
    +
    + +

    This version of MyApp instructs +PropertyConfigurator to parse a configuration file and +set up logging accordingly.

    + +

    Here is a sample configuration file that results in exactly same +output as the previous BasicConfigurator based example.

    + +

    +
    +# Set root logger level to DEBUG and its only appender to A1.
    +log4j.rootLogger=DEBUG, A1
    +
    +# A1 is set to be a ConsoleAppender.
    +log4j.appender.A1=org.apache.log4j.ConsoleAppender
    +
    +# A1 uses PatternLayout.
    +log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    +log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
    +
    +

    + + +

    Suppose we are no longer interested in seeing the output of any +component belonging to the com.foo package. The following +configuration file shows one possible way of achieving this.

    + +

    +
    +log4j.rootLogger=DEBUG, A1
    +log4j.appender.A1=org.apache.log4j.ConsoleAppender
    +log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    +
    +# Print the date in ISO 8601 format
    +log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
    +
    +# Print only messages of level WARN or above in the package com.foo.
    +log4j.logger.com.foo=WARN
    +
    +

    + +

    The output of MyApp configured with this file is shown below.

    + +
    +2000-09-07 14:07:41,508 [main] INFO  MyApp - Entering application.
    +2000-09-07 14:07:41,529 [main] INFO  MyApp - Exiting application.
    +
    + +

    As the logger com.foo.Bar does not have an assigned +level, it inherits its level from com.foo, which +was set to WARN in the configuration file. The log statement from the +Bar.doIt method has the level DEBUG, lower than the +logger level WARN. Consequently, doIt() method's log +request is suppressed.

    + +

    Here is another configuration file that uses multiple appenders.

    + +

    +
    +log4j.rootLogger=debug, stdout, R
    +
    +log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    +
    +# Pattern to output the caller's file name and line number.
    +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
    +
    +log4j.appender.R=org.apache.log4j.RollingFileAppender
    +log4j.appender.R.File=example.log
    +
    +log4j.appender.R.MaxFileSize=100KB
    +# Keep one backup file
    +log4j.appender.R.MaxBackupIndex=1
    +
    +log4j.appender.R.layout=org.apache.log4j.PatternLayout
    +log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
    +
    +

    + +

    Calling the enhanced MyApp with the this configuration file will +output the following on the console.

    + +
    + INFO [main] (MyApp2.java:12) - Entering application.
    +DEBUG [main] (Bar.java:8) - Doing it again!
    + INFO [main] (MyApp2.java:15) - Exiting application.
    +

    + +

    In addition, as the root logger has been allocated a second +appender, output will also be directed to the example.log +file. This file will be rolled over when it reaches 100KB. When +roll-over occurs, the old version of example.log is +automatically moved to example.log.1.

    + +

    Note that to obtain these different logging behaviors we did not +need to recompile code. We could just as easily have logged to a UNIX +Syslog daemon, redirected all com.foo output to an NT +Event logger, or forwarded logging events to a remote log4j server, +which would log according to local server policy, for example by +forwarding the log event to a second log4j server.

    + +

    Default Initialization Procedure

    + +

    The log4j library does not make any assumptions about its +environment. In particular, there are no default log4j +appenders. Under certain well-defined circumstances however, the +static inializer of the Logger class will attempt to +automatically configure log4j. The Java language guarantees that the +static initializer of a class is called once and only once during the +loading of a class into memory. It is important to remember that +different classloaders may load distinct copies of the same +class. These copies of the same class are considered as totally +unrelated by the JVM.

    + +

    The default initialization is very useful in environments where the +exact entry point to the application depends on the runtime +environment. For example, the same application can be used as a +stand-alone application, as an applet, or as a servlet under the +control of a web-server.

    + +

    The exact default initialization algorithm is defined as follows:

    + +
      + +
    1. Setting the log4j.defaultInitOverride system property to + any other value then "false" will cause log4j to skip the default + initialization procedure (this procedure).
    2. + +
    3. Set the resource string variable to the value of + the log4j.configuration system property. The preferred + way to specify the default initialization file is through the + log4j.configuration system property. In case the system + property log4j.configuration is not defined, then set the + string variable resource to its default value + "log4j.properties".
    4. + +
    5. Attempt to convert the resource variable to a + URL.
    6. + +
    7. If the resource variable cannot be converted to a URL, for + example due to a MalformedURLException, then search for + the resource from the classpath by calling + org.apache.log4j.helpers.Loader.getResource(resource, + Logger.class) which returns a URL. Note that the string + "log4j.properties" constitutes a malformed URL. + +

      See Loader.getResource(java.lang.String) + for the list of searched locations.

    8. + +
    9. If no URL could not be found, abort default + initialization. Otherwise, configure log4j from the URL. + +

      The PropertyConfigurator + will be used to parse the URL to configure log4j unless the URL ends + with the ".xml" extension, in which case the DOMConfigurator + will be used. You can optionaly specify a custom configurator. The + value of the log4j.configuratorClass system property is taken + as the fully qualified class name of your custom configurator. The + custom configurator you specify must implement the Configurator + interface.

    10. + +
    + +

    Example Configurations

    + + + +

    Default Initialization under Tomcat

    + +

    The default log4j initialization is particularly useful in +web-server environments. Under Tomcat 3.x and 4.x, you should place +the log4j.properties under the +WEB-INF/classes directory of your web-applications. Log4j +will find the properties file and initialize itself. This is easy to +do and it works.

    + +

    You can also choose to set the system property +log4j.configuration before starting Tomcat. For Tomcat 3.x The +TOMCAT_OPTS environment variable is used to set command +line options. For Tomcat 4.0, set the CATALINA_OPTS +environment variable instead of TOMCAT_OPTS.

    + +

    Example 1

    + +

    The Unix shell command +

    +   export TOMCAT_OPTS="-Dlog4j.configuration=foobar.txt"
    +
    + +tells log4j to use the file foobar.txt as the default +configuration file. This file should be place under the +WEB-INF/classes directory of your web-application. The +file will be read using the PropertyConfigurator. Each +web-application will use a different default configuration file because +each file is relative to a web-application.

    + + +

    Example 2

    + +

    The Unix shell command +

    +   export TOMCAT_OPTS="-Dlog4j.debug -Dlog4j.configuration=foobar.xml"
    +
    + +tells log4j to output log4j-internal debugging information and to use +the file foobar.xml as the default configuration +file. This file should be place under the WEB-INF/classes +directory of your web-application. Since the file ends with a +.xml extension, it will read using the DOMConfigurator. Each +web-application will use a different default configuration file because +each file is relative to a web-application.

    + +

    Example 3

    + +

    The Windows shell command +

    +   set TOMCAT_OPTS=-Dlog4j.configuration=foobar.lcf -Dlog4j.configuratorClass=com.foo.BarConfigurator
    +
    + +tells log4j to use the file foobar.lcf as the default +configuration file. This file should be place under the +WEB-INF/classes directory of your web-application. Due to +the definition of the log4j.configuratorClass system property, +the file will be read using the com.foo.BarConfigurator +custom configurator. Each web-application will use a different +default configuration file because each file is relative to a +web-application.

    + +

    Example 4

    + +

    The Windows shell command +

    +   set TOMCAT_OPTS=-Dlog4j.configuration=file:/c:/foobar.lcf
    + +tells log4j to use the file c:\foobar.lcf as the default +configuration file. The configuration file is fully specified by the +URL file:/c:/foobar.lcf. Thus, the same configuration +file will be used for all web-applications.

    + + +

    Different web-applications will load the log4j classes through +their respective classloaderss. Thus, each image of the log4j +environment will act independetly and without any mutual +synchronization. For example, FileAppenders defined +exactly the same way in multiple web-application configurations will +all attempt to write the same file. The results are likely to be less +than satisfactory. You must make sure that log4j configurations of +different web-applications do not use the same underlying system +resource.

    + + +

    Initialization servlet

    + +

    It is also possible to use a special servlet for log4j +initialization. Here is an example,

    + +

    +
    +package com.foo;
    +
    +import org.apache.log4j.PropertyConfigurator;
    +import javax.servlet.http.HttpServlet;
    +import javax.servlet.http.HttpServletRequest;
    +import javax.servlet.http.HttpServletResponse;
    +import java.io.PrintWriter;
    +import java.io.IOException;
    +
    +public class Log4jInit extends HttpServlet {
    +
    +  public
    +  void init() {
    +    String prefix =  getServletContext().getRealPath("/");
    +    String file = getInitParameter("log4j-init-file");
    +    // if the log4j-init-file is not set, then no point in trying
    +    if(file != null) {
    +      PropertyConfigurator.configure(prefix+file);
    +    }
    +  }
    +
    +  public
    +  void doGet(HttpServletRequest req, HttpServletResponse res) {
    +  }
    +}
    +
    +

    + +

    Define the following servlet in the web.xml file for your web-application.

    + +

    +
    +  <servlet>
    +    <servlet-name>log4j-init</servlet-name>
    +    <servlet-class>com.foo.Log4jInit</servlet-class>
    +
    +    <init-param>
    +      <param-name>log4j-init-file</param-name>
    +      <param-value>WEB-INF/classes/log4j.lcf</param-value>
    +    </init-param>
    +
    +    <load-on-startup>1</load-on-startup>
    +  </servlet>
    +
    +

    + +

    Writing an initialization servlet is the most flexible way for +initializing log4j. There are no constraints on the code you can place +in the init() method of the servlet.

    + + + +

    Nested Diagnostic Contexts

    + +

    Most real-world systems have to deal with multiple clients +simultaneously. In a typical multithreaded implementation of such a +system, different threads will handle different clients. Logging is +especially well suited to trace and debug complex distributed +applications. A common approach to differentiate the logging output of +one client from another is to instantiate a new separate logger for +each client. This promotes the proliferation of loggers and +increases the management overhead of logging.

    + +

    A lighter technique is to uniquely stamp each log request initiated +from the same client interaction. Neil Harrison described this method +in the book "Patterns for Logging Diagnostic Messages," in Pattern +Languages of Program Design 3, edited by R. Martin, D. Riehle, +and F. Buschmann (Addison-Wesley, 1997).

    + + + +

    To uniquely stamp each request, the +user pushes contextual information into the NDC, the abbreviation of +Nested Diagnostic Context. The NDC class is shown below. + +

    +  public class NDC {
    +    // Used when printing the diagnostic
    +    public static String get();
    +
    +    // Remove the top of the context from the NDC.
    +    public static String pop();
    +
    +    // Add diagnostic context for the current thread.
    +    public static void push(String message);
    +
    +    // Remove the diagnostic context for this thread.
    +    public static void remove();
    +  }
    +

    + +

    The NDC is managed per thread as a stack of contextual +information. Note that all methods of the org.apache.log4j.NDC +class are static. Assuming that NDC printing is turned on, every time +a log request is made, the appropriate log4j component will include +the entire NDC stack for the current thread in the log +output. This is done without the intervention of the user, who is +responsible only for placing the correct information in the NDC by +using the push and pop methods at a few +well-defined points in the code. In contrast, the per-client logger +approach commands extensive changes in the code.

    + +

    To illustrate this point, let us take the example of a servlet +delivering content to numerous clients. The servlet can build the NDC +at the very beginning of the request before executing other code. The +contextual information can be the client's host name and other +information inherent to the request, typically information contained +in cookies. Hence, even if the servlet is serving multiple clients +simultaneously, the logs initiated by the same code, i.e. belonging to +the same logger, can still be distinguished because each client +request will have a different NDC stack. Contrast this with the +complexity of passing a freshly instantiated logger to all code +exercised during the client's request.

    + +

    Nevertheless, some sophisticated applications, such as virtual +hosting web servers, must log differently depending on the virtual +host context and also depending on the software component issuing the +request. Recent log4j releases support multiple hierarchy trees. This +enhancement allows each virtual host to possess its own copy of the +logger hierarchy.

    + + +

    Performance

    + +

    One of the often-cited arguments against logging is its +computational cost. This is a legitimate concern as even moderately +sized applications can generate thousands of log requests. Much +effort was spent measuring and tweaking logging performance. Log4j +claims to be fast and flexible: speed first, flexibility second.

    + +

    The user should be aware of the following performance issues.

    + +
      +
    1. Logging performance when logging is turned off.
      + +

      When logging is turned + off entirely or just for a set + of levels, the cost of a log request consists of a method + invocation plus an integer comparison. On a 233 MHz Pentium II + machine this cost is typically in the 5 to 50 nanosecond range.

      + +

      However, The method invocation involves the "hidden" cost of + parameter construction.

      + +

      For example, for some logger cat, writing, +

      +     logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
      +    
      + + incurs the cost of constructing the message parameter, i.e. + converting both integer i and entry[i] + to a String, and concatenating intermediate strings, + regardless of whether the message will be logged or not. + + This cost of parameter construction can be quite high and it + depends on the size of the parameters involved.

      + + +

      To avoid the parameter construction cost write: +

      +      if(logger.isDebugEnabled() {
      +        logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
      +      }
      +   

      + +

      This will not incur the cost of parameter + construction if debugging is disabled. On the other hand, if + the logger is debug-enabled, it will incur twice the cost of + evaluating whether the logger is enabled or not: once + in debugEnabled and once in + debug. This is an insignificant + overhead because evaluating a logger takes about 1% + of the time it takes to actually log.

      + +

      In log4j, logging requests are made to instances of the Logger + class. Logger is a class and not an interface. This measurably + reduces the cost of method invocation at the cost of some + flexibility.

      + + +

      Certain users resort to preprocessing or compile-time + techniques to compile out all log statements. This leads to perfect + performance efficiency with respect to logging. However, since the + resulting application binary does not contain any log statements, + logging cannot be turned on for that binary. In my opinion this is + a disproportionate price to pay in exchange for a small performance + gain.

    2. + +
    3. The performance of deciding whether to log or not to log when + logging is turned on.
      + +

      This is essentially the performance of walking the logger + hierarchy. When logging is turned on, log4j still needs to compare + the level of the log request with the level of the request + logger. However, loggers may not have an assigned + level; they can inherit them from the logger hierarchy. Thus, + before inheriting a level, the logger may need to search its + ancestors.

      + +

      There has been a serious effort to make this hierarchy walk to +be as fast as possible. For example, child loggers link only to +their existing ancestors. In the BasicConfigurator +example shown earlier, the logger named com.foo.Bar is +linked directly to the root logger, thereby circumventing the +nonexistent com or com.foo loggers. This +significantly improves the speed of the walk, especially in "sparse" +hierarchies.

      + +

      The typical cost of walking the hierarchy is typically 3 + times slower than when logging is turned off entirely.

    4. + +
    5. Actually outputting log messages
      + +

      This is the cost of formatting the log output and sending it to + its target destination. Here again, a serious effort was made to + make layouts (formatters) perform as quickly as possible. The same + is true for appenders. The typical cost of actually logging is + about 100 to 300 microseconds.

      + + See org.apache.log4.performance.Logging + for actual figures. +
    6. + +
    + +

    Although log4j has many features, its first design goal was speed. +Some log4j components have been rewritten many times to improve +performance. Nevertheless, contributors frequently come up with new +optimizations. You should be pleased to know that when configured with +the SimpleLayout +performance tests have shown log4j to log as quickly as +System.out.println.

    + +

    Conclusions

    + +

    Log4j is a popular logging package written in Java. One of its +distinctive features is the notion of inheritance in loggers. Using +a logger hierarchy it is possible to control which log statements +are output at arbitrary granularity. This helps reduce the volume of +logged output and minimize the cost of logging.

    + +

    One of the advantages of the log4j API is its manageability. Once +the log statements have been inserted into the code, they can be +controlled with configuration files. They can be selectively enabled +or disabled, and sent to different and multiple output targets in +user-chosen formats. The log4j package is designed so that log +statements can remain in shipped code without incurring a heavy +performance cost.

    + +

    Acknowledgments

    + +Many thanks to N. Asokan for reviewing the article. He is also one of +the originators of the logger concept. I am indebted to Nelson Minar +for encouraging me to write this article. He has also made many useful +suggestions and corrections to this article. Log4j is the result of a +collective effort. My special thanks go to all the authors who have +contributed to the project. Without exception, the best features in +the package have all originated in the user community. +
    + + \ No newline at end of file From af00cf52adaf908b1750b0ffba6f356d9cad0faf Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 11 May 2007 15:36:55 +0000 Subject: [PATCH 288/342] Bug 37930: Maven documentation feature complete git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@537211 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 2 +- src/site/apt/books.apt | 61 --- src/site/apt/index.apt | 195 +++------ src/site/apt/publications.apt | 83 ++++ src/site/apt/roadmap.apt | 77 +--- src/site/fml/faq.fml | 760 +++++++++++++++++++++++++++++++++- src/site/site.xml | 16 +- 7 files changed, 931 insertions(+), 263 deletions(-) delete mode 100644 src/site/apt/books.apt create mode 100644 src/site/apt/publications.apt diff --git a/src/changes/changes.xml b/src/changes/changes.xml index aaacbdc42f..93667f1077 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -1 +1 @@ - Apache log4j 1.2 SyslogAppender: Added "header" property which if set to true will cause the appender to produce the HEADER part (timestamp and hostname) of the syslog packet. Default value is false for compatibility with previous behavior. SyslogAppender also now sends any header from the associated layout when activateOptions is called or first logging event is sent and any footer when the appender is closed. SyslogAppender leaks descriptors SyslogAppender assumes all lines start with tab SyslogAppender does not limit packet size to 1024 bytes NTEventLogAppender: Updated NTEventLogAppender.dll which corrects missing event messages and which should work with earlier releases of log4j. NTEventLogAppender.dll also now supports registration and unregistration using regsvr32. If replacing an existing copy of NTEventLogAppender, use "regsvr32 NTDllEventLogAppender.dll" or manually remove the HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J registry key. PropertyConfigurator.configure(URL) does not close resource stream. In Turkish locale level "info" is not equivalent to "INFO" Javadoc of PatternLayout should use %n in TTCC layout examples Stacktraces of exceptions disappear occassionally Incorrect message when specified custom level class does not implement toLevel Warning when configuring inner-class logger AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts Add target to generate binary and source compatibility report PropertyPrinter.printOptions breaking signature change in log4j 1.2.9 RollingFileAppender may delete files during rollover XMLConfiguration of loggerFactory does not work SyslogAppender does not limit packet size to 1024 bytes \ No newline at end of file + Apache log4j 1.2 SyslogAppender: Added "header" property which if set to true will cause the appender to produce the HEADER part (timestamp and hostname) of the syslog packet. Default value is false for compatibility with previous behavior. SyslogAppender also now sends any header from the associated layout when activateOptions is called or first logging event is sent and any footer when the appender is closed. SyslogAppender leaks descriptors SyslogAppender assumes all lines start with tab SyslogAppender does not limit packet size to 1024 bytes NTEventLogAppender: Updated NTEventLogAppender.dll which corrects missing event messages and which should work with earlier releases of log4j. NTEventLogAppender.dll also now supports registration and unregistration using regsvr32. If replacing an existing copy of NTEventLogAppender, use "regsvr32 NTDllEventLogAppender.dll" or manually remove the HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J registry key. PropertyConfigurator.configure(URL) does not close resource stream. In Turkish locale level "info" is not equivalent to "INFO" Javadoc of PatternLayout should use %n in TTCC layout examples Stacktraces of exceptions disappear occassionally Incorrect message when specified custom level class does not implement toLevel Warning when configuring inner-class logger AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts Add target to generate binary and source compatibility report PropertyPrinter.printOptions breaking signature change in log4j 1.2.9 RollingFileAppender may delete files during rollover XMLConfiguration of loggerFactory does not work SyslogAppender does not limit packet size to 1024 bytes Monitor deadlock in AsyncAppender. AsyncAppender: Dispatcher should run at normal prio. AsyncAppender wait forever when buffer is full. Add non-blocking option for AsyncAppender. Add SyslogPort option to SyslogAppender. Add cc and bcc addresses to SMTPAppender. Add password authentication to SMTPAppender. NullPointerException in org.apache.log4j.NDC.get. org.apache.log4j.lf5.util.DateFormatManager.setTimeZone assignment error. Monthly logs not generated at midnight with DailyRollingFileAppender. PatternLayout specifier %r is not consistent with documentation. Space after log level causes default level to be used. Bad patterns in ISO8601DateFormat and DateTimeDateFormat. SyslogAppender throws NullPointerException upon misconfiguration. FallbackErrorHandler throws NullPointerException if no loggers are set. Bad documentation for WriterAppender.encoding. NTEventLogAppender not build, tested and placed in distribution. SMTPAppender does not output newlines between stack trace lines. SMTPAppender will not run within sandbox. MDC with SMTPAppender doesn't work. Misspelling in HierarchyDynamicMBean. Additivity not exported by PropertyPrinter. RollingFileAppender, if removed, can cause NullPointerExceptions. AsyncAppender blocks on thread death. NOTICE file added to distribution and jars. Chainsaw of log4j 1.2 does not show TRACE level. TRACE level missing in short introduction to log4j. Update site generation to velocity 1.4 and remove dependency on logging/site project. Location info missing for TRACE level messages. Console appender now behaves as before to fix compatibility problem with JBoss introduced in 1.2.12 release due to fix for bug 31056. Can still be configured to detect changes in the System.out and System.err streams as needed by setting the follow property. Removed final qualifiers on member variables in org.apache.log4j.chainsaw.LoggingReceiver which would cause spurious compiler errors with JDK 1.1 and 1.2 javac compilers. Added a jndi.jar property to the build.xml. Added "release" target to build.xml. Removed references to obsolete documentation. Added protected accessors for member variables topicConnection, topicSession, and topicPublisher. SyslogAppender now checks Layout.ignoresThrowable() just like every other appender. DOMConfigurator would call LogLog.error to report XML validation errors that caused no problems in the interpretation of the configuration file. Fixed the JavaDoc links for the XML sample files. Added getNext/setNext methods to org.apache.log4j.spi.Filter and deprecated public "next" field. This mirrors the same change in the upcoming 1.3 version and, hence, provides a migration path. Added o.a.log4j.Logger.trace(), o.a.log4j.Logger.isTraceEnabled() and o.a.log4j.Level.TRACE Implemented serialization for Level. o.a.log4j.ConsoleAppender would ignore redirections of System.out and System.err that occurred after configuration. o.a.log4j.xml.DOMConfigurator would not properly interpret relative path names in external entity declarations. o.a.log4j.xml.XmlLayout would not properly escape class names that contained '<' or '>'. Use of String.intern() in o.a.log4j.CategoryKey would cause application to slow down. o.a.log4j.FileAppender would not create log file if parent directory did not exist. o.a.log4j.AsyncAppender would deadlock if a unchecked exception occurred in the attached appender causing the dispatch thread to die. Added jdiff target to build.xml. log4j would not build with a JDK 1.5 javac. Added log4j 1.1 compatibility method to o.a.l.helpers.Loader. Additional null terminating character in Windows nteventlog.cpp code. Broken links to J2SE classes in javadocs. o.a.log4j.or.jms.MessageRenderer would not be compiled in the build.jms target. Log4j version 1.2.9, is identical to version 1.2.8, except that several key methods have been deprecated in preparation for version 1.3.0, the next major release of log4j. These changes are intended to enforce the rule that client code should never refer to the Category class directly, but use the Logger class instead. Similarly, client code should not refer to the Priority class but to the Level class instead. For a more detailed discussion, refer to the document entitled preparing for log4j 1.3 at: http://www.qos.ch/logging/preparingFor13.jsp XMLAppender would throw a NullPointerException if the input message was null. Many thanks to David Vandegrift for reporting the bug and to Hendrik Brummermann for supplying the patch. Various versions of Xerces would not parse log4j configuration scripts expressed in XML format. The "removes" buffer used in the flushBuffer() method of JDBCAppender is now cleared, solving the memory leak. Thanks to John Landers for reporting the bug and suggesting the fix. SocketAppender now honors ReconnectionDelay of 0. Many thanks to Scott Schram for reporting the bug and providing the fix. Log4j now searches for the file log4j.xml as well as the file log4j.properties during log4j initialization. Add of new options in JMSAppender and new command line arguments in JMSSink. Add new method getLoggerName() in LoggingEvent class. The getLoggerName is the preferred way for accessing the logger name. The public access categoryName field should not be accessed directly. Similarly, added the getLevel method which is now the preferred way of accessing the event's level. The public access level field should not be accessed directly. The javadocs now mark the categoryName and level fields as deprecated. Modified existing appenders to comply with these new directives. Log4j now will check if a system property named "log4j.ignoreTCL" is set. If it is set, then it will ignore the Thread Context ClassLoader when loading classes. This solves the irritating "appender is not assignable to Appender" messages observed when log4j.jar is loaded by multiple class loaders. The error reporting for this problem was also improved. Calling the MDC.get method with a null argument would throw a NullPointerException. July 5th, 2002 Calling an AsyncAppender close method also closes the embedded appender instances. The JDBCAppender is marked as slated for replacement. Do not build critical software using it. Add LF5 documentation and examples. Further tests are required for full integration. XMLLayout can now output messages which contain embedded CDATA sections.Many thanks to Michael A. McAngus for supplying the relevant patch. The dispatcher thread associated with AsyncAppender is now marked as a deamon thread. Add missing NTEventLogAppender.dll log4j.dtd was changed so that <log4j:event> is now made of logger and level attributes instead of category and priority. Changed XMLLayout to conform to the DTD. Chainsaw was changed to adapt to the XMLLayout. Add missing LevelRangeFilter file. SyslogAppender would incorrectly compute the length of the datagram to send to the remote syslogd host. Reported by Mamoru Kadota. The stack trace of exception would not be properly printed on the Compaq tru64 Unix platform. Initially reported by Fabrice Claes and later by Espen H. Kolstad who also provided the fix. Log4j configurators take the "NULL" string value as a synonym for "INHERITED". Both of these two strings are legal level values for setting the level of a logger. Both values are case insensitive. When loading component classes, log4j will now first attempt to use the Thread Context Loader and if that fails, it will use Class.forName. In log4j 1.2 and 1.2.1, only Class.forName was used and the TCL was ignored. This change is a response to bug #9305 opened by Scott M. Stark. LoggingEvent.getMDCCopy() method now sets mdcCopyLookupRequired instead of ndcLookupRequired. This bug would cause the wrong MDC information to appear on a log server. It could only occur if the client wrapped an AsyncAppender around a SocketAppender or if the server used an AsyncAppender for its logging. A closed TelnetAppender would continue waiting for connections even if its ServerSocket was closed. This caused the TelnetSocket to sit in a loop and complain about the closed socket. AsyncAppender throws NullPointerException problem. The bug was actually in AppenderSkeleton. Add support for recursive variable substiuton as requested by Eric Chastan. SocketNode now used a BufferedInputStream as suggested by Kok Chong Fixed a problem with DailiyRollingAppender which would not correctly compute the rollover period in certain timezones. Fixed documentation bug #2726 in FAQ.html. Added a flush statement in the WriterAppender.writeFooter method. In XMLLayout, escaped the method attribute. The XMLLayout also outputs each item of a stack trace in a separate line. The LoggingEvent.getMDCCopy method now clones the MDC instead of just referencing it. The ANT build script was modified to use jar files specified in the build.properties file instead of the CLASSPATH environment variable. The build.properties file depends on local paths and is supplied by the user. The build.properties.sample file is included in the distribution. The build.sh and build.bat scripts have been removed. This is the way many other jakarta projects build their projects. The jar files in the dist/lib directory were also removed since they are no longer used. The DOMConfigurator now interprets the string after the '#' character in the value attribute within the <level> element as the fully qualified class name of a custom Level. This is consistent with the way log4j handles "level" values in other places. The class attribute is still honored. Add Oliver Burn's chainsaw tool to the core log4j distribution. Visualisation and dynamic filtering of log events is bound to be a very important area of activity in the future. Add the org.apache.log4j.jdbc.JDBCAppender which as the name indicates sends events to a database using the JDBC API. Thanks to Kevin Steppe for supplying the code. Add SocketHubAppender class as contributed by Mark Womack. This appender sends LoggingEvent objects to a set of remote a log servers. In the Category class, the getChainedPriority method has been replaced with getEffectiveLevel method. Replaced the custom class loading based on the thread context class loader with a simple Class.forName() call. This solves two allied but distinct problems encountered when using Ant with JUnit although the bug is more general. In one instance of the problem, log4j would throw java.lang.NoClassDefFoundError for org/apache/log4j/AppenderSkeleton where log4j.jar and related classes were clearly available to the Ant classloader. In another incarnation, log4j would reject a custom appender claiming that it is not assignable to a org.apache.log4j.Appender variable. This would occur when log4j.jar was available to both the Ant classloader and the system classloader.
    Thanks to Dave Herman for providing detailed scenarios exposing the issues involved. See http://forum.java.sun.com/thread.jsp?forum=38&thread=70946 http://forum.java.sun.com/thread.jsp?forum=38&thread=70946#479697 http://marc.theaimsgroup.com/?l=ant-user&m=101139178705895&w=2 for more details.
    Fixed the complaints the compiler issued when using the Logger.setLevel() method. Incorporated the performance enhancements to ISO8601DateFormat and AbsoluteTimeDateFormat classes submitted by Andrew Vajoczki. Source code written for log4j 1.1.3.jar will compile fine with log4j 1.2X. However, code compiled for log4j 1.1.3 would previously systematically throw "java.lang.NoSuchMethodError" runtime exceptions when run with log4j 1.2 - prior to beta2. This problem has been corrected in beta2. Pheew, that was a close one. Log4j 1.2 is now backward compatible in serialization of LoggingEvents. For example, a 1.1.3 SocketAppedner can write to 1.2 SocketServer. Similarly a 1.2 JMSAppender will work with 1.1.3 JMSSink. This should ease the move to log4j 1.2, especially in large deployments. The src/java/org/apache/log4j/examples/ directory moved under the top-level directory as examples/. Fixed the ArrayIndexOutOfBoundsException that was thrown by AsyncAppender if multiple threads were trying to log an event containing an exception near simultaneously. Thanks to Thomas Tuft Muller for reporting this bug. Improved error reporting in DOMConfigurator. Thanks to Thomas Tuft Muller for contributing the enhancement. Log4j is now configurable using JMX. JMX support is not of production quality. Add support for different encodings in WriterAppender. Thanks to Ben Sandee for submitting the relevant patch. Modified SMTPAppender to allow multiple email sessions. Thanks to Jon Skeet for supplying the relevant patch. The CategoryFactory class has been replaced by the LoggerFactory class. The makeNewCategoryInstance method has been renamed as makeNewLoggerInstance. This change requires subclasses of Category classes to be modified and recompiled. The Level class replaced the Priority class. Priority class now extends Level to preserve backward compatibility. The Logger class replaced the Category class. Logger class extends Category to preserve backward compatibility. We proudly mark this change with a single star for 100% compatibility. The Category.assert method has been replaced by Category.assertLog. This change was necessary because assert is a language reserved word in JDK 1.4. Removed deprecated methods setOptions and getOptionStrings defined in the org.apache.log4j.spi.OptionHandler interface. This interface is implemented by most log4j appenders and layouts. In particular, all appenders and layouts shipped with log4j contain these deprecated methods. They have become totally redundant after we moved to JavaBeans style configuration in log4j 1.1. The disable(Level) methods in Hierarchy have been removed and been replaced by threshold methods. Add buffered IO capability to FileAppender and subclasses. The location information (or stack information) was not correctly transmitted by JMSAppender. Add event reporting capability to the Hierarchy class. Add new system property "log4j.configuratorClass". This property allows the user to specify the custom configurator at the default initialization phase. This property replaces the previous interpretation of the reference part of "log4j.configuration" as the custom configurator class. This interpretation was sometimes erroneous and caused headaches. Introduced the Mapped Diagnostic Context or MDC class. This class is similar to the NDC except that the diagnostic context is based on a map instead of a stack. Moreover the MDC is automatically inherited by child threads under JDK 1.2 and above. Corrected a performance bug in the NDC class as observed by Dan Milstein and independently by Ray Millard. Removed deprecated methods disable(Priority), disableAll, disableDebug, disableInfo and enableAll in BasicConfigurator. Add supports java.io.Reader objects in the method doConfigure(), instead of only InputStream. Thanks to Mark Womack for submitting the relevant patch. Corrected the restart bug in DailyRollingFileAppender. Thanks to Jim Moore for supplying the relevant patch.
    Add a missing namespace declaration in the log4j:configuration element in log4j.dtd. The missing declaration caused the new generation of namespace aware parsers to barf when parsing log4j configuration files. Reduced the size of log4j-core.jar to 78KB. Minor documentation changes. Corrected a problem with the static initializer of the Category class which would use the wrong class loader to search for the default configuration file. The associated search algorithm has been also simplified. Nevertheless, the preferred method to specify the automatic configuration file is by setting the log4j.configuration system property. Documentation improvements. Added a new section to the manual explaining the default initialization procedure Enhancements to the org.apache.log4j.examples.appserver package. Corrected a bug in the way the NTEventLogAppender printed exceptions. Add missing custom priority support in PropertyConfigurator. Made a number of fields protected instead of default access in SMTPAppender. This release has the same code as 1.1b7. It differs only in a few minor documentation changes. Made BasicConfigurator disable methods static as they were in log4j 1.0.4. Thanks to Francisco Marin for reporting the bug. Corrected a two related deadlock problems introduced while fixing bug 1505. Thanks to joelr@viair.com for reporting the problem. The configureAndWatch methods in Configurators did not close the configuration file, preventing its editing. In DOMConfigurator.setParameter special character conversion now precedes variable substitution. This change was suggested by Steven Velez. The vast majority of users should be oblivious to it. The TextPaneAppender is no longer maintained and has been removed. It is still available under the contribs/ directory. This change has been discussed in the log4j mailing lists and no one objected to the removal of the TextPaneAppender class. Aaron Greenhouse from Carnegie Mellon SCS found a series of multi-threading related bugs in Category and AsyncAppender. See bug ids 1505 and 1507 in our bug database for exemplary bug reports. They are worth the detour. InvalidJarIndexException is only available in JDK 1.3. Referring to this exception type caused log4j 1.1b5 to break on earlier JDKs. We now avoid referring to it. Add PriorityRangeFilter by Simon Kitching. See the Threshold option in AppenderSkeleton for a more convenient alternative. In HTMLLayout, the Title option sets the HTML document title (<title>...<title>). Corrected an important performance bug in LocationInfo. Hein Couwet and kr@it-practice.dk have independently identified the bug. This is yet another example of the difference made by the number of eyeballs studying source code. Corrected the incorrect value returned by LocationInfo.getClassName method when running under IBM Visual Age. Thanks to Mathias Rupprecht for supplying the relevant patch. Corrected a bug where the build.sh file in the distribution would be in DOS CRLF format. Thanks to ma.darche@free.fr for reporting the problem. Corrected InvalidJarIndexException thrown in applets while searching for the default log4j configuration file. Thanks to Michael Lundahl for reporting this bug. Add missing PropertySetterException class to log4j-core.jar. Thanks to ma.darche@free.fr for reporting this bug. Mathias Bogaert observed that in version 1.1b3 the search algorithm for the resource used in automatic log4j configuration was different than in 1.0.x. Beta4 uses a more powerful mechanism which is also compatible with 1.0.x. Paul Glezen correctly observed that if log4j is deployed in a client/server mode where multiple log4j clients log to a log4j server, all hosts must be upgraded to version 1.1 in one go because the internal LoggingEvent class used in client/server communication changed in log4j 1.1. Add a RollingFileAppenderBeanInfo class that fakes the maxFileSize JavaBeans property as a String type instead of a long. This allows us to resuscitate setMaxFileSize(long) method that was removed in 1.1b2 breaking 100% backward compatibility. This addition restores 100% backward compatibility. The directory structure has changed to better suit Jakarta conventions Add a few jar files required at build time to build/lib so that it is now possible to compile log4j out of the box. Whenever a priority parameter is expected in a configuration file, one can now use a custom priority class. See OptionConverter.toPriority method for more information. Note that the <priority> element in log4j.dtd remains unaffected by this change. Add the setQuietMode(boolean) method to LogLog. In quiet mode LogLog will not output anything even in case of errors. Log4j components are now configured as JavaBeans. The setOption and getOptionString methods have been deprecated in OptionHandler interface which is implemented by most log4j components. The stack trace of a throwable passed in a logging statement is not parsed into a stack array which is serializable. This allows cascading of log4j servers to properly propagate throwable information. In XML configuration files, the <configuration> element has been deprecated and was replaced by the <log4j:configuration> element. The "log4j.configDebug" system property has been replaced with the "log4j.debug" system property although it is still available. Similarly, the "configDebug" attribute has been deprecated and replaced with the "debug" attribute in log4j.dtd. Logging can now be disabled per Hierarchy. It can also be disabled using configuration files using the "disable" directive. The "disableOverride" directive takes precedence over the "disable" directive. As a result of this change the disable family of methods in BasicConfigurator has been deprecated and replaced by the same family of methods in the Hierarchy class. The FileAppender has been split into three parts: WriterAppender, ConsoleAppender and FileAppender. ConsoleAppender takes over the console logging functionality of FileAppender. As a result support for stream and console printing has been deprecated in FileAppender. The FileAppender now correctly outputs the header and footer of its layout. This problem was reported by too many users to list here. Appenders and Layouts now get to see the raw message object in LoggingEvent not just its rendered form. The access modifiers of some LoggingEvent fields were changed so that they can be accessed in less error-prone ways. Thanks to Jim Cakalic and Anders Kristens for their valuable advice. Add getLayout(), getErrorHandler(), and getFilter() to the Appender interface. Add getOption(key) method to the OptionHandler interface and modified implementations of it as appropriate. Add the much awaited DailyRollingFileAppender. The structure of the distribution changed somewhat. The log4j.jar files can be found under dist/. The javadoc directory has been moved to docs/api/. We are now totally dependent on ANT to perform all the steps involved in creating a release, including compilation, jar file creation, generation of the javadocs, and for the creation of the distribution tar and zip files. Removed org/apache/log4j/varia/ResilientFileAppender.java which was bogus to begin with. XMLLayout will now mark some output as <![CDATA[ .. ]]> so that it does not get interpreted by the XML parser. This was suggested by Mathias Bogaert like a long list of other fixes. Corrected a bug in CyclicBuffer.resize method that would not update the next insertion point. Thanks to Ole Bulbuk for accurately reporting the bug. The LoggingEvent class now supports serialization of priorities derived from the org.apache.log4j.Priority class. Improved the search method for finding the "log4j.properties" file in the static initializer of Category class. Thanks to Calvin Chan for supplying a better method. The code handling the FCQN (formerly instanceFQN) parameter was cleaned up. There is now a well-established and simple manner for sub-classes of Category (or wrapper classes) to define the FCQN variable: just define a static variable, say FCQN, consisting of the fully qualified class name of the subclass or wrapper, supply this variable as an argument to forcedLog method if and when the sub-class or wrapper invokes that method. Made the instanceFCQN an instance variable instead of a class static in Category.java. In related move, the Category constructor now takes an additional argument setting the instanceFCQN. This makes life less miserable for Category subclasses. Corrected a bug in the OptionConverter.instantiateByClassName method that would not return the defaultValue in case of error. Thanks to Matthieu Verbert for identifying this bug. Corrected the missing stack trace in e-mails generated by the SMTPAppender when using certain Layouts. Updated the "Adding Conversion Characters to PatternLayout" document to reflect the latest changes to the code. Also added the org/apache/log4j/examples/appserver directory containing the associated example code. Add the BufferSize option to the AsyncAppender. Eliminated the SecurityExceptions thrown in Applets. Thanks Timur Zambalayev for reporting this bug. Fixed the erroneously thrown IOInterruptedException when the AsyncAppender was closed. Thanks to Tom Palmer for accurately reporting this bug. Corrected a serious bug in Hierarchy.java that would cause a NullPointerException depending on the order of instantiation of categories. Thanks to Wolfram Gewohn for reporting this bug. Corrected a bug in the getOptionsStrings method of SMTPAppender that omitted to mention the EvaluatorClass option. Thanks to Mark Balster for reporting this bug. Fixed a NullPointerException occurring in AsyncAppender after invoking Category.shutdown. Thanks to Frank-Olaf Lohmann for reporting this bug. Modified the OptionConverter.selectAndConfigure method to take an extra argument of type Hierarchy. This method is used internally and should not affect most users. Add the warn method to LogLog which is used internally by log4j to report on itself. Displaced a number of HTML files under the docs directory. The new structure is compatible with the jakarta site and results in a more consistent navigation experience. Made a few improvements in the javadocs. Add the missing build.inc file to the distribution. No code changed. This version corrects some documentation and build script bugs; code has not changed. Package hierarchy now starts at org.apache.log4j.

    Add the fatal() family of methods to the Category class. Moreover, the EMERG priority has been removed from the Priority class. This priority has been replaced by the FATAL priority that is more widely accepted. This change will require EMERG log statements to be replaced by FATAL log statements. Assuming EMERG log statements are rare, this should have a small but bearable impact on existing client code.

    Moreover, the Unix Syslog priorities ALERT, CRIT and NOTICE are no longer recognized. Support for these priorities was minimal and few users should suffer from these changes.

    Removed the methods setRootPriority, getRootPriority as these methods were redundant and had been previously deprecated. Removed the DOM Level 2 dependency in DOMConfigurator. This makes log4j XML configurable using Sun's parser or Apache's Xerces. The static initializer of the Category class now takes the log4j.configuration system property to search for its configuration file. The type of the configurator used to parse the configuration file depends on the value of the log4j.configuration system property. Enhanced the PropertyConfigurator and DOMConfigurator to support customisation of independent Hierarchy instances. The org.apache.log4j.net.SocketServer has been enhanced to take advantage of this functionality. The old code of SocketServer has been moved to SimpleSocketServer. Enhanced the PropertyConfigurator to support variable substitution for all options *values* (but not keys!). Categories are now aware of the Hierarchy they are linked to. This will provide a basis for several performance enhancements planned for the future.

    Add support for object rendering. It is now possible to register an object renderer for a given object type. When the given object needs to be logged log4j will invoke the corresponding renderer to transform the object into a String.

    As a result of this enhancement, all the String forms of all the printing methods such as debug(String), info(String) have been removed as they are no longer necessary. This change should be backward compatible but requires recompilation of old client code. Thanks to Michael Smith for noting the recompilation requirement.

    Add support for user defined category factories in the PropertyConfigurator. Thus, it is now possible to configure log4j with a properties file and still use custom Category sub-classes. The DOMConfigurator had already a finer grain support. Add the SMTPAppender that in case of an error or fatal event sends an e-mail containing latest N logging events in its buffer, where N is chosen by the user. Add the method getInstance(Class) to the Category class. Corrected a bug in configureAndWatch method of configurators that would configure log4j only after an unnecessary delay.
    Corrected a typo making NTEventLogAppender.dll register the wrong category message file. Thanks to Peter Hayes for accurately reporting this bug. The DOMConfigurator and PropertyConfigurator can now automatically detect modified configuration files and re-read them. Add AsyncAppender which buffers log requests and serves them at a later time. AsyncAppender can increase logging performance tremendously if logging operations are interspersed with long and blocking non CPU-intensive operations, typically I/O or network access. For CPU intensive applications, using the AsyncAppender will actualy degrade logging performance by 10 to 25 percent. The log4j.dtd has been modified to allow appenders to refer to other appenders by IDREF. The DOMConfigurator has been modified to take advantage of ID/IDREF attributes when referring to appenders. This change requires a DOM Level-2 API compliant parser. DOM Level-2 java bindings are available at http://www.w3.org/TR/1999/WD-DOM-Level-2-19990923/java-binding.html. Add the configure(String filename) method to DOMConfigurator. This method requires the presence of a JAXP compatible parser. At this time, the only DOM2 and JAXP compatible parser seems to be the Apache xerces parser. Add the PriorityMatchFilter allowing filtering by exact priority match. This was a common request by users. The configuration of a category is now an atomic operation. This ensures that log requests are not lost while configuration is in progress. Anders Kristensen was to first to observe the potential problems in non-atomic configurations. The "log4j" element has been renamed to "configuration" in the log4j DTD. This change requires that log4j configuration files written in XML be modified. Since the log4j element figures only once in the XML file, this change should take little time. ResourceBundles are now category instance specific and no longer class static. Moreover, like other properties resource bundles are inherited from the category hierarchy. The jar files log4j.jar and log4j-full.jar now contain versioning information in their respective manifest files. Corrected an inconsistency in the NTEventLogAppender which broke it. Fixed a bug where configuration files were not parsed correctely due to trailing spaces in option values as returned by java.util.Properties. Trailing spaces are now removed from option values. This bug was quite disconcerting because the trailing spaces cannot be seen without careful examination of the configuration file. Add the XMLLayout. The output of the XMLLayout consists of a series of log4j:event elements. It does not output a complete XML file. The output is designed to be included as an external entity to form a well-formed XML file. Add a new abstract class org.log4j.helpers.DateLayout. The TTCCLayout now extends DateLayout. Corrected a rather subtle performance bug in the buffer management code in PatternLayout. Thanks to Vladislav Dutov and Constantine A. Plotnikov for for insisting on the correction of this bug. Created a new package called org.log4j.spi. This new package holds classes that are hidden from the casual user but are needed to extend log4j. Add org.log4j.varia.ExternallyRolledFileAppender to handle externally triggered file rollovers. Add support for multiple hierarchy trees. PatternLayout can now be subclassed to support new conversion patterns. Extended the DOMConfigurator and the log4j DTD to properly handle sub-classing of Category and Priority classes. There have been also minor adjustments to other classes to handle sub-classing. These changes should be invisible to users. All categories except the root category can be sub-classed and also assigned priorities sub-classing org.log4j.Priority. The root category always exists and CANNOT be subclassed. The ProppertyConfigurator remains unchanged. Thus, it does not handle extensions of the Category class. Add filter support in appenders. The DOMConfigurator and the log4j.dtd have been enhanced to support filters. Add error handling support to appenders. The DOMConfigurator and the log4j.dtd have been enhanced to support filters. Add support for correct interpretation of location information in IBM's Visual Age environment. Thanks to Wolf Siberski for supplying the relevant patch. Add getAdditivity method to Category. This feature was requested by Constantin Mitran. (mitran at ecircle.de) Corrected multiple bugs in default initialization code of Category class. Thanks to Jeff Turner for identifying and supplying corrective patches. Add the %n conversion character to PatternLayout so that a line separator can be specified in a platform independent way. In 0.8.5 internal Priority integer values were decoupled from the Unix Syslog values. This broke SyslogAppedder. A new function Priority.toSyslogInt is introduced to solve this bug. Corrected a bug where the internal priority integer All log4j internal output is now prepended with the string "log4j: ". This makes is easier to differentiate log4j internal logs from messages output by other sources. Sub-classes of Category class must now specify their fully qualified name when constructing logging events. This allows the %C conversion specifier in PatternLayout to work properly even with sub-classes or wrappers of Category. Add the method disableDebug to BasicConfigurator. This method disables all print requests of debug priority regardless its category. Similar methods disableInfo, disable, disableAll and enableAll have also been added. Disable type methods can be overriden by setting the log4j.disableOverride system property. Calling BasicConfigurator.disableInfo is equivalent to the now deprecated flagAsShippedCode method. Given the above changes, the system property log4j.shippedCodeFlagOverride is no longer honored. It is now possible to sub-class Category. The sub-classes may continue to adhere to the category hierarchy. This was a frequently requested feature. Corrected a problem with the additivity flag being ignored in categories without appenders. This bug was discovered by Anders Kristensen. Add a method BasicConfigurator.resetConfiguration to reset the log4j environment. This method should be used sparingly. At the initialization of the Category class, the file log4j.properties will now be searched from the search path used to load classes. If the file can be found, then it is fed to the PropertyConfigurator.configure(java.net.URL) method. Failing to access system properties within the static initializer of BasicConfigurator class is no longer reported as an error but as a debug message. Thanks to Gilles Schlienger for reporting this problem with applets. Corrected a bug which caused infinite loops when using conversion patterns with a single element, fortunately under very rare circumstances. This bug was first reported by Igor Potraev, the author of log4p. It was independently reported by Joe Haberl from IBM Global Services. Add a mechanism to lazily remove references to dead threads in the NDC class. Indeed, in previous versions calling NDC.pop within a thread but forgetting to call to NDC.remove before exiting (that thread) resulted in a memory leak. Corrected a huge memory leak in SocketAppender. This leak was due to the ObjectOutputStream indefinitely holding a reference for each written to the stream. Thanks to Dan MacDonald for very accurately describing this bug. The log and l7dlog methods in Category no longer ignore the shipped code flag. This bug was reported by Mario Schomburg. Add missing NDC information to LoggingEvent.writeObject method. Corrected handling of SocketException in SocketNode. Thanks to Gerald Gutierez (ggutierez@emobiledata.com) for reporting this and the previous problem. Phased out custom shell scripts to build java documentation and jar files in favor of Jakarta's ANT. It was becoming a nuisance to keep the ANT build file in sync with the custom shell scripts. The NT EventViewer no longer complains about missing message 4096. Minor corrections in documentation. Add missing icons GIFs into the distribution. SocketNode now attempts to close the socket when exiting. Thanks to Moses Hohman (mmhohman@rainbow.uchicago.edu) for noting this. Removed the com.ibm.log4j from the javadoc directory. This seems to confuse VAJ. Thanks to Steve Ashcroft for reporting this problem. As a result of the infinite loop problem (see next item), added over 800 new test cases to stress-test the code in CategoryFactory class where category creation occurs. Under certain rare circumstances the Category.getInstance method entered an infinite loop. Thanks to Mario Schomburg from IBM Global Services / Hannover for identifying this problem and proposing a patch. DOMConfigurator and the log4j.dtd were out of sync on the type of the priority directive. As a result, priority directives all defaulted to DEBUG. Thanks to Peter (petervt@users.sourceforge.net) for accurately reporting this bug. Minor additions to the FAQ. Add the NumberCruncher example showing how the NDC class can be used to distinguish output from different clients. Add the %x conversion specifier to the TTCC_CONVERSION_PATTERN in the PatternLayout class. This is consistent expected output of Trivial.java example. Thanks to Jerome (schrom@users.sourceforge.net) for reporting this bug. The value of the additivity option would not be parsed properly by the ProperytConfigurator if the line containing the option contained trailing spaces. The localized logging methods (l7dlog) omitted priority based evaluation and erroneously logged all requests. The close method was added to the Appender interface allowing appender implementations to release any resources they may have allocated. The package naming scheme of changed from "com.ibm.log4j.*" to "org.log4j.*". The new naming reflects the open source nature of the project and is consistent with the URL http://www.log4j.org. Add internationalization support. See the newly introduced l7dlog methods in Category class. In the FileAppender, the File option now admits variable substitution. For example, if "java.home" system property is set to /home/xyz and the File option is given the value "%{java.home}/test.log", then File option will be interpreted as "/home/xyz/test.log". Thanks to Avy Sharell (sharell@online.fr) for contributing this feature. SocketAppender is now officially part of the package. It is capable of sending logging events to a remote SocketNode. The SocketNode logs events according to server (local) policy. For example, a client can log events to a local file and also send them to a remote server (a SocketNode). This server can log the event to any number of files, to the console, to any number of TextPaneAppenders and even re-transmit the event to another server, and so forth. This paradigm is common in most logging systems, e.g. Syslog and NT Event Log. Many thanks to Andrew Harrison for showing a way to actually implement the paradigm. The Category.callAppenders method now accepts a LoggingEvent instead of creating one itself. This was necessary to accommodate events generated at a remote client. LoggingEvent class changed slightly to support remote logging. The category field (a Category) has been replaced by the categoryName field (a String). Corrected a bug in Category.removeAppender(String) which would never remove the desired appender. Thanks to Moses Hohman for reporting this bug. Corrected a bug RollingFileAppender which would throw an uncaught exception in case output file could not be opened for writing. Thanks to Vinay Aggarwal for signaling this problem. The log4j.override key defined in BasicConfigurator has been renamed to log4j.shippedCodeFlagOverride. The getCurrentCategories method in the Category class would not return the correct value. Thanks to Timothy Potter (tpotter@agency.com) for reporting this problem. Appenders now admit a priority threshold as an option. All requests with a priority lower than the appender's threshold priority are ignored by the appender. Integrated Christopher Taylor's DOMConfigurator parsing XML configuration files. The jar file log4j-net.jar has been replaced by log4j-full.jar. It contains DOMConfigurator.class in addition to the com.ibm.log4j.net package. Add support for the ANT build tool. Thanks to Christopher Taylor for supplying the build.xml file. ANT is available form http://jakarta.apache.org. FileAppender's File option now accepts the values "System.out" or "System.err". If one these values is suppiled in a configuration file then the output is directed to the corresponding stream. Moreover, the default constructor of FileAppender no longer sets System.out as an output target nor does it define a default layout. Add caller class (C), caller file name (F), caller line number (L), caller method name (M) conversion specifiers to the PatternLayout class. The category conversion specifier now takes an optional precision modifier allowing the user to control the number of right most components in the category name that will be printed. Corrected a bug occuring when the caller file name and line number information were unavilable due to JIT compilation. In that case, the PatternLayout would not properly use the rest of the available location information. The above enhancements and bug-fixes originate from comments by Nelson Minar (nelson@monkey.org). The SimpleLayout and TTCCLayout are replaced by the PatternLayout in the log4j.jar file to keep its size small. These two layouts are still part of the package. The PatternLayout class is introduced. This new layout is configurable using a conversion pattern which is parsed at runtime. This allows the user to choose the output layout without writing any code and only at a marginal performance cost compared to the dedicated layouts such as SimpleLayout and TTCCLayout. The PatternLayout also allows the user to determine minimum and maximum field lengths. The PatternLayout was written by Jim Cakalic (jim_cakalic@na.biomerieux.com). All internal components now use LoggingEvent instances to specifiy logging information. Corrected a problem with a missing variable initialization in SyslogAppender. This caused NullPinterException to be thrown when logging exceptions. Added a default constructor to SyslogAppender. The lack of this constructor caused PropertyConfigurator to throw a java.lang.InstantiationException when the appender type was set to be SyslogAppender. Thanks to Yves Bossel (ybossel@opengets.cl) for accurately identifying these bugs. Modified some other related option handling code in SyslogAppender. Made NDC.get public access instead of default access. Thanks to Y. J. Chun (monac@softonnet.com) for reporting this problem. PropertyConfigurator now parses the additivity option for categories. Corrected the value of the ADDITIVITY_PREFIX constant to match the documented value, that is "log4j.additivity". Corrected a really bad bug where System.out would be closed when PropertyConfigurator.configure was called. Thanks to Christopher Taylor (cstaylor@pacbell.net) for tracking and reporting this bug. The PropertyConfiguator now prints debug messages if the flag "log4j.configDebug" is defined in the configuration file. Previously, only if the system property "log4j.configDebug" was set would debug messages be printed. A question by Shawn Kircher (skircher@vninet.com) induced this change. In AbsoluteTimeDateFormat, DateTimeDateFormat and ISO8601DateFormat the separator between the seconds and milliseconds has been changed to comma from full stop, in order to be compliant with ISO8601's preferred sign. Thanks to Jim Cakalic (jim_cakalic@na.biomerieux.com) for pointing out this discrepancy with the standard. Corrected a bug where RollingFileAppender would not work properly on Windows systems. Thanks to Heinz Richter (heinz.richter@ecmwf.int) for noting this problem. Core classes are now independent of the format of the options file. Configurable core classes implement the OptionHandler interface. OptionHandlers allows configurators to learn the relevant option names. The configurator feeds option values to the OptionHandler which configures itself. As a result of these changes, the Init class has been broken down to two separate classes: the BasicConfigurator and the PropertiesConfigurator. An XML configurator for 0.8.0 has been already written by Christopher Taylor (cstaylor@pacbell.net). Add multiple appender support per category. The appenders follow the category hierarchy, i.e. a child category inherits the appenders of its parents. Add an assert() method to the Category class. Steven Marcus (srnm@awaretechnologies.com) requested this addition. Automatic stack printing is no longer supported. This was an unused and unreliable feature which unnecessarily complicated the code. log4j now emits a single warning message when no appender to write to could be found. This is typically the case when the user forgets to configure the log4j environment. This change was suggested by Jim Cakalic (jim_cakalic@na.biomerieux.com). RollingFileAppender adds file roll over capability-implemented by Heinz Richter (heinz.richter@ecmwf.int). Corrected a bug where a java.lang.NoClassDefFoundError would be thrown because com.ibm.log4j.helpers.SyslogTracerPrintWriter was not included in log4j.jar. Thanks to Jim Cakalic (jim_cakalic@na.biomerieux.com) for signaling this bug. There has been an important API changes. The Log, NOPLog and ILog classes have been removed. Their functionality has been migrated to the Category class. In this release, instead of writing ILog.debug(CAT, "Some message."); one will write CAT.debug("Some message."); Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> observed that one could use the Category objects directly for logging. It is no longer possible to instantiate Category objects directly. Instead, one would use the factory method Category.getInstance(String name). [***] There category instantiation code was moved to CateogryFactory class. This class has package visibility and remains hidden from the user. This stylistic improvement was suggested by Luke Blanshard (luke@quiq.com). The Init class offers methods to initialize the log4j environment. The Init.flagAsShippedCode method replaces the NOPLog class. Changes in the documentation to reflect the API changes. The NDC.cloneStack and inherit methods now tolerate null-stacks. TTCCLayout now takes a java.text.DateFormat object as a parameter. The task of formatting the date is delegated to this object. Added four classes extending the java.text.DateFormat class. These are RelativeTimeDateFormat, AbsoluteTimeDateFormat, DateTimeDateFormat and ISO8601DateFormat classes. Thanks to Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> for suggesting the ISO8601 date format. These four classes can be parametrized with a particular TimeZone. The TTCCLayout class now accepts a new configuration file option called "TimeZone". These four DateFormats are less malleable than the java.text.SimpleDateFormat but they are also much faster. As a consequence of these changes, the setRelativeTime, setDatePrinting methods in TTCCLayout have been removed along with the associated configuration file options RelativeTime, DatePrinting and TimePrinting. The current code is inspired by code contributed by Heinz Richter (heinz.richter@ecmwf.int). The Log.emerg method has been deprecated. If you use statements of EMERG priority, please use the Log.log form instead. Add getDepth and setMaxdepth methods to the NDC class. This makes it easier to manage the nested context depth especially when callees push but forget to pop. Moved the documentation in com/ibm/log4j/package.html to com/ibm/log4j/overview.html. Many users were failing to read the com/ibm/log4j/package.html description due to the unfortunate layout of the text. Hopefully more people will read the package overview in its present location. Add the com.ibm.log4j.net package for doing remote logging using TCP sockets. This is still experimental code. Add new debug, .., emerg methods that do not require a category parameter. They assume the "root" category, that is the decision to whether print or not is made by comparing the statement's priority with the default priority. Add a new ILog.init method accepting an Appender and a configuration file as parameters. FileAppender's setWriter and setFile methods where not instantiating a new tracer. This caused stack traces to be lost! SyslogAppender had a similar problem. The FileAppender and SyslogAppender where not calling the layout's readConfig method to set layout specific options. Thanks to Heinz Richter (heinz.richter@ecmwf.int) for reporting this bug. Corrected a bug in Log.log() method where the appender was always called with Priority.DEBUG. Thanks to Oliver Boehm (Oliver.Boehm@abaxx.de) for reporting this bug. Add Syslog compatibility. One can now choose (at runtime) between remote syslog logging or file logging. Syslog logging performance, although not appalling, is significantly slower than file logging. Priority class was enriched with the previously missing priorities NOTICE, ALERT and CRIT. The internal constants were also aligned with the syslog counterparts. Add the Log.log method to support the new priorities. TracerPrintWriter is now an independent class instead of being a nested top-level class in Tracer. A number of writers, namely the SyslogWriter, SyslogQuietWriter, SyslogTracerPrintWriter, were added to the helper package. Log.force method was removed. The various Appender.doAppend implementations take over its functionality. FileAppender and SyslogAppender now use QuietWriter. QuietWriter is a FilterWriter which hides exceptions and instead emits a single warning message to System.err. The layout is now an initialization parameter to the appender type. Previously, the layout and the appender where independent parameters to the Log constructor. Many small improvements and corrections in the documentation. Syslog related documentation remains sparse. ILog.init() and ILog.init(String configFile) have been changed to call ILog.init(,,,) with "com.ibm.log4j.Log.class" as the first parameter. This makes it easier for people to get familiar with log4j. Add missing files to the make directory. These files are useful for those wishing to use the log4j make environment. Thanks to "Lee Hall" <LHall@JavaFoundry.com> for reporting this omission. Until recently the make environment failed to compile RMI stubs in a single run. This nagging problem has been corrected thanks to help from Thomas Eirich (IBM Zurich Research Lab). Some users have been rightly complaining about the verbosity TTCCLayout's date output. The full date output is now shortened to "dd MMM YYYY HH:mm:ss.SSS" for example, "06 Nov 1994 08:49:37.459" In addition, users may now choose to print only time information, as in "08:49:37.459". The package now uses Writer instead of OutputStream as its output target. This makes the log4j code smaller and easier to understand at the cost of a slight performance degradation. As a result of this change a few method names in FileAppender class were changed. Preliminary experiments with SyslogAppedner and SyslogLayout show that syslog compatibility is not far away. The difficultly is adding syslog compatibility without making radical changes to the current log4j architecture. Corrected a bug in the NOPLog.createInstance method which always created a Log singleton even if the system property "log4j.logType" was set to NOPLog. Thanks to Robert Gottofrey (Robert.Gottofrey@wdr.com) for reporting this bug and the associated test case. Removed the inconsistent "Layout" configuration option in Log.readConfig(). This change should be transparent to most users. The LogCreationManager class has been removed. Its functionality has been transfered to the createInstance and getInstance methods in the Log and NOPLog classes. The new way of creating instances is both simpler and less error prone although just as flexible. As a result of these changes, the init family of methods in the ILog class have been adjusted to the new way of creating the log singleton. The Appender interface has been introduced. The method of writing a log statement into an output stream can now be varied by using a different Appender. The new FileAppender offers the same functionality that was previously part of the Log class. Changed the time format used in TTCCLayout to be of the form "Day, dd MMM YYYY HH:mm:ss.SSS GMT" for example, "Sun, 06 Nov 1994 22:49:37.459 GMT". This format is almost the same as the format specified in RFC 1123 and also the format recommended in RFC 2616. The only difference is the additional milliseconds information. The layout specific options were not read from the configuration file due to a missing instruction. Many thanks to Vikram Sridharan (Vikram.Sridharan@alysis.com) to patiently pointing out this omission to an unbelieving maintainer. Version 0.7.0 and above will be distributed under the IBM Public License (IPL). The IPL is an approved open source license (see http://www.opensource.org/licenses/ for a list). It grants similar rights to the previous ALPHAWORKS license agreement, in particular, the right to redistribute and to modify the package. The Log class can now be parameterized with a Layout object. Layouts determine the format of what is printed, where as the Log class decides when to print and to where. As a result of this modularization, the CGULog and NOPCGULog classes no longer exists. CGULog class has been replaced with the TTCCLayout (Time Thread Context Category). This should make it easier to create new log output formats. Some time in the near future, the Log class will be further broken down to allow different strategies for writing to output streams. Renamed com.ibm.util.log hierarchy to to com.ibm.log4j. I wanted to do this for some time. I feel release 0.7.0 was the last opportunity to do so. I am sorry for the the trouble caused by this change. New NDC class. This class implements nested diagnostic contexts as suggested by Neil Harrison in the article "Patterns for Logging Diagnostic Messages" part of the book "Pattern Languages of Program Design 3" edited by Martin et al. Nested diagnostic contexts is a nifty feature that was missing up to now. The StressNDC test class seems to break JDK 1.2.2 beta on AIX. On Linux and NT using sun's JDK 1.2.2 it seem to work OK. In any case, tests done with StressNDC and associated perl script seem to indicate that the NDC class is bug-free. Corrected a date formatting bug in CGULog class where on some environments the wrong month was printed. Thanks to Christopher Williams (Christopher_Williams@mail.northgrum.com) for signaling this bug. Also changed the month format from a number to a three letter abbreviation such as "Jan", "Feb", ..., "Dec". The new format is unambiguous regardless of local date format. Clearer documentation with still much room for improvement. Corrected a bug in the Tracer class which always used the Unix line separator instead of the system specific separator. Thanks to Vikram Sridharan (Vikram.Sridharan@alysis.com) for singaling this bug. Corrected a runaway comment which gulped the CGULog.readConfig method. Add the init family of methods to the ILog class to ease the setup of a basic logging environment. Thanks to Mark Donszelmann (Mark.Donszelmann@cern.ch) for this enhancement. Just an hour after releasing version 0.6.1 detected and corrected a bug where the Tracer class would correctly print Exception stack trace but not the type of the Exception. Replaced the distribution on www.zurich.ibm.com without changing the version number. I hope nobody is using the intermediary (and buggy) release of 0.6.1. Better documentation with still much room for improvement. For consistence sake, added setDefaultPriority and getDefaultPriority methods to the Category class and deprecated setDefaultPriority in the Log.class. Corrected a major bug where if two categories were homonyms the second instance would not be properly initialized. Increased the speed of Exception logging from about 4000 microseconds to about 1000. It seems that for some people Exception logging is performance critical. Improved implementation is a variant of Nocolai's (XNH@crisplant.com) implementation. Release of log4j 0.6.0 with incomplete documentation. Add a stress test program to debug the new Category class. It turns out that the test program was as hard to get right as the Category class. Given the favorable results of the stress test I am quite confident that the new class is now bug free. This assumption has been proven to be wrong. See above.

    Created a new class called Category to manipulate categories instead of plain Strings. The new class is just as easy to use. However, the evaluation of whether to log or not to log is at least 10 times faster. The NOP class performance remain unaffected by the change. (You can't improve on the performance of an empty function call.)

    Many thanks to Alex Blewitt "Alex.Blewitt@ioshq.com" for his valuable comments. He was the first to observe that finding Strings in a hash table was an expensive operation.

    This change will require some recoding on your part. See the FAQ for more details.

    Modified the force in Log and CGULog method to use a byte[] buffer instead of a StringBuffer. The old code was clearer but the new one is at least 25% faster. Add regression testing.

    We now enforce a policy where the OutputStream set by setOutputStream is a user managed resource whereas the OutputStream opened using setLogFile is the Log class' responsibility.

    The setLogFile method now closes any previous OutputStream if only if opened through setLogFile. If the previous OutputStream was opened by the user and set through setOutputStream the previous OutputStream is untouched.

    Similarly, setOutputStream will close any previous OutputStream if and only if it was opened using setLogFile.

    Add a new method logOutputStreamExists to the Log class allowing the programmer to check if there is already an opened stream before trying to set a new one. A stream can be opened as a byproduct of reading the configuration file.

    Changed the behavior of the (private) Log.Append method in case of failure to write to the OutputStream.

    Previously, in case of failure, we reverted to System.err. Now, we emit a warning message and discard all future log messages. The new behavior is consistent with our current unreliable logging semantics. The change prevents an otherwise functional program from failing because the terminal is flooded with logging messages.

    Renamed the iLog to ILog to remain consistent with our class naming scheme. The initial intention was to add ILog and deprecate iLog. However, I am running CVS on a fat16 partition, causing serious problems when files differ only in case. Corrected a bug where the LogFileName was not remembered. Thanks to Jens for signaling this bug.
    Now the programmer can choose to truncate the log file instead of always appending to it. This functionality was first requested and intially implemented by "Jens Uwe Pipka" jens.pipka@gmx.de. setLogFile now opens the requested file instead of having the Append function open it later. Cleaned up some related code in the Append function. Although nobody has requested it, there is still no method to close the log file. This is harder to implement reliably than it sounds. Simplified setLogOutputStream so that it does no longer return the previously set OutputStream. Joe Walker (joe@eireneh.com) observed that the LogCreationManager.getSingleton mechanism was cumbersome. There is now a new class iLog (indirect Log) which hides the need to call getSingleton. Performance testing on my 233Mhz Thinkpad shows that this indirection has small performance impact on non-logged calls in the order of 40 nanoseconds. The impact on logged calls is negligible. Add a jar file to the distribution. The jar file contains only the files you would need to use log but not other classes needed for testing nor examples. Corrected a bug where CGUNOPLog was not integrated to the Makefile. Add new public methods isDebugEnabled and isInfoEnabled to allow programmers to check whether a debug/info statement will be logged without incurring the cost of message parameter construction. This addition was suggested by Luke Blanshard Luke@quiq.com. Renamed the private method evaluate to isEnabled. Also made it final with no apparent speed gains. In addition, made the Log.force method public. New syntactic sugar debug, ..., emerg, methods to log objects. Modified the interface to deal with Throwables and not just Exceptions. My thanks to Luke Blanshard for signaling this "bug". Add more tests to the LogPerformance class. In particular, to test the influence of indirect debug calls. Add a "make" mini-tutorial for those who want to modify the code. License updated to standard alphaWorks license allowing modifications to source code. However, this license explicitly requires that modifications be communicated back to alphaWorks. Initial availability on alphaWorks. Refer to the FAQ for the lineage of the package.
    \ No newline at end of file diff --git a/src/site/apt/books.apt b/src/site/apt/books.apt deleted file mode 100644 index 16ac21318c..0000000000 --- a/src/site/apt/books.apt +++ /dev/null @@ -1,61 +0,0 @@ - ------ - Maven Features - ------ - Jason van Zyl - ------ - 12 October 2005 - ------ - -Feature Summary - - The following are the key features of Maven in a nutshell: - - * Simple project setup that follows best practices - get a new project or module started in seconds - - * Consistent usage across all projects means no ramp up time for new developers coming onto a project - - * Superior dependency management including automatic updating, dependency closures (also known as transitive dependencies) - - * Able to easily work with multiple projects at the same time - - * A large and growing repository of libraries and metadata to use out of the box, and arrangements in place with the largest Open Source projects for - real-time availability of their latest releases - - * Extensible, with the ability to easily write plugins in Java or scripting languages - - * Instant access to new features with little or no extra configuration - - * Ant tasks for dependency management and deployment outside of Maven - - * Model based builds: - Maven is able to build any number of projects into predefined output types - such as a JAR, WAR, or distribution based on metadata about the project, without - the need to do any scripting in most cases. - - * Coherent site of project information: - Using the same metadata as for the build process, Maven is able to generate a - web site or PDF including any documentation you care to add, and adds to that - standard reports about the state of development of the project. - Examples of this information can be seen at the bottom of the left-hand navigation of - this site under the "Project Information" and "Project Reports" submenus. - - * Release management and distribution publication: - Without much additional configuration, Maven will integrate with your source control - system such as CVS and manage the release of a project based on a certain tag. - It can also publish this to a distribution location for use by other projects. - Maven is able to publish individual outputs such as a JAR, an archive including other - dependencies and documentation, or as a source distribution. - - * Dependency management: - Maven encourages the use of a central repository of JARs and other dependencies. Maven - comes with a mechanism that your project's clients can use to - download any JARs required for building your project from a - central JAR repository much like Perl's CPAN. This allows users - of Maven to reuse JARs across projects and encourages communication - between projects to ensure that backward compatibility issues are - dealt with. We are collaborating with the folks at {{{http://www.ibiblio.org}Ibiblio}} who have graciously - allowed the central repository to live on their servers. - - [] - -~~ this needs to be greatly expanded and is too detailed here ... jvz diff --git a/src/site/apt/index.apt b/src/site/apt/index.apt index 385a53973f..238e417313 100644 --- a/src/site/apt/index.apt +++ b/src/site/apt/index.apt @@ -1,135 +1,70 @@ +~~ Licensed to the Apache Software Foundation (ASF) under one or more +~~ contributor license agreements. See the NOTICE file distributed with +~~ this work for additional information regarding copyright ownership. +~~ The ASF licenses this file to You under the Apache License, Version 2.0 +~~ (the "License"); you may not use this file except in compliance with +~~ the License. You may obtain a copy of the License at +~~ +~~ http://www.apache.org/licenses/LICENSE-2.0 +~~ +~~ Unless required by applicable law or agreed to in writing, software +~~ distributed under the License is distributed on an "AS IS" BASIS, +~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +~~ See the License for the specific language governing permissions and +~~ limitations under the License. ------ - What is Maven? + log4j 1.2 ------ - Jason van Zyl ------ - 12 October 2005 ------ -Introduction - - Maven was originally started as an attempt to simplify the build - processes in the Jakarta Turbine project. There were several - projects each with their own Ant build files that were all slightly - different and JARs were checked into CVS. We wanted a standard way to - build the projects, a clear definition of what the project consisted - of, an easy way to publish project information and a way to share JARs - across several projects. - - The result is a tool that can now be used for building and managing - any Java-based project. We hope that we have created something that - will make the day-to-day work of Java developers easier and generally - help with the comprehension of any Java-based project. - -Maven's Objectives - - Maven's primary goal is to allow a developer to comprehend the - complete state of a development effort in the shortest period of - time. In order to attain this goal there are several areas of concern - that Maven attempts to deal with: - - * Making the build process easy - - * Providing a uniform build system - - * Providing quality project information - - * Providing guidelines for best practices development - - * Allowing transparent migration to new features - -* Making the build process easy - - While using Maven doesn't eliminate the need to know about the - underlying mechanisms, Maven does provide a lot of shielding - from the details. - -* Providing a uniform build system - - Maven allows a project to build using its project object model (POM) and - a set of plugins that are shared by all projects using - Maven, providing a uniform build system. Once you familiarize yourself - with how one Maven project builds you automatically know how all Maven - projects build saving you immense amounts of time when trying to - navigate many projects. - -* Providing quality project information - - Maven provides plenty of useful project information that is in - part taken from your POM and in part generated from your project's - sources. For example, Maven can provide: - - * Change log document created directly from source control - - * Cross referenced sources - - * Mailing lists - - * Dependency list - - * Unit test reports including coverage - - [] - - As Maven improves the information set provided will improve, all of - which will be transparent to users of Maven. - - Other products can also provide Maven plugins to allow their set of - project information alongside some of the standard information given by - Maven, all still based on the POM. - -* Providing guidelines for best practices development - - Maven aims to gather current principles for best practices development, and - make it easy to guide a project in that direction. - - For example, specification, execution, and reporting of unit tests are part of - the normal build cycle using Maven. - Current unit testing best practices were used as guidelines: - - * Keeping your test source code in a separate, but parallel source tree - - * Using test case naming conventions to locate and execute tests - - * Have test cases setup their environment and don't rely on customizing the build for test preparation. - - [] - - Maven also aims to assist in project workflow such as release management and - issue tracking. - - Maven also suggests some guidelines on how to layout your project's directory structure - so that once you learn the layout you can easily navigate any other project that uses - Maven and the same defaults. - -* Allowing transparent migration to new features - - Maven provides an easy way for Maven clients to update their installations - so that they can take advantage of any changes that been made to - Maven itself. - - Installation of new or updated plugins from third parties or Maven itself has - been made trivial for this reason. - -What is Maven Not? - - You may have heard some of the following things about Maven: - - * Maven is a site and documentation tool - - * Maven extends Ant to let you download dependencies - - * Maven is a set of reusable Ant scriptlets - - [] - - While Maven does these things, as you can read above in the "What is Maven?" section, - these are not the only features Maven has, and its objectives are quite different. - - Maven does encourage best practices, but we realise that some projects may not fit with - these ideals for historical reasons. While Maven is designed to be flexible, to an extent, in these - situations and to the needs of different projects, it can not cater to every situation without making - compromises to the integrity of its objectives. - - If you decide to use Maven, and have an unusual build structure that you cannot reorganise, you may - have to forgo some features or the use of Maven altogether. + Inserting log statements into your code is a low-tech method + for debugging it. It may also be the only way because + debuggers are not always available or applicable. This is + often the case for distributed applications. + + On the other hand, some people argue that log statements + pollute source code and decrease legibility. (We believe that + the contrary is true). In the Java language where a + preprocessor is not available, log statements increase the + size of the code and reduce its speed, even when logging is + turned off. Given that a reasonably sized application may + contain thousands of log statements, speed is of particular + importance. + + + With log4j it is possible to enable logging at runtime + without modifying the application binary. The log4j package is + designed so that these statements can remain in shipped code + without incurring a heavy performance cost. Logging behavior + can be controlled by editing a configuration file, without + touching the application binary. + + Logging equips the developer with detailed context for + application failures. On the other hand, testing provides + quality assurance and confidence in the application. Logging + and testing should not be confused. They are + complementary. When logging is wisely used, it can prove to be + an essential tool. + + One of the distinctive features of log4j is the notion of + inheritance in loggers. Using a logger + hierarchy it is possible to control which log + statements are output at arbitrarily fine granularity but also + great ease. This helps reduce the volume of logged output and + minimize the cost of logging. + + The target of the log output can be a file, an + OutputStream, a java.io.Writer, a + remote log4j server, a remote Unix Syslog daemon, or many other output targets. + + On an AMD Duron clocked at 800Mhz running JDK 1.3.1, it costs + about 5 nanoseconds to determine if a logging statement should + be logged or not. Actual logging is also quite fast, ranging + from 21 microseconds using the SimpleLayout, 37 + microseconds using the TTCCLayout. The performance of the + PatternLayout is almost as good as the dedicated layouts, + except that it is much more flexible. + + The package is being constantly improved thanks to input from + users and code contributed by authors in the community. diff --git a/src/site/apt/publications.apt b/src/site/apt/publications.apt new file mode 100644 index 0000000000..46b1bfddbe --- /dev/null +++ b/src/site/apt/publications.apt @@ -0,0 +1,83 @@ +~~ Licensed to the Apache Software Foundation (ASF) under one or more +~~ contributor license agreements. See the NOTICE file distributed with +~~ this work for additional information regarding copyright ownership. +~~ The ASF licenses this file to You under the Apache License, Version 2.0 +~~ (the "License"); you may not use this file except in compliance with +~~ the License. You may obtain a copy of the License at +~~ +~~ http://www.apache.org/licenses/LICENSE-2.0 +~~ +~~ Unless required by applicable law or agreed to in writing, software +~~ distributed under the License is distributed on an "AS IS" BASIS, +~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +~~ See the License for the specific language governing permissions and +~~ limitations under the License. + ------ + log4j 1.2 Publications + ------ + Curt Arnold + ------ + 8 May 2007 + ------ + + +Books + + * Ceki G\xFClc\xFC. 2004. The complete log4j manual. QoS.ch. {{{http://www.qos.ch/shop/products/eclm/}http://www.qos.ch/shop/products/eclm/}}. + + * Samudra Gupta. 2007. Pro Apache log4j, Second Edition. APress. + +Articles: + + * Vipan Singla. Don't Use System.out.println! Use Log4j. + {{{http://www.vipan.com/htdocs/log4jhelp.html}http://www.vipan.com/htdocs/log4jhelp.html}}. + + * Vikran Goyal. Build Flexible Logs With log4j. + {{{http://www.onjava.com/pub/a/onjava/2002/08/07/log4j.html}http://www.onjava.com/pub/a/onjava/2002/08/07/log4j.html}}. + + * Ashley J.S. Mills. Log4J. + {{{http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/log4j/log4j.html}http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/log4j/log4j.html}}. + + * Kevin Brown. Add logging to your Java Applications. + {{{http://www.builder.com.com/article.jhtml?id=u00820020124kev01.htm} + http://www.builder.com.com/article.jhtml?id=u00820020124kev01.htm}} + + * Kevin Brown. How does the Java logging API stack up against log4j? + {{{http://www.builder.com.com/article.jhtml?id=u00220020724kev01.htm} + http://www.builder.com.com/article.jhtml?id=u00220020724kev01.htm}}. + + * Michael Canzoneri. Log4J FAQ. {{{http://www.jguru.com/faq/Log4j}http://www.jguru.com/faq/Log4j}}. + + * Ceki G\xFClc\xFC. Think Again. + {{{http://www.qos.ch/logging/thinkAgain.html}http://www.qos.ch/logging/thinkAgain.html}}. + + * Ceki G\xFClc\xFC. Supporting the log4j RepositorySelector. + {{{http://www.qos.ch/logging/sc.html}http://www.qos.ch/logging/sc.html}}. + + * Ceki G\xFClc\xFC. Log4j delivers control over logging. + {{{http://www.javaworld.com/jw-11-2000/jw-1122-log4j.html}http://www.javaworld.com/jw-11-2000/jw-1122-log4j.html}}. + + * Vikram Goyal. Understanding Classloaders: log4j in a J2EE Environment. + {{{http://www.onjava.com/pub/a/onjava/2003/04/02/log4j_ejb.html}http://www.onjava.com/pub/a/onjava/2003/04/02/log4j_ejb.html}}. + + * Ruth Zamorano and Rafeal Luque. Instant logging: Harness the power of log4j with Jabber. + {{{http://www-106.ibm.com/developerworks/java/library/j-instlog/}http://www-106.ibm.com/developerworks/java/library/j-instlog/}}. + + * Matthew Litkey, Jay Galvin, and Marina Sum. + Developer Tip: Adding the log4j API to Applications on Sun Java System Application Server 7 + {{{http://developers.sun.com/prodtech/appserver/reference/techart/log4j.html}http://developers.sun.com/prodtech/appserver/reference/techart/log4j.html}}. + + * Sean C. Sullivan. Reporting Application Errors by Email. + {{{http://www.onjava.com/pub/a/onjava/2004/09/29/smtp-logging.html}http://www.onjava.com/pub/a/onjava/2004/09/29/smtp-logging.html}}. + + +Presentations: + + * John Munsch. Log4J In 30 Minutes Or Less. + {{{http://www.johnmunsch.com/projects/Presentations/}http://www.johnmunsch.com/projects/Presentations/}}. + + * Ceki G\xFClc\xFC. Log4j, a logging package for the Java language. + {{{http://www.qos.ch/ac2001/F11-10.html}http://www.qos.ch/ac2001/F11-10.html}}. + + * Brent Twenter. Log4j. {{{http://www.ociweb.com/javasig/knowledgebase/January2001/Log4J.ppt}http://www.ociweb.com/javasig/knowledgebase/January2001/Log4J.ppt}}. + \ No newline at end of file diff --git a/src/site/apt/roadmap.apt b/src/site/apt/roadmap.apt index 16ac21318c..247c7cc155 100644 --- a/src/site/apt/roadmap.apt +++ b/src/site/apt/roadmap.apt @@ -1,61 +1,28 @@ +~~ Licensed to the Apache Software Foundation (ASF) under one or more +~~ contributor license agreements. See the NOTICE file distributed with +~~ this work for additional information regarding copyright ownership. +~~ The ASF licenses this file to You under the Apache License, Version 2.0 +~~ (the "License"); you may not use this file except in compliance with +~~ the License. You may obtain a copy of the License at +~~ +~~ http://www.apache.org/licenses/LICENSE-2.0 +~~ +~~ Unless required by applicable law or agreed to in writing, software +~~ distributed under the License is distributed on an "AS IS" BASIS, +~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +~~ See the License for the specific language governing permissions and +~~ limitations under the License. ------ - Maven Features + log4j 1.2 Roadmap ------ - Jason van Zyl + Curt Arnold ------ - 12 October 2005 + 8 May 2007 ------ -Feature Summary +log4j 1.2 Roadmap - The following are the key features of Maven in a nutshell: - - * Simple project setup that follows best practices - get a new project or module started in seconds - - * Consistent usage across all projects means no ramp up time for new developers coming onto a project - - * Superior dependency management including automatic updating, dependency closures (also known as transitive dependencies) - - * Able to easily work with multiple projects at the same time - - * A large and growing repository of libraries and metadata to use out of the box, and arrangements in place with the largest Open Source projects for - real-time availability of their latest releases - - * Extensible, with the ability to easily write plugins in Java or scripting languages - - * Instant access to new features with little or no extra configuration - - * Ant tasks for dependency management and deployment outside of Maven - - * Model based builds: - Maven is able to build any number of projects into predefined output types - such as a JAR, WAR, or distribution based on metadata about the project, without - the need to do any scripting in most cases. - - * Coherent site of project information: - Using the same metadata as for the build process, Maven is able to generate a - web site or PDF including any documentation you care to add, and adds to that - standard reports about the state of development of the project. - Examples of this information can be seen at the bottom of the left-hand navigation of - this site under the "Project Information" and "Project Reports" submenus. - - * Release management and distribution publication: - Without much additional configuration, Maven will integrate with your source control - system such as CVS and manage the release of a project based on a certain tag. - It can also publish this to a distribution location for use by other projects. - Maven is able to publish individual outputs such as a JAR, an archive including other - dependencies and documentation, or as a source distribution. - - * Dependency management: - Maven encourages the use of a central repository of JARs and other dependencies. Maven - comes with a mechanism that your project's clients can use to - download any JARs required for building your project from a - central JAR repository much like Perl's CPAN. This allows users - of Maven to reuse JARs across projects and encourages communication - between projects to ensure that backward compatibility issues are - dealt with. We are collaborating with the folks at {{{http://www.ibiblio.org}Ibiblio}} who have graciously - allowed the central repository to live on their servers. - - [] - -~~ this needs to be greatly expanded and is too detailed here ... jvz + log4j 1.2 is mature and future development on the log4j 1.2 branch + is expected to be limited to bug fixes and minor enhancements. + Any major new features for log4j 1.2 are likely to be developed + as companion products for log4j 1.2. diff --git a/src/site/fml/faq.fml b/src/site/fml/faq.fml index b2655ee537..546d8b6a21 100644 --- a/src/site/fml/faq.fml +++ b/src/site/fml/faq.fml @@ -18,20 +18,764 @@ --> - - How do I prevent including JARs in WEB-INF/lib? I need a "compile only" scope! + + + What is log4j? +

    log4j is a tool to help the programmer output log statements to a + variety of output targets. +

    + +

    In case of problems with an application, it is helpful to + enable logging so that the problem can be located. With log4j + it is possible to enable logging at runtime without modifying + the application binary. The log4j package is designed so that + log statements can remain in shipped code without + incurring a high performance cost. It follows that the speed + of logging (or rather not logging) is capital. +

    + +

    At the same time, log output can be so voluminous that it quickly + becomes overwhelming. One of the distinctive features of log4j is the + notion of hierarchical loggers. Using loggers it is + possible to selectively control which log statements are output at + arbitrary granularity. +

    + +

    log4j is designed with two three goals in mind: + reliability, speed and flexibility. There is a tight balance + between these requirements. We believe that log4j strikes the + right balance. +

    +
    +
    + + + Is log4j a reliable logging system? +

    No. log4j is not reliable. It is a best-effort + fail-stop logging system. +

    + +

    By fail-stop, we mean that log4j will not throw unexpected + exceptions at run-time potentially causing your application to + crash. If for any reason, log4j throws an uncaught exception, + please send an email to the log4j-user@logging.apache.org + mailing list. Uncaught exceptions are handled as serious bugs + requiring immediate attention. +

    + +

    Moreover, log4j will not revert to System.out or System.err + when its designated output stream is not opened, is not writable or + becomes full. This avoids corrupting an otherwise working program by + flooding the user's terminal because logging fails. However, log4j + will output a single message to System.err indicating that logging can + not be performed. +

    + + What are the prerequisites for log4j? +

    Log4j versions upto and including 1.2.8 are + compatible with JDK 1.1.x and later. Log4j version 1.3 will + be compatilble with JDK 1.2 and later. +

    + +

    The DOMConfigurator is based on the DOM Level 1 + API. The DOMConfigurator.configure(Element) method will work + with any XML parser that will pass it a DOM tree. +

    +

    The DOMConfigurator.configure(String filename) method and its + variants require a JAXP compatible XML parser, for example Xerces or Sun's + parser. Compiling the DOMConfigurator requires the presence of a + JAXP parser in the classpath. +

    + +

    The org.apache.log4j.net.SMTPAppender + relies on the JavaMail + API. It has been tested with JavaMail API version + 1.2. The JavaMail API requires the JavaBeans + Activation Framework package. +

    + +

    The org.apache.log4j.net.JMSAppender + requires the presence of the JMS API as well as JNDI. +

    + +

    log4j test code relies on the JUnit testing framework. +

    +
    + + What are the features of log4j? + +

    log4j is optimized for speed.

    + +

    log4j is based on a named logger hierarchy.

    + +

    log4j is fail-stop. However, altough it certainly + strives to ensure delivery, log4j does not guarantee that + each log statement will be delivered to its destination. +

    + +

    log4j is thread-safe.

    + +

    log4j is not restricted to a predefined set of + facilities.

    + +

    Logging behavior can be set at runtime using a + configuration file. Configuration files can be property + files or in XML format.

    + +

    log4j is designed to handle Java Exceptions from the + start.

    + +

    log4j can direct its output to a file, the console, + an java.io.OutputStream, + java.io.Writer, a remote server using TCP, a + remote Unix Syslog daemon, to a remote listener using JMS, + to the NT EventLog or even send e-mail.

    + +

    log4j uses 5 levels, namely DEBUG, INFO, WARN, ERROR and + FATAL. +

    + +

    The format of the log output can be easily changed by + extending the Layout + class.

    + +

    The target of the log output as well as the writing + strategy can be altered by implementations of the + Appender interface.

    + +

    log4j supports multiple output appenders per logger. +

    + +

    log4j supports internationalization.

    +
    + + Is there example code for using log4j? + +

    See the examples/ directory.

    +
    +
    + + + What documentation should I read to learn more about + log4j? +

    Make sure to read the short + manual. It is also recommended to you read The complete + log4j manual which is much more detailed and up to + date. Both documents were written by Ceki Gülcü. +

    +
    + + Is log4j thread-safe? + +

    Yes, log4j is thread-safe. Log4j components are designed to + be used in heavily multithreaded systems.

    + +
    + + What does log output look like? + +

    The log output can be customized in many ways. Moreover, + one can completely override the output format by implementing + one's own Layout. +

    + +

    Here is an example output using PatternLayout with + the conversion pattern "%r [%t] %-5p %c{2} %x - %m%n" +

    + +
    +176 [main] INFO  examples.Sort - Populating an array of 2 elements in reverse order.
    +225 [main] INFO  examples.SortAlgo - Entered the sort method.
    +262 [main] DEBUG SortAlgo.OUTER i=1 - Outer loop.
    +276 [main] DEBUG SortAlgo.SWAP i=1 j=0 - Swapping intArray[0] = 1 and intArray[1] = 0
    +290 [main] DEBUG SortAlgo.OUTER i=0 - Outer loop.
    +304 [main] INFO  SortAlgo.DUMP - Dump of interger array:
    +317 [main] INFO  SortAlgo.DUMP - Element [0] = 0
    +331 [main] INFO  SortAlgo.DUMP - Element [1] = 1
    +343 [main] INFO  examples.Sort - The next log statement should be an error message.
    +346 [main] ERROR SortAlgo.DUMP - Tried to dump an uninitialized array.
    +        at org.log4j.examples.SortAlgo.dump(SortAlgo.java:58)
    +        at org.log4j.examples.Sort.main(Sort.java:64)
    +467 [main] INFO  examples.Sort - Exiting main method.
    +	
    + +

    The first field is the number of milliseconds elapsed since + the start of the program. The second field is the thread + outputting the log statement. The third field is the level of + the log statement. The fourth field is the rightmost two + components of the logger making the log request. The fifth + field (just before the '-') is the nested diagnostic + context (NDC). Note the nested diagnostic context may be + empty as in the first two statements. The text after the '-' + is the message of the statement. +

    +
    + + Why should I use log4j when JDK 1.4 already ships with a + logging API? + +

    - The scope you should use for this is - provided. This indicates to Maven that the dependency will be - provided at run time by its container or the JDK, for example. + Although both APIs are conceptually similar, the log4j API is + significantly more flexible and offers many more features, too + numerous to be listed here. You will discover that the + additional features and flexibility turn out to be + indispensable in the context of a mission-critical + application. +

    + +

    The open and collaborative way in which log4j is developped + ensures that it continues to preserve and even widen its + competitive edge. At some point, input from bright developers + from all over the world is bound to make a difference.

    +
    +
    + + + What are Loggers? + + +

    Lggers lie at the heart of log4j. Loggers define a hierarchy and give + the programmer run-time control on which statements are + printed or not. +

    + +

    Loggers are assigned levels. A log statement is printed + depending on its level and its logger. +

    + +

    Make sure to read the log4j manual + for more information. +

    +
    + +How can I change log behavior at runtime? + +

    Log behavior can be set using configuration files which are parsed + at runtime. Using configuration files the programmer can define + loggers and set their levels. +

    + +

    The PropertyConfigurator defines a particular format + of a configuration file. See also the examples/Sort.java + example and associated configuration files. +

    + +

    Configuration files can be specified in XML. See + log4j.dtd and + org.log4j.xml.DOMConfigurator for more details. +

    + +

    See the various Layout and Appender components for specific + configuration options. +

    + +

    In addition to configuration files, the user may disable all + messages belonging to a set of levels. See next item. +

    + +
    + + What is the fastest way of (not) logging? + +

    For some logger l, writing, +

    + +
    + l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
    +	
    + +

    incurs the cost of constructing the message parameter, that is + converting both integer i and entry[i] to a + String, and concatenating intermediate strings. This, regardless of + whether the message will be logged or not. +

    + +

    If you are worried about speed, then write

    +
    +   if(l.isDebugEnabled()) {
    +     l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
    +   }
    +	
    + +

    This way you will not incur the cost of parameter + construction if debugging is disabled for logger + l. On the other hand, if the logger is debug + enabled, you will incur the cost of evaluating whether the + logger is enabled or not, twice: once in + debugEnabled and once in debug. + This is an insignificant overhead since evaluating a logger + takes less than 1% of the time it takes to actually log a + statement. +

    +
    + + Are there any suggested ways for naming loggers? + +

    Yes, there are.

    + +

    You can name loggers by locality. It turns out + that instantiating a logger in each class, with the logger name + equal to the fully-qualified name of the class, is a useful and + straightforward approach of defining loggers. This approach has + many benefits: +

    + +
      +
    • It is very simple to implement.
    • + +
    • It is very simple to explain to new developers.
    • + +
    • It automatically mirrors your application's own modular design. +
    • +
    • It can be further refined at will.
    • + +
    • Printing the logger automatically gives information on the locality + of the log statement.
    • +
    + +

    However, this is not the only way for naming loggers. A + common alternative is to name loggers by functional + areas. For example, the "database" logger, "RMI" + logger, "security" logger, or the "XML" logger. +

    + +

    You may choose to name loggers by functionality and + subcategorize by locality, as in "DATABASE.com.foo.some.package.someClass" or + "DATABASE.com.foo.some.other.package.someOtherClass". +

    + +

    You are totally free in choosing the names of your + loggers. The log4j package merely allows you to manage your + names in a hierarchy. However, it is your responsibility to define + this hierarchy. +

    + +

    Note by naming loggers by locality one tends to name things by + functionality, since in most cases the locality relates closely to + functionality. +

    +
    + + How do I get the fully-qualified name of a class in a static block? + +

    You can easily retrieve the fully-qualified name of a class in a + static block for class X, with the statement + X.class.getName(). Note that X is the class + name and not an instance. The X.class statement does + not create a new instance of class X. +

    + +

    Here is the suggested usage template:

    + +
    +package a.b.c;
    +
    +public class Foo {
    +  final static Logger logger = Logger.getLogger(Foo.class);
    +  ... other code
    +
    +}
    +	
    +
    + + Can the log output format be customized? + +

    Yes, you can extend the Layout class to create + you own customized log format. Appenders can be parameterized + to use the layout of your choice. +

    +
    + + What are the configurable options for FooBarAppender? + +

    Log4j uses JavaBeans style configuration.

    + +

    Thus, any setter method in FooBarAppender + corresponds to a configurable option. For example, in RollingFileAppender + the setMaxBackupIndex(int + maxBackups) method corresponds to the + maxBackupIndex option. The first letter of the + option can be upper case, i.e. MaxBackupIndex + and maxBackupIndex are equivalent but not + MAXBACKUPIndex nor mAXBackupIndex. +

    + +

    Layouts options are also defined by their setter methods. The same goes + for most other log4j components. +

    +
    + + What is the recommended way of migrating from + java.util.logging to log4j? + + +

    We suggest to just use global file search/replace. You should be able + to replace all the "java.util.Logger" references with + "org.apache.log4j.Logger", and you should be on your way. +

    + +

    If you're on a Win32 platform, we recommend Textpad. You can use the + CTRL+SHIFT+O to open all *.java files from a directory including all + its sub-directories, and then use the search/replace function to + replace in all files, and then CTRL+SHIFT+S to save all. Should take + about 60 seconds! :) +

    +
    + + Is it possible to direct log output to + different appenders by level? +

    Yes it is. Setting the Threshold option of any appender + extending AppenderSkeleton, + (most log4j appenders extend AppenderSkeleton) to filter out all log + events with lower level than the value of the threshold + option. +

    + +

    For example, setting the threshold of an appender to DEBUG + also allow INFO, WARN, ERROR and FATAL messages to log along + with DEBUG messages. This is usually acceptable as there is + little use for DEBUG messages without the surrounding INFO, + WARN, ERROR and FATAL messages. Similarly, setting the + threshold of an appender to ERROR will filter out DEBUG, INFO + and WARN messages but not ERROR or FATAL messages. +

    + +

    This policy usually best encapsulates what the user + actually wants to do, as opposed to her mind-projected + solution. +

    +

    See examples/sort4.lcf for an example threshold + configuration.

    + +

    If you must filter events by exact level match, then you can + attach a LevelMatchFilter + to any appender to filter out logging events by exact level match. +

    +
    + + + What does the Windows NT Event Viewer complain about + missing descriptions for my event messages when I use the + NTEventLogAppender? + + +

    The NT Event Viewer relies on message resource DLLs + to properly view an event message. The NTEventLogAppender.dll + contains these message resources, but that DLL must be copied + to %SYSTEMROOT%\SYSTEM32 for it to work properly. +

    +
    + + Why can't I map my logger names to the loggers that + appear in the NT Event Log when I use the + NTEventLogAppender? + + +

    Unfotunately, the logger names are hardcoded within the + message resource DLL (see previous question about + NTEventLogAppender), so there isn't any easy way to override + those dynamically... in fact, I don't think it's possible to + do it, as you'd have to modify the DLL resources for every + application. Since most native applications don't use the + Logger column anyway... +

    +
    + + Are there suggested approaches for logging in JSP pages? +

    - Dependencies with this scope will not be passed on transitively, nor will they be bundled in an package such - as a WAR, or included in the runtime classpath. + The suggested approach depends on your design requirements. If you or + your organization has no constraints on the use of Java in JSP pages, + simply use log4j normally in <% ... %> statements + as indicated in the Short Manual and the rest of the documentation.

    -
    +

    + However, if your design calls for a minimum amount of Java in your JSP + pages, consider using the + Log Taglib + from the Jakarta Taglibs project. It provides logging JSP tags that invoke + log4j. +

    +
    + Can the outputs of multiple client request go to + different log files? + +

    Many developers are confronted with the problem of + distinguishing the log output originating from the same class + but different client requests. They come up with ingenious + mechanisms to fan out the log output to different files. In + most cases, this is not the right approach. +

    + +

    It is simpler to use a nested diagnostic context + (NDC). Typically, one would NDC.push() client + specific information, such as the client's hostname, ID or any + other distinguishing information when starting to handle the + client's request. Thereafter, log output will automatically + include the nested diagnostic context so that you can + distinguish logs from different client requests even if they + are output to the same file. +

    + +

    See the NDC and the PatternLayout + classes for more information. The NumberCruncher + example shows how the NDC can be used to distinguish the log + output from multiple clients even if they share the same log + file. +

    + +

    For select applications, such as virtual hosting + web-servers, the NDC solution is not sufficient. As of version + 0.9.0, log4j supports multiple hierarchy trees. Thus, it is + possible to log to different targets from the same logger + depending on the current context. +

    +
    + + + Logger instances seem to be create only. Why isn't + there a method to remove logger instances? + +

    It is quite nontrivial to define the semantics of a + "removed" logger escecially if it is still referenced by the + user. Future releases may include a remove method in + the Logger class.

    + + How do I get multiple process to log to the same file? + +

    You may have each process log to a + SocketAppender. + The receiving + SocketServer + (or + SimpleSocketServer) + can receive all the events and send them to a single + log file. +

    +
    + + How about the timesamps of events generated by multiple + processes across multiple hosts (possibly across multiple + timezones)? + +

    The timestamp is created when the logging event is created. + That is so say, when the debug, + info, warn, error or + fatal method is invoked. Thus, the timestamp is + unaffected by the time at which event arrive at a remote + socket server. +

    + +

    Timestamps are stored in UTC format inside the + event. Consequently, when displayed or written to a log file, + timestamps appear in the same timezone as the host displaying + or creating the logfile. Note that because the clocks of + various machines may not be synchronized, there may be + timestamp inconsistencies between events generated on + different hosts. +

    +
    + + Why can't log4j find my properties file in a J2EE or WAR + application? +

    The short answer: the log4j classes and the properties file + are not within the scope of the same classloader. +

    + +

    The long answer (and what to do about it): J2EE or Servlet + containers utilize Java's class loading system. Sun changed + the way classloading works with the release of Java 2. In + Java 2, classloaders are arranged in a hierarchial + parent-child relationship. When a child classloader needs to + find a class or a resource, it first delegates the request to + the parent. +

    + +

    Log4j only uses the default Class.forName() + mechanism for loading classes. Resources are handled + similarly. See the documentation for + java.lang.ClassLoader for more details. +

    + +

    So, if you're having problems, try loading the class or + resource yourself. If you can't find it, neither will + log4j. ;) +

    + + + Is there a way to get log4j to automatically reload a + configuration file if it changes? + +

    Yes. Both the DOMConfigurator and the PropertyConfigurator support + automatic reloading through the configureAndWatch method. + See the API documentation for more details. +

    + + +

    Because the configureAndWatch launches a + separate wathdog thread, and because there is no way to stop + this thread in log4j 1.2, the configureAndWatch + method is unsafe for use in J2EE envrironments where + applications are recycled. +

    + + + Why should I donate my extensions to log4j back to the + project? +

    Contrary to the GNU Public License (GPL) the Apache + Software License does not make any claims over your + extensions. By extensions, we mean totally new code that + invokes existing log4j classes. You are free to do + whatever you wish with your proprietary log4j extensions. + In particular, you may choose to never release your extensions + to the wider public. +

    + +

    We are very careful not to change the log4j client API so + that newer log4j releases are backward compatible with + previous versions. We are a lot less scrupulous with the + internal log4j API. Thus, if your extension is designed to + work with log4j version n, then when log4j + release version n+1 comes out, you will probably + need to adapt your proprietary extensions to the new release. +

    + +

    Thus, you will be forced to spend precious resources in + order to keep up with log4j changes. This is commonly referred + to as the "stupid-tax." By donating the code and making it + part of the standard distribution, you save yourself the + unnecessary maintenance work. +

    + +

    If your extensions are useful then someone will eventually + write an extension providing the same or very similar + functionality. Your development effort will be wasted. Unless + the proprietary log4j extension is business critical, there is + little reason for not donating your extensions back to the + project. +

    + + What should I keep in mind when contributing code? + +
      + +
    1. +

      Write a test case for your contribution.

      + +

      There is nothing more irritating than finding the bugs + in debugging (i.e. logging) code. Writing a test case + takes some effort but is crucial for a widely used library + such as log4j. Writing a test case will go a long way in + earning you the respect of fellow developers. See the + tests/ directory for exiting test cases. +

      +
    2. + + +
    3. +

      Stick to the existing indentation style even if you hate it.

      + +

      Alternating between indentation styles makes it hard to + understand the source code. Make it a little harder on + yourself but easier on others. +

      + +

      Log4j has adopted a rather conservative approach by + following the Code Conventions + for the JavaTM Programming Language. We use 2 (two) + spaces for indentation and no tabs. +

      +
    4. + +
    5. +

      Please do not both modify the code and change the + indentation in a single commit.

      + +

      If you change the code and reformat it at the same time + and then commit, the commit notification message will be + hard to read. It will contain many diffs associated with + the reformatting in addition to logical changes. +

      + +

      If you must reformat and change the code, then perform + each step separately. For example, reformat the code and + commit. Following that, you can change the logic and + commit. The two steps can be performed in the reverse + order just as well. You can first change the logic and + commit and only later reformat and commit. +

      + +
    6. +
    7. +

      Make every effort to stick to the JDK 1.1 API.

      + +

      One of the important advantages of log4j is its + compatibility with JDK 1.1.x. +

      +
    8. + +
    9. +

      Always keep it simple, small and fast when + possible.

      + +

      It's all about the application not about logging.

      +
    10. + +
    11. +

      Identify yourself as a contributor at the top of the + relevant file. +

      +
    12. +
    13. +

      Take responsibility for your code.

      + +

      Authoring software is very much like running a marathon. It + takes time and endurance. +

      +
    14. +
    15. +

      Did we mention sticking with the indentation style?

      +
    16. +
    17. Did we mention writing test cases?

      +
    18. + +
    +
    + + + + Why am I getting multiple copies of messages in my log file? + +

    There are several reasons this can occur: +

      +
    • Repeated configuration of log4j: By default, each call to + PropertyConfigurator.configure or DOMConfigurator.configure is + culmulative. If your configuration file defines a file appender, + calling PropertyConfigurator.configure three times will create + three distinct instances and connect each of them to the specified logger.
    • +
    • Attaching the same appender to multiple loggers: if an appender is + attached to the root logger and child logger, then any message + sent to the child logger will go to the appender twice (unless + additivity is set to false).
    • +

    +
    +
    + + How do I add a custom level? + +

    It is possible, but rarely appropriate. The + request is commonly for a level named something like "audit" + that doesn't obviously fit in the progression "trace", "debug", + "info", "warn", "error" and "fatal". In that case, the request + for a level is really a request for a mechanism to specify + a different audience. The appropriate mechanism is to use a distinct + logger name (or tree) for "audit" related messages.

    +
    +
    diff --git a/src/site/site.xml b/src/site/site.xml index d364441f2b..1e49a44999 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -19,7 +19,7 @@ Apache log4j 1.2 images/ls-logo.jpg - http://logging.apache.org/log4j/1.2 + http://logging.apache.org/test/log4j/1.2 images/logo.jpg @@ -27,9 +27,9 @@ - - - + + + @@ -59,13 +59,13 @@ - + - - - + + + From c0983f6028eab967efc19417ac6e5ab03eaad42c Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 11 May 2007 15:48:21 +0000 Subject: [PATCH 289/342] Bug 37930: Fix line endings git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@537214 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1738 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 1737 insertions(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 93667f1077..db467ee454 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -1 +1,1737 @@ - Apache log4j 1.2 SyslogAppender: Added "header" property which if set to true will cause the appender to produce the HEADER part (timestamp and hostname) of the syslog packet. Default value is false for compatibility with previous behavior. SyslogAppender also now sends any header from the associated layout when activateOptions is called or first logging event is sent and any footer when the appender is closed. SyslogAppender leaks descriptors SyslogAppender assumes all lines start with tab SyslogAppender does not limit packet size to 1024 bytes NTEventLogAppender: Updated NTEventLogAppender.dll which corrects missing event messages and which should work with earlier releases of log4j. NTEventLogAppender.dll also now supports registration and unregistration using regsvr32. If replacing an existing copy of NTEventLogAppender, use "regsvr32 NTDllEventLogAppender.dll" or manually remove the HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J registry key. PropertyConfigurator.configure(URL) does not close resource stream. In Turkish locale level "info" is not equivalent to "INFO" Javadoc of PatternLayout should use %n in TTCC layout examples Stacktraces of exceptions disappear occassionally Incorrect message when specified custom level class does not implement toLevel Warning when configuring inner-class logger AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts Add target to generate binary and source compatibility report PropertyPrinter.printOptions breaking signature change in log4j 1.2.9 RollingFileAppender may delete files during rollover XMLConfiguration of loggerFactory does not work SyslogAppender does not limit packet size to 1024 bytes Monitor deadlock in AsyncAppender. AsyncAppender: Dispatcher should run at normal prio. AsyncAppender wait forever when buffer is full. Add non-blocking option for AsyncAppender. Add SyslogPort option to SyslogAppender. Add cc and bcc addresses to SMTPAppender. Add password authentication to SMTPAppender. NullPointerException in org.apache.log4j.NDC.get. org.apache.log4j.lf5.util.DateFormatManager.setTimeZone assignment error. Monthly logs not generated at midnight with DailyRollingFileAppender. PatternLayout specifier %r is not consistent with documentation. Space after log level causes default level to be used. Bad patterns in ISO8601DateFormat and DateTimeDateFormat. SyslogAppender throws NullPointerException upon misconfiguration. FallbackErrorHandler throws NullPointerException if no loggers are set. Bad documentation for WriterAppender.encoding. NTEventLogAppender not build, tested and placed in distribution. SMTPAppender does not output newlines between stack trace lines. SMTPAppender will not run within sandbox. MDC with SMTPAppender doesn't work. Misspelling in HierarchyDynamicMBean. Additivity not exported by PropertyPrinter. RollingFileAppender, if removed, can cause NullPointerExceptions. AsyncAppender blocks on thread death. NOTICE file added to distribution and jars. Chainsaw of log4j 1.2 does not show TRACE level. TRACE level missing in short introduction to log4j. Update site generation to velocity 1.4 and remove dependency on logging/site project. Location info missing for TRACE level messages. Console appender now behaves as before to fix compatibility problem with JBoss introduced in 1.2.12 release due to fix for bug 31056. Can still be configured to detect changes in the System.out and System.err streams as needed by setting the follow property. Removed final qualifiers on member variables in org.apache.log4j.chainsaw.LoggingReceiver which would cause spurious compiler errors with JDK 1.1 and 1.2 javac compilers. Added a jndi.jar property to the build.xml. Added "release" target to build.xml. Removed references to obsolete documentation. Added protected accessors for member variables topicConnection, topicSession, and topicPublisher. SyslogAppender now checks Layout.ignoresThrowable() just like every other appender. DOMConfigurator would call LogLog.error to report XML validation errors that caused no problems in the interpretation of the configuration file. Fixed the JavaDoc links for the XML sample files. Added getNext/setNext methods to org.apache.log4j.spi.Filter and deprecated public "next" field. This mirrors the same change in the upcoming 1.3 version and, hence, provides a migration path. Added o.a.log4j.Logger.trace(), o.a.log4j.Logger.isTraceEnabled() and o.a.log4j.Level.TRACE Implemented serialization for Level. o.a.log4j.ConsoleAppender would ignore redirections of System.out and System.err that occurred after configuration. o.a.log4j.xml.DOMConfigurator would not properly interpret relative path names in external entity declarations. o.a.log4j.xml.XmlLayout would not properly escape class names that contained '<' or '>'. Use of String.intern() in o.a.log4j.CategoryKey would cause application to slow down. o.a.log4j.FileAppender would not create log file if parent directory did not exist. o.a.log4j.AsyncAppender would deadlock if a unchecked exception occurred in the attached appender causing the dispatch thread to die. Added jdiff target to build.xml. log4j would not build with a JDK 1.5 javac. Added log4j 1.1 compatibility method to o.a.l.helpers.Loader. Additional null terminating character in Windows nteventlog.cpp code. Broken links to J2SE classes in javadocs. o.a.log4j.or.jms.MessageRenderer would not be compiled in the build.jms target. Log4j version 1.2.9, is identical to version 1.2.8, except that several key methods have been deprecated in preparation for version 1.3.0, the next major release of log4j. These changes are intended to enforce the rule that client code should never refer to the Category class directly, but use the Logger class instead. Similarly, client code should not refer to the Priority class but to the Level class instead. For a more detailed discussion, refer to the document entitled preparing for log4j 1.3 at: http://www.qos.ch/logging/preparingFor13.jsp XMLAppender would throw a NullPointerException if the input message was null. Many thanks to David Vandegrift for reporting the bug and to Hendrik Brummermann for supplying the patch. Various versions of Xerces would not parse log4j configuration scripts expressed in XML format. The "removes" buffer used in the flushBuffer() method of JDBCAppender is now cleared, solving the memory leak. Thanks to John Landers for reporting the bug and suggesting the fix. SocketAppender now honors ReconnectionDelay of 0. Many thanks to Scott Schram for reporting the bug and providing the fix. Log4j now searches for the file log4j.xml as well as the file log4j.properties during log4j initialization. Add of new options in JMSAppender and new command line arguments in JMSSink. Add new method getLoggerName() in LoggingEvent class. The getLoggerName is the preferred way for accessing the logger name. The public access categoryName field should not be accessed directly. Similarly, added the getLevel method which is now the preferred way of accessing the event's level. The public access level field should not be accessed directly. The javadocs now mark the categoryName and level fields as deprecated. Modified existing appenders to comply with these new directives. Log4j now will check if a system property named "log4j.ignoreTCL" is set. If it is set, then it will ignore the Thread Context ClassLoader when loading classes. This solves the irritating "appender is not assignable to Appender" messages observed when log4j.jar is loaded by multiple class loaders. The error reporting for this problem was also improved. Calling the MDC.get method with a null argument would throw a NullPointerException. July 5th, 2002 Calling an AsyncAppender close method also closes the embedded appender instances. The JDBCAppender is marked as slated for replacement. Do not build critical software using it. Add LF5 documentation and examples. Further tests are required for full integration. XMLLayout can now output messages which contain embedded CDATA sections.Many thanks to Michael A. McAngus for supplying the relevant patch. The dispatcher thread associated with AsyncAppender is now marked as a deamon thread. Add missing NTEventLogAppender.dll log4j.dtd was changed so that <log4j:event> is now made of logger and level attributes instead of category and priority. Changed XMLLayout to conform to the DTD. Chainsaw was changed to adapt to the XMLLayout. Add missing LevelRangeFilter file. SyslogAppender would incorrectly compute the length of the datagram to send to the remote syslogd host. Reported by Mamoru Kadota. The stack trace of exception would not be properly printed on the Compaq tru64 Unix platform. Initially reported by Fabrice Claes and later by Espen H. Kolstad who also provided the fix. Log4j configurators take the "NULL" string value as a synonym for "INHERITED". Both of these two strings are legal level values for setting the level of a logger. Both values are case insensitive. When loading component classes, log4j will now first attempt to use the Thread Context Loader and if that fails, it will use Class.forName. In log4j 1.2 and 1.2.1, only Class.forName was used and the TCL was ignored. This change is a response to bug #9305 opened by Scott M. Stark. LoggingEvent.getMDCCopy() method now sets mdcCopyLookupRequired instead of ndcLookupRequired. This bug would cause the wrong MDC information to appear on a log server. It could only occur if the client wrapped an AsyncAppender around a SocketAppender or if the server used an AsyncAppender for its logging. A closed TelnetAppender would continue waiting for connections even if its ServerSocket was closed. This caused the TelnetSocket to sit in a loop and complain about the closed socket. AsyncAppender throws NullPointerException problem. The bug was actually in AppenderSkeleton. Add support for recursive variable substiuton as requested by Eric Chastan. SocketNode now used a BufferedInputStream as suggested by Kok Chong Fixed a problem with DailiyRollingAppender which would not correctly compute the rollover period in certain timezones. Fixed documentation bug #2726 in FAQ.html. Added a flush statement in the WriterAppender.writeFooter method. In XMLLayout, escaped the method attribute. The XMLLayout also outputs each item of a stack trace in a separate line. The LoggingEvent.getMDCCopy method now clones the MDC instead of just referencing it. The ANT build script was modified to use jar files specified in the build.properties file instead of the CLASSPATH environment variable. The build.properties file depends on local paths and is supplied by the user. The build.properties.sample file is included in the distribution. The build.sh and build.bat scripts have been removed. This is the way many other jakarta projects build their projects. The jar files in the dist/lib directory were also removed since they are no longer used. The DOMConfigurator now interprets the string after the '#' character in the value attribute within the <level> element as the fully qualified class name of a custom Level. This is consistent with the way log4j handles "level" values in other places. The class attribute is still honored. Add Oliver Burn's chainsaw tool to the core log4j distribution. Visualisation and dynamic filtering of log events is bound to be a very important area of activity in the future. Add the org.apache.log4j.jdbc.JDBCAppender which as the name indicates sends events to a database using the JDBC API. Thanks to Kevin Steppe for supplying the code. Add SocketHubAppender class as contributed by Mark Womack. This appender sends LoggingEvent objects to a set of remote a log servers. In the Category class, the getChainedPriority method has been replaced with getEffectiveLevel method. Replaced the custom class loading based on the thread context class loader with a simple Class.forName() call. This solves two allied but distinct problems encountered when using Ant with JUnit although the bug is more general. In one instance of the problem, log4j would throw java.lang.NoClassDefFoundError for org/apache/log4j/AppenderSkeleton where log4j.jar and related classes were clearly available to the Ant classloader. In another incarnation, log4j would reject a custom appender claiming that it is not assignable to a org.apache.log4j.Appender variable. This would occur when log4j.jar was available to both the Ant classloader and the system classloader.
    Thanks to Dave Herman for providing detailed scenarios exposing the issues involved. See http://forum.java.sun.com/thread.jsp?forum=38&thread=70946 http://forum.java.sun.com/thread.jsp?forum=38&thread=70946#479697 http://marc.theaimsgroup.com/?l=ant-user&m=101139178705895&w=2 for more details.
    Fixed the complaints the compiler issued when using the Logger.setLevel() method. Incorporated the performance enhancements to ISO8601DateFormat and AbsoluteTimeDateFormat classes submitted by Andrew Vajoczki. Source code written for log4j 1.1.3.jar will compile fine with log4j 1.2X. However, code compiled for log4j 1.1.3 would previously systematically throw "java.lang.NoSuchMethodError" runtime exceptions when run with log4j 1.2 - prior to beta2. This problem has been corrected in beta2. Pheew, that was a close one. Log4j 1.2 is now backward compatible in serialization of LoggingEvents. For example, a 1.1.3 SocketAppedner can write to 1.2 SocketServer. Similarly a 1.2 JMSAppender will work with 1.1.3 JMSSink. This should ease the move to log4j 1.2, especially in large deployments. The src/java/org/apache/log4j/examples/ directory moved under the top-level directory as examples/. Fixed the ArrayIndexOutOfBoundsException that was thrown by AsyncAppender if multiple threads were trying to log an event containing an exception near simultaneously. Thanks to Thomas Tuft Muller for reporting this bug. Improved error reporting in DOMConfigurator. Thanks to Thomas Tuft Muller for contributing the enhancement. Log4j is now configurable using JMX. JMX support is not of production quality. Add support for different encodings in WriterAppender. Thanks to Ben Sandee for submitting the relevant patch. Modified SMTPAppender to allow multiple email sessions. Thanks to Jon Skeet for supplying the relevant patch. The CategoryFactory class has been replaced by the LoggerFactory class. The makeNewCategoryInstance method has been renamed as makeNewLoggerInstance. This change requires subclasses of Category classes to be modified and recompiled. The Level class replaced the Priority class. Priority class now extends Level to preserve backward compatibility. The Logger class replaced the Category class. Logger class extends Category to preserve backward compatibility. We proudly mark this change with a single star for 100% compatibility. The Category.assert method has been replaced by Category.assertLog. This change was necessary because assert is a language reserved word in JDK 1.4. Removed deprecated methods setOptions and getOptionStrings defined in the org.apache.log4j.spi.OptionHandler interface. This interface is implemented by most log4j appenders and layouts. In particular, all appenders and layouts shipped with log4j contain these deprecated methods. They have become totally redundant after we moved to JavaBeans style configuration in log4j 1.1. The disable(Level) methods in Hierarchy have been removed and been replaced by threshold methods. Add buffered IO capability to FileAppender and subclasses. The location information (or stack information) was not correctly transmitted by JMSAppender. Add event reporting capability to the Hierarchy class. Add new system property "log4j.configuratorClass". This property allows the user to specify the custom configurator at the default initialization phase. This property replaces the previous interpretation of the reference part of "log4j.configuration" as the custom configurator class. This interpretation was sometimes erroneous and caused headaches. Introduced the Mapped Diagnostic Context or MDC class. This class is similar to the NDC except that the diagnostic context is based on a map instead of a stack. Moreover the MDC is automatically inherited by child threads under JDK 1.2 and above. Corrected a performance bug in the NDC class as observed by Dan Milstein and independently by Ray Millard. Removed deprecated methods disable(Priority), disableAll, disableDebug, disableInfo and enableAll in BasicConfigurator. Add supports java.io.Reader objects in the method doConfigure(), instead of only InputStream. Thanks to Mark Womack for submitting the relevant patch. Corrected the restart bug in DailyRollingFileAppender. Thanks to Jim Moore for supplying the relevant patch.
    Add a missing namespace declaration in the log4j:configuration element in log4j.dtd. The missing declaration caused the new generation of namespace aware parsers to barf when parsing log4j configuration files. Reduced the size of log4j-core.jar to 78KB. Minor documentation changes. Corrected a problem with the static initializer of the Category class which would use the wrong class loader to search for the default configuration file. The associated search algorithm has been also simplified. Nevertheless, the preferred method to specify the automatic configuration file is by setting the log4j.configuration system property. Documentation improvements. Added a new section to the manual explaining the default initialization procedure Enhancements to the org.apache.log4j.examples.appserver package. Corrected a bug in the way the NTEventLogAppender printed exceptions. Add missing custom priority support in PropertyConfigurator. Made a number of fields protected instead of default access in SMTPAppender. This release has the same code as 1.1b7. It differs only in a few minor documentation changes. Made BasicConfigurator disable methods static as they were in log4j 1.0.4. Thanks to Francisco Marin for reporting the bug. Corrected a two related deadlock problems introduced while fixing bug 1505. Thanks to joelr@viair.com for reporting the problem. The configureAndWatch methods in Configurators did not close the configuration file, preventing its editing. In DOMConfigurator.setParameter special character conversion now precedes variable substitution. This change was suggested by Steven Velez. The vast majority of users should be oblivious to it. The TextPaneAppender is no longer maintained and has been removed. It is still available under the contribs/ directory. This change has been discussed in the log4j mailing lists and no one objected to the removal of the TextPaneAppender class. Aaron Greenhouse from Carnegie Mellon SCS found a series of multi-threading related bugs in Category and AsyncAppender. See bug ids 1505 and 1507 in our bug database for exemplary bug reports. They are worth the detour. InvalidJarIndexException is only available in JDK 1.3. Referring to this exception type caused log4j 1.1b5 to break on earlier JDKs. We now avoid referring to it. Add PriorityRangeFilter by Simon Kitching. See the Threshold option in AppenderSkeleton for a more convenient alternative. In HTMLLayout, the Title option sets the HTML document title (<title>...<title>). Corrected an important performance bug in LocationInfo. Hein Couwet and kr@it-practice.dk have independently identified the bug. This is yet another example of the difference made by the number of eyeballs studying source code. Corrected the incorrect value returned by LocationInfo.getClassName method when running under IBM Visual Age. Thanks to Mathias Rupprecht for supplying the relevant patch. Corrected a bug where the build.sh file in the distribution would be in DOS CRLF format. Thanks to ma.darche@free.fr for reporting the problem. Corrected InvalidJarIndexException thrown in applets while searching for the default log4j configuration file. Thanks to Michael Lundahl for reporting this bug. Add missing PropertySetterException class to log4j-core.jar. Thanks to ma.darche@free.fr for reporting this bug. Mathias Bogaert observed that in version 1.1b3 the search algorithm for the resource used in automatic log4j configuration was different than in 1.0.x. Beta4 uses a more powerful mechanism which is also compatible with 1.0.x. Paul Glezen correctly observed that if log4j is deployed in a client/server mode where multiple log4j clients log to a log4j server, all hosts must be upgraded to version 1.1 in one go because the internal LoggingEvent class used in client/server communication changed in log4j 1.1. Add a RollingFileAppenderBeanInfo class that fakes the maxFileSize JavaBeans property as a String type instead of a long. This allows us to resuscitate setMaxFileSize(long) method that was removed in 1.1b2 breaking 100% backward compatibility. This addition restores 100% backward compatibility. The directory structure has changed to better suit Jakarta conventions Add a few jar files required at build time to build/lib so that it is now possible to compile log4j out of the box. Whenever a priority parameter is expected in a configuration file, one can now use a custom priority class. See OptionConverter.toPriority method for more information. Note that the <priority> element in log4j.dtd remains unaffected by this change. Add the setQuietMode(boolean) method to LogLog. In quiet mode LogLog will not output anything even in case of errors. Log4j components are now configured as JavaBeans. The setOption and getOptionString methods have been deprecated in OptionHandler interface which is implemented by most log4j components. The stack trace of a throwable passed in a logging statement is not parsed into a stack array which is serializable. This allows cascading of log4j servers to properly propagate throwable information. In XML configuration files, the <configuration> element has been deprecated and was replaced by the <log4j:configuration> element. The "log4j.configDebug" system property has been replaced with the "log4j.debug" system property although it is still available. Similarly, the "configDebug" attribute has been deprecated and replaced with the "debug" attribute in log4j.dtd. Logging can now be disabled per Hierarchy. It can also be disabled using configuration files using the "disable" directive. The "disableOverride" directive takes precedence over the "disable" directive. As a result of this change the disable family of methods in BasicConfigurator has been deprecated and replaced by the same family of methods in the Hierarchy class. The FileAppender has been split into three parts: WriterAppender, ConsoleAppender and FileAppender. ConsoleAppender takes over the console logging functionality of FileAppender. As a result support for stream and console printing has been deprecated in FileAppender. The FileAppender now correctly outputs the header and footer of its layout. This problem was reported by too many users to list here. Appenders and Layouts now get to see the raw message object in LoggingEvent not just its rendered form. The access modifiers of some LoggingEvent fields were changed so that they can be accessed in less error-prone ways. Thanks to Jim Cakalic and Anders Kristens for their valuable advice. Add getLayout(), getErrorHandler(), and getFilter() to the Appender interface. Add getOption(key) method to the OptionHandler interface and modified implementations of it as appropriate. Add the much awaited DailyRollingFileAppender. The structure of the distribution changed somewhat. The log4j.jar files can be found under dist/. The javadoc directory has been moved to docs/api/. We are now totally dependent on ANT to perform all the steps involved in creating a release, including compilation, jar file creation, generation of the javadocs, and for the creation of the distribution tar and zip files. Removed org/apache/log4j/varia/ResilientFileAppender.java which was bogus to begin with. XMLLayout will now mark some output as <![CDATA[ .. ]]> so that it does not get interpreted by the XML parser. This was suggested by Mathias Bogaert like a long list of other fixes. Corrected a bug in CyclicBuffer.resize method that would not update the next insertion point. Thanks to Ole Bulbuk for accurately reporting the bug. The LoggingEvent class now supports serialization of priorities derived from the org.apache.log4j.Priority class. Improved the search method for finding the "log4j.properties" file in the static initializer of Category class. Thanks to Calvin Chan for supplying a better method. The code handling the FCQN (formerly instanceFQN) parameter was cleaned up. There is now a well-established and simple manner for sub-classes of Category (or wrapper classes) to define the FCQN variable: just define a static variable, say FCQN, consisting of the fully qualified class name of the subclass or wrapper, supply this variable as an argument to forcedLog method if and when the sub-class or wrapper invokes that method. Made the instanceFCQN an instance variable instead of a class static in Category.java. In related move, the Category constructor now takes an additional argument setting the instanceFCQN. This makes life less miserable for Category subclasses. Corrected a bug in the OptionConverter.instantiateByClassName method that would not return the defaultValue in case of error. Thanks to Matthieu Verbert for identifying this bug. Corrected the missing stack trace in e-mails generated by the SMTPAppender when using certain Layouts. Updated the "Adding Conversion Characters to PatternLayout" document to reflect the latest changes to the code. Also added the org/apache/log4j/examples/appserver directory containing the associated example code. Add the BufferSize option to the AsyncAppender. Eliminated the SecurityExceptions thrown in Applets. Thanks Timur Zambalayev for reporting this bug. Fixed the erroneously thrown IOInterruptedException when the AsyncAppender was closed. Thanks to Tom Palmer for accurately reporting this bug. Corrected a serious bug in Hierarchy.java that would cause a NullPointerException depending on the order of instantiation of categories. Thanks to Wolfram Gewohn for reporting this bug. Corrected a bug in the getOptionsStrings method of SMTPAppender that omitted to mention the EvaluatorClass option. Thanks to Mark Balster for reporting this bug. Fixed a NullPointerException occurring in AsyncAppender after invoking Category.shutdown. Thanks to Frank-Olaf Lohmann for reporting this bug. Modified the OptionConverter.selectAndConfigure method to take an extra argument of type Hierarchy. This method is used internally and should not affect most users. Add the warn method to LogLog which is used internally by log4j to report on itself. Displaced a number of HTML files under the docs directory. The new structure is compatible with the jakarta site and results in a more consistent navigation experience. Made a few improvements in the javadocs. Add the missing build.inc file to the distribution. No code changed. This version corrects some documentation and build script bugs; code has not changed. Package hierarchy now starts at org.apache.log4j.

    Add the fatal() family of methods to the Category class. Moreover, the EMERG priority has been removed from the Priority class. This priority has been replaced by the FATAL priority that is more widely accepted. This change will require EMERG log statements to be replaced by FATAL log statements. Assuming EMERG log statements are rare, this should have a small but bearable impact on existing client code.

    Moreover, the Unix Syslog priorities ALERT, CRIT and NOTICE are no longer recognized. Support for these priorities was minimal and few users should suffer from these changes.

    Removed the methods setRootPriority, getRootPriority as these methods were redundant and had been previously deprecated. Removed the DOM Level 2 dependency in DOMConfigurator. This makes log4j XML configurable using Sun's parser or Apache's Xerces. The static initializer of the Category class now takes the log4j.configuration system property to search for its configuration file. The type of the configurator used to parse the configuration file depends on the value of the log4j.configuration system property. Enhanced the PropertyConfigurator and DOMConfigurator to support customisation of independent Hierarchy instances. The org.apache.log4j.net.SocketServer has been enhanced to take advantage of this functionality. The old code of SocketServer has been moved to SimpleSocketServer. Enhanced the PropertyConfigurator to support variable substitution for all options *values* (but not keys!). Categories are now aware of the Hierarchy they are linked to. This will provide a basis for several performance enhancements planned for the future.

    Add support for object rendering. It is now possible to register an object renderer for a given object type. When the given object needs to be logged log4j will invoke the corresponding renderer to transform the object into a String.

    As a result of this enhancement, all the String forms of all the printing methods such as debug(String), info(String) have been removed as they are no longer necessary. This change should be backward compatible but requires recompilation of old client code. Thanks to Michael Smith for noting the recompilation requirement.

    Add support for user defined category factories in the PropertyConfigurator. Thus, it is now possible to configure log4j with a properties file and still use custom Category sub-classes. The DOMConfigurator had already a finer grain support. Add the SMTPAppender that in case of an error or fatal event sends an e-mail containing latest N logging events in its buffer, where N is chosen by the user. Add the method getInstance(Class) to the Category class. Corrected a bug in configureAndWatch method of configurators that would configure log4j only after an unnecessary delay.
    Corrected a typo making NTEventLogAppender.dll register the wrong category message file. Thanks to Peter Hayes for accurately reporting this bug. The DOMConfigurator and PropertyConfigurator can now automatically detect modified configuration files and re-read them. Add AsyncAppender which buffers log requests and serves them at a later time. AsyncAppender can increase logging performance tremendously if logging operations are interspersed with long and blocking non CPU-intensive operations, typically I/O or network access. For CPU intensive applications, using the AsyncAppender will actualy degrade logging performance by 10 to 25 percent. The log4j.dtd has been modified to allow appenders to refer to other appenders by IDREF. The DOMConfigurator has been modified to take advantage of ID/IDREF attributes when referring to appenders. This change requires a DOM Level-2 API compliant parser. DOM Level-2 java bindings are available at http://www.w3.org/TR/1999/WD-DOM-Level-2-19990923/java-binding.html. Add the configure(String filename) method to DOMConfigurator. This method requires the presence of a JAXP compatible parser. At this time, the only DOM2 and JAXP compatible parser seems to be the Apache xerces parser. Add the PriorityMatchFilter allowing filtering by exact priority match. This was a common request by users. The configuration of a category is now an atomic operation. This ensures that log requests are not lost while configuration is in progress. Anders Kristensen was to first to observe the potential problems in non-atomic configurations. The "log4j" element has been renamed to "configuration" in the log4j DTD. This change requires that log4j configuration files written in XML be modified. Since the log4j element figures only once in the XML file, this change should take little time. ResourceBundles are now category instance specific and no longer class static. Moreover, like other properties resource bundles are inherited from the category hierarchy. The jar files log4j.jar and log4j-full.jar now contain versioning information in their respective manifest files. Corrected an inconsistency in the NTEventLogAppender which broke it. Fixed a bug where configuration files were not parsed correctely due to trailing spaces in option values as returned by java.util.Properties. Trailing spaces are now removed from option values. This bug was quite disconcerting because the trailing spaces cannot be seen without careful examination of the configuration file. Add the XMLLayout. The output of the XMLLayout consists of a series of log4j:event elements. It does not output a complete XML file. The output is designed to be included as an external entity to form a well-formed XML file. Add a new abstract class org.log4j.helpers.DateLayout. The TTCCLayout now extends DateLayout. Corrected a rather subtle performance bug in the buffer management code in PatternLayout. Thanks to Vladislav Dutov and Constantine A. Plotnikov for for insisting on the correction of this bug. Created a new package called org.log4j.spi. This new package holds classes that are hidden from the casual user but are needed to extend log4j. Add org.log4j.varia.ExternallyRolledFileAppender to handle externally triggered file rollovers. Add support for multiple hierarchy trees. PatternLayout can now be subclassed to support new conversion patterns. Extended the DOMConfigurator and the log4j DTD to properly handle sub-classing of Category and Priority classes. There have been also minor adjustments to other classes to handle sub-classing. These changes should be invisible to users. All categories except the root category can be sub-classed and also assigned priorities sub-classing org.log4j.Priority. The root category always exists and CANNOT be subclassed. The ProppertyConfigurator remains unchanged. Thus, it does not handle extensions of the Category class. Add filter support in appenders. The DOMConfigurator and the log4j.dtd have been enhanced to support filters. Add error handling support to appenders. The DOMConfigurator and the log4j.dtd have been enhanced to support filters. Add support for correct interpretation of location information in IBM's Visual Age environment. Thanks to Wolf Siberski for supplying the relevant patch. Add getAdditivity method to Category. This feature was requested by Constantin Mitran. (mitran at ecircle.de) Corrected multiple bugs in default initialization code of Category class. Thanks to Jeff Turner for identifying and supplying corrective patches. Add the %n conversion character to PatternLayout so that a line separator can be specified in a platform independent way. In 0.8.5 internal Priority integer values were decoupled from the Unix Syslog values. This broke SyslogAppedder. A new function Priority.toSyslogInt is introduced to solve this bug. Corrected a bug where the internal priority integer All log4j internal output is now prepended with the string "log4j: ". This makes is easier to differentiate log4j internal logs from messages output by other sources. Sub-classes of Category class must now specify their fully qualified name when constructing logging events. This allows the %C conversion specifier in PatternLayout to work properly even with sub-classes or wrappers of Category. Add the method disableDebug to BasicConfigurator. This method disables all print requests of debug priority regardless its category. Similar methods disableInfo, disable, disableAll and enableAll have also been added. Disable type methods can be overriden by setting the log4j.disableOverride system property. Calling BasicConfigurator.disableInfo is equivalent to the now deprecated flagAsShippedCode method. Given the above changes, the system property log4j.shippedCodeFlagOverride is no longer honored. It is now possible to sub-class Category. The sub-classes may continue to adhere to the category hierarchy. This was a frequently requested feature. Corrected a problem with the additivity flag being ignored in categories without appenders. This bug was discovered by Anders Kristensen. Add a method BasicConfigurator.resetConfiguration to reset the log4j environment. This method should be used sparingly. At the initialization of the Category class, the file log4j.properties will now be searched from the search path used to load classes. If the file can be found, then it is fed to the PropertyConfigurator.configure(java.net.URL) method. Failing to access system properties within the static initializer of BasicConfigurator class is no longer reported as an error but as a debug message. Thanks to Gilles Schlienger for reporting this problem with applets. Corrected a bug which caused infinite loops when using conversion patterns with a single element, fortunately under very rare circumstances. This bug was first reported by Igor Potraev, the author of log4p. It was independently reported by Joe Haberl from IBM Global Services. Add a mechanism to lazily remove references to dead threads in the NDC class. Indeed, in previous versions calling NDC.pop within a thread but forgetting to call to NDC.remove before exiting (that thread) resulted in a memory leak. Corrected a huge memory leak in SocketAppender. This leak was due to the ObjectOutputStream indefinitely holding a reference for each written to the stream. Thanks to Dan MacDonald for very accurately describing this bug. The log and l7dlog methods in Category no longer ignore the shipped code flag. This bug was reported by Mario Schomburg. Add missing NDC information to LoggingEvent.writeObject method. Corrected handling of SocketException in SocketNode. Thanks to Gerald Gutierez (ggutierez@emobiledata.com) for reporting this and the previous problem. Phased out custom shell scripts to build java documentation and jar files in favor of Jakarta's ANT. It was becoming a nuisance to keep the ANT build file in sync with the custom shell scripts. The NT EventViewer no longer complains about missing message 4096. Minor corrections in documentation. Add missing icons GIFs into the distribution. SocketNode now attempts to close the socket when exiting. Thanks to Moses Hohman (mmhohman@rainbow.uchicago.edu) for noting this. Removed the com.ibm.log4j from the javadoc directory. This seems to confuse VAJ. Thanks to Steve Ashcroft for reporting this problem. As a result of the infinite loop problem (see next item), added over 800 new test cases to stress-test the code in CategoryFactory class where category creation occurs. Under certain rare circumstances the Category.getInstance method entered an infinite loop. Thanks to Mario Schomburg from IBM Global Services / Hannover for identifying this problem and proposing a patch. DOMConfigurator and the log4j.dtd were out of sync on the type of the priority directive. As a result, priority directives all defaulted to DEBUG. Thanks to Peter (petervt@users.sourceforge.net) for accurately reporting this bug. Minor additions to the FAQ. Add the NumberCruncher example showing how the NDC class can be used to distinguish output from different clients. Add the %x conversion specifier to the TTCC_CONVERSION_PATTERN in the PatternLayout class. This is consistent expected output of Trivial.java example. Thanks to Jerome (schrom@users.sourceforge.net) for reporting this bug. The value of the additivity option would not be parsed properly by the ProperytConfigurator if the line containing the option contained trailing spaces. The localized logging methods (l7dlog) omitted priority based evaluation and erroneously logged all requests. The close method was added to the Appender interface allowing appender implementations to release any resources they may have allocated. The package naming scheme of changed from "com.ibm.log4j.*" to "org.log4j.*". The new naming reflects the open source nature of the project and is consistent with the URL http://www.log4j.org. Add internationalization support. See the newly introduced l7dlog methods in Category class. In the FileAppender, the File option now admits variable substitution. For example, if "java.home" system property is set to /home/xyz and the File option is given the value "%{java.home}/test.log", then File option will be interpreted as "/home/xyz/test.log". Thanks to Avy Sharell (sharell@online.fr) for contributing this feature. SocketAppender is now officially part of the package. It is capable of sending logging events to a remote SocketNode. The SocketNode logs events according to server (local) policy. For example, a client can log events to a local file and also send them to a remote server (a SocketNode). This server can log the event to any number of files, to the console, to any number of TextPaneAppenders and even re-transmit the event to another server, and so forth. This paradigm is common in most logging systems, e.g. Syslog and NT Event Log. Many thanks to Andrew Harrison for showing a way to actually implement the paradigm. The Category.callAppenders method now accepts a LoggingEvent instead of creating one itself. This was necessary to accommodate events generated at a remote client. LoggingEvent class changed slightly to support remote logging. The category field (a Category) has been replaced by the categoryName field (a String). Corrected a bug in Category.removeAppender(String) which would never remove the desired appender. Thanks to Moses Hohman for reporting this bug. Corrected a bug RollingFileAppender which would throw an uncaught exception in case output file could not be opened for writing. Thanks to Vinay Aggarwal for signaling this problem. The log4j.override key defined in BasicConfigurator has been renamed to log4j.shippedCodeFlagOverride. The getCurrentCategories method in the Category class would not return the correct value. Thanks to Timothy Potter (tpotter@agency.com) for reporting this problem. Appenders now admit a priority threshold as an option. All requests with a priority lower than the appender's threshold priority are ignored by the appender. Integrated Christopher Taylor's DOMConfigurator parsing XML configuration files. The jar file log4j-net.jar has been replaced by log4j-full.jar. It contains DOMConfigurator.class in addition to the com.ibm.log4j.net package. Add support for the ANT build tool. Thanks to Christopher Taylor for supplying the build.xml file. ANT is available form http://jakarta.apache.org. FileAppender's File option now accepts the values "System.out" or "System.err". If one these values is suppiled in a configuration file then the output is directed to the corresponding stream. Moreover, the default constructor of FileAppender no longer sets System.out as an output target nor does it define a default layout. Add caller class (C), caller file name (F), caller line number (L), caller method name (M) conversion specifiers to the PatternLayout class. The category conversion specifier now takes an optional precision modifier allowing the user to control the number of right most components in the category name that will be printed. Corrected a bug occuring when the caller file name and line number information were unavilable due to JIT compilation. In that case, the PatternLayout would not properly use the rest of the available location information. The above enhancements and bug-fixes originate from comments by Nelson Minar (nelson@monkey.org). The SimpleLayout and TTCCLayout are replaced by the PatternLayout in the log4j.jar file to keep its size small. These two layouts are still part of the package. The PatternLayout class is introduced. This new layout is configurable using a conversion pattern which is parsed at runtime. This allows the user to choose the output layout without writing any code and only at a marginal performance cost compared to the dedicated layouts such as SimpleLayout and TTCCLayout. The PatternLayout also allows the user to determine minimum and maximum field lengths. The PatternLayout was written by Jim Cakalic (jim_cakalic@na.biomerieux.com). All internal components now use LoggingEvent instances to specifiy logging information. Corrected a problem with a missing variable initialization in SyslogAppender. This caused NullPinterException to be thrown when logging exceptions. Added a default constructor to SyslogAppender. The lack of this constructor caused PropertyConfigurator to throw a java.lang.InstantiationException when the appender type was set to be SyslogAppender. Thanks to Yves Bossel (ybossel@opengets.cl) for accurately identifying these bugs. Modified some other related option handling code in SyslogAppender. Made NDC.get public access instead of default access. Thanks to Y. J. Chun (monac@softonnet.com) for reporting this problem. PropertyConfigurator now parses the additivity option for categories. Corrected the value of the ADDITIVITY_PREFIX constant to match the documented value, that is "log4j.additivity". Corrected a really bad bug where System.out would be closed when PropertyConfigurator.configure was called. Thanks to Christopher Taylor (cstaylor@pacbell.net) for tracking and reporting this bug. The PropertyConfiguator now prints debug messages if the flag "log4j.configDebug" is defined in the configuration file. Previously, only if the system property "log4j.configDebug" was set would debug messages be printed. A question by Shawn Kircher (skircher@vninet.com) induced this change. In AbsoluteTimeDateFormat, DateTimeDateFormat and ISO8601DateFormat the separator between the seconds and milliseconds has been changed to comma from full stop, in order to be compliant with ISO8601's preferred sign. Thanks to Jim Cakalic (jim_cakalic@na.biomerieux.com) for pointing out this discrepancy with the standard. Corrected a bug where RollingFileAppender would not work properly on Windows systems. Thanks to Heinz Richter (heinz.richter@ecmwf.int) for noting this problem. Core classes are now independent of the format of the options file. Configurable core classes implement the OptionHandler interface. OptionHandlers allows configurators to learn the relevant option names. The configurator feeds option values to the OptionHandler which configures itself. As a result of these changes, the Init class has been broken down to two separate classes: the BasicConfigurator and the PropertiesConfigurator. An XML configurator for 0.8.0 has been already written by Christopher Taylor (cstaylor@pacbell.net). Add multiple appender support per category. The appenders follow the category hierarchy, i.e. a child category inherits the appenders of its parents. Add an assert() method to the Category class. Steven Marcus (srnm@awaretechnologies.com) requested this addition. Automatic stack printing is no longer supported. This was an unused and unreliable feature which unnecessarily complicated the code. log4j now emits a single warning message when no appender to write to could be found. This is typically the case when the user forgets to configure the log4j environment. This change was suggested by Jim Cakalic (jim_cakalic@na.biomerieux.com). RollingFileAppender adds file roll over capability-implemented by Heinz Richter (heinz.richter@ecmwf.int). Corrected a bug where a java.lang.NoClassDefFoundError would be thrown because com.ibm.log4j.helpers.SyslogTracerPrintWriter was not included in log4j.jar. Thanks to Jim Cakalic (jim_cakalic@na.biomerieux.com) for signaling this bug. There has been an important API changes. The Log, NOPLog and ILog classes have been removed. Their functionality has been migrated to the Category class. In this release, instead of writing ILog.debug(CAT, "Some message."); one will write CAT.debug("Some message."); Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> observed that one could use the Category objects directly for logging. It is no longer possible to instantiate Category objects directly. Instead, one would use the factory method Category.getInstance(String name). [***] There category instantiation code was moved to CateogryFactory class. This class has package visibility and remains hidden from the user. This stylistic improvement was suggested by Luke Blanshard (luke@quiq.com). The Init class offers methods to initialize the log4j environment. The Init.flagAsShippedCode method replaces the NOPLog class. Changes in the documentation to reflect the API changes. The NDC.cloneStack and inherit methods now tolerate null-stacks. TTCCLayout now takes a java.text.DateFormat object as a parameter. The task of formatting the date is delegated to this object. Added four classes extending the java.text.DateFormat class. These are RelativeTimeDateFormat, AbsoluteTimeDateFormat, DateTimeDateFormat and ISO8601DateFormat classes. Thanks to Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> for suggesting the ISO8601 date format. These four classes can be parametrized with a particular TimeZone. The TTCCLayout class now accepts a new configuration file option called "TimeZone". These four DateFormats are less malleable than the java.text.SimpleDateFormat but they are also much faster. As a consequence of these changes, the setRelativeTime, setDatePrinting methods in TTCCLayout have been removed along with the associated configuration file options RelativeTime, DatePrinting and TimePrinting. The current code is inspired by code contributed by Heinz Richter (heinz.richter@ecmwf.int). The Log.emerg method has been deprecated. If you use statements of EMERG priority, please use the Log.log form instead. Add getDepth and setMaxdepth methods to the NDC class. This makes it easier to manage the nested context depth especially when callees push but forget to pop. Moved the documentation in com/ibm/log4j/package.html to com/ibm/log4j/overview.html. Many users were failing to read the com/ibm/log4j/package.html description due to the unfortunate layout of the text. Hopefully more people will read the package overview in its present location. Add the com.ibm.log4j.net package for doing remote logging using TCP sockets. This is still experimental code. Add new debug, .., emerg methods that do not require a category parameter. They assume the "root" category, that is the decision to whether print or not is made by comparing the statement's priority with the default priority. Add a new ILog.init method accepting an Appender and a configuration file as parameters. FileAppender's setWriter and setFile methods where not instantiating a new tracer. This caused stack traces to be lost! SyslogAppender had a similar problem. The FileAppender and SyslogAppender where not calling the layout's readConfig method to set layout specific options. Thanks to Heinz Richter (heinz.richter@ecmwf.int) for reporting this bug. Corrected a bug in Log.log() method where the appender was always called with Priority.DEBUG. Thanks to Oliver Boehm (Oliver.Boehm@abaxx.de) for reporting this bug. Add Syslog compatibility. One can now choose (at runtime) between remote syslog logging or file logging. Syslog logging performance, although not appalling, is significantly slower than file logging. Priority class was enriched with the previously missing priorities NOTICE, ALERT and CRIT. The internal constants were also aligned with the syslog counterparts. Add the Log.log method to support the new priorities. TracerPrintWriter is now an independent class instead of being a nested top-level class in Tracer. A number of writers, namely the SyslogWriter, SyslogQuietWriter, SyslogTracerPrintWriter, were added to the helper package. Log.force method was removed. The various Appender.doAppend implementations take over its functionality. FileAppender and SyslogAppender now use QuietWriter. QuietWriter is a FilterWriter which hides exceptions and instead emits a single warning message to System.err. The layout is now an initialization parameter to the appender type. Previously, the layout and the appender where independent parameters to the Log constructor. Many small improvements and corrections in the documentation. Syslog related documentation remains sparse. ILog.init() and ILog.init(String configFile) have been changed to call ILog.init(,,,) with "com.ibm.log4j.Log.class" as the first parameter. This makes it easier for people to get familiar with log4j. Add missing files to the make directory. These files are useful for those wishing to use the log4j make environment. Thanks to "Lee Hall" <LHall@JavaFoundry.com> for reporting this omission. Until recently the make environment failed to compile RMI stubs in a single run. This nagging problem has been corrected thanks to help from Thomas Eirich (IBM Zurich Research Lab). Some users have been rightly complaining about the verbosity TTCCLayout's date output. The full date output is now shortened to "dd MMM YYYY HH:mm:ss.SSS" for example, "06 Nov 1994 08:49:37.459" In addition, users may now choose to print only time information, as in "08:49:37.459". The package now uses Writer instead of OutputStream as its output target. This makes the log4j code smaller and easier to understand at the cost of a slight performance degradation. As a result of this change a few method names in FileAppender class were changed. Preliminary experiments with SyslogAppedner and SyslogLayout show that syslog compatibility is not far away. The difficultly is adding syslog compatibility without making radical changes to the current log4j architecture. Corrected a bug in the NOPLog.createInstance method which always created a Log singleton even if the system property "log4j.logType" was set to NOPLog. Thanks to Robert Gottofrey (Robert.Gottofrey@wdr.com) for reporting this bug and the associated test case. Removed the inconsistent "Layout" configuration option in Log.readConfig(). This change should be transparent to most users. The LogCreationManager class has been removed. Its functionality has been transfered to the createInstance and getInstance methods in the Log and NOPLog classes. The new way of creating instances is both simpler and less error prone although just as flexible. As a result of these changes, the init family of methods in the ILog class have been adjusted to the new way of creating the log singleton. The Appender interface has been introduced. The method of writing a log statement into an output stream can now be varied by using a different Appender. The new FileAppender offers the same functionality that was previously part of the Log class. Changed the time format used in TTCCLayout to be of the form "Day, dd MMM YYYY HH:mm:ss.SSS GMT" for example, "Sun, 06 Nov 1994 22:49:37.459 GMT". This format is almost the same as the format specified in RFC 1123 and also the format recommended in RFC 2616. The only difference is the additional milliseconds information. The layout specific options were not read from the configuration file due to a missing instruction. Many thanks to Vikram Sridharan (Vikram.Sridharan@alysis.com) to patiently pointing out this omission to an unbelieving maintainer. Version 0.7.0 and above will be distributed under the IBM Public License (IPL). The IPL is an approved open source license (see http://www.opensource.org/licenses/ for a list). It grants similar rights to the previous ALPHAWORKS license agreement, in particular, the right to redistribute and to modify the package. The Log class can now be parameterized with a Layout object. Layouts determine the format of what is printed, where as the Log class decides when to print and to where. As a result of this modularization, the CGULog and NOPCGULog classes no longer exists. CGULog class has been replaced with the TTCCLayout (Time Thread Context Category). This should make it easier to create new log output formats. Some time in the near future, the Log class will be further broken down to allow different strategies for writing to output streams. Renamed com.ibm.util.log hierarchy to to com.ibm.log4j. I wanted to do this for some time. I feel release 0.7.0 was the last opportunity to do so. I am sorry for the the trouble caused by this change. New NDC class. This class implements nested diagnostic contexts as suggested by Neil Harrison in the article "Patterns for Logging Diagnostic Messages" part of the book "Pattern Languages of Program Design 3" edited by Martin et al. Nested diagnostic contexts is a nifty feature that was missing up to now. The StressNDC test class seems to break JDK 1.2.2 beta on AIX. On Linux and NT using sun's JDK 1.2.2 it seem to work OK. In any case, tests done with StressNDC and associated perl script seem to indicate that the NDC class is bug-free. Corrected a date formatting bug in CGULog class where on some environments the wrong month was printed. Thanks to Christopher Williams (Christopher_Williams@mail.northgrum.com) for signaling this bug. Also changed the month format from a number to a three letter abbreviation such as "Jan", "Feb", ..., "Dec". The new format is unambiguous regardless of local date format. Clearer documentation with still much room for improvement. Corrected a bug in the Tracer class which always used the Unix line separator instead of the system specific separator. Thanks to Vikram Sridharan (Vikram.Sridharan@alysis.com) for singaling this bug. Corrected a runaway comment which gulped the CGULog.readConfig method. Add the init family of methods to the ILog class to ease the setup of a basic logging environment. Thanks to Mark Donszelmann (Mark.Donszelmann@cern.ch) for this enhancement. Just an hour after releasing version 0.6.1 detected and corrected a bug where the Tracer class would correctly print Exception stack trace but not the type of the Exception. Replaced the distribution on www.zurich.ibm.com without changing the version number. I hope nobody is using the intermediary (and buggy) release of 0.6.1. Better documentation with still much room for improvement. For consistence sake, added setDefaultPriority and getDefaultPriority methods to the Category class and deprecated setDefaultPriority in the Log.class. Corrected a major bug where if two categories were homonyms the second instance would not be properly initialized. Increased the speed of Exception logging from about 4000 microseconds to about 1000. It seems that for some people Exception logging is performance critical. Improved implementation is a variant of Nocolai's (XNH@crisplant.com) implementation. Release of log4j 0.6.0 with incomplete documentation. Add a stress test program to debug the new Category class. It turns out that the test program was as hard to get right as the Category class. Given the favorable results of the stress test I am quite confident that the new class is now bug free. This assumption has been proven to be wrong. See above.

    Created a new class called Category to manipulate categories instead of plain Strings. The new class is just as easy to use. However, the evaluation of whether to log or not to log is at least 10 times faster. The NOP class performance remain unaffected by the change. (You can't improve on the performance of an empty function call.)

    Many thanks to Alex Blewitt "Alex.Blewitt@ioshq.com" for his valuable comments. He was the first to observe that finding Strings in a hash table was an expensive operation.

    This change will require some recoding on your part. See the FAQ for more details.

    Modified the force in Log and CGULog method to use a byte[] buffer instead of a StringBuffer. The old code was clearer but the new one is at least 25% faster. Add regression testing.

    We now enforce a policy where the OutputStream set by setOutputStream is a user managed resource whereas the OutputStream opened using setLogFile is the Log class' responsibility.

    The setLogFile method now closes any previous OutputStream if only if opened through setLogFile. If the previous OutputStream was opened by the user and set through setOutputStream the previous OutputStream is untouched.

    Similarly, setOutputStream will close any previous OutputStream if and only if it was opened using setLogFile.

    Add a new method logOutputStreamExists to the Log class allowing the programmer to check if there is already an opened stream before trying to set a new one. A stream can be opened as a byproduct of reading the configuration file.

    Changed the behavior of the (private) Log.Append method in case of failure to write to the OutputStream.

    Previously, in case of failure, we reverted to System.err. Now, we emit a warning message and discard all future log messages. The new behavior is consistent with our current unreliable logging semantics. The change prevents an otherwise functional program from failing because the terminal is flooded with logging messages.

    Renamed the iLog to ILog to remain consistent with our class naming scheme. The initial intention was to add ILog and deprecate iLog. However, I am running CVS on a fat16 partition, causing serious problems when files differ only in case. Corrected a bug where the LogFileName was not remembered. Thanks to Jens for signaling this bug.
    Now the programmer can choose to truncate the log file instead of always appending to it. This functionality was first requested and intially implemented by "Jens Uwe Pipka" jens.pipka@gmx.de. setLogFile now opens the requested file instead of having the Append function open it later. Cleaned up some related code in the Append function. Although nobody has requested it, there is still no method to close the log file. This is harder to implement reliably than it sounds. Simplified setLogOutputStream so that it does no longer return the previously set OutputStream. Joe Walker (joe@eireneh.com) observed that the LogCreationManager.getSingleton mechanism was cumbersome. There is now a new class iLog (indirect Log) which hides the need to call getSingleton. Performance testing on my 233Mhz Thinkpad shows that this indirection has small performance impact on non-logged calls in the order of 40 nanoseconds. The impact on logged calls is negligible. Add a jar file to the distribution. The jar file contains only the files you would need to use log but not other classes needed for testing nor examples. Corrected a bug where CGUNOPLog was not integrated to the Makefile. Add new public methods isDebugEnabled and isInfoEnabled to allow programmers to check whether a debug/info statement will be logged without incurring the cost of message parameter construction. This addition was suggested by Luke Blanshard Luke@quiq.com. Renamed the private method evaluate to isEnabled. Also made it final with no apparent speed gains. In addition, made the Log.force method public. New syntactic sugar debug, ..., emerg, methods to log objects. Modified the interface to deal with Throwables and not just Exceptions. My thanks to Luke Blanshard for signaling this "bug". Add more tests to the LogPerformance class. In particular, to test the influence of indirect debug calls. Add a "make" mini-tutorial for those who want to modify the code. License updated to standard alphaWorks license allowing modifications to source code. However, this license explicitly requires that modifications be communicated back to alphaWorks. Initial availability on alphaWorks. Refer to the FAQ for the lineage of the package.
    \ No newline at end of file + + + + Apache log4j 1.2 + + + + + SyslogAppender: Added "header" property which if set to true will cause the appender + to produce the HEADER part (timestamp and hostname) of the syslog packet. + Default value is false for compatibility with previous behavior. + SyslogAppender also now sends any header from the associated + layout when activateOptions is called or first logging event is sent and + any footer when the appender is closed. + SyslogAppender leaks descriptors + SyslogAppender assumes all lines start with tab + SyslogAppender does not limit packet size to 1024 bytes + + NTEventLogAppender: Updated NTEventLogAppender.dll which corrects missing event messages + and which should work with earlier releases of log4j. + NTEventLogAppender.dll also now supports registration and unregistration + using regsvr32. If replacing an existing copy of NTEventLogAppender, + use "regsvr32 NTDllEventLogAppender.dll" or manually remove the + HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J + registry key. + PropertyConfigurator.configure(URL) does not close resource stream. + In Turkish locale level "info" is not equivalent to "INFO" + Javadoc of PatternLayout should use %n in TTCC layout examples + Stacktraces of exceptions disappear occassionally + Incorrect message when specified custom level class does not implement toLevel + Warning when configuring inner-class logger + AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts + Add target to generate binary and source compatibility report + PropertyPrinter.printOptions breaking signature change in log4j 1.2.9 + RollingFileAppender may delete files during rollover + XMLConfiguration of loggerFactory does not work + SyslogAppender does not limit packet size to 1024 bytes + + + + Monitor deadlock in AsyncAppender. + AsyncAppender: Dispatcher should run at normal prio. + AsyncAppender wait forever when buffer is full. + Add non-blocking option for AsyncAppender. + Add SyslogPort option to SyslogAppender. + Add cc and bcc addresses to SMTPAppender. + Add password authentication to SMTPAppender. + NullPointerException in org.apache.log4j.NDC.get. + org.apache.log4j.lf5.util.DateFormatManager.setTimeZone assignment error. + Monthly logs not generated at midnight with DailyRollingFileAppender. + PatternLayout specifier %r is not consistent with documentation. + Space after log level causes default level to be used. + Bad patterns in ISO8601DateFormat and DateTimeDateFormat. + SyslogAppender throws NullPointerException upon misconfiguration. + FallbackErrorHandler throws NullPointerException if no loggers are set. + Bad documentation for WriterAppender.encoding. + NTEventLogAppender not build, tested and placed in distribution. + SMTPAppender does not output newlines between stack trace lines. + SMTPAppender will not run within sandbox. + MDC with SMTPAppender doesn't work. + Misspelling in HierarchyDynamicMBean. + Additivity not exported by PropertyPrinter. + RollingFileAppender, if removed, can cause NullPointerExceptions. + AsyncAppender blocks on thread death. + NOTICE file added to distribution and jars. + Chainsaw of log4j 1.2 does not show TRACE level. + TRACE level missing in short introduction to log4j. + Update site generation to velocity 1.4 and remove dependency on logging/site project. + + + + Location info missing for TRACE level messages. + Console appender now behaves as before to fix + compatibility problem with JBoss introduced in 1.2.12 release due to fix + for bug 31056. Can still be configured to detect changes in the System.out + and System.err streams as needed by setting the follow property. + + + + Removed final qualifiers on member variables + in org.apache.log4j.chainsaw.LoggingReceiver which would cause + spurious compiler errors with JDK 1.1 and 1.2 javac compilers. + + Added a jndi.jar property to the build.xml. + + Added "release" target to build.xml. + + Removed references to obsolete documentation. + + Added protected accessors for member variables + topicConnection, topicSession, and topicPublisher. + + SyslogAppender now checks Layout.ignoresThrowable() just + like every other appender. + + DOMConfigurator would call LogLog.error to report + XML validation errors that caused no problems in the interpretation of the + configuration file. + + Fixed the JavaDoc links + for the XML sample files. + + Added getNext/setNext methods to org.apache.log4j.spi.Filter and deprecated + public "next" field. This mirrors the same change in the upcoming 1.3 + version and, hence, provides a migration path. + + Added o.a.log4j.Logger.trace(), o.a.log4j.Logger.isTraceEnabled() and + o.a.log4j.Level.TRACE + + Implemented serialization for Level. + + o.a.log4j.ConsoleAppender would ignore redirections + of System.out and System.err that occurred after configuration. + + o.a.log4j.xml.DOMConfigurator would not properly + interpret relative path names in external entity declarations. + + o.a.log4j.xml.XmlLayout would not properly escape + class names that contained '<' or '>'. + + Use of String.intern() in o.a.log4j.CategoryKey + would cause application to slow down. + + o.a.log4j.FileAppender would not create log file + if parent directory did not exist. + + o.a.log4j.AsyncAppender would deadlock if a + unchecked exception occurred in the attached appender causing the + dispatch thread to die. + + Added jdiff target to build.xml. + + log4j would not build with a JDK 1.5 javac. + + Added log4j 1.1 compatibility method + to o.a.l.helpers.Loader. + + Additional null terminating character in Windows + nteventlog.cpp code. + + Broken links to J2SE classes in javadocs. + + + + + o.a.log4j.or.jms.MessageRenderer + would not be compiled in the build.jms target. + + + + + + Log4j version 1.2.9, is identical to version 1.2.8, except that + several key methods have been deprecated in preparation for version + 1.3.0, the next major release of log4j. These changes are intended to + enforce the rule that client code should never refer to the Category + class directly, but use the Logger class instead. Similarly, client + code should not refer to the Priority class but to the Level class + instead. + + For a more detailed discussion, refer to the document entitled + preparing for log4j 1.3 at: + + http://www.qos.ch/logging/preparingFor13.jsp + + + + + + XMLAppender would throw a + NullPointerException if the input message was null. Many thanks to + David Vandegrift for reporting the bug and to Hendrik Brummermann for + supplying the patch. + + Various versions of Xerces would not parse + log4j configuration scripts expressed in XML format. + + The "removes" buffer used in the flushBuffer() method + of JDBCAppender is now cleared, solving the memory leak. Thanks to John + Landers for reporting the bug and suggesting the fix. + + SocketAppender now honors ReconnectionDelay of 0. + Many thanks to Scott Schram for reporting the bug and providing the fix. + + + + Log4j now searches for the file log4j.xml as well as the file + log4j.properties during log4j initialization. + + + + + Add of new options in JMSAppender and new command line arguments in + JMSSink. + + Add new method getLoggerName() in LoggingEvent class. The + getLoggerName is the preferred way for accessing the logger + name. The public access categoryName field should not be accessed + directly. Similarly, added the getLevel method which is now the + preferred way of accessing the event's level. The public access + level field should not be accessed directly. The javadocs now mark + the categoryName and level fields as deprecated. + Modified existing appenders to comply with these new directives. + + Log4j now will check if a system property named "log4j.ignoreTCL" + is set. If it is set, then it will ignore the Thread Context + ClassLoader when loading classes. This solves the irritating + "appender is not assignable to Appender" messages observed when + log4j.jar is loaded by multiple class loaders. + The error reporting for this problem was also improved. + + Calling the MDC.get method with a null + argument would throw a NullPointerException. + + + + July 5th, 2002 + Calling an AsyncAppender close method also closes the embedded + appender instances. + + + + The JDBCAppender is marked as slated for replacement. Do not build + critical software using it. + + Add LF5 documentation and examples. Further tests are required + for full integration. + + XMLLayout can now output messages which contain embedded CDATA + sections.Many thanks to Michael + A. McAngus for supplying the relevant patch. + + The dispatcher thread associated with AsyncAppender is now marked + as a deamon thread. + + Add missing NTEventLogAppender.dll + + log4j.dtd was changed so that + <log4j:event> is now made of logger and level attributes instead of + category and priority. Changed XMLLayout to conform to the + DTD. Chainsaw was changed to adapt to the XMLLayout. + + Add missing LevelRangeFilter file. + + + + SyslogAppender would incorrectly compute + the length of the datagram to send to the remote syslogd host. + Reported by Mamoru Kadota. + + The stack trace of exception would not be + properly printed on the Compaq tru64 Unix platform. Initially + reported by Fabrice Claes and later by Espen H. Kolstad who also + provided the fix. + + + +Log4j configurators take the "NULL" string value as a synonym for + "INHERITED". Both of these two strings are legal level values for + setting the level of a logger. Both values are case insensitive. + +When loading component classes, log4j will now first attempt to use + the Thread Context Loader and if that fails, it will use + Class.forName. In log4j 1.2 and 1.2.1, only Class.forName was used + and the TCL was ignored. This change is a response to bug #9305 + opened by Scott M. Stark. + + + + + LoggingEvent.getMDCCopy() method now sets mdcCopyLookupRequired + instead of ndcLookupRequired. This bug would cause the wrong MDC + information to appear on a log server. It could only occur if the + client wrapped an AsyncAppender around a SocketAppender or if the + server used an AsyncAppender for its logging. + + + + + A closed TelnetAppender would continue waiting + for connections even if its ServerSocket was closed. This caused + the TelnetSocket to sit in a loop and complain about the closed + socket. + + AsyncAppender throws NullPointerException problem. The bug was actually in + AppenderSkeleton. + + Add support for recursive variable substiuton as requested by + Eric Chastan. + + SocketNode now used a BufferedInputStream as suggested by Kok Chong + + Fixed a problem with DailiyRollingAppender which would not + correctly compute the rollover period in certain timezones. + + Fixed documentation bug #2726 in FAQ.html. + + Added a flush statement in the + WriterAppender.writeFooter method. + + In XMLLayout, escaped the method attribute. The + XMLLayout also outputs each item of a stack trace in a separate + line. + + The + LoggingEvent.getMDCCopy method now clones the MDC instead of just + referencing it. + + The ANT build script was modified to use jar files specified in + the build.properties file instead of the CLASSPATH environment + variable. The build.properties file depends on local paths and is + supplied by the user. The build.properties.sample file is included + in the distribution. The build.sh and build.bat scripts have + been removed. This is the way many other jakarta projects build their + projects. The jar files in the dist/lib directory were also removed + since they are no longer used. + + The DOMConfigurator now interprets the string after the '#' + character in the value attribute within the <level> element as + the fully qualified class name of a custom Level. This is consistent + with the way log4j handles "level" values in other places. The + class attribute is still honored. + + Add Oliver Burn's chainsaw tool to the core log4j + distribution. Visualisation and dynamic filtering of log events is + bound to be a very important area of activity in the future. + + Add the org.apache.log4j.jdbc.JDBCAppender which as the name + indicates sends events to a database using the JDBC API. Thanks to + Kevin Steppe for supplying the code. + + Add SocketHubAppender class as contributed by Mark Womack. This + appender sends LoggingEvent objects to a set of remote a log + servers. + + In the Category class, the getChainedPriority method has been + replaced with getEffectiveLevel method. + + Replaced the custom class loading based on the thread context class + loader with a simple Class.forName() call. This solves two allied + but distinct problems encountered when using Ant with JUnit + although the bug is more general. In one instance of the + problem, log4j would throw java.lang.NoClassDefFoundError for + org/apache/log4j/AppenderSkeleton where log4j.jar and related + classes were clearly available to the Ant classloader. In another + incarnation, log4j would reject a custom appender claiming that it is + not assignable to a org.apache.log4j.Appender variable. This would + occur when log4j.jar was available to both the Ant classloader and the + system classloader.
    + + Thanks to Dave Herman for providing detailed scenarios exposing + the issues involved. See + http://forum.java.sun.com/thread.jsp?forum=38&thread=70946 + http://forum.java.sun.com/thread.jsp?forum=38&thread=70946#479697 + http://marc.theaimsgroup.com/?l=ant-user&m=101139178705895&w=2 + for more details.
    + + Fixed the complaints the compiler issued when using the + Logger.setLevel() method. + + Incorporated the performance enhancements to ISO8601DateFormat and + AbsoluteTimeDateFormat classes submitted by Andrew Vajoczki. + + Source code written for log4j 1.1.3.jar will compile fine with + log4j 1.2X. However, code compiled for log4j 1.1.3 would previously + systematically throw "java.lang.NoSuchMethodError" runtime exceptions + when run with log4j 1.2 - prior to beta2. This problem has been + corrected in beta2. Pheew, that was a close one. + + Log4j 1.2 is now backward compatible in serialization of + LoggingEvents. For example, a 1.1.3 SocketAppedner can write to 1.2 + SocketServer. Similarly a 1.2 JMSAppender will work with 1.1.3 + JMSSink. This should ease the move to log4j 1.2, especially in + large deployments. + + The src/java/org/apache/log4j/examples/ directory moved under the + top-level directory as examples/. + + Fixed the ArrayIndexOutOfBoundsException that was thrown by + AsyncAppender if multiple threads were trying to log an event + containing an exception near simultaneously. Thanks to Thomas Tuft Muller + for reporting this bug. + + Improved error reporting in DOMConfigurator. Thanks to Thomas Tuft + Muller for contributing the enhancement. + + Log4j is now configurable using JMX. JMX support is not of + production quality. + + Add support for different encodings in WriterAppender. Thanks to + Ben Sandee for submitting the relevant patch. + + Modified SMTPAppender to allow multiple email sessions. Thanks to + Jon Skeet for supplying the relevant patch. + + The CategoryFactory class has been replaced by the LoggerFactory + class. The makeNewCategoryInstance method has been renamed as + makeNewLoggerInstance. This change requires subclasses of Category + classes to be modified and recompiled. + + The Level class replaced the Priority class. Priority class now + extends Level to preserve backward compatibility. + + The Logger class replaced the Category class. Logger class + extends Category to preserve backward compatibility. We proudly + mark this change with a single star for 100% compatibility. + + The Category.assert method has been replaced by + Category.assertLog. This change was necessary because assert is a + language reserved word in JDK 1.4. + + Removed deprecated methods setOptions and getOptionStrings defined + in the org.apache.log4j.spi.OptionHandler interface. This interface + is implemented by most log4j appenders and layouts. In particular, + all appenders and layouts shipped with log4j contain these + deprecated methods. They have become totally redundant after we + moved to JavaBeans style configuration in log4j 1.1. + + The disable(Level) methods in Hierarchy have been removed and been + replaced by threshold methods. + + Add buffered IO capability to FileAppender and subclasses. + + The location information (or stack information) was not correctly + transmitted by JMSAppender. + + Add event reporting capability to the Hierarchy class. + + Add new system property "log4j.configuratorClass". This property + allows the user to specify the custom configurator at the default + initialization phase. This property replaces the previous + interpretation of the reference part of "log4j.configuration" + as the custom configurator class. This interpretation was sometimes + erroneous and caused headaches. + + Introduced the Mapped Diagnostic Context or MDC class. This class + is similar to the NDC except that the diagnostic context is based + on a map instead of a stack. Moreover the MDC is automatically + inherited by child threads under JDK 1.2 and above. + + Corrected a performance bug in the NDC class as observed by Dan + Milstein and independently by Ray Millard. + + Removed deprecated methods disable(Priority), disableAll, + disableDebug, disableInfo and enableAll in BasicConfigurator. + + Add supports java.io.Reader objects in the method doConfigure(), + instead of only InputStream. Thanks to Mark Womack for submitting + the relevant patch. + + Corrected the restart bug in DailyRollingFileAppender. Thanks to + Jim Moore for supplying the relevant patch. +
    + + + + Add a missing namespace declaration in the log4j:configuration + element in log4j.dtd. The missing declaration caused the new + generation of namespace aware parsers to barf when parsing log4j + configuration files. + + Reduced the size of log4j-core.jar to 78KB. + + Minor documentation changes. + + + + + Corrected a problem with the static initializer of the Category + class which would use the wrong class loader to search for the + default configuration file. The associated search algorithm has + been also simplified. Nevertheless, the preferred method to specify + the automatic configuration file is by setting the + log4j.configuration system property. + + Documentation improvements. Added a new section to the manual + explaining the default initialization procedure + + Enhancements to the org.apache.log4j.examples.appserver package. + + Corrected a bug in the way the NTEventLogAppender printed + exceptions. + + + + Add missing custom priority support in PropertyConfigurator. + +Made a number of fields protected instead of default access in + SMTPAppender. + + + + + This release has the same code as 1.1b7. It differs only in a few minor + documentation changes. + + + +Made BasicConfigurator disable methods static as they were in log4j + 1.0.4. Thanks to Francisco Marin for reporting the bug. + + Corrected a two related deadlock problems introduced while fixing + bug 1505. Thanks to joelr@viair.com for reporting the problem. + + The configureAndWatch methods in Configurators did not close the + configuration file, preventing its editing. + +In DOMConfigurator.setParameter special character conversion now + precedes variable substitution. This change was suggested by Steven + Velez. The vast majority of users should be oblivious to it. + +The TextPaneAppender is no longer maintained and has been + removed. It is still available under the contribs/ + directory. This change has been discussed in the log4j mailing + lists and no one objected to the removal of the TextPaneAppender + class. + + + +Aaron Greenhouse from Carnegie Mellon SCS found a series of + multi-threading related bugs in Category and AsyncAppender. See bug + ids 1505 and 1507 in our bug database for exemplary bug + reports. They are worth the detour. + + InvalidJarIndexException is only available in JDK 1.3. Referring + to this exception type caused log4j 1.1b5 to break on earlier JDKs. + We now avoid referring to it. + + Add PriorityRangeFilter by Simon Kitching. See the Threshold + option in AppenderSkeleton for a more convenient alternative. + + + +In HTMLLayout, the Title option sets the HTML document + title (<title>...<title>). + +Corrected an important performance bug in LocationInfo. Hein Couwet + and kr@it-practice.dk have independently identified the bug. This is + yet another example of the difference made by the number of eyeballs + studying source code. + + Corrected the incorrect value returned by LocationInfo.getClassName + method when running under IBM Visual Age. Thanks to Mathias + Rupprecht for supplying the relevant patch. + + Corrected a bug where the build.sh file in the distribution would be in + DOS CRLF format. Thanks to ma.darche@free.fr for reporting the + problem. + + Corrected InvalidJarIndexException thrown in applets while + searching for the default log4j configuration file. Thanks to + Michael Lundahl for reporting this bug. + + Add missing PropertySetterException class to log4j-core.jar. + Thanks to ma.darche@free.fr for reporting this bug. + + + +Mathias Bogaert observed that in version 1.1b3 the search algorithm + for the resource used in automatic log4j configuration was + different than in 1.0.x. Beta4 uses a more powerful mechanism which + is also compatible with 1.0.x. + + Paul Glezen correctly observed that if log4j is deployed in a + client/server mode where multiple log4j clients log to a log4j + server, all hosts must be upgraded to version 1.1 in one go because + the internal LoggingEvent class used in client/server communication + changed in log4j 1.1. + + + + Add a RollingFileAppenderBeanInfo class that fakes the + maxFileSize JavaBeans property as a String type instead of a long. + This allows us to resuscitate setMaxFileSize(long) method that was + removed in 1.1b2 breaking 100% backward compatibility. This addition + restores 100% backward compatibility. + + + + + The directory structure has changed to better suit Jakarta + conventions + + Add a few jar files required at build time to build/lib so that + it is now possible to compile log4j out of the box. + + Whenever a priority parameter is expected in a configuration file, + one can now use a custom priority class. See OptionConverter.toPriority + method for more information. Note that the <priority> element in + log4j.dtd remains unaffected by this change. + + Add the setQuietMode(boolean) method to LogLog. In quiet mode + LogLog will not output anything even in case of errors. + + Log4j components are now configured as JavaBeans. The setOption and + getOptionString methods have been deprecated in OptionHandler + interface which is implemented by most log4j components. + + The stack trace of a throwable passed in a logging statement is not + parsed into a stack array which is serializable. This allows cascading of + log4j servers to properly propagate throwable information. + + In XML configuration files, the <configuration> element has been + deprecated and was replaced by the <log4j:configuration> element. + + The "log4j.configDebug" system property has been replaced with the + "log4j.debug" system property although it is still available. + Similarly, the "configDebug" attribute has been deprecated and + replaced with the "debug" attribute in log4j.dtd. + + + + + Logging can now be disabled per Hierarchy. It can also be disabled + using configuration files using the "disable" directive. The + "disableOverride" directive takes precedence over the "disable" + directive. As a result of this change the disable family of + methods in BasicConfigurator has been deprecated and replaced by the same + family of methods in the Hierarchy class. + + The FileAppender has been split into three parts: WriterAppender, + ConsoleAppender and FileAppender. ConsoleAppender takes over the + console logging functionality of FileAppender. As a result support + for stream and console printing has been deprecated in FileAppender. + + The FileAppender now correctly outputs the header and footer of its + layout. This problem was reported by too many users to list here. + + Appenders and Layouts now get to see the raw message object in + LoggingEvent not just its rendered form. The access modifiers of + some LoggingEvent fields were changed so that they can be accessed + in less error-prone ways. Thanks to Jim Cakalic and Anders Kristens + for their valuable advice. + + Add getLayout(), getErrorHandler(), and getFilter() to the + Appender interface. + + Add getOption(key) method to the OptionHandler interface and modified + implementations of it as appropriate. + + Add the much awaited DailyRollingFileAppender. + + The structure of the distribution changed somewhat. The log4j.jar + files can be found under dist/. The javadoc directory has been + moved to docs/api/. We are now totally dependent on ANT to perform + all the steps involved in creating a release, including + compilation, jar file creation, generation of the javadocs, and for + the creation of the distribution tar and zip files. + + Removed org/apache/log4j/varia/ResilientFileAppender.java which was + bogus to begin with. + + XMLLayout will now mark some output as <![CDATA[ .. ]]> so that it + does not get interpreted by the XML parser. This was suggested by + Mathias Bogaert like a long list of other fixes. + +Corrected a bug in CyclicBuffer.resize method that would not update the + next insertion point. Thanks to Ole Bulbuk for accurately reporting + the bug. + +The LoggingEvent class now supports serialization of priorities + derived from the org.apache.log4j.Priority class. + +Improved the search method for finding the "log4j.properties" file in + the static initializer of Category class. Thanks to Calvin Chan for + supplying a better method. + +The code handling the FCQN (formerly instanceFQN) parameter was + cleaned up. There is now a well-established and simple manner for + sub-classes of Category (or wrapper classes) to define the FCQN + variable: just define a static variable, say FCQN, consisting of + the fully qualified class name of the subclass or wrapper, supply + this variable as an argument to forcedLog method if and when + the sub-class or wrapper invokes that method. + +Made the instanceFCQN an instance variable instead of a class + static in Category.java. In related move, the Category constructor + now takes an additional argument setting the instanceFCQN. This + makes life less miserable for Category subclasses. + +Corrected a bug in the OptionConverter.instantiateByClassName + method that would not return the defaultValue in case of error. Thanks + to Matthieu Verbert for identifying this bug. + +Corrected the missing stack trace in e-mails generated by the + SMTPAppender when using certain Layouts. + +Updated the "Adding Conversion Characters to PatternLayout" + document to reflect the latest changes to the code. Also added the + org/apache/log4j/examples/appserver directory containing the + associated example code. + + Add the BufferSize option to the AsyncAppender. + +Eliminated the SecurityExceptions thrown in Applets. Thanks Timur + Zambalayev for reporting this bug. + +Fixed the erroneously thrown IOInterruptedException when the AsyncAppender + was closed. Thanks to Tom Palmer for accurately reporting this bug. + + + + + +Corrected a serious bug in Hierarchy.java that would cause a + NullPointerException depending on the order of instantiation of + categories. Thanks to Wolfram Gewohn for reporting this bug. + +Corrected a bug in the getOptionsStrings method of SMTPAppender + that omitted to mention the EvaluatorClass option. Thanks to Mark + Balster for reporting this bug. + + + + +Fixed a NullPointerException occurring in AsyncAppender after + invoking Category.shutdown. Thanks to Frank-Olaf Lohmann for + reporting this bug. + +Modified the OptionConverter.selectAndConfigure method to take an + extra argument of type Hierarchy. This method is used internally + and should not affect most users. + + Add the warn method to LogLog which is used internally by log4j + to report on itself. + +Displaced a number of HTML files under the docs directory. The new + structure is compatible with the jakarta site and results in a + more consistent navigation experience. + +Made a few improvements in the javadocs. + + + + + Add the missing build.inc file to the distribution. No code + changed. + + + + + +This version corrects some documentation and build script bugs; + code has not changed. + + + + +Package hierarchy now starts at org.apache.log4j. + +

    Add the fatal() family of methods to the Category + class. Moreover, the EMERG priority has been removed from the + Priority class. This priority has been replaced by the FATAL + priority that is more widely accepted. This change will + require EMERG log statements to be replaced by FATAL log + statements. Assuming EMERG log statements are rare, this should + have a small but bearable impact on existing client code.

    + +

    Moreover, the Unix Syslog priorities ALERT, CRIT and NOTICE are no + longer recognized. Support for these priorities was minimal and + few users should suffer from these changes.

    + +Removed the methods setRootPriority, getRootPriority as these + methods were redundant and had been previously deprecated. + +Removed the DOM Level 2 dependency in DOMConfigurator. This makes + log4j XML configurable using Sun's parser or Apache's Xerces. + +The static initializer of the Category class now takes the + log4j.configuration system property to search for its configuration + file. The type of the configurator used to parse the configuration + file depends on the value of the log4j.configuration system + property. + +Enhanced the PropertyConfigurator and DOMConfigurator to support + customisation of independent Hierarchy instances. The + org.apache.log4j.net.SocketServer has been enhanced to take + advantage of this functionality. The old code of SocketServer has + been moved to SimpleSocketServer. + +Enhanced the PropertyConfigurator to support variable substitution + for all options *values* (but not keys!). + +Categories are now aware of the Hierarchy they are linked to. This + will provide a basis for several performance enhancements planned + for the future. + +

    Add support for object rendering. It is now possible to register + an object renderer for a given object type. When the given object + needs to be logged log4j will invoke the corresponding renderer to + transform the object into a String.

    + +

    As a result of this enhancement, all the String forms of all the + printing methods such as debug(String), info(String) have been + removed as they are no longer necessary. This change should be + backward compatible but requires recompilation of old client + code. Thanks to Michael Smith for noting the recompilation + requirement.

    + + Add support for user defined category factories in the + PropertyConfigurator. Thus, it is now possible to configure log4j + with a properties file and still use custom Category + sub-classes. The DOMConfigurator had already a finer grain + support. + + Add the SMTPAppender that in case of an error or fatal event + sends an e-mail containing latest N logging events in its buffer, + where N is chosen by the user. + + Add the method getInstance(Class) to the Category class. + +Corrected a bug in configureAndWatch method of configurators that + would configure log4j only after an unnecessary delay. +
    + + + +Corrected a typo making NTEventLogAppender.dll register the wrong + category message file. Thanks to Peter Hayes for accurately + reporting this bug. + +The DOMConfigurator and PropertyConfigurator can now automatically + detect modified configuration files and re-read them. + + Add AsyncAppender which buffers log requests and serves them + at a later time. AsyncAppender can increase logging performance + tremendously if logging operations are interspersed with long + and blocking non CPU-intensive operations, typically I/O or network + access. For CPU intensive applications, using the AsyncAppender + will actualy degrade logging performance by 10 to 25 percent. + +The log4j.dtd has been modified to allow appenders to refer to + other appenders by IDREF. + +The DOMConfigurator has been modified to take advantage of ID/IDREF + attributes when referring to appenders. This change requires a + DOM Level-2 API compliant parser. DOM Level-2 java bindings are + available at + http://www.w3.org/TR/1999/WD-DOM-Level-2-19990923/java-binding.html. + + Add the configure(String filename) method to DOMConfigurator. + This method requires the presence of a JAXP compatible parser. + At this time, the only DOM2 and JAXP compatible parser seems to be + the Apache xerces parser. + + Add the PriorityMatchFilter allowing filtering by exact priority + match. This was a common request by users. + +The configuration of a category is now an atomic operation. This + ensures that log requests are not lost while configuration is in + progress. Anders Kristensen was to first to observe the potential + problems in non-atomic configurations. + + + + +The "log4j" element has been renamed to "configuration" in the + log4j DTD. This change requires that log4j configuration files + written in XML be modified. Since the log4j element figures only + once in the XML file, this change should take little time. + +ResourceBundles are now category instance specific and no longer + class static. Moreover, like other properties resource bundles + are inherited from the category hierarchy. + +The jar files log4j.jar and log4j-full.jar now contain versioning + information in their respective manifest files. + +Corrected an inconsistency in the NTEventLogAppender which broke it. + +Fixed a bug where configuration files were not parsed correctely + due to trailing spaces in option values as returned by + java.util.Properties. Trailing spaces are now removed from option + values. This bug was quite disconcerting because the + trailing spaces cannot be seen without careful examination of the + configuration file. + + Add the XMLLayout. + + The output of the XMLLayout consists of a series of log4j:event + elements. It does not output a complete XML file. The output is designed to + be included as an external entity to form a well-formed XML file. + + Add a new abstract class org.log4j.helpers.DateLayout. The TTCCLayout + now extends DateLayout. + +Corrected a rather subtle performance bug in the buffer management code + in PatternLayout. Thanks to Vladislav Dutov and Constantine + A. Plotnikov for for insisting on the correction of this bug. + +Created a new package called org.log4j.spi. This new package + holds classes that are hidden from the casual user but are needed + to extend log4j. + + Add org.log4j.varia.ExternallyRolledFileAppender to handle + externally triggered file rollovers. + + Add support for multiple hierarchy trees. + +PatternLayout can now be subclassed to support new conversion + patterns. + +Extended the DOMConfigurator and the log4j DTD to properly handle + sub-classing of Category and Priority classes. + There have been also minor adjustments to other classes to handle + sub-classing. These changes should be invisible to users. + + All categories except the root category can be sub-classed and also + assigned priorities sub-classing org.log4j.Priority. + + The root category always exists and CANNOT be subclassed. + + The ProppertyConfigurator remains unchanged. Thus, it does not + handle extensions of the Category class. + + Add filter support in appenders. The DOMConfigurator and the + log4j.dtd have been enhanced to support filters. + + Add error handling support to appenders. The DOMConfigurator and the + log4j.dtd have been enhanced to support filters. + + Add support for correct interpretation of location information in + IBM's Visual Age environment. Thanks to Wolf Siberski for supplying + the relevant patch. + + Add getAdditivity method to Category. This feature was requested + by Constantin Mitran. (mitran at ecircle.de) + + + + +Corrected multiple bugs in default initialization code of + Category class. Thanks to Jeff Turner for identifying and supplying + corrective patches. + + + + + Add the %n conversion character to PatternLayout so that a line + separator can be specified in a platform independent way. + +In 0.8.5 internal Priority integer values were decoupled from the + Unix Syslog values. This broke SyslogAppedder. A new function + Priority.toSyslogInt is introduced to solve this bug. + +Corrected a bug where the internal priority integer + + + + +All log4j internal output is now prepended with the string + "log4j: ". This makes is easier to differentiate log4j internal + logs from messages output by other sources. + +Sub-classes of Category class must now specify their fully + qualified name when constructing logging events. This allows the %C + conversion specifier in PatternLayout to work properly even with + sub-classes or wrappers of Category. + + Add the method disableDebug to BasicConfigurator. This method + disables all print requests of debug priority regardless its + category. Similar methods disableInfo, disable, disableAll and + enableAll have also been added. Disable type methods can be + overriden by setting the log4j.disableOverride system property. + + Calling BasicConfigurator.disableInfo is equivalent to the now + deprecated flagAsShippedCode method. + +Given the above changes, the system property + log4j.shippedCodeFlagOverride is no longer honored. + +It is now possible to sub-class Category. The sub-classes may + continue to adhere to the category hierarchy. This was a frequently + requested feature. + +Corrected a problem with the additivity flag being ignored in + categories without appenders. This bug was discovered by Anders + Kristensen. + + Add a method BasicConfigurator.resetConfiguration to reset the + log4j environment. This method should be used sparingly. + +At the initialization of the Category class, the file + log4j.properties will now be searched from the search path used to + load classes. If the file can be found, then it is fed to the + PropertyConfigurator.configure(java.net.URL) method. + +Failing to access system properties within the static initializer + of BasicConfigurator class is no longer reported as an error but as + a debug message. Thanks to Gilles Schlienger for reporting this + problem with applets. + +Corrected a bug which caused infinite loops when using conversion + patterns with a single element, fortunately under very rare + circumstances. This bug was first reported by Igor Potraev, the + author of log4p. It was independently reported by Joe Haberl from + IBM Global Services. + + Add a mechanism to lazily remove references to dead threads in + the NDC class. Indeed, in previous versions calling NDC.pop within + a thread but forgetting to call to NDC.remove before exiting (that + thread) resulted in a memory leak. + +Corrected a huge memory leak in SocketAppender. This leak was due + to the ObjectOutputStream indefinitely holding a reference for each + written to the stream. Thanks to Dan MacDonald for very accurately + describing this bug. + +The log and l7dlog methods in Category no longer ignore the shipped + code flag. This bug was reported by Mario Schomburg. + + Add missing NDC information to LoggingEvent.writeObject + method. + +Corrected handling of SocketException in SocketNode. Thanks to + Gerald Gutierez (ggutierez@emobiledata.com) for reporting this and + the previous problem. + +Phased out custom shell scripts to build java documentation and jar + files in favor of Jakarta's ANT. It was becoming a nuisance to keep + the ANT build file in sync with the custom shell scripts. + + + + + + +The NT EventViewer no longer complains about missing message 4096. + +Minor corrections in documentation. + + Add missing icons GIFs into the distribution. + +SocketNode now attempts to close the socket when exiting. Thanks to + Moses Hohman (mmhohman@rainbow.uchicago.edu) for noting this. + +Removed the com.ibm.log4j from the javadoc directory. This seems to + confuse VAJ. Thanks to Steve Ashcroft for reporting this problem. + + + + +As a result of the infinite loop problem (see next item), added + over 800 new test cases to stress-test the code in CategoryFactory + class where category creation occurs. + +Under certain rare circumstances the Category.getInstance method + entered an infinite loop. Thanks to Mario Schomburg from IBM Global + Services / Hannover for identifying this problem and proposing a + patch. + +DOMConfigurator and the log4j.dtd were out of sync on the type of + the priority directive. As a result, priority directives all + defaulted to DEBUG. Thanks to Peter (petervt@users.sourceforge.net) + for accurately reporting this bug. + +Minor additions to the FAQ. + + Add the NumberCruncher example showing how the NDC class can be + used to distinguish output from different clients. + + Add the %x conversion specifier to the TTCC_CONVERSION_PATTERN in + the PatternLayout class. This is consistent expected output of + Trivial.java example. Thanks to Jerome (schrom@users.sourceforge.net) + for reporting this bug. + + + + + +The value of the additivity option would not be parsed properly by + the ProperytConfigurator if the line containing the option + contained trailing spaces. + + + + +The localized logging methods (l7dlog) omitted priority based + evaluation and erroneously logged all requests. + + + + + +The close method was added to the Appender interface allowing + appender implementations to release any resources they may have + allocated. + +The package naming scheme of changed from "com.ibm.log4j.*" to + "org.log4j.*". The new naming reflects the open source nature of + the project and is consistent with the URL http://www.log4j.org. + + Add internationalization support. See the newly introduced l7dlog + methods in Category class. + +In the FileAppender, the File option now admits variable + substitution. For example, if "java.home" system property is set + to /home/xyz and the File option is given the value + "%{java.home}/test.log", then File option will be interpreted as + "/home/xyz/test.log". + + Thanks to Avy Sharell (sharell@online.fr) for contributing this + feature. + +SocketAppender is now officially part of the package. It is capable + of sending logging events to a remote SocketNode. The SocketNode + logs events according to server (local) policy. For example, a + client can log events to a local file and also send them to a + remote server (a SocketNode). This server can log the event to any + number of files, to the console, to any number of TextPaneAppenders + and even re-transmit the event to another server, and so forth. + + This paradigm is common in most logging systems, e.g. Syslog and NT + Event Log. Many thanks to Andrew Harrison for showing a way to + actually implement the paradigm. + +The Category.callAppenders method now accepts a LoggingEvent + instead of creating one itself. This was necessary to accommodate + events generated at a remote client. + +LoggingEvent class changed slightly to support remote logging. The + category field (a Category) has been replaced by the categoryName + field (a String). + + + + +Corrected a bug in Category.removeAppender(String) which would + never remove the desired appender. Thanks to Moses Hohman for + reporting this bug. + + + + +Corrected a bug RollingFileAppender which would throw an uncaught + exception in case output file could not be opened for + writing. Thanks to Vinay Aggarwal for signaling this problem. + + + + +The log4j.override key defined in BasicConfigurator has been + renamed to log4j.shippedCodeFlagOverride. + +The getCurrentCategories method in the Category class would not + return the correct value. Thanks to Timothy Potter + (tpotter@agency.com) for reporting this problem. + +Appenders now admit a priority threshold as an option. All requests + with a priority lower than the appender's threshold priority are + ignored by the appender. + +Integrated Christopher Taylor's DOMConfigurator parsing XML + configuration files. + +The jar file log4j-net.jar has been replaced by log4j-full.jar. It + contains DOMConfigurator.class in addition to the com.ibm.log4j.net + package. + + Add support for the ANT build tool. Thanks to Christopher Taylor + for supplying the build.xml file. ANT is available form + http://jakarta.apache.org. + +FileAppender's File option now accepts the values "System.out" or + "System.err". If one these values is suppiled in a configuration + file then the output is directed to the corresponding stream. + Moreover, the default constructor of FileAppender no longer sets + System.out as an output target nor does it define a default + layout. + + Add caller class (C), caller file name (F), caller line number + (L), caller method name (M) conversion specifiers to the + PatternLayout class. + + The category conversion specifier now takes an optional precision + modifier allowing the user to control the number of right most + components in the category name that will be printed. + + Corrected a bug occuring when the caller file name and line number + information were unavilable due to JIT compilation. In that case, + the PatternLayout would not properly use the rest of the available + location information. + + The above enhancements and bug-fixes originate from comments by + Nelson Minar (nelson@monkey.org). + + + + +The SimpleLayout and TTCCLayout are replaced by the PatternLayout + in the log4j.jar file to keep its size small. These two layouts are + still part of the package. + +The PatternLayout class is introduced. This new layout is + configurable using a conversion pattern which is parsed at + runtime. This allows the user to choose the output layout without + writing any code and only at a marginal performance cost compared + to the dedicated layouts such as SimpleLayout and TTCCLayout. The + PatternLayout also allows the user to determine minimum and maximum + field lengths. + + The PatternLayout was written by Jim Cakalic + (jim_cakalic@na.biomerieux.com). + +All internal components now use LoggingEvent instances to specifiy + logging information. + +Corrected a problem with a missing variable initialization in + SyslogAppender. This caused NullPinterException to be thrown when + logging exceptions. + + Added a default constructor to SyslogAppender. The lack of this + constructor caused PropertyConfigurator to throw a + java.lang.InstantiationException when the appender type was set to + be SyslogAppender. + + Thanks to Yves Bossel (ybossel@opengets.cl) for accurately + identifying these bugs. + + Modified some other related option handling code in + SyslogAppender. + +Made NDC.get public access instead of default access. Thanks to + Y. J. Chun (monac@softonnet.com) for reporting this problem. + +PropertyConfigurator now parses the additivity option for + categories. + +Corrected the value of the ADDITIVITY_PREFIX constant to match the + documented value, that is "log4j.additivity". + +Corrected a really bad bug where System.out would be closed when + PropertyConfigurator.configure was called. Thanks to Christopher + Taylor (cstaylor@pacbell.net) for tracking and reporting this bug. + +The PropertyConfiguator now prints debug messages if the flag + "log4j.configDebug" is defined in the configuration + file. Previously, only if the system property "log4j.configDebug" + was set would debug messages be printed. A question by Shawn + Kircher (skircher@vninet.com) induced this change. + +In AbsoluteTimeDateFormat, DateTimeDateFormat and ISO8601DateFormat + the separator between the seconds and milliseconds has been changed + to comma from full stop, in order to be compliant with ISO8601's + preferred sign. Thanks to Jim Cakalic + (jim_cakalic@na.biomerieux.com) for pointing out this discrepancy + with the standard. + +Corrected a bug where RollingFileAppender would not work + properly on Windows systems. Thanks to Heinz Richter + (heinz.richter@ecmwf.int) for noting this problem. + + + + +Core classes are now independent of the format of the options + file. Configurable core classes implement the OptionHandler + interface. OptionHandlers allows configurators to learn the + relevant option names. The configurator feeds option values to the + OptionHandler which configures itself. + + As a result of these changes, the Init class has been broken down + to two separate classes: the BasicConfigurator and the + PropertiesConfigurator. + + An XML configurator for 0.8.0 has been already written by + Christopher Taylor (cstaylor@pacbell.net). + + Add multiple appender support per category. The appenders follow + the category hierarchy, i.e. a child category inherits the + appenders of its parents. + + Add an assert() method to the Category class. Steven Marcus + (srnm@awaretechnologies.com) requested this addition. + +Automatic stack printing is no longer supported. This was an unused + and unreliable feature which unnecessarily complicated the + code. + +log4j now emits a single warning message when no appender to write to + could be found. This is typically the case when the user forgets + to configure the log4j environment. This change was suggested by + Jim Cakalic (jim_cakalic@na.biomerieux.com). + +RollingFileAppender adds file roll over capability-implemented by + Heinz Richter (heinz.richter@ecmwf.int). + +Corrected a bug where a java.lang.NoClassDefFoundError would be + thrown because com.ibm.log4j.helpers.SyslogTracerPrintWriter was + not included in log4j.jar. Thanks to Jim Cakalic (jim_cakalic@na.biomerieux.com) + for signaling this bug. + + + + + +There has been an important API changes. The Log, NOPLog and ILog + classes have been removed. Their functionality has been migrated to + the Category class. + + In this release, instead of writing + + ILog.debug(CAT, "Some message."); + + one will write + + CAT.debug("Some message."); + + Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> observed that + one could use the Category objects directly for logging. + +It is no longer possible to instantiate Category objects directly. + Instead, one would use the factory method + Category.getInstance(String name). [***] + + There category instantiation code was moved to CateogryFactory + class. This class has package visibility and remains hidden from + the user. + + This stylistic improvement was suggested by Luke Blanshard + (luke@quiq.com). + +The Init class offers methods to initialize the log4j + environment. The Init.flagAsShippedCode method replaces the NOPLog + class. + +Changes in the documentation to reflect the API changes. + +The NDC.cloneStack and inherit methods now tolerate null-stacks. + + + + + +TTCCLayout now takes a java.text.DateFormat object as a + parameter. The task of formatting the date is delegated to this + object. + + Added four classes extending the java.text.DateFormat class. These + are RelativeTimeDateFormat, AbsoluteTimeDateFormat, + DateTimeDateFormat and ISO8601DateFormat classes. + + Thanks to Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> + for suggesting the ISO8601 date format. + + These four classes can be parametrized with a particular + TimeZone. The TTCCLayout class now accepts a new configuration file + option called "TimeZone". + + These four DateFormats are less malleable than the + java.text.SimpleDateFormat but they are also much faster. + + As a consequence of these changes, the setRelativeTime, + setDatePrinting methods in TTCCLayout have been removed along with + the associated configuration file options RelativeTime, + DatePrinting and TimePrinting. + + The current code is inspired by code contributed by + Heinz Richter (heinz.richter@ecmwf.int). + +The Log.emerg method has been deprecated. If you use statements of + EMERG priority, please use the Log.log form instead. + + Add getDepth and setMaxdepth methods to the NDC class. This makes + it easier to manage the nested context depth especially when + callees push but forget to pop. + +Moved the documentation in com/ibm/log4j/package.html to + com/ibm/log4j/overview.html. Many users were failing to read the + com/ibm/log4j/package.html description due to the unfortunate + layout of the text. Hopefully more people will read the package + overview in its present location. + + Add the com.ibm.log4j.net package for doing remote logging using + TCP sockets. This is still experimental code. + + Add new debug, .., emerg methods that do not require a category + parameter. They assume the "root" category, that is the decision to + whether print or not is made by comparing the statement's priority + with the default priority. + + + + + Add a new ILog.init method accepting an Appender and a + configuration file as parameters. + +FileAppender's setWriter and setFile methods where not instantiating + a new tracer. This caused stack traces to be lost! SyslogAppender + had a similar problem. + +The FileAppender and SyslogAppender where not calling the layout's + readConfig method to set layout specific options. Thanks to Heinz + Richter (heinz.richter@ecmwf.int) for reporting this bug. + +Corrected a bug in Log.log() method where the appender was always + called with Priority.DEBUG. Thanks to Oliver Boehm + (Oliver.Boehm@abaxx.de) for reporting this bug. + + + + + Add Syslog compatibility. One can now choose (at runtime) between + remote syslog logging or file logging. + Syslog logging performance, although not appalling, is significantly + slower than file logging. + +Priority class was enriched with the previously missing priorities + NOTICE, ALERT and CRIT. The internal constants were also aligned with + the syslog counterparts. + + Add the Log.log method to support the new priorities. + +TracerPrintWriter is now an independent class instead of being a + nested top-level class in Tracer. + +A number of writers, namely the SyslogWriter, SyslogQuietWriter, + SyslogTracerPrintWriter, were added to the helper package. + +Log.force method was removed. The various Appender.doAppend + implementations take over its functionality. + +FileAppender and SyslogAppender now use QuietWriter. QuietWriter is + a FilterWriter which hides exceptions and instead emits a single + warning message to System.err. + +The layout is now an initialization parameter to the appender + type. Previously, the layout and the appender where independent + parameters to the Log constructor. + +Many small improvements and corrections in the documentation. + Syslog related documentation remains sparse. + +ILog.init() and ILog.init(String configFile) have been changed to + call ILog.init(,,,) with "com.ibm.log4j.Log.class" as the first + parameter. This makes it easier for people to get familiar with log4j. + + Add missing files to the make directory. These files are useful + for those wishing to use the log4j make environment. Thanks to "Lee + Hall" <LHall@JavaFoundry.com> for reporting this omission. + Until recently the make environment failed to compile RMI stubs in + a single run. This nagging problem has been corrected thanks to + help from Thomas Eirich (IBM Zurich Research Lab). + + + + +Some users have been rightly complaining about the verbosity + TTCCLayout's date output. The full date output is now shortened to + "dd MMM YYYY HH:mm:ss.SSS" for example, "06 Nov 1994 08:49:37.459" + In addition, users may now choose to print only time information, + as in "08:49:37.459". + +The package now uses Writer instead of OutputStream as its output + target. This makes the log4j code smaller and easier to + understand at the cost of a slight performance degradation. As a + result of this change a few method names in FileAppender class were + changed. + +Preliminary experiments with SyslogAppedner and SyslogLayout show + that syslog compatibility is not far away. The difficultly is + adding syslog compatibility without making radical changes to the + current log4j architecture. + +Corrected a bug in the NOPLog.createInstance method which always + created a Log singleton even if the system property "log4j.logType" + was set to NOPLog. Thanks to Robert Gottofrey + (Robert.Gottofrey@wdr.com) for reporting this bug and the + associated test case. + +Removed the inconsistent "Layout" configuration option in + Log.readConfig(). This change should be transparent to most + users. + + + + +The LogCreationManager class has been removed. Its functionality + has been transfered to the createInstance and getInstance methods + in the Log and NOPLog classes. The new way of creating instances is + both simpler and less error prone although just as flexible. + + As a result of these changes, the init family of methods in the + ILog class have been adjusted to the new way of creating the log + singleton. + +The Appender interface has been introduced. The method of writing a + log statement into an output stream can now be varied by using a + different Appender. The new FileAppender offers the same + functionality that was previously part of the Log class. + +Changed the time format used in TTCCLayout to be of the form "Day, + dd MMM YYYY HH:mm:ss.SSS GMT" for example, "Sun, 06 Nov 1994 + 22:49:37.459 GMT". This format is almost the same as the format + specified in RFC 1123 and also the format recommended in RFC + 2616. The only difference is the additional milliseconds + information. + +The layout specific options were not read from the configuration + file due to a missing instruction. Many thanks to Vikram Sridharan + (Vikram.Sridharan@alysis.com) to patiently pointing out this + omission to an unbelieving maintainer. + + + + +Version 0.7.0 and above will be distributed under the IBM Public + License (IPL). The IPL is an approved open source license (see + http://www.opensource.org/licenses/ for a list). It grants similar + rights to the previous ALPHAWORKS license agreement, in particular, + the right to redistribute and to modify the package. + +The Log class can now be parameterized with a Layout object. + Layouts determine the format of what is printed, where as the Log + class decides when to print and to where. + + As a result of this modularization, the CGULog and NOPCGULog + classes no longer exists. CGULog class has been replaced with the + TTCCLayout (Time Thread Context Category). This should make it + easier to create new log output formats. + + Some time in the near future, the Log class will be further broken + down to allow different strategies for writing to output streams. + +Renamed com.ibm.util.log hierarchy to to com.ibm.log4j. I wanted to + do this for some time. I feel release 0.7.0 was the last + opportunity to do so. I am sorry for the the trouble caused by this + change. + +New NDC class. This class implements nested diagnostic contexts as + suggested by Neil Harrison in the article "Patterns for Logging + Diagnostic Messages" part of the book "Pattern Languages of Program + Design 3" edited by Martin et al. Nested diagnostic contexts is a + nifty feature that was missing up to now. + + The StressNDC test class seems to break JDK 1.2.2 beta on AIX. On + Linux and NT using sun's JDK 1.2.2 it seem to work OK. In any case, + tests done with StressNDC and associated perl script seem to + indicate that the NDC class is bug-free. + +Corrected a date formatting bug in CGULog class where on some + environments the wrong month was printed. Thanks to Christopher + Williams (Christopher_Williams@mail.northgrum.com) for signaling + this bug. Also changed the month format from a number to a three + letter abbreviation such as "Jan", "Feb", ..., "Dec". The new + format is unambiguous regardless of local date format. + + + + +Clearer documentation with still much room for improvement. + +Corrected a bug in the Tracer class which always used the Unix line + separator instead of the system specific separator. Thanks to + Vikram Sridharan (Vikram.Sridharan@alysis.com) for singaling this + bug. + +Corrected a runaway comment which gulped the CGULog.readConfig + method. + + Add the init family of methods to the ILog class to ease the + setup of a basic logging environment. Thanks to Mark Donszelmann + (Mark.Donszelmann@cern.ch) for this enhancement. + +Just an hour after releasing version 0.6.1 detected and corrected a + bug where the Tracer class would correctly print Exception stack + trace but not the type of the Exception. Replaced the + distribution on www.zurich.ibm.com without changing the version + number. I hope nobody is using the intermediary (and buggy) release + of 0.6.1. + + + + +Better documentation with still much room for improvement. + +For consistence sake, added setDefaultPriority and + getDefaultPriority methods to the Category class and deprecated + setDefaultPriority in the Log.class. + +Corrected a major bug where if two categories were homonyms the + second instance would not be properly initialized. + +Increased the speed of Exception logging from about 4000 + microseconds to about 1000. It seems that for some people Exception + logging is performance critical. Improved implementation is a + variant of Nocolai's (XNH@crisplant.com) implementation. + + + + +Release of log4j 0.6.0 with incomplete documentation. + + Add a stress test program to debug the new Category class. It + turns out that the test program was as hard to get right as the + Category class. Given the favorable results of the stress test I am + quite confident that the new class is now bug free. This assumption + has been proven to be wrong. See above. + +

    Created a new class called Category to manipulate categories + instead of plain Strings. The new class is just as easy to use. + However, the evaluation of whether to log or not to log is at least + 10 times faster. The NOP class performance remain unaffected by the + change. (You can't improve on the performance of an empty function + call.)

    + +

    Many thanks to Alex Blewitt "Alex.Blewitt@ioshq.com" for his + valuable comments. He was the first to observe that finding Strings + in a hash table was an expensive operation.

    + +

    This change will require some recoding on your part. See the FAQ + for more details.

    + +Modified the force in Log and CGULog method to use a byte[] buffer + instead of a StringBuffer. The old code was clearer but the new one + is at least 25% faster. + + Add regression testing. + +

    We now enforce a policy where the OutputStream set by + setOutputStream is a user managed resource whereas the OutputStream + opened using setLogFile is the Log class' responsibility.

    + +

    The setLogFile method now closes any previous OutputStream if only + if opened through setLogFile. If the previous OutputStream was + opened by the user and set through setOutputStream the previous + OutputStream is untouched.

    + +

    Similarly, setOutputStream will close any previous OutputStream if + and only if it was opened using setLogFile.

    +
    + + Add a new method logOutputStreamExists to the Log class allowing + the programmer to check if there is already an opened stream before + trying to set a new one. A stream can be opened as a byproduct of + reading the configuration file. + +

    Changed the behavior of the (private) Log.Append method in case of + failure to write to the OutputStream.

    + +

    Previously, in case of failure, we reverted to System.err. Now, we + emit a warning message and discard all future log messages. The + new behavior is consistent with our current unreliable logging + semantics. The change prevents an otherwise functional program + from failing because the terminal is flooded with logging messages.

    + +Renamed the iLog to ILog to remain consistent with our class naming + scheme. The initial intention was to add ILog and deprecate + iLog. However, I am running CVS on a fat16 partition, causing + serious problems when files differ only in case. + +Corrected a bug where the LogFileName was not remembered. Thanks to + Jens for signaling this bug. +
    + + +Now the programmer can choose to truncate the log file instead of + always appending to it. This functionality was first requested and + intially implemented by "Jens Uwe Pipka" jens.pipka@gmx.de. + +setLogFile now opens the requested file instead of having the + Append function open it later. Cleaned up some related code in the + Append function. Although nobody has requested it, there is still + no method to close the log file. This is harder to implement + reliably than it sounds. + +Simplified setLogOutputStream so that it does no longer return the + previously set OutputStream. + + + + + +Joe Walker (joe@eireneh.com) observed that the + LogCreationManager.getSingleton mechanism was cumbersome. There is + now a new class iLog (indirect Log) which hides the need to call + getSingleton. Performance testing on my 233Mhz Thinkpad shows that + this indirection has small performance impact on non-logged calls + in the order of 40 nanoseconds. The impact on logged calls is + negligible. + + Add a jar file to the distribution. The jar file contains only + the files you would need to use log but not other classes needed + for testing nor examples. + +Corrected a bug where CGUNOPLog was not integrated to the Makefile. + + Add new public methods isDebugEnabled and isInfoEnabled to allow + programmers to check whether a debug/info statement will be logged + without incurring the cost of message parameter construction. This + addition was suggested by Luke Blanshard Luke@quiq.com. + +Renamed the private method evaluate to isEnabled. Also made it + final with no apparent speed gains. In addition, made the + Log.force method public. + +New syntactic sugar debug, ..., emerg, methods to log objects. + +Modified the interface to deal with Throwables and not just + Exceptions. My thanks to Luke Blanshard for signaling this "bug". + + Add more tests to the LogPerformance class. In particular, to + test the influence of indirect debug calls. + + Add a "make" mini-tutorial for those who want to modify the code. + +License updated to standard alphaWorks license allowing + modifications to source code. However, this license explicitly + requires that modifications be communicated back to alphaWorks. + + + + +Initial availability on alphaWorks. Refer to the FAQ for the lineage of the package. + + +
    \ No newline at end of file From 8d15fcd9068d1e762b488bfc0d6fec3f0e6671fe Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 14 May 2007 19:48:30 +0000 Subject: [PATCH 290/342] Bug 37930: Move src/java to src/main/java git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@537960 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 8 ++++---- pom.xml | 1 - src/{ => main}/java/org/apache/log4j/Appender.java | 0 .../java/org/apache/log4j/AppenderSkeleton.java | 0 .../java/org/apache/log4j/AsyncAppender.java | 0 .../java/org/apache/log4j/BasicConfigurator.java | 0 src/{ => main}/java/org/apache/log4j/Category.java | 0 .../java/org/apache/log4j/CategoryKey.java | 0 .../java/org/apache/log4j/ConsoleAppender.java | 0 .../org/apache/log4j/DailyRollingFileAppender.java | 0 .../org/apache/log4j/DefaultCategoryFactory.java | 0 .../java/org/apache/log4j/Dispatcher.java | 0 .../java/org/apache/log4j/FileAppender.java | 0 .../java/org/apache/log4j/HTMLLayout.java | 0 src/{ => main}/java/org/apache/log4j/Hierarchy.java | 0 src/{ => main}/java/org/apache/log4j/Layout.java | 0 src/{ => main}/java/org/apache/log4j/Level.java | 0 .../java/org/apache/log4j/LogManager.java | 0 src/{ => main}/java/org/apache/log4j/Logger.java | 0 src/{ => main}/java/org/apache/log4j/MDC.java | 0 src/{ => main}/java/org/apache/log4j/NDC.java | 0 .../java/org/apache/log4j/PatternLayout.java | 0 src/{ => main}/java/org/apache/log4j/Priority.java | 0 .../java/org/apache/log4j/PropertyConfigurator.java | 0 .../java/org/apache/log4j/ProvisionNode.java | 0 .../java/org/apache/log4j/RollingFileAppender.java | 0 .../java/org/apache/log4j/SimpleLayout.java | 0 .../java/org/apache/log4j/TTCCLayout.java | 0 .../java/org/apache/log4j/WriterAppender.java | 0 .../org/apache/log4j/chainsaw/ControlPanel.java | 0 .../java/org/apache/log4j/chainsaw/DetailPanel.java | 0 .../org/apache/log4j/chainsaw/EventDetails.java | 0 .../java/org/apache/log4j/chainsaw/ExitAction.java | 0 .../org/apache/log4j/chainsaw/LoadXMLAction.java | 0 .../org/apache/log4j/chainsaw/LoggingReceiver.java | 0 .../java/org/apache/log4j/chainsaw/Main.java | 0 .../org/apache/log4j/chainsaw/MyTableModel.java | 0 .../org/apache/log4j/chainsaw/XMLFileHandler.java | 0 .../apache/log4j/chainsaw/doc-files/screen_01.png | Bin .../java/org/apache/log4j/chainsaw/package.html | 0 .../org/apache/log4j/config/PropertyGetter.java | 0 .../org/apache/log4j/config/PropertyPrinter.java | 0 .../org/apache/log4j/config/PropertySetter.java | 0 .../log4j/config/PropertySetterException.java | 0 .../java/org/apache/log4j/config/package.html | 0 .../log4j/helpers/AbsoluteTimeDateFormat.java | 0 .../log4j/helpers/AppenderAttachableImpl.java | 0 .../java/org/apache/log4j/helpers/BoundedFIFO.java | 0 .../apache/log4j/helpers/CountingQuietWriter.java | 0 .../java/org/apache/log4j/helpers/CyclicBuffer.java | 0 .../java/org/apache/log4j/helpers/DateLayout.java | 0 .../apache/log4j/helpers/DateTimeDateFormat.java | 0 .../java/org/apache/log4j/helpers/FileWatchdog.java | 0 .../org/apache/log4j/helpers/FormattingInfo.java | 0 .../org/apache/log4j/helpers/ISO8601DateFormat.java | 0 .../java/org/apache/log4j/helpers/Loader.java | 0 .../java/org/apache/log4j/helpers/LogLog.java | 0 .../org/apache/log4j/helpers/NullEnumeration.java | 0 .../apache/log4j/helpers/OnlyOnceErrorHandler.java | 0 .../org/apache/log4j/helpers/OptionConverter.java | 0 .../org/apache/log4j/helpers/PatternConverter.java | 0 .../org/apache/log4j/helpers/PatternParser.java | 0 .../java/org/apache/log4j/helpers/QuietWriter.java | 0 .../log4j/helpers/RelativeTimeDateFormat.java | 0 .../org/apache/log4j/helpers/SyslogQuietWriter.java | 0 .../java/org/apache/log4j/helpers/SyslogWriter.java | 0 .../org/apache/log4j/helpers/ThreadLocalMap.java | 0 .../java/org/apache/log4j/helpers/Transform.java | 0 .../java/org/apache/log4j/helpers/package.html | 0 .../java/org/apache/log4j/jdbc/JDBCAppender.java | 0 .../java/org/apache/log4j/jdbc/package.html | 0 .../org/apache/log4j/jmx/AbstractDynamicMBean.java | 0 src/{ => main}/java/org/apache/log4j/jmx/Agent.java | 0 .../org/apache/log4j/jmx/AppenderDynamicMBean.java | 0 .../org/apache/log4j/jmx/HierarchyDynamicMBean.java | 0 .../org/apache/log4j/jmx/LayoutDynamicMBean.java | 0 .../org/apache/log4j/jmx/LoggerDynamicMBean.java | 0 .../java/org/apache/log4j/jmx/MethodUnion.java | 0 .../java/org/apache/log4j/jmx/package.html | 0 .../org/apache/log4j/lf5/AppenderFinalizer.java | 0 .../apache/log4j/lf5/DefaultLF5Configurator.java | 0 .../java/org/apache/log4j/lf5/LF5Appender.java | 0 .../java/org/apache/log4j/lf5/Log4JLogRecord.java | 0 .../java/org/apache/log4j/lf5/LogLevel.java | 0 .../apache/log4j/lf5/LogLevelFormatException.java | 0 .../java/org/apache/log4j/lf5/LogRecord.java | 0 .../java/org/apache/log4j/lf5/LogRecordFilter.java | 0 .../apache/log4j/lf5/PassingLogRecordFilter.java | 0 .../java/org/apache/log4j/lf5/StartLogFactor5.java | 0 .../log4j/lf5/config/defaultconfig.properties | 0 .../org/apache/log4j/lf5/util/AdapterLogRecord.java | 0 .../apache/log4j/lf5/util/DateFormatManager.java | 0 .../org/apache/log4j/lf5/util/LogFileParser.java | 0 .../apache/log4j/lf5/util/LogMonitorAdapter.java | 0 .../java/org/apache/log4j/lf5/util/Resource.java | 0 .../org/apache/log4j/lf5/util/ResourceUtils.java | 0 .../java/org/apache/log4j/lf5/util/StreamUtils.java | 0 .../log4j/lf5/viewer/FilteredLogTableModel.java | 0 .../org/apache/log4j/lf5/viewer/LF5SwingUtils.java | 0 .../apache/log4j/lf5/viewer/LogBrokerMonitor.java | 0 .../apache/log4j/lf5/viewer/LogFactor5Dialog.java | 0 .../log4j/lf5/viewer/LogFactor5ErrorDialog.java | 0 .../log4j/lf5/viewer/LogFactor5InputDialog.java | 0 .../log4j/lf5/viewer/LogFactor5LoadingDialog.java | 0 .../java/org/apache/log4j/lf5/viewer/LogTable.java | 0 .../org/apache/log4j/lf5/viewer/LogTableColumn.java | 0 .../lf5/viewer/LogTableColumnFormatException.java | 0 .../org/apache/log4j/lf5/viewer/LogTableModel.java | 0 .../log4j/lf5/viewer/LogTableRowRenderer.java | 0 .../lf5/viewer/TrackingAdjustmentListener.java | 0 .../CategoryAbstractCellEditor.java | 0 .../viewer/categoryexplorer/CategoryElement.java | 0 .../CategoryExplorerLogRecordFilter.java | 0 .../categoryexplorer/CategoryExplorerModel.java | 0 .../categoryexplorer/CategoryExplorerTree.java | 0 .../categoryexplorer/CategoryImmediateEditor.java | 0 .../lf5/viewer/categoryexplorer/CategoryNode.java | 0 .../viewer/categoryexplorer/CategoryNodeEditor.java | 0 .../CategoryNodeEditorRenderer.java | 0 .../categoryexplorer/CategoryNodeRenderer.java | 0 .../lf5/viewer/categoryexplorer/CategoryPath.java | 0 .../viewer/categoryexplorer/TreeModelAdapter.java | 0 .../lf5/viewer/configure/ConfigurationManager.java | 0 .../log4j/lf5/viewer/configure/MRUFileManager.java | 0 .../log4j/lf5/viewer/images/channelexplorer_new.gif | Bin .../lf5/viewer/images/channelexplorer_satellite.gif | Bin .../log4j/lf5/viewer/images/lf5_small_icon.gif | Bin .../java/org/apache/log4j/net/JMSAppender.java | 0 .../java/org/apache/log4j/net/JMSSink.java | 0 .../java/org/apache/log4j/net/SMTPAppender.java | 0 .../org/apache/log4j/net/SimpleSocketServer.java | 0 .../java/org/apache/log4j/net/SocketAppender.java | 0 .../org/apache/log4j/net/SocketHubAppender.java | 0 .../java/org/apache/log4j/net/SocketNode.java | 0 .../java/org/apache/log4j/net/SocketServer.java | 0 .../java/org/apache/log4j/net/SyslogAppender.java | 0 .../java/org/apache/log4j/net/TelnetAppender.java | 0 .../java/org/apache/log4j/net/package.html | 0 .../java/org/apache/log4j/net/test/Loop.java | 0 .../java/org/apache/log4j/net/test/SMTPMin.java | 0 .../java/org/apache/log4j/net/test/SocketMin.java | 0 .../java/org/apache/log4j/net/test/SyslogMin.java | 0 .../log4j/net/test/intermediarySocketServer.lcf | 0 .../java/org/apache/log4j/net/test/jms.lcf | 0 .../java/org/apache/log4j/net/test/logging.lcf | 0 .../java/org/apache/log4j/net/test/loop.lcf | 0 .../java/org/apache/log4j/net/test/socketClient.lcf | 0 .../java/org/apache/log4j/net/test/socketServer.lcf | 0 .../java/org/apache/log4j/net/test/syslog.lcf | 0 .../java/org/apache/log4j/net/test/syslogMin | 0 .../java/org/apache/log4j/nt/EventLogCategories.mc | 0 .../java/org/apache/log4j/nt/MSG00001.bin | Bin .../org/apache/log4j/nt/NTEventLogAppender.java | 0 .../java/org/apache/log4j/nt/NTEventLogAppender.rc | 0 .../java/org/apache/log4j/nt/nteventlog.cpp | 0 .../java/org/apache/log4j/nt/package.html | 0 .../java/org/apache/log4j/or/DefaultRenderer.java | 0 .../java/org/apache/log4j/or/ObjectRenderer.java | 0 .../java/org/apache/log4j/or/RendererMap.java | 0 .../org/apache/log4j/or/ThreadGroupRenderer.java | 0 .../org/apache/log4j/or/jms/MessageRenderer.java | 0 .../java/org/apache/log4j/or/jms/package.html | 0 .../java/org/apache/log4j/or/package.html | 0 .../org/apache/log4j/or/sax/AttributesRenderer.java | 0 .../java/org/apache/log4j/or/sax/package.html | 0 src/{ => main}/java/org/apache/log4j/package.html | 0 .../org/apache/log4j/performance/ListVsVector.java | 0 .../org/apache/log4j/performance/NOPWriter.java | 0 .../org/apache/log4j/performance/NewVsSetLen.java | 0 .../org/apache/log4j/performance/NullAppender.java | 0 .../org/apache/log4j/performance/SystemTime.java | 0 .../log4j/performance/history/FALKNIS.logging | 0 .../apache/log4j/performance/history/GIL.logging | 0 .../apache/log4j/performance/history/NAPOLI.logging | 0 .../apache/log4j/performance/history/TORINO.logging | 0 .../java/org/apache/log4j/performance/logging | 0 .../java/org/apache/log4j/performance/package.html | 0 .../org/apache/log4j/performance/xml/logging1.xml | 0 .../org/apache/log4j/performance/xml/logging10.xml | 0 .../org/apache/log4j/performance/xml/logging100.xml | 0 .../apache/log4j/performance/xml/logging1000.xml | 0 .../org/apache/log4j/performance/xml/logging101.xml | 0 .../org/apache/log4j/performance/xml/logging102.xml | 0 .../org/apache/log4j/performance/xml/logging103.xml | 0 .../org/apache/log4j/performance/xml/logging104.xml | 0 .../org/apache/log4j/performance/xml/logging105.xml | 0 .../org/apache/log4j/performance/xml/logging106.xml | 0 .../org/apache/log4j/performance/xml/logging107.xml | 0 .../org/apache/log4j/performance/xml/logging11.xml | 0 .../org/apache/log4j/performance/xml/logging12.xml | 0 .../org/apache/log4j/performance/xml/logging13.xml | 0 .../org/apache/log4j/performance/xml/logging2.xml | 0 .../org/apache/log4j/performance/xml/logging200.xml | 0 .../org/apache/log4j/performance/xml/logging201.xml | 0 .../org/apache/log4j/performance/xml/logging202.xml | 0 .../org/apache/log4j/performance/xml/logging203.xml | 0 .../org/apache/log4j/performance/xml/logging204.xml | 0 .../org/apache/log4j/performance/xml/logging205.xml | 0 .../org/apache/log4j/performance/xml/logging206.xml | 0 .../org/apache/log4j/performance/xml/logging207.xml | 0 .../org/apache/log4j/performance/xml/logging220.xml | 0 .../org/apache/log4j/performance/xml/logging221.xml | 0 .../org/apache/log4j/performance/xml/logging222.xml | 0 .../org/apache/log4j/performance/xml/logging223.xml | 0 .../org/apache/log4j/performance/xml/logging224.xml | 0 .../org/apache/log4j/performance/xml/logging225.xml | 0 .../org/apache/log4j/performance/xml/logging226.xml | 0 .../org/apache/log4j/performance/xml/logging227.xml | 0 .../org/apache/log4j/performance/xml/logging3.xml | 0 .../org/apache/log4j/performance/xml/logging300.xml | 0 .../org/apache/log4j/performance/xml/logging301.xml | 0 .../org/apache/log4j/performance/xml/logging302.xml | 0 .../org/apache/log4j/performance/xml/logging303.xml | 0 .../org/apache/log4j/performance/xml/logging304.xml | 0 .../org/apache/log4j/performance/xml/logging305.xml | 0 .../org/apache/log4j/performance/xml/logging306.xml | 0 .../org/apache/log4j/performance/xml/logging307.xml | 0 .../org/apache/log4j/performance/xml/logging4.xml | 0 .../org/apache/log4j/performance/xml/logging5.xml | 0 .../org/apache/log4j/performance/xml/logging6.xml | 0 .../org/apache/log4j/performance/xml/logging7.xml | 0 .../org/apache/log4j/performance/xml/logging8.xml | 0 .../org/apache/log4j/performance/xml/logging9.xml | 0 .../org/apache/log4j/spi/AppenderAttachable.java | 0 .../java/org/apache/log4j/spi/Configurator.java | 0 .../apache/log4j/spi/DefaultRepositorySelector.java | 0 .../java/org/apache/log4j/spi/ErrorCode.java | 0 .../java/org/apache/log4j/spi/ErrorHandler.java | 0 .../java/org/apache/log4j/spi/Filter.java | 0 .../apache/log4j/spi/HierarchyEventListener.java | 0 .../java/org/apache/log4j/spi/LocationInfo.java | 0 .../java/org/apache/log4j/spi/LoggerFactory.java | 0 .../java/org/apache/log4j/spi/LoggerRepository.java | 0 .../java/org/apache/log4j/spi/LoggingEvent.java | 0 .../java/org/apache/log4j/spi/NullWriter.java | 0 .../java/org/apache/log4j/spi/OptionHandler.java | 0 .../java/org/apache/log4j/spi/RendererSupport.java | 0 .../org/apache/log4j/spi/RepositorySelector.java | 0 .../java/org/apache/log4j/spi/RootCategory.java | 0 .../java/org/apache/log4j/spi/RootLogger.java | 0 .../org/apache/log4j/spi/ThrowableInformation.java | 0 .../apache/log4j/spi/TriggeringEventEvaluator.java | 0 .../java/org/apache/log4j/spi/VectorWriter.java | 0 .../java/org/apache/log4j/spi/package.html | 0 .../java/org/apache/log4j/varia/DenyAllFilter.java | 0 .../log4j/varia/ExternallyRolledFileAppender.java | 0 .../apache/log4j/varia/FallbackErrorHandler.java | 0 .../org/apache/log4j/varia/LevelMatchFilter.java | 0 .../org/apache/log4j/varia/LevelRangeFilter.java | 0 .../java/org/apache/log4j/varia/NullAppender.java | 0 .../log4j/varia/ReloadingPropertyConfigurator.java | 0 .../java/org/apache/log4j/varia/Roller.java | 0 .../org/apache/log4j/varia/StringMatchFilter.java | 0 .../java/org/apache/log4j/varia/package.html | 0 .../java/org/apache/log4j/varia/test/Loop.java | 0 .../org/apache/log4j/varia/test/checkForHoles.pl | 0 .../java/org/apache/log4j/varia/test/doRoll | 0 .../java/org/apache/log4j/varia/test/elf.pl | 0 .../java/org/apache/log4j/varia/test/externalRoll | 0 .../java/org/apache/log4j/varia/test/resiliency | 0 .../java/org/apache/log4j/xml/DOMConfigurator.java | 0 .../org/apache/log4j/xml/Log4jEntityResolver.java | 0 .../java/org/apache/log4j/xml/SAXErrorHandler.java | 0 .../log4j/xml/UnrecognizedElementHandler.java | 0 .../java/org/apache/log4j/xml/XMLLayout.java | 0 .../log4j/xml/examples/ReportParserError.java | 0 .../org/apache/log4j/xml/examples/XMLSample.java | 0 .../org/apache/log4j/xml/examples/extension1.xml | 0 .../org/apache/log4j/xml/examples/extension2.xml | 0 .../java/org/apache/log4j/xml/examples/package.html | 0 .../java/org/apache/log4j/xml/examples/sample1.xml | 0 .../java/org/apache/log4j/xml/examples/sample2.xml | 0 .../java/org/apache/log4j/xml/examples/sample3.xml | 0 .../java/org/apache/log4j/xml/examples/sample4.xml | 0 .../java/org/apache/log4j/xml/examples/sample5.xml | 0 src/{ => main}/java/org/apache/log4j/xml/log4j.dtd | 0 .../java/org/apache/log4j/xml/package.html | 0 .../java/org/apache/log4j/xml/test/DOMTest.java | 0 .../java/org/apache/log4j/xml/test/testlog.xml | 0 tests/build.xml | 2 +- 280 files changed, 5 insertions(+), 6 deletions(-) rename src/{ => main}/java/org/apache/log4j/Appender.java (100%) rename src/{ => main}/java/org/apache/log4j/AppenderSkeleton.java (100%) rename src/{ => main}/java/org/apache/log4j/AsyncAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/BasicConfigurator.java (100%) rename src/{ => main}/java/org/apache/log4j/Category.java (100%) rename src/{ => main}/java/org/apache/log4j/CategoryKey.java (100%) rename src/{ => main}/java/org/apache/log4j/ConsoleAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/DailyRollingFileAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/DefaultCategoryFactory.java (100%) rename src/{ => main}/java/org/apache/log4j/Dispatcher.java (100%) rename src/{ => main}/java/org/apache/log4j/FileAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/HTMLLayout.java (100%) rename src/{ => main}/java/org/apache/log4j/Hierarchy.java (100%) rename src/{ => main}/java/org/apache/log4j/Layout.java (100%) rename src/{ => main}/java/org/apache/log4j/Level.java (100%) rename src/{ => main}/java/org/apache/log4j/LogManager.java (100%) rename src/{ => main}/java/org/apache/log4j/Logger.java (100%) rename src/{ => main}/java/org/apache/log4j/MDC.java (100%) rename src/{ => main}/java/org/apache/log4j/NDC.java (100%) rename src/{ => main}/java/org/apache/log4j/PatternLayout.java (100%) rename src/{ => main}/java/org/apache/log4j/Priority.java (100%) rename src/{ => main}/java/org/apache/log4j/PropertyConfigurator.java (100%) rename src/{ => main}/java/org/apache/log4j/ProvisionNode.java (100%) rename src/{ => main}/java/org/apache/log4j/RollingFileAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/SimpleLayout.java (100%) rename src/{ => main}/java/org/apache/log4j/TTCCLayout.java (100%) rename src/{ => main}/java/org/apache/log4j/WriterAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/chainsaw/ControlPanel.java (100%) rename src/{ => main}/java/org/apache/log4j/chainsaw/DetailPanel.java (100%) rename src/{ => main}/java/org/apache/log4j/chainsaw/EventDetails.java (100%) rename src/{ => main}/java/org/apache/log4j/chainsaw/ExitAction.java (100%) rename src/{ => main}/java/org/apache/log4j/chainsaw/LoadXMLAction.java (100%) rename src/{ => main}/java/org/apache/log4j/chainsaw/LoggingReceiver.java (100%) rename src/{ => main}/java/org/apache/log4j/chainsaw/Main.java (100%) rename src/{ => main}/java/org/apache/log4j/chainsaw/MyTableModel.java (100%) rename src/{ => main}/java/org/apache/log4j/chainsaw/XMLFileHandler.java (100%) rename src/{ => main}/java/org/apache/log4j/chainsaw/doc-files/screen_01.png (100%) rename src/{ => main}/java/org/apache/log4j/chainsaw/package.html (100%) rename src/{ => main}/java/org/apache/log4j/config/PropertyGetter.java (100%) rename src/{ => main}/java/org/apache/log4j/config/PropertyPrinter.java (100%) rename src/{ => main}/java/org/apache/log4j/config/PropertySetter.java (100%) rename src/{ => main}/java/org/apache/log4j/config/PropertySetterException.java (100%) rename src/{ => main}/java/org/apache/log4j/config/package.html (100%) rename src/{ => main}/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/AppenderAttachableImpl.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/BoundedFIFO.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/CountingQuietWriter.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/CyclicBuffer.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/DateLayout.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/DateTimeDateFormat.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/FileWatchdog.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/FormattingInfo.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/ISO8601DateFormat.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/Loader.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/LogLog.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/NullEnumeration.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/OptionConverter.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/PatternConverter.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/PatternParser.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/QuietWriter.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/SyslogQuietWriter.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/SyslogWriter.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/ThreadLocalMap.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/Transform.java (100%) rename src/{ => main}/java/org/apache/log4j/helpers/package.html (100%) rename src/{ => main}/java/org/apache/log4j/jdbc/JDBCAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/jdbc/package.html (100%) rename src/{ => main}/java/org/apache/log4j/jmx/AbstractDynamicMBean.java (100%) rename src/{ => main}/java/org/apache/log4j/jmx/Agent.java (100%) rename src/{ => main}/java/org/apache/log4j/jmx/AppenderDynamicMBean.java (100%) rename src/{ => main}/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java (100%) rename src/{ => main}/java/org/apache/log4j/jmx/LayoutDynamicMBean.java (100%) rename src/{ => main}/java/org/apache/log4j/jmx/LoggerDynamicMBean.java (100%) rename src/{ => main}/java/org/apache/log4j/jmx/MethodUnion.java (100%) rename src/{ => main}/java/org/apache/log4j/jmx/package.html (100%) rename src/{ => main}/java/org/apache/log4j/lf5/AppenderFinalizer.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/DefaultLF5Configurator.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/LF5Appender.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/Log4JLogRecord.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/LogLevel.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/LogLevelFormatException.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/LogRecord.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/LogRecordFilter.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/PassingLogRecordFilter.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/StartLogFactor5.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/config/defaultconfig.properties (100%) rename src/{ => main}/java/org/apache/log4j/lf5/util/AdapterLogRecord.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/util/DateFormatManager.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/util/LogFileParser.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/util/Resource.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/util/ResourceUtils.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/util/StreamUtils.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/LogTable.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/LogTableColumn.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/LogTableModel.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/images/channelexplorer_new.gif (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/images/channelexplorer_satellite.gif (100%) rename src/{ => main}/java/org/apache/log4j/lf5/viewer/images/lf5_small_icon.gif (100%) rename src/{ => main}/java/org/apache/log4j/net/JMSAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/net/JMSSink.java (100%) rename src/{ => main}/java/org/apache/log4j/net/SMTPAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/net/SimpleSocketServer.java (100%) rename src/{ => main}/java/org/apache/log4j/net/SocketAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/net/SocketHubAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/net/SocketNode.java (100%) rename src/{ => main}/java/org/apache/log4j/net/SocketServer.java (100%) rename src/{ => main}/java/org/apache/log4j/net/SyslogAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/net/TelnetAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/net/package.html (100%) rename src/{ => main}/java/org/apache/log4j/net/test/Loop.java (100%) rename src/{ => main}/java/org/apache/log4j/net/test/SMTPMin.java (100%) rename src/{ => main}/java/org/apache/log4j/net/test/SocketMin.java (100%) rename src/{ => main}/java/org/apache/log4j/net/test/SyslogMin.java (100%) rename src/{ => main}/java/org/apache/log4j/net/test/intermediarySocketServer.lcf (100%) rename src/{ => main}/java/org/apache/log4j/net/test/jms.lcf (100%) rename src/{ => main}/java/org/apache/log4j/net/test/logging.lcf (100%) rename src/{ => main}/java/org/apache/log4j/net/test/loop.lcf (100%) rename src/{ => main}/java/org/apache/log4j/net/test/socketClient.lcf (100%) rename src/{ => main}/java/org/apache/log4j/net/test/socketServer.lcf (100%) rename src/{ => main}/java/org/apache/log4j/net/test/syslog.lcf (100%) rename src/{ => main}/java/org/apache/log4j/net/test/syslogMin (100%) rename src/{ => main}/java/org/apache/log4j/nt/EventLogCategories.mc (100%) rename src/{ => main}/java/org/apache/log4j/nt/MSG00001.bin (100%) rename src/{ => main}/java/org/apache/log4j/nt/NTEventLogAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/nt/NTEventLogAppender.rc (100%) rename src/{ => main}/java/org/apache/log4j/nt/nteventlog.cpp (100%) rename src/{ => main}/java/org/apache/log4j/nt/package.html (100%) rename src/{ => main}/java/org/apache/log4j/or/DefaultRenderer.java (100%) rename src/{ => main}/java/org/apache/log4j/or/ObjectRenderer.java (100%) rename src/{ => main}/java/org/apache/log4j/or/RendererMap.java (100%) rename src/{ => main}/java/org/apache/log4j/or/ThreadGroupRenderer.java (100%) rename src/{ => main}/java/org/apache/log4j/or/jms/MessageRenderer.java (100%) rename src/{ => main}/java/org/apache/log4j/or/jms/package.html (100%) rename src/{ => main}/java/org/apache/log4j/or/package.html (100%) rename src/{ => main}/java/org/apache/log4j/or/sax/AttributesRenderer.java (100%) rename src/{ => main}/java/org/apache/log4j/or/sax/package.html (100%) rename src/{ => main}/java/org/apache/log4j/package.html (100%) rename src/{ => main}/java/org/apache/log4j/performance/ListVsVector.java (100%) rename src/{ => main}/java/org/apache/log4j/performance/NOPWriter.java (100%) rename src/{ => main}/java/org/apache/log4j/performance/NewVsSetLen.java (100%) rename src/{ => main}/java/org/apache/log4j/performance/NullAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/performance/SystemTime.java (100%) rename src/{ => main}/java/org/apache/log4j/performance/history/FALKNIS.logging (100%) rename src/{ => main}/java/org/apache/log4j/performance/history/GIL.logging (100%) rename src/{ => main}/java/org/apache/log4j/performance/history/NAPOLI.logging (100%) rename src/{ => main}/java/org/apache/log4j/performance/history/TORINO.logging (100%) rename src/{ => main}/java/org/apache/log4j/performance/logging (100%) rename src/{ => main}/java/org/apache/log4j/performance/package.html (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging1.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging10.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging100.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging1000.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging101.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging102.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging103.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging104.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging105.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging106.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging107.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging11.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging12.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging13.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging2.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging200.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging201.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging202.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging203.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging204.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging205.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging206.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging207.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging220.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging221.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging222.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging223.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging224.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging225.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging226.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging227.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging3.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging300.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging301.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging302.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging303.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging304.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging305.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging306.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging307.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging4.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging5.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging6.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging7.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging8.xml (100%) rename src/{ => main}/java/org/apache/log4j/performance/xml/logging9.xml (100%) rename src/{ => main}/java/org/apache/log4j/spi/AppenderAttachable.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/Configurator.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/DefaultRepositorySelector.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/ErrorCode.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/ErrorHandler.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/Filter.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/HierarchyEventListener.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/LocationInfo.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/LoggerFactory.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/LoggerRepository.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/LoggingEvent.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/NullWriter.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/OptionHandler.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/RendererSupport.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/RepositorySelector.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/RootCategory.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/RootLogger.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/ThrowableInformation.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/TriggeringEventEvaluator.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/VectorWriter.java (100%) rename src/{ => main}/java/org/apache/log4j/spi/package.html (100%) rename src/{ => main}/java/org/apache/log4j/varia/DenyAllFilter.java (100%) rename src/{ => main}/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/varia/FallbackErrorHandler.java (100%) rename src/{ => main}/java/org/apache/log4j/varia/LevelMatchFilter.java (100%) rename src/{ => main}/java/org/apache/log4j/varia/LevelRangeFilter.java (100%) rename src/{ => main}/java/org/apache/log4j/varia/NullAppender.java (100%) rename src/{ => main}/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java (100%) rename src/{ => main}/java/org/apache/log4j/varia/Roller.java (100%) rename src/{ => main}/java/org/apache/log4j/varia/StringMatchFilter.java (100%) rename src/{ => main}/java/org/apache/log4j/varia/package.html (100%) rename src/{ => main}/java/org/apache/log4j/varia/test/Loop.java (100%) rename src/{ => main}/java/org/apache/log4j/varia/test/checkForHoles.pl (100%) rename src/{ => main}/java/org/apache/log4j/varia/test/doRoll (100%) rename src/{ => main}/java/org/apache/log4j/varia/test/elf.pl (100%) rename src/{ => main}/java/org/apache/log4j/varia/test/externalRoll (100%) rename src/{ => main}/java/org/apache/log4j/varia/test/resiliency (100%) rename src/{ => main}/java/org/apache/log4j/xml/DOMConfigurator.java (100%) rename src/{ => main}/java/org/apache/log4j/xml/Log4jEntityResolver.java (100%) rename src/{ => main}/java/org/apache/log4j/xml/SAXErrorHandler.java (100%) rename src/{ => main}/java/org/apache/log4j/xml/UnrecognizedElementHandler.java (100%) rename src/{ => main}/java/org/apache/log4j/xml/XMLLayout.java (100%) rename src/{ => main}/java/org/apache/log4j/xml/examples/ReportParserError.java (100%) rename src/{ => main}/java/org/apache/log4j/xml/examples/XMLSample.java (100%) rename src/{ => main}/java/org/apache/log4j/xml/examples/extension1.xml (100%) rename src/{ => main}/java/org/apache/log4j/xml/examples/extension2.xml (100%) rename src/{ => main}/java/org/apache/log4j/xml/examples/package.html (100%) rename src/{ => main}/java/org/apache/log4j/xml/examples/sample1.xml (100%) rename src/{ => main}/java/org/apache/log4j/xml/examples/sample2.xml (100%) rename src/{ => main}/java/org/apache/log4j/xml/examples/sample3.xml (100%) rename src/{ => main}/java/org/apache/log4j/xml/examples/sample4.xml (100%) rename src/{ => main}/java/org/apache/log4j/xml/examples/sample5.xml (100%) rename src/{ => main}/java/org/apache/log4j/xml/log4j.dtd (100%) rename src/{ => main}/java/org/apache/log4j/xml/package.html (100%) rename src/{ => main}/java/org/apache/log4j/xml/test/DOMTest.java (100%) rename src/{ => main}/java/org/apache/log4j/xml/test/testlog.xml (100%) diff --git a/build.xml b/build.xml index fcdf4311ef..7dd26e3d2b 100644 --- a/build.xml +++ b/build.xml @@ -23,7 +23,7 @@ - + - + @@ -718,7 +718,7 @@ diff --git a/pom.xml b/pom.xml index 3f7ee07202..48ba93171c 100644 --- a/pom.xml +++ b/pom.xml @@ -103,7 +103,6 @@ - src/java tests/src/java diff --git a/src/java/org/apache/log4j/Appender.java b/src/main/java/org/apache/log4j/Appender.java similarity index 100% rename from src/java/org/apache/log4j/Appender.java rename to src/main/java/org/apache/log4j/Appender.java diff --git a/src/java/org/apache/log4j/AppenderSkeleton.java b/src/main/java/org/apache/log4j/AppenderSkeleton.java similarity index 100% rename from src/java/org/apache/log4j/AppenderSkeleton.java rename to src/main/java/org/apache/log4j/AppenderSkeleton.java diff --git a/src/java/org/apache/log4j/AsyncAppender.java b/src/main/java/org/apache/log4j/AsyncAppender.java similarity index 100% rename from src/java/org/apache/log4j/AsyncAppender.java rename to src/main/java/org/apache/log4j/AsyncAppender.java diff --git a/src/java/org/apache/log4j/BasicConfigurator.java b/src/main/java/org/apache/log4j/BasicConfigurator.java similarity index 100% rename from src/java/org/apache/log4j/BasicConfigurator.java rename to src/main/java/org/apache/log4j/BasicConfigurator.java diff --git a/src/java/org/apache/log4j/Category.java b/src/main/java/org/apache/log4j/Category.java similarity index 100% rename from src/java/org/apache/log4j/Category.java rename to src/main/java/org/apache/log4j/Category.java diff --git a/src/java/org/apache/log4j/CategoryKey.java b/src/main/java/org/apache/log4j/CategoryKey.java similarity index 100% rename from src/java/org/apache/log4j/CategoryKey.java rename to src/main/java/org/apache/log4j/CategoryKey.java diff --git a/src/java/org/apache/log4j/ConsoleAppender.java b/src/main/java/org/apache/log4j/ConsoleAppender.java similarity index 100% rename from src/java/org/apache/log4j/ConsoleAppender.java rename to src/main/java/org/apache/log4j/ConsoleAppender.java diff --git a/src/java/org/apache/log4j/DailyRollingFileAppender.java b/src/main/java/org/apache/log4j/DailyRollingFileAppender.java similarity index 100% rename from src/java/org/apache/log4j/DailyRollingFileAppender.java rename to src/main/java/org/apache/log4j/DailyRollingFileAppender.java diff --git a/src/java/org/apache/log4j/DefaultCategoryFactory.java b/src/main/java/org/apache/log4j/DefaultCategoryFactory.java similarity index 100% rename from src/java/org/apache/log4j/DefaultCategoryFactory.java rename to src/main/java/org/apache/log4j/DefaultCategoryFactory.java diff --git a/src/java/org/apache/log4j/Dispatcher.java b/src/main/java/org/apache/log4j/Dispatcher.java similarity index 100% rename from src/java/org/apache/log4j/Dispatcher.java rename to src/main/java/org/apache/log4j/Dispatcher.java diff --git a/src/java/org/apache/log4j/FileAppender.java b/src/main/java/org/apache/log4j/FileAppender.java similarity index 100% rename from src/java/org/apache/log4j/FileAppender.java rename to src/main/java/org/apache/log4j/FileAppender.java diff --git a/src/java/org/apache/log4j/HTMLLayout.java b/src/main/java/org/apache/log4j/HTMLLayout.java similarity index 100% rename from src/java/org/apache/log4j/HTMLLayout.java rename to src/main/java/org/apache/log4j/HTMLLayout.java diff --git a/src/java/org/apache/log4j/Hierarchy.java b/src/main/java/org/apache/log4j/Hierarchy.java similarity index 100% rename from src/java/org/apache/log4j/Hierarchy.java rename to src/main/java/org/apache/log4j/Hierarchy.java diff --git a/src/java/org/apache/log4j/Layout.java b/src/main/java/org/apache/log4j/Layout.java similarity index 100% rename from src/java/org/apache/log4j/Layout.java rename to src/main/java/org/apache/log4j/Layout.java diff --git a/src/java/org/apache/log4j/Level.java b/src/main/java/org/apache/log4j/Level.java similarity index 100% rename from src/java/org/apache/log4j/Level.java rename to src/main/java/org/apache/log4j/Level.java diff --git a/src/java/org/apache/log4j/LogManager.java b/src/main/java/org/apache/log4j/LogManager.java similarity index 100% rename from src/java/org/apache/log4j/LogManager.java rename to src/main/java/org/apache/log4j/LogManager.java diff --git a/src/java/org/apache/log4j/Logger.java b/src/main/java/org/apache/log4j/Logger.java similarity index 100% rename from src/java/org/apache/log4j/Logger.java rename to src/main/java/org/apache/log4j/Logger.java diff --git a/src/java/org/apache/log4j/MDC.java b/src/main/java/org/apache/log4j/MDC.java similarity index 100% rename from src/java/org/apache/log4j/MDC.java rename to src/main/java/org/apache/log4j/MDC.java diff --git a/src/java/org/apache/log4j/NDC.java b/src/main/java/org/apache/log4j/NDC.java similarity index 100% rename from src/java/org/apache/log4j/NDC.java rename to src/main/java/org/apache/log4j/NDC.java diff --git a/src/java/org/apache/log4j/PatternLayout.java b/src/main/java/org/apache/log4j/PatternLayout.java similarity index 100% rename from src/java/org/apache/log4j/PatternLayout.java rename to src/main/java/org/apache/log4j/PatternLayout.java diff --git a/src/java/org/apache/log4j/Priority.java b/src/main/java/org/apache/log4j/Priority.java similarity index 100% rename from src/java/org/apache/log4j/Priority.java rename to src/main/java/org/apache/log4j/Priority.java diff --git a/src/java/org/apache/log4j/PropertyConfigurator.java b/src/main/java/org/apache/log4j/PropertyConfigurator.java similarity index 100% rename from src/java/org/apache/log4j/PropertyConfigurator.java rename to src/main/java/org/apache/log4j/PropertyConfigurator.java diff --git a/src/java/org/apache/log4j/ProvisionNode.java b/src/main/java/org/apache/log4j/ProvisionNode.java similarity index 100% rename from src/java/org/apache/log4j/ProvisionNode.java rename to src/main/java/org/apache/log4j/ProvisionNode.java diff --git a/src/java/org/apache/log4j/RollingFileAppender.java b/src/main/java/org/apache/log4j/RollingFileAppender.java similarity index 100% rename from src/java/org/apache/log4j/RollingFileAppender.java rename to src/main/java/org/apache/log4j/RollingFileAppender.java diff --git a/src/java/org/apache/log4j/SimpleLayout.java b/src/main/java/org/apache/log4j/SimpleLayout.java similarity index 100% rename from src/java/org/apache/log4j/SimpleLayout.java rename to src/main/java/org/apache/log4j/SimpleLayout.java diff --git a/src/java/org/apache/log4j/TTCCLayout.java b/src/main/java/org/apache/log4j/TTCCLayout.java similarity index 100% rename from src/java/org/apache/log4j/TTCCLayout.java rename to src/main/java/org/apache/log4j/TTCCLayout.java diff --git a/src/java/org/apache/log4j/WriterAppender.java b/src/main/java/org/apache/log4j/WriterAppender.java similarity index 100% rename from src/java/org/apache/log4j/WriterAppender.java rename to src/main/java/org/apache/log4j/WriterAppender.java diff --git a/src/java/org/apache/log4j/chainsaw/ControlPanel.java b/src/main/java/org/apache/log4j/chainsaw/ControlPanel.java similarity index 100% rename from src/java/org/apache/log4j/chainsaw/ControlPanel.java rename to src/main/java/org/apache/log4j/chainsaw/ControlPanel.java diff --git a/src/java/org/apache/log4j/chainsaw/DetailPanel.java b/src/main/java/org/apache/log4j/chainsaw/DetailPanel.java similarity index 100% rename from src/java/org/apache/log4j/chainsaw/DetailPanel.java rename to src/main/java/org/apache/log4j/chainsaw/DetailPanel.java diff --git a/src/java/org/apache/log4j/chainsaw/EventDetails.java b/src/main/java/org/apache/log4j/chainsaw/EventDetails.java similarity index 100% rename from src/java/org/apache/log4j/chainsaw/EventDetails.java rename to src/main/java/org/apache/log4j/chainsaw/EventDetails.java diff --git a/src/java/org/apache/log4j/chainsaw/ExitAction.java b/src/main/java/org/apache/log4j/chainsaw/ExitAction.java similarity index 100% rename from src/java/org/apache/log4j/chainsaw/ExitAction.java rename to src/main/java/org/apache/log4j/chainsaw/ExitAction.java diff --git a/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java b/src/main/java/org/apache/log4j/chainsaw/LoadXMLAction.java similarity index 100% rename from src/java/org/apache/log4j/chainsaw/LoadXMLAction.java rename to src/main/java/org/apache/log4j/chainsaw/LoadXMLAction.java diff --git a/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java b/src/main/java/org/apache/log4j/chainsaw/LoggingReceiver.java similarity index 100% rename from src/java/org/apache/log4j/chainsaw/LoggingReceiver.java rename to src/main/java/org/apache/log4j/chainsaw/LoggingReceiver.java diff --git a/src/java/org/apache/log4j/chainsaw/Main.java b/src/main/java/org/apache/log4j/chainsaw/Main.java similarity index 100% rename from src/java/org/apache/log4j/chainsaw/Main.java rename to src/main/java/org/apache/log4j/chainsaw/Main.java diff --git a/src/java/org/apache/log4j/chainsaw/MyTableModel.java b/src/main/java/org/apache/log4j/chainsaw/MyTableModel.java similarity index 100% rename from src/java/org/apache/log4j/chainsaw/MyTableModel.java rename to src/main/java/org/apache/log4j/chainsaw/MyTableModel.java diff --git a/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java b/src/main/java/org/apache/log4j/chainsaw/XMLFileHandler.java similarity index 100% rename from src/java/org/apache/log4j/chainsaw/XMLFileHandler.java rename to src/main/java/org/apache/log4j/chainsaw/XMLFileHandler.java diff --git a/src/java/org/apache/log4j/chainsaw/doc-files/screen_01.png b/src/main/java/org/apache/log4j/chainsaw/doc-files/screen_01.png similarity index 100% rename from src/java/org/apache/log4j/chainsaw/doc-files/screen_01.png rename to src/main/java/org/apache/log4j/chainsaw/doc-files/screen_01.png diff --git a/src/java/org/apache/log4j/chainsaw/package.html b/src/main/java/org/apache/log4j/chainsaw/package.html similarity index 100% rename from src/java/org/apache/log4j/chainsaw/package.html rename to src/main/java/org/apache/log4j/chainsaw/package.html diff --git a/src/java/org/apache/log4j/config/PropertyGetter.java b/src/main/java/org/apache/log4j/config/PropertyGetter.java similarity index 100% rename from src/java/org/apache/log4j/config/PropertyGetter.java rename to src/main/java/org/apache/log4j/config/PropertyGetter.java diff --git a/src/java/org/apache/log4j/config/PropertyPrinter.java b/src/main/java/org/apache/log4j/config/PropertyPrinter.java similarity index 100% rename from src/java/org/apache/log4j/config/PropertyPrinter.java rename to src/main/java/org/apache/log4j/config/PropertyPrinter.java diff --git a/src/java/org/apache/log4j/config/PropertySetter.java b/src/main/java/org/apache/log4j/config/PropertySetter.java similarity index 100% rename from src/java/org/apache/log4j/config/PropertySetter.java rename to src/main/java/org/apache/log4j/config/PropertySetter.java diff --git a/src/java/org/apache/log4j/config/PropertySetterException.java b/src/main/java/org/apache/log4j/config/PropertySetterException.java similarity index 100% rename from src/java/org/apache/log4j/config/PropertySetterException.java rename to src/main/java/org/apache/log4j/config/PropertySetterException.java diff --git a/src/java/org/apache/log4j/config/package.html b/src/main/java/org/apache/log4j/config/package.html similarity index 100% rename from src/java/org/apache/log4j/config/package.html rename to src/main/java/org/apache/log4j/config/package.html diff --git a/src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java b/src/main/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java similarity index 100% rename from src/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java rename to src/main/java/org/apache/log4j/helpers/AbsoluteTimeDateFormat.java diff --git a/src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java b/src/main/java/org/apache/log4j/helpers/AppenderAttachableImpl.java similarity index 100% rename from src/java/org/apache/log4j/helpers/AppenderAttachableImpl.java rename to src/main/java/org/apache/log4j/helpers/AppenderAttachableImpl.java diff --git a/src/java/org/apache/log4j/helpers/BoundedFIFO.java b/src/main/java/org/apache/log4j/helpers/BoundedFIFO.java similarity index 100% rename from src/java/org/apache/log4j/helpers/BoundedFIFO.java rename to src/main/java/org/apache/log4j/helpers/BoundedFIFO.java diff --git a/src/java/org/apache/log4j/helpers/CountingQuietWriter.java b/src/main/java/org/apache/log4j/helpers/CountingQuietWriter.java similarity index 100% rename from src/java/org/apache/log4j/helpers/CountingQuietWriter.java rename to src/main/java/org/apache/log4j/helpers/CountingQuietWriter.java diff --git a/src/java/org/apache/log4j/helpers/CyclicBuffer.java b/src/main/java/org/apache/log4j/helpers/CyclicBuffer.java similarity index 100% rename from src/java/org/apache/log4j/helpers/CyclicBuffer.java rename to src/main/java/org/apache/log4j/helpers/CyclicBuffer.java diff --git a/src/java/org/apache/log4j/helpers/DateLayout.java b/src/main/java/org/apache/log4j/helpers/DateLayout.java similarity index 100% rename from src/java/org/apache/log4j/helpers/DateLayout.java rename to src/main/java/org/apache/log4j/helpers/DateLayout.java diff --git a/src/java/org/apache/log4j/helpers/DateTimeDateFormat.java b/src/main/java/org/apache/log4j/helpers/DateTimeDateFormat.java similarity index 100% rename from src/java/org/apache/log4j/helpers/DateTimeDateFormat.java rename to src/main/java/org/apache/log4j/helpers/DateTimeDateFormat.java diff --git a/src/java/org/apache/log4j/helpers/FileWatchdog.java b/src/main/java/org/apache/log4j/helpers/FileWatchdog.java similarity index 100% rename from src/java/org/apache/log4j/helpers/FileWatchdog.java rename to src/main/java/org/apache/log4j/helpers/FileWatchdog.java diff --git a/src/java/org/apache/log4j/helpers/FormattingInfo.java b/src/main/java/org/apache/log4j/helpers/FormattingInfo.java similarity index 100% rename from src/java/org/apache/log4j/helpers/FormattingInfo.java rename to src/main/java/org/apache/log4j/helpers/FormattingInfo.java diff --git a/src/java/org/apache/log4j/helpers/ISO8601DateFormat.java b/src/main/java/org/apache/log4j/helpers/ISO8601DateFormat.java similarity index 100% rename from src/java/org/apache/log4j/helpers/ISO8601DateFormat.java rename to src/main/java/org/apache/log4j/helpers/ISO8601DateFormat.java diff --git a/src/java/org/apache/log4j/helpers/Loader.java b/src/main/java/org/apache/log4j/helpers/Loader.java similarity index 100% rename from src/java/org/apache/log4j/helpers/Loader.java rename to src/main/java/org/apache/log4j/helpers/Loader.java diff --git a/src/java/org/apache/log4j/helpers/LogLog.java b/src/main/java/org/apache/log4j/helpers/LogLog.java similarity index 100% rename from src/java/org/apache/log4j/helpers/LogLog.java rename to src/main/java/org/apache/log4j/helpers/LogLog.java diff --git a/src/java/org/apache/log4j/helpers/NullEnumeration.java b/src/main/java/org/apache/log4j/helpers/NullEnumeration.java similarity index 100% rename from src/java/org/apache/log4j/helpers/NullEnumeration.java rename to src/main/java/org/apache/log4j/helpers/NullEnumeration.java diff --git a/src/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java b/src/main/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java similarity index 100% rename from src/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java rename to src/main/java/org/apache/log4j/helpers/OnlyOnceErrorHandler.java diff --git a/src/java/org/apache/log4j/helpers/OptionConverter.java b/src/main/java/org/apache/log4j/helpers/OptionConverter.java similarity index 100% rename from src/java/org/apache/log4j/helpers/OptionConverter.java rename to src/main/java/org/apache/log4j/helpers/OptionConverter.java diff --git a/src/java/org/apache/log4j/helpers/PatternConverter.java b/src/main/java/org/apache/log4j/helpers/PatternConverter.java similarity index 100% rename from src/java/org/apache/log4j/helpers/PatternConverter.java rename to src/main/java/org/apache/log4j/helpers/PatternConverter.java diff --git a/src/java/org/apache/log4j/helpers/PatternParser.java b/src/main/java/org/apache/log4j/helpers/PatternParser.java similarity index 100% rename from src/java/org/apache/log4j/helpers/PatternParser.java rename to src/main/java/org/apache/log4j/helpers/PatternParser.java diff --git a/src/java/org/apache/log4j/helpers/QuietWriter.java b/src/main/java/org/apache/log4j/helpers/QuietWriter.java similarity index 100% rename from src/java/org/apache/log4j/helpers/QuietWriter.java rename to src/main/java/org/apache/log4j/helpers/QuietWriter.java diff --git a/src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java b/src/main/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java similarity index 100% rename from src/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java rename to src/main/java/org/apache/log4j/helpers/RelativeTimeDateFormat.java diff --git a/src/java/org/apache/log4j/helpers/SyslogQuietWriter.java b/src/main/java/org/apache/log4j/helpers/SyslogQuietWriter.java similarity index 100% rename from src/java/org/apache/log4j/helpers/SyslogQuietWriter.java rename to src/main/java/org/apache/log4j/helpers/SyslogQuietWriter.java diff --git a/src/java/org/apache/log4j/helpers/SyslogWriter.java b/src/main/java/org/apache/log4j/helpers/SyslogWriter.java similarity index 100% rename from src/java/org/apache/log4j/helpers/SyslogWriter.java rename to src/main/java/org/apache/log4j/helpers/SyslogWriter.java diff --git a/src/java/org/apache/log4j/helpers/ThreadLocalMap.java b/src/main/java/org/apache/log4j/helpers/ThreadLocalMap.java similarity index 100% rename from src/java/org/apache/log4j/helpers/ThreadLocalMap.java rename to src/main/java/org/apache/log4j/helpers/ThreadLocalMap.java diff --git a/src/java/org/apache/log4j/helpers/Transform.java b/src/main/java/org/apache/log4j/helpers/Transform.java similarity index 100% rename from src/java/org/apache/log4j/helpers/Transform.java rename to src/main/java/org/apache/log4j/helpers/Transform.java diff --git a/src/java/org/apache/log4j/helpers/package.html b/src/main/java/org/apache/log4j/helpers/package.html similarity index 100% rename from src/java/org/apache/log4j/helpers/package.html rename to src/main/java/org/apache/log4j/helpers/package.html diff --git a/src/java/org/apache/log4j/jdbc/JDBCAppender.java b/src/main/java/org/apache/log4j/jdbc/JDBCAppender.java similarity index 100% rename from src/java/org/apache/log4j/jdbc/JDBCAppender.java rename to src/main/java/org/apache/log4j/jdbc/JDBCAppender.java diff --git a/src/java/org/apache/log4j/jdbc/package.html b/src/main/java/org/apache/log4j/jdbc/package.html similarity index 100% rename from src/java/org/apache/log4j/jdbc/package.html rename to src/main/java/org/apache/log4j/jdbc/package.html diff --git a/src/java/org/apache/log4j/jmx/AbstractDynamicMBean.java b/src/main/java/org/apache/log4j/jmx/AbstractDynamicMBean.java similarity index 100% rename from src/java/org/apache/log4j/jmx/AbstractDynamicMBean.java rename to src/main/java/org/apache/log4j/jmx/AbstractDynamicMBean.java diff --git a/src/java/org/apache/log4j/jmx/Agent.java b/src/main/java/org/apache/log4j/jmx/Agent.java similarity index 100% rename from src/java/org/apache/log4j/jmx/Agent.java rename to src/main/java/org/apache/log4j/jmx/Agent.java diff --git a/src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java b/src/main/java/org/apache/log4j/jmx/AppenderDynamicMBean.java similarity index 100% rename from src/java/org/apache/log4j/jmx/AppenderDynamicMBean.java rename to src/main/java/org/apache/log4j/jmx/AppenderDynamicMBean.java diff --git a/src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java b/src/main/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java similarity index 100% rename from src/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java rename to src/main/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java diff --git a/src/java/org/apache/log4j/jmx/LayoutDynamicMBean.java b/src/main/java/org/apache/log4j/jmx/LayoutDynamicMBean.java similarity index 100% rename from src/java/org/apache/log4j/jmx/LayoutDynamicMBean.java rename to src/main/java/org/apache/log4j/jmx/LayoutDynamicMBean.java diff --git a/src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java b/src/main/java/org/apache/log4j/jmx/LoggerDynamicMBean.java similarity index 100% rename from src/java/org/apache/log4j/jmx/LoggerDynamicMBean.java rename to src/main/java/org/apache/log4j/jmx/LoggerDynamicMBean.java diff --git a/src/java/org/apache/log4j/jmx/MethodUnion.java b/src/main/java/org/apache/log4j/jmx/MethodUnion.java similarity index 100% rename from src/java/org/apache/log4j/jmx/MethodUnion.java rename to src/main/java/org/apache/log4j/jmx/MethodUnion.java diff --git a/src/java/org/apache/log4j/jmx/package.html b/src/main/java/org/apache/log4j/jmx/package.html similarity index 100% rename from src/java/org/apache/log4j/jmx/package.html rename to src/main/java/org/apache/log4j/jmx/package.html diff --git a/src/java/org/apache/log4j/lf5/AppenderFinalizer.java b/src/main/java/org/apache/log4j/lf5/AppenderFinalizer.java similarity index 100% rename from src/java/org/apache/log4j/lf5/AppenderFinalizer.java rename to src/main/java/org/apache/log4j/lf5/AppenderFinalizer.java diff --git a/src/java/org/apache/log4j/lf5/DefaultLF5Configurator.java b/src/main/java/org/apache/log4j/lf5/DefaultLF5Configurator.java similarity index 100% rename from src/java/org/apache/log4j/lf5/DefaultLF5Configurator.java rename to src/main/java/org/apache/log4j/lf5/DefaultLF5Configurator.java diff --git a/src/java/org/apache/log4j/lf5/LF5Appender.java b/src/main/java/org/apache/log4j/lf5/LF5Appender.java similarity index 100% rename from src/java/org/apache/log4j/lf5/LF5Appender.java rename to src/main/java/org/apache/log4j/lf5/LF5Appender.java diff --git a/src/java/org/apache/log4j/lf5/Log4JLogRecord.java b/src/main/java/org/apache/log4j/lf5/Log4JLogRecord.java similarity index 100% rename from src/java/org/apache/log4j/lf5/Log4JLogRecord.java rename to src/main/java/org/apache/log4j/lf5/Log4JLogRecord.java diff --git a/src/java/org/apache/log4j/lf5/LogLevel.java b/src/main/java/org/apache/log4j/lf5/LogLevel.java similarity index 100% rename from src/java/org/apache/log4j/lf5/LogLevel.java rename to src/main/java/org/apache/log4j/lf5/LogLevel.java diff --git a/src/java/org/apache/log4j/lf5/LogLevelFormatException.java b/src/main/java/org/apache/log4j/lf5/LogLevelFormatException.java similarity index 100% rename from src/java/org/apache/log4j/lf5/LogLevelFormatException.java rename to src/main/java/org/apache/log4j/lf5/LogLevelFormatException.java diff --git a/src/java/org/apache/log4j/lf5/LogRecord.java b/src/main/java/org/apache/log4j/lf5/LogRecord.java similarity index 100% rename from src/java/org/apache/log4j/lf5/LogRecord.java rename to src/main/java/org/apache/log4j/lf5/LogRecord.java diff --git a/src/java/org/apache/log4j/lf5/LogRecordFilter.java b/src/main/java/org/apache/log4j/lf5/LogRecordFilter.java similarity index 100% rename from src/java/org/apache/log4j/lf5/LogRecordFilter.java rename to src/main/java/org/apache/log4j/lf5/LogRecordFilter.java diff --git a/src/java/org/apache/log4j/lf5/PassingLogRecordFilter.java b/src/main/java/org/apache/log4j/lf5/PassingLogRecordFilter.java similarity index 100% rename from src/java/org/apache/log4j/lf5/PassingLogRecordFilter.java rename to src/main/java/org/apache/log4j/lf5/PassingLogRecordFilter.java diff --git a/src/java/org/apache/log4j/lf5/StartLogFactor5.java b/src/main/java/org/apache/log4j/lf5/StartLogFactor5.java similarity index 100% rename from src/java/org/apache/log4j/lf5/StartLogFactor5.java rename to src/main/java/org/apache/log4j/lf5/StartLogFactor5.java diff --git a/src/java/org/apache/log4j/lf5/config/defaultconfig.properties b/src/main/java/org/apache/log4j/lf5/config/defaultconfig.properties similarity index 100% rename from src/java/org/apache/log4j/lf5/config/defaultconfig.properties rename to src/main/java/org/apache/log4j/lf5/config/defaultconfig.properties diff --git a/src/java/org/apache/log4j/lf5/util/AdapterLogRecord.java b/src/main/java/org/apache/log4j/lf5/util/AdapterLogRecord.java similarity index 100% rename from src/java/org/apache/log4j/lf5/util/AdapterLogRecord.java rename to src/main/java/org/apache/log4j/lf5/util/AdapterLogRecord.java diff --git a/src/java/org/apache/log4j/lf5/util/DateFormatManager.java b/src/main/java/org/apache/log4j/lf5/util/DateFormatManager.java similarity index 100% rename from src/java/org/apache/log4j/lf5/util/DateFormatManager.java rename to src/main/java/org/apache/log4j/lf5/util/DateFormatManager.java diff --git a/src/java/org/apache/log4j/lf5/util/LogFileParser.java b/src/main/java/org/apache/log4j/lf5/util/LogFileParser.java similarity index 100% rename from src/java/org/apache/log4j/lf5/util/LogFileParser.java rename to src/main/java/org/apache/log4j/lf5/util/LogFileParser.java diff --git a/src/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java b/src/main/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java similarity index 100% rename from src/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java rename to src/main/java/org/apache/log4j/lf5/util/LogMonitorAdapter.java diff --git a/src/java/org/apache/log4j/lf5/util/Resource.java b/src/main/java/org/apache/log4j/lf5/util/Resource.java similarity index 100% rename from src/java/org/apache/log4j/lf5/util/Resource.java rename to src/main/java/org/apache/log4j/lf5/util/Resource.java diff --git a/src/java/org/apache/log4j/lf5/util/ResourceUtils.java b/src/main/java/org/apache/log4j/lf5/util/ResourceUtils.java similarity index 100% rename from src/java/org/apache/log4j/lf5/util/ResourceUtils.java rename to src/main/java/org/apache/log4j/lf5/util/ResourceUtils.java diff --git a/src/java/org/apache/log4j/lf5/util/StreamUtils.java b/src/main/java/org/apache/log4j/lf5/util/StreamUtils.java similarity index 100% rename from src/java/org/apache/log4j/lf5/util/StreamUtils.java rename to src/main/java/org/apache/log4j/lf5/util/StreamUtils.java diff --git a/src/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java b/src/main/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java rename to src/main/java/org/apache/log4j/lf5/viewer/FilteredLogTableModel.java diff --git a/src/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java b/src/main/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java rename to src/main/java/org/apache/log4j/lf5/viewer/LF5SwingUtils.java diff --git a/src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java b/src/main/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java rename to src/main/java/org/apache/log4j/lf5/viewer/LogBrokerMonitor.java diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java b/src/main/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java rename to src/main/java/org/apache/log4j/lf5/viewer/LogFactor5Dialog.java diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java b/src/main/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java rename to src/main/java/org/apache/log4j/lf5/viewer/LogFactor5ErrorDialog.java diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java b/src/main/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java rename to src/main/java/org/apache/log4j/lf5/viewer/LogFactor5InputDialog.java diff --git a/src/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java b/src/main/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java rename to src/main/java/org/apache/log4j/lf5/viewer/LogFactor5LoadingDialog.java diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTable.java b/src/main/java/org/apache/log4j/lf5/viewer/LogTable.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/LogTable.java rename to src/main/java/org/apache/log4j/lf5/viewer/LogTable.java diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java b/src/main/java/org/apache/log4j/lf5/viewer/LogTableColumn.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/LogTableColumn.java rename to src/main/java/org/apache/log4j/lf5/viewer/LogTableColumn.java diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java b/src/main/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java rename to src/main/java/org/apache/log4j/lf5/viewer/LogTableColumnFormatException.java diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableModel.java b/src/main/java/org/apache/log4j/lf5/viewer/LogTableModel.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/LogTableModel.java rename to src/main/java/org/apache/log4j/lf5/viewer/LogTableModel.java diff --git a/src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java b/src/main/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java rename to src/main/java/org/apache/log4j/lf5/viewer/LogTableRowRenderer.java diff --git a/src/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java b/src/main/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java rename to src/main/java/org/apache/log4j/lf5/viewer/TrackingAdjustmentListener.java diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java b/src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java rename to src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryAbstractCellEditor.java diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java b/src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java rename to src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryElement.java diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java b/src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java rename to src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerLogRecordFilter.java diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java b/src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java rename to src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerModel.java diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java b/src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java rename to src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryExplorerTree.java diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java b/src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java rename to src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryImmediateEditor.java diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java b/src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java rename to src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNode.java diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java b/src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java rename to src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditor.java diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java b/src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java rename to src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeEditorRenderer.java diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java b/src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java rename to src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryNodeRenderer.java diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java b/src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java rename to src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/CategoryPath.java diff --git a/src/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java b/src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java rename to src/main/java/org/apache/log4j/lf5/viewer/categoryexplorer/TreeModelAdapter.java diff --git a/src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java b/src/main/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java rename to src/main/java/org/apache/log4j/lf5/viewer/configure/ConfigurationManager.java diff --git a/src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java b/src/main/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java rename to src/main/java/org/apache/log4j/lf5/viewer/configure/MRUFileManager.java diff --git a/src/java/org/apache/log4j/lf5/viewer/images/channelexplorer_new.gif b/src/main/java/org/apache/log4j/lf5/viewer/images/channelexplorer_new.gif similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/images/channelexplorer_new.gif rename to src/main/java/org/apache/log4j/lf5/viewer/images/channelexplorer_new.gif diff --git a/src/java/org/apache/log4j/lf5/viewer/images/channelexplorer_satellite.gif b/src/main/java/org/apache/log4j/lf5/viewer/images/channelexplorer_satellite.gif similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/images/channelexplorer_satellite.gif rename to src/main/java/org/apache/log4j/lf5/viewer/images/channelexplorer_satellite.gif diff --git a/src/java/org/apache/log4j/lf5/viewer/images/lf5_small_icon.gif b/src/main/java/org/apache/log4j/lf5/viewer/images/lf5_small_icon.gif similarity index 100% rename from src/java/org/apache/log4j/lf5/viewer/images/lf5_small_icon.gif rename to src/main/java/org/apache/log4j/lf5/viewer/images/lf5_small_icon.gif diff --git a/src/java/org/apache/log4j/net/JMSAppender.java b/src/main/java/org/apache/log4j/net/JMSAppender.java similarity index 100% rename from src/java/org/apache/log4j/net/JMSAppender.java rename to src/main/java/org/apache/log4j/net/JMSAppender.java diff --git a/src/java/org/apache/log4j/net/JMSSink.java b/src/main/java/org/apache/log4j/net/JMSSink.java similarity index 100% rename from src/java/org/apache/log4j/net/JMSSink.java rename to src/main/java/org/apache/log4j/net/JMSSink.java diff --git a/src/java/org/apache/log4j/net/SMTPAppender.java b/src/main/java/org/apache/log4j/net/SMTPAppender.java similarity index 100% rename from src/java/org/apache/log4j/net/SMTPAppender.java rename to src/main/java/org/apache/log4j/net/SMTPAppender.java diff --git a/src/java/org/apache/log4j/net/SimpleSocketServer.java b/src/main/java/org/apache/log4j/net/SimpleSocketServer.java similarity index 100% rename from src/java/org/apache/log4j/net/SimpleSocketServer.java rename to src/main/java/org/apache/log4j/net/SimpleSocketServer.java diff --git a/src/java/org/apache/log4j/net/SocketAppender.java b/src/main/java/org/apache/log4j/net/SocketAppender.java similarity index 100% rename from src/java/org/apache/log4j/net/SocketAppender.java rename to src/main/java/org/apache/log4j/net/SocketAppender.java diff --git a/src/java/org/apache/log4j/net/SocketHubAppender.java b/src/main/java/org/apache/log4j/net/SocketHubAppender.java similarity index 100% rename from src/java/org/apache/log4j/net/SocketHubAppender.java rename to src/main/java/org/apache/log4j/net/SocketHubAppender.java diff --git a/src/java/org/apache/log4j/net/SocketNode.java b/src/main/java/org/apache/log4j/net/SocketNode.java similarity index 100% rename from src/java/org/apache/log4j/net/SocketNode.java rename to src/main/java/org/apache/log4j/net/SocketNode.java diff --git a/src/java/org/apache/log4j/net/SocketServer.java b/src/main/java/org/apache/log4j/net/SocketServer.java similarity index 100% rename from src/java/org/apache/log4j/net/SocketServer.java rename to src/main/java/org/apache/log4j/net/SocketServer.java diff --git a/src/java/org/apache/log4j/net/SyslogAppender.java b/src/main/java/org/apache/log4j/net/SyslogAppender.java similarity index 100% rename from src/java/org/apache/log4j/net/SyslogAppender.java rename to src/main/java/org/apache/log4j/net/SyslogAppender.java diff --git a/src/java/org/apache/log4j/net/TelnetAppender.java b/src/main/java/org/apache/log4j/net/TelnetAppender.java similarity index 100% rename from src/java/org/apache/log4j/net/TelnetAppender.java rename to src/main/java/org/apache/log4j/net/TelnetAppender.java diff --git a/src/java/org/apache/log4j/net/package.html b/src/main/java/org/apache/log4j/net/package.html similarity index 100% rename from src/java/org/apache/log4j/net/package.html rename to src/main/java/org/apache/log4j/net/package.html diff --git a/src/java/org/apache/log4j/net/test/Loop.java b/src/main/java/org/apache/log4j/net/test/Loop.java similarity index 100% rename from src/java/org/apache/log4j/net/test/Loop.java rename to src/main/java/org/apache/log4j/net/test/Loop.java diff --git a/src/java/org/apache/log4j/net/test/SMTPMin.java b/src/main/java/org/apache/log4j/net/test/SMTPMin.java similarity index 100% rename from src/java/org/apache/log4j/net/test/SMTPMin.java rename to src/main/java/org/apache/log4j/net/test/SMTPMin.java diff --git a/src/java/org/apache/log4j/net/test/SocketMin.java b/src/main/java/org/apache/log4j/net/test/SocketMin.java similarity index 100% rename from src/java/org/apache/log4j/net/test/SocketMin.java rename to src/main/java/org/apache/log4j/net/test/SocketMin.java diff --git a/src/java/org/apache/log4j/net/test/SyslogMin.java b/src/main/java/org/apache/log4j/net/test/SyslogMin.java similarity index 100% rename from src/java/org/apache/log4j/net/test/SyslogMin.java rename to src/main/java/org/apache/log4j/net/test/SyslogMin.java diff --git a/src/java/org/apache/log4j/net/test/intermediarySocketServer.lcf b/src/main/java/org/apache/log4j/net/test/intermediarySocketServer.lcf similarity index 100% rename from src/java/org/apache/log4j/net/test/intermediarySocketServer.lcf rename to src/main/java/org/apache/log4j/net/test/intermediarySocketServer.lcf diff --git a/src/java/org/apache/log4j/net/test/jms.lcf b/src/main/java/org/apache/log4j/net/test/jms.lcf similarity index 100% rename from src/java/org/apache/log4j/net/test/jms.lcf rename to src/main/java/org/apache/log4j/net/test/jms.lcf diff --git a/src/java/org/apache/log4j/net/test/logging.lcf b/src/main/java/org/apache/log4j/net/test/logging.lcf similarity index 100% rename from src/java/org/apache/log4j/net/test/logging.lcf rename to src/main/java/org/apache/log4j/net/test/logging.lcf diff --git a/src/java/org/apache/log4j/net/test/loop.lcf b/src/main/java/org/apache/log4j/net/test/loop.lcf similarity index 100% rename from src/java/org/apache/log4j/net/test/loop.lcf rename to src/main/java/org/apache/log4j/net/test/loop.lcf diff --git a/src/java/org/apache/log4j/net/test/socketClient.lcf b/src/main/java/org/apache/log4j/net/test/socketClient.lcf similarity index 100% rename from src/java/org/apache/log4j/net/test/socketClient.lcf rename to src/main/java/org/apache/log4j/net/test/socketClient.lcf diff --git a/src/java/org/apache/log4j/net/test/socketServer.lcf b/src/main/java/org/apache/log4j/net/test/socketServer.lcf similarity index 100% rename from src/java/org/apache/log4j/net/test/socketServer.lcf rename to src/main/java/org/apache/log4j/net/test/socketServer.lcf diff --git a/src/java/org/apache/log4j/net/test/syslog.lcf b/src/main/java/org/apache/log4j/net/test/syslog.lcf similarity index 100% rename from src/java/org/apache/log4j/net/test/syslog.lcf rename to src/main/java/org/apache/log4j/net/test/syslog.lcf diff --git a/src/java/org/apache/log4j/net/test/syslogMin b/src/main/java/org/apache/log4j/net/test/syslogMin similarity index 100% rename from src/java/org/apache/log4j/net/test/syslogMin rename to src/main/java/org/apache/log4j/net/test/syslogMin diff --git a/src/java/org/apache/log4j/nt/EventLogCategories.mc b/src/main/java/org/apache/log4j/nt/EventLogCategories.mc similarity index 100% rename from src/java/org/apache/log4j/nt/EventLogCategories.mc rename to src/main/java/org/apache/log4j/nt/EventLogCategories.mc diff --git a/src/java/org/apache/log4j/nt/MSG00001.bin b/src/main/java/org/apache/log4j/nt/MSG00001.bin similarity index 100% rename from src/java/org/apache/log4j/nt/MSG00001.bin rename to src/main/java/org/apache/log4j/nt/MSG00001.bin diff --git a/src/java/org/apache/log4j/nt/NTEventLogAppender.java b/src/main/java/org/apache/log4j/nt/NTEventLogAppender.java similarity index 100% rename from src/java/org/apache/log4j/nt/NTEventLogAppender.java rename to src/main/java/org/apache/log4j/nt/NTEventLogAppender.java diff --git a/src/java/org/apache/log4j/nt/NTEventLogAppender.rc b/src/main/java/org/apache/log4j/nt/NTEventLogAppender.rc similarity index 100% rename from src/java/org/apache/log4j/nt/NTEventLogAppender.rc rename to src/main/java/org/apache/log4j/nt/NTEventLogAppender.rc diff --git a/src/java/org/apache/log4j/nt/nteventlog.cpp b/src/main/java/org/apache/log4j/nt/nteventlog.cpp similarity index 100% rename from src/java/org/apache/log4j/nt/nteventlog.cpp rename to src/main/java/org/apache/log4j/nt/nteventlog.cpp diff --git a/src/java/org/apache/log4j/nt/package.html b/src/main/java/org/apache/log4j/nt/package.html similarity index 100% rename from src/java/org/apache/log4j/nt/package.html rename to src/main/java/org/apache/log4j/nt/package.html diff --git a/src/java/org/apache/log4j/or/DefaultRenderer.java b/src/main/java/org/apache/log4j/or/DefaultRenderer.java similarity index 100% rename from src/java/org/apache/log4j/or/DefaultRenderer.java rename to src/main/java/org/apache/log4j/or/DefaultRenderer.java diff --git a/src/java/org/apache/log4j/or/ObjectRenderer.java b/src/main/java/org/apache/log4j/or/ObjectRenderer.java similarity index 100% rename from src/java/org/apache/log4j/or/ObjectRenderer.java rename to src/main/java/org/apache/log4j/or/ObjectRenderer.java diff --git a/src/java/org/apache/log4j/or/RendererMap.java b/src/main/java/org/apache/log4j/or/RendererMap.java similarity index 100% rename from src/java/org/apache/log4j/or/RendererMap.java rename to src/main/java/org/apache/log4j/or/RendererMap.java diff --git a/src/java/org/apache/log4j/or/ThreadGroupRenderer.java b/src/main/java/org/apache/log4j/or/ThreadGroupRenderer.java similarity index 100% rename from src/java/org/apache/log4j/or/ThreadGroupRenderer.java rename to src/main/java/org/apache/log4j/or/ThreadGroupRenderer.java diff --git a/src/java/org/apache/log4j/or/jms/MessageRenderer.java b/src/main/java/org/apache/log4j/or/jms/MessageRenderer.java similarity index 100% rename from src/java/org/apache/log4j/or/jms/MessageRenderer.java rename to src/main/java/org/apache/log4j/or/jms/MessageRenderer.java diff --git a/src/java/org/apache/log4j/or/jms/package.html b/src/main/java/org/apache/log4j/or/jms/package.html similarity index 100% rename from src/java/org/apache/log4j/or/jms/package.html rename to src/main/java/org/apache/log4j/or/jms/package.html diff --git a/src/java/org/apache/log4j/or/package.html b/src/main/java/org/apache/log4j/or/package.html similarity index 100% rename from src/java/org/apache/log4j/or/package.html rename to src/main/java/org/apache/log4j/or/package.html diff --git a/src/java/org/apache/log4j/or/sax/AttributesRenderer.java b/src/main/java/org/apache/log4j/or/sax/AttributesRenderer.java similarity index 100% rename from src/java/org/apache/log4j/or/sax/AttributesRenderer.java rename to src/main/java/org/apache/log4j/or/sax/AttributesRenderer.java diff --git a/src/java/org/apache/log4j/or/sax/package.html b/src/main/java/org/apache/log4j/or/sax/package.html similarity index 100% rename from src/java/org/apache/log4j/or/sax/package.html rename to src/main/java/org/apache/log4j/or/sax/package.html diff --git a/src/java/org/apache/log4j/package.html b/src/main/java/org/apache/log4j/package.html similarity index 100% rename from src/java/org/apache/log4j/package.html rename to src/main/java/org/apache/log4j/package.html diff --git a/src/java/org/apache/log4j/performance/ListVsVector.java b/src/main/java/org/apache/log4j/performance/ListVsVector.java similarity index 100% rename from src/java/org/apache/log4j/performance/ListVsVector.java rename to src/main/java/org/apache/log4j/performance/ListVsVector.java diff --git a/src/java/org/apache/log4j/performance/NOPWriter.java b/src/main/java/org/apache/log4j/performance/NOPWriter.java similarity index 100% rename from src/java/org/apache/log4j/performance/NOPWriter.java rename to src/main/java/org/apache/log4j/performance/NOPWriter.java diff --git a/src/java/org/apache/log4j/performance/NewVsSetLen.java b/src/main/java/org/apache/log4j/performance/NewVsSetLen.java similarity index 100% rename from src/java/org/apache/log4j/performance/NewVsSetLen.java rename to src/main/java/org/apache/log4j/performance/NewVsSetLen.java diff --git a/src/java/org/apache/log4j/performance/NullAppender.java b/src/main/java/org/apache/log4j/performance/NullAppender.java similarity index 100% rename from src/java/org/apache/log4j/performance/NullAppender.java rename to src/main/java/org/apache/log4j/performance/NullAppender.java diff --git a/src/java/org/apache/log4j/performance/SystemTime.java b/src/main/java/org/apache/log4j/performance/SystemTime.java similarity index 100% rename from src/java/org/apache/log4j/performance/SystemTime.java rename to src/main/java/org/apache/log4j/performance/SystemTime.java diff --git a/src/java/org/apache/log4j/performance/history/FALKNIS.logging b/src/main/java/org/apache/log4j/performance/history/FALKNIS.logging similarity index 100% rename from src/java/org/apache/log4j/performance/history/FALKNIS.logging rename to src/main/java/org/apache/log4j/performance/history/FALKNIS.logging diff --git a/src/java/org/apache/log4j/performance/history/GIL.logging b/src/main/java/org/apache/log4j/performance/history/GIL.logging similarity index 100% rename from src/java/org/apache/log4j/performance/history/GIL.logging rename to src/main/java/org/apache/log4j/performance/history/GIL.logging diff --git a/src/java/org/apache/log4j/performance/history/NAPOLI.logging b/src/main/java/org/apache/log4j/performance/history/NAPOLI.logging similarity index 100% rename from src/java/org/apache/log4j/performance/history/NAPOLI.logging rename to src/main/java/org/apache/log4j/performance/history/NAPOLI.logging diff --git a/src/java/org/apache/log4j/performance/history/TORINO.logging b/src/main/java/org/apache/log4j/performance/history/TORINO.logging similarity index 100% rename from src/java/org/apache/log4j/performance/history/TORINO.logging rename to src/main/java/org/apache/log4j/performance/history/TORINO.logging diff --git a/src/java/org/apache/log4j/performance/logging b/src/main/java/org/apache/log4j/performance/logging similarity index 100% rename from src/java/org/apache/log4j/performance/logging rename to src/main/java/org/apache/log4j/performance/logging diff --git a/src/java/org/apache/log4j/performance/package.html b/src/main/java/org/apache/log4j/performance/package.html similarity index 100% rename from src/java/org/apache/log4j/performance/package.html rename to src/main/java/org/apache/log4j/performance/package.html diff --git a/src/java/org/apache/log4j/performance/xml/logging1.xml b/src/main/java/org/apache/log4j/performance/xml/logging1.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging1.xml rename to src/main/java/org/apache/log4j/performance/xml/logging1.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging10.xml b/src/main/java/org/apache/log4j/performance/xml/logging10.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging10.xml rename to src/main/java/org/apache/log4j/performance/xml/logging10.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging100.xml b/src/main/java/org/apache/log4j/performance/xml/logging100.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging100.xml rename to src/main/java/org/apache/log4j/performance/xml/logging100.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging1000.xml b/src/main/java/org/apache/log4j/performance/xml/logging1000.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging1000.xml rename to src/main/java/org/apache/log4j/performance/xml/logging1000.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging101.xml b/src/main/java/org/apache/log4j/performance/xml/logging101.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging101.xml rename to src/main/java/org/apache/log4j/performance/xml/logging101.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging102.xml b/src/main/java/org/apache/log4j/performance/xml/logging102.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging102.xml rename to src/main/java/org/apache/log4j/performance/xml/logging102.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging103.xml b/src/main/java/org/apache/log4j/performance/xml/logging103.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging103.xml rename to src/main/java/org/apache/log4j/performance/xml/logging103.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging104.xml b/src/main/java/org/apache/log4j/performance/xml/logging104.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging104.xml rename to src/main/java/org/apache/log4j/performance/xml/logging104.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging105.xml b/src/main/java/org/apache/log4j/performance/xml/logging105.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging105.xml rename to src/main/java/org/apache/log4j/performance/xml/logging105.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging106.xml b/src/main/java/org/apache/log4j/performance/xml/logging106.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging106.xml rename to src/main/java/org/apache/log4j/performance/xml/logging106.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging107.xml b/src/main/java/org/apache/log4j/performance/xml/logging107.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging107.xml rename to src/main/java/org/apache/log4j/performance/xml/logging107.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging11.xml b/src/main/java/org/apache/log4j/performance/xml/logging11.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging11.xml rename to src/main/java/org/apache/log4j/performance/xml/logging11.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging12.xml b/src/main/java/org/apache/log4j/performance/xml/logging12.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging12.xml rename to src/main/java/org/apache/log4j/performance/xml/logging12.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging13.xml b/src/main/java/org/apache/log4j/performance/xml/logging13.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging13.xml rename to src/main/java/org/apache/log4j/performance/xml/logging13.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging2.xml b/src/main/java/org/apache/log4j/performance/xml/logging2.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging2.xml rename to src/main/java/org/apache/log4j/performance/xml/logging2.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging200.xml b/src/main/java/org/apache/log4j/performance/xml/logging200.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging200.xml rename to src/main/java/org/apache/log4j/performance/xml/logging200.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging201.xml b/src/main/java/org/apache/log4j/performance/xml/logging201.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging201.xml rename to src/main/java/org/apache/log4j/performance/xml/logging201.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging202.xml b/src/main/java/org/apache/log4j/performance/xml/logging202.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging202.xml rename to src/main/java/org/apache/log4j/performance/xml/logging202.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging203.xml b/src/main/java/org/apache/log4j/performance/xml/logging203.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging203.xml rename to src/main/java/org/apache/log4j/performance/xml/logging203.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging204.xml b/src/main/java/org/apache/log4j/performance/xml/logging204.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging204.xml rename to src/main/java/org/apache/log4j/performance/xml/logging204.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging205.xml b/src/main/java/org/apache/log4j/performance/xml/logging205.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging205.xml rename to src/main/java/org/apache/log4j/performance/xml/logging205.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging206.xml b/src/main/java/org/apache/log4j/performance/xml/logging206.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging206.xml rename to src/main/java/org/apache/log4j/performance/xml/logging206.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging207.xml b/src/main/java/org/apache/log4j/performance/xml/logging207.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging207.xml rename to src/main/java/org/apache/log4j/performance/xml/logging207.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging220.xml b/src/main/java/org/apache/log4j/performance/xml/logging220.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging220.xml rename to src/main/java/org/apache/log4j/performance/xml/logging220.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging221.xml b/src/main/java/org/apache/log4j/performance/xml/logging221.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging221.xml rename to src/main/java/org/apache/log4j/performance/xml/logging221.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging222.xml b/src/main/java/org/apache/log4j/performance/xml/logging222.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging222.xml rename to src/main/java/org/apache/log4j/performance/xml/logging222.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging223.xml b/src/main/java/org/apache/log4j/performance/xml/logging223.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging223.xml rename to src/main/java/org/apache/log4j/performance/xml/logging223.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging224.xml b/src/main/java/org/apache/log4j/performance/xml/logging224.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging224.xml rename to src/main/java/org/apache/log4j/performance/xml/logging224.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging225.xml b/src/main/java/org/apache/log4j/performance/xml/logging225.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging225.xml rename to src/main/java/org/apache/log4j/performance/xml/logging225.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging226.xml b/src/main/java/org/apache/log4j/performance/xml/logging226.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging226.xml rename to src/main/java/org/apache/log4j/performance/xml/logging226.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging227.xml b/src/main/java/org/apache/log4j/performance/xml/logging227.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging227.xml rename to src/main/java/org/apache/log4j/performance/xml/logging227.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging3.xml b/src/main/java/org/apache/log4j/performance/xml/logging3.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging3.xml rename to src/main/java/org/apache/log4j/performance/xml/logging3.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging300.xml b/src/main/java/org/apache/log4j/performance/xml/logging300.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging300.xml rename to src/main/java/org/apache/log4j/performance/xml/logging300.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging301.xml b/src/main/java/org/apache/log4j/performance/xml/logging301.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging301.xml rename to src/main/java/org/apache/log4j/performance/xml/logging301.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging302.xml b/src/main/java/org/apache/log4j/performance/xml/logging302.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging302.xml rename to src/main/java/org/apache/log4j/performance/xml/logging302.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging303.xml b/src/main/java/org/apache/log4j/performance/xml/logging303.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging303.xml rename to src/main/java/org/apache/log4j/performance/xml/logging303.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging304.xml b/src/main/java/org/apache/log4j/performance/xml/logging304.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging304.xml rename to src/main/java/org/apache/log4j/performance/xml/logging304.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging305.xml b/src/main/java/org/apache/log4j/performance/xml/logging305.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging305.xml rename to src/main/java/org/apache/log4j/performance/xml/logging305.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging306.xml b/src/main/java/org/apache/log4j/performance/xml/logging306.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging306.xml rename to src/main/java/org/apache/log4j/performance/xml/logging306.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging307.xml b/src/main/java/org/apache/log4j/performance/xml/logging307.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging307.xml rename to src/main/java/org/apache/log4j/performance/xml/logging307.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging4.xml b/src/main/java/org/apache/log4j/performance/xml/logging4.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging4.xml rename to src/main/java/org/apache/log4j/performance/xml/logging4.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging5.xml b/src/main/java/org/apache/log4j/performance/xml/logging5.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging5.xml rename to src/main/java/org/apache/log4j/performance/xml/logging5.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging6.xml b/src/main/java/org/apache/log4j/performance/xml/logging6.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging6.xml rename to src/main/java/org/apache/log4j/performance/xml/logging6.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging7.xml b/src/main/java/org/apache/log4j/performance/xml/logging7.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging7.xml rename to src/main/java/org/apache/log4j/performance/xml/logging7.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging8.xml b/src/main/java/org/apache/log4j/performance/xml/logging8.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging8.xml rename to src/main/java/org/apache/log4j/performance/xml/logging8.xml diff --git a/src/java/org/apache/log4j/performance/xml/logging9.xml b/src/main/java/org/apache/log4j/performance/xml/logging9.xml similarity index 100% rename from src/java/org/apache/log4j/performance/xml/logging9.xml rename to src/main/java/org/apache/log4j/performance/xml/logging9.xml diff --git a/src/java/org/apache/log4j/spi/AppenderAttachable.java b/src/main/java/org/apache/log4j/spi/AppenderAttachable.java similarity index 100% rename from src/java/org/apache/log4j/spi/AppenderAttachable.java rename to src/main/java/org/apache/log4j/spi/AppenderAttachable.java diff --git a/src/java/org/apache/log4j/spi/Configurator.java b/src/main/java/org/apache/log4j/spi/Configurator.java similarity index 100% rename from src/java/org/apache/log4j/spi/Configurator.java rename to src/main/java/org/apache/log4j/spi/Configurator.java diff --git a/src/java/org/apache/log4j/spi/DefaultRepositorySelector.java b/src/main/java/org/apache/log4j/spi/DefaultRepositorySelector.java similarity index 100% rename from src/java/org/apache/log4j/spi/DefaultRepositorySelector.java rename to src/main/java/org/apache/log4j/spi/DefaultRepositorySelector.java diff --git a/src/java/org/apache/log4j/spi/ErrorCode.java b/src/main/java/org/apache/log4j/spi/ErrorCode.java similarity index 100% rename from src/java/org/apache/log4j/spi/ErrorCode.java rename to src/main/java/org/apache/log4j/spi/ErrorCode.java diff --git a/src/java/org/apache/log4j/spi/ErrorHandler.java b/src/main/java/org/apache/log4j/spi/ErrorHandler.java similarity index 100% rename from src/java/org/apache/log4j/spi/ErrorHandler.java rename to src/main/java/org/apache/log4j/spi/ErrorHandler.java diff --git a/src/java/org/apache/log4j/spi/Filter.java b/src/main/java/org/apache/log4j/spi/Filter.java similarity index 100% rename from src/java/org/apache/log4j/spi/Filter.java rename to src/main/java/org/apache/log4j/spi/Filter.java diff --git a/src/java/org/apache/log4j/spi/HierarchyEventListener.java b/src/main/java/org/apache/log4j/spi/HierarchyEventListener.java similarity index 100% rename from src/java/org/apache/log4j/spi/HierarchyEventListener.java rename to src/main/java/org/apache/log4j/spi/HierarchyEventListener.java diff --git a/src/java/org/apache/log4j/spi/LocationInfo.java b/src/main/java/org/apache/log4j/spi/LocationInfo.java similarity index 100% rename from src/java/org/apache/log4j/spi/LocationInfo.java rename to src/main/java/org/apache/log4j/spi/LocationInfo.java diff --git a/src/java/org/apache/log4j/spi/LoggerFactory.java b/src/main/java/org/apache/log4j/spi/LoggerFactory.java similarity index 100% rename from src/java/org/apache/log4j/spi/LoggerFactory.java rename to src/main/java/org/apache/log4j/spi/LoggerFactory.java diff --git a/src/java/org/apache/log4j/spi/LoggerRepository.java b/src/main/java/org/apache/log4j/spi/LoggerRepository.java similarity index 100% rename from src/java/org/apache/log4j/spi/LoggerRepository.java rename to src/main/java/org/apache/log4j/spi/LoggerRepository.java diff --git a/src/java/org/apache/log4j/spi/LoggingEvent.java b/src/main/java/org/apache/log4j/spi/LoggingEvent.java similarity index 100% rename from src/java/org/apache/log4j/spi/LoggingEvent.java rename to src/main/java/org/apache/log4j/spi/LoggingEvent.java diff --git a/src/java/org/apache/log4j/spi/NullWriter.java b/src/main/java/org/apache/log4j/spi/NullWriter.java similarity index 100% rename from src/java/org/apache/log4j/spi/NullWriter.java rename to src/main/java/org/apache/log4j/spi/NullWriter.java diff --git a/src/java/org/apache/log4j/spi/OptionHandler.java b/src/main/java/org/apache/log4j/spi/OptionHandler.java similarity index 100% rename from src/java/org/apache/log4j/spi/OptionHandler.java rename to src/main/java/org/apache/log4j/spi/OptionHandler.java diff --git a/src/java/org/apache/log4j/spi/RendererSupport.java b/src/main/java/org/apache/log4j/spi/RendererSupport.java similarity index 100% rename from src/java/org/apache/log4j/spi/RendererSupport.java rename to src/main/java/org/apache/log4j/spi/RendererSupport.java diff --git a/src/java/org/apache/log4j/spi/RepositorySelector.java b/src/main/java/org/apache/log4j/spi/RepositorySelector.java similarity index 100% rename from src/java/org/apache/log4j/spi/RepositorySelector.java rename to src/main/java/org/apache/log4j/spi/RepositorySelector.java diff --git a/src/java/org/apache/log4j/spi/RootCategory.java b/src/main/java/org/apache/log4j/spi/RootCategory.java similarity index 100% rename from src/java/org/apache/log4j/spi/RootCategory.java rename to src/main/java/org/apache/log4j/spi/RootCategory.java diff --git a/src/java/org/apache/log4j/spi/RootLogger.java b/src/main/java/org/apache/log4j/spi/RootLogger.java similarity index 100% rename from src/java/org/apache/log4j/spi/RootLogger.java rename to src/main/java/org/apache/log4j/spi/RootLogger.java diff --git a/src/java/org/apache/log4j/spi/ThrowableInformation.java b/src/main/java/org/apache/log4j/spi/ThrowableInformation.java similarity index 100% rename from src/java/org/apache/log4j/spi/ThrowableInformation.java rename to src/main/java/org/apache/log4j/spi/ThrowableInformation.java diff --git a/src/java/org/apache/log4j/spi/TriggeringEventEvaluator.java b/src/main/java/org/apache/log4j/spi/TriggeringEventEvaluator.java similarity index 100% rename from src/java/org/apache/log4j/spi/TriggeringEventEvaluator.java rename to src/main/java/org/apache/log4j/spi/TriggeringEventEvaluator.java diff --git a/src/java/org/apache/log4j/spi/VectorWriter.java b/src/main/java/org/apache/log4j/spi/VectorWriter.java similarity index 100% rename from src/java/org/apache/log4j/spi/VectorWriter.java rename to src/main/java/org/apache/log4j/spi/VectorWriter.java diff --git a/src/java/org/apache/log4j/spi/package.html b/src/main/java/org/apache/log4j/spi/package.html similarity index 100% rename from src/java/org/apache/log4j/spi/package.html rename to src/main/java/org/apache/log4j/spi/package.html diff --git a/src/java/org/apache/log4j/varia/DenyAllFilter.java b/src/main/java/org/apache/log4j/varia/DenyAllFilter.java similarity index 100% rename from src/java/org/apache/log4j/varia/DenyAllFilter.java rename to src/main/java/org/apache/log4j/varia/DenyAllFilter.java diff --git a/src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java b/src/main/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java similarity index 100% rename from src/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java rename to src/main/java/org/apache/log4j/varia/ExternallyRolledFileAppender.java diff --git a/src/java/org/apache/log4j/varia/FallbackErrorHandler.java b/src/main/java/org/apache/log4j/varia/FallbackErrorHandler.java similarity index 100% rename from src/java/org/apache/log4j/varia/FallbackErrorHandler.java rename to src/main/java/org/apache/log4j/varia/FallbackErrorHandler.java diff --git a/src/java/org/apache/log4j/varia/LevelMatchFilter.java b/src/main/java/org/apache/log4j/varia/LevelMatchFilter.java similarity index 100% rename from src/java/org/apache/log4j/varia/LevelMatchFilter.java rename to src/main/java/org/apache/log4j/varia/LevelMatchFilter.java diff --git a/src/java/org/apache/log4j/varia/LevelRangeFilter.java b/src/main/java/org/apache/log4j/varia/LevelRangeFilter.java similarity index 100% rename from src/java/org/apache/log4j/varia/LevelRangeFilter.java rename to src/main/java/org/apache/log4j/varia/LevelRangeFilter.java diff --git a/src/java/org/apache/log4j/varia/NullAppender.java b/src/main/java/org/apache/log4j/varia/NullAppender.java similarity index 100% rename from src/java/org/apache/log4j/varia/NullAppender.java rename to src/main/java/org/apache/log4j/varia/NullAppender.java diff --git a/src/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java b/src/main/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java similarity index 100% rename from src/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java rename to src/main/java/org/apache/log4j/varia/ReloadingPropertyConfigurator.java diff --git a/src/java/org/apache/log4j/varia/Roller.java b/src/main/java/org/apache/log4j/varia/Roller.java similarity index 100% rename from src/java/org/apache/log4j/varia/Roller.java rename to src/main/java/org/apache/log4j/varia/Roller.java diff --git a/src/java/org/apache/log4j/varia/StringMatchFilter.java b/src/main/java/org/apache/log4j/varia/StringMatchFilter.java similarity index 100% rename from src/java/org/apache/log4j/varia/StringMatchFilter.java rename to src/main/java/org/apache/log4j/varia/StringMatchFilter.java diff --git a/src/java/org/apache/log4j/varia/package.html b/src/main/java/org/apache/log4j/varia/package.html similarity index 100% rename from src/java/org/apache/log4j/varia/package.html rename to src/main/java/org/apache/log4j/varia/package.html diff --git a/src/java/org/apache/log4j/varia/test/Loop.java b/src/main/java/org/apache/log4j/varia/test/Loop.java similarity index 100% rename from src/java/org/apache/log4j/varia/test/Loop.java rename to src/main/java/org/apache/log4j/varia/test/Loop.java diff --git a/src/java/org/apache/log4j/varia/test/checkForHoles.pl b/src/main/java/org/apache/log4j/varia/test/checkForHoles.pl similarity index 100% rename from src/java/org/apache/log4j/varia/test/checkForHoles.pl rename to src/main/java/org/apache/log4j/varia/test/checkForHoles.pl diff --git a/src/java/org/apache/log4j/varia/test/doRoll b/src/main/java/org/apache/log4j/varia/test/doRoll similarity index 100% rename from src/java/org/apache/log4j/varia/test/doRoll rename to src/main/java/org/apache/log4j/varia/test/doRoll diff --git a/src/java/org/apache/log4j/varia/test/elf.pl b/src/main/java/org/apache/log4j/varia/test/elf.pl similarity index 100% rename from src/java/org/apache/log4j/varia/test/elf.pl rename to src/main/java/org/apache/log4j/varia/test/elf.pl diff --git a/src/java/org/apache/log4j/varia/test/externalRoll b/src/main/java/org/apache/log4j/varia/test/externalRoll similarity index 100% rename from src/java/org/apache/log4j/varia/test/externalRoll rename to src/main/java/org/apache/log4j/varia/test/externalRoll diff --git a/src/java/org/apache/log4j/varia/test/resiliency b/src/main/java/org/apache/log4j/varia/test/resiliency similarity index 100% rename from src/java/org/apache/log4j/varia/test/resiliency rename to src/main/java/org/apache/log4j/varia/test/resiliency diff --git a/src/java/org/apache/log4j/xml/DOMConfigurator.java b/src/main/java/org/apache/log4j/xml/DOMConfigurator.java similarity index 100% rename from src/java/org/apache/log4j/xml/DOMConfigurator.java rename to src/main/java/org/apache/log4j/xml/DOMConfigurator.java diff --git a/src/java/org/apache/log4j/xml/Log4jEntityResolver.java b/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java similarity index 100% rename from src/java/org/apache/log4j/xml/Log4jEntityResolver.java rename to src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java diff --git a/src/java/org/apache/log4j/xml/SAXErrorHandler.java b/src/main/java/org/apache/log4j/xml/SAXErrorHandler.java similarity index 100% rename from src/java/org/apache/log4j/xml/SAXErrorHandler.java rename to src/main/java/org/apache/log4j/xml/SAXErrorHandler.java diff --git a/src/java/org/apache/log4j/xml/UnrecognizedElementHandler.java b/src/main/java/org/apache/log4j/xml/UnrecognizedElementHandler.java similarity index 100% rename from src/java/org/apache/log4j/xml/UnrecognizedElementHandler.java rename to src/main/java/org/apache/log4j/xml/UnrecognizedElementHandler.java diff --git a/src/java/org/apache/log4j/xml/XMLLayout.java b/src/main/java/org/apache/log4j/xml/XMLLayout.java similarity index 100% rename from src/java/org/apache/log4j/xml/XMLLayout.java rename to src/main/java/org/apache/log4j/xml/XMLLayout.java diff --git a/src/java/org/apache/log4j/xml/examples/ReportParserError.java b/src/main/java/org/apache/log4j/xml/examples/ReportParserError.java similarity index 100% rename from src/java/org/apache/log4j/xml/examples/ReportParserError.java rename to src/main/java/org/apache/log4j/xml/examples/ReportParserError.java diff --git a/src/java/org/apache/log4j/xml/examples/XMLSample.java b/src/main/java/org/apache/log4j/xml/examples/XMLSample.java similarity index 100% rename from src/java/org/apache/log4j/xml/examples/XMLSample.java rename to src/main/java/org/apache/log4j/xml/examples/XMLSample.java diff --git a/src/java/org/apache/log4j/xml/examples/extension1.xml b/src/main/java/org/apache/log4j/xml/examples/extension1.xml similarity index 100% rename from src/java/org/apache/log4j/xml/examples/extension1.xml rename to src/main/java/org/apache/log4j/xml/examples/extension1.xml diff --git a/src/java/org/apache/log4j/xml/examples/extension2.xml b/src/main/java/org/apache/log4j/xml/examples/extension2.xml similarity index 100% rename from src/java/org/apache/log4j/xml/examples/extension2.xml rename to src/main/java/org/apache/log4j/xml/examples/extension2.xml diff --git a/src/java/org/apache/log4j/xml/examples/package.html b/src/main/java/org/apache/log4j/xml/examples/package.html similarity index 100% rename from src/java/org/apache/log4j/xml/examples/package.html rename to src/main/java/org/apache/log4j/xml/examples/package.html diff --git a/src/java/org/apache/log4j/xml/examples/sample1.xml b/src/main/java/org/apache/log4j/xml/examples/sample1.xml similarity index 100% rename from src/java/org/apache/log4j/xml/examples/sample1.xml rename to src/main/java/org/apache/log4j/xml/examples/sample1.xml diff --git a/src/java/org/apache/log4j/xml/examples/sample2.xml b/src/main/java/org/apache/log4j/xml/examples/sample2.xml similarity index 100% rename from src/java/org/apache/log4j/xml/examples/sample2.xml rename to src/main/java/org/apache/log4j/xml/examples/sample2.xml diff --git a/src/java/org/apache/log4j/xml/examples/sample3.xml b/src/main/java/org/apache/log4j/xml/examples/sample3.xml similarity index 100% rename from src/java/org/apache/log4j/xml/examples/sample3.xml rename to src/main/java/org/apache/log4j/xml/examples/sample3.xml diff --git a/src/java/org/apache/log4j/xml/examples/sample4.xml b/src/main/java/org/apache/log4j/xml/examples/sample4.xml similarity index 100% rename from src/java/org/apache/log4j/xml/examples/sample4.xml rename to src/main/java/org/apache/log4j/xml/examples/sample4.xml diff --git a/src/java/org/apache/log4j/xml/examples/sample5.xml b/src/main/java/org/apache/log4j/xml/examples/sample5.xml similarity index 100% rename from src/java/org/apache/log4j/xml/examples/sample5.xml rename to src/main/java/org/apache/log4j/xml/examples/sample5.xml diff --git a/src/java/org/apache/log4j/xml/log4j.dtd b/src/main/java/org/apache/log4j/xml/log4j.dtd similarity index 100% rename from src/java/org/apache/log4j/xml/log4j.dtd rename to src/main/java/org/apache/log4j/xml/log4j.dtd diff --git a/src/java/org/apache/log4j/xml/package.html b/src/main/java/org/apache/log4j/xml/package.html similarity index 100% rename from src/java/org/apache/log4j/xml/package.html rename to src/main/java/org/apache/log4j/xml/package.html diff --git a/src/java/org/apache/log4j/xml/test/DOMTest.java b/src/main/java/org/apache/log4j/xml/test/DOMTest.java similarity index 100% rename from src/java/org/apache/log4j/xml/test/DOMTest.java rename to src/main/java/org/apache/log4j/xml/test/DOMTest.java diff --git a/src/java/org/apache/log4j/xml/test/testlog.xml b/src/main/java/org/apache/log4j/xml/test/testlog.xml similarity index 100% rename from src/java/org/apache/log4j/xml/test/testlog.xml rename to src/main/java/org/apache/log4j/xml/test/testlog.xml diff --git a/tests/build.xml b/tests/build.xml index 16822144a6..a2300bb965 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -44,7 +44,7 @@ - + From 6f4e9d2597479995bcc23fb2be7c6b87acbf101f Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 14 May 2007 21:07:53 +0000 Subject: [PATCH 291/342] Bug 37930: Maven built jar should now be equiv with ant built jar git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@537977 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 23 +- pom.xml | 15 +- .../java/org/apache/log4j/net/test/Loop.java | 70 ------ .../org/apache/log4j/net/test/SMTPMin.java | 65 ------ .../org/apache/log4j/net/test/SocketMin.java | 112 ---------- .../org/apache/log4j/net/test/SyslogMin.java | 70 ------ .../net/test/intermediarySocketServer.lcf | 23 -- .../java/org/apache/log4j/net/test/jms.lcf | 6 - .../org/apache/log4j/net/test/logging.lcf | 9 - .../java/org/apache/log4j/net/test/loop.lcf | 9 - .../apache/log4j/net/test/socketClient.lcf | 20 -- .../apache/log4j/net/test/socketServer.lcf | 12 -- .../java/org/apache/log4j/net/test/syslog.lcf | 20 -- .../java/org/apache/log4j/net/test/syslogMin | 21 -- .../org/apache/log4j/varia/test/Loop.java | 74 ------- .../apache/log4j/varia/test/checkForHoles.pl | 53 ----- .../java/org/apache/log4j/varia/test/doRoll | 21 -- .../java/org/apache/log4j/varia/test/elf.pl | 34 --- .../org/apache/log4j/varia/test/externalRoll | 42 ---- .../org/apache/log4j/varia/test/resiliency | 41 ---- .../log4j/xml/examples/ReportParserError.java | 51 ----- .../apache/log4j/xml/examples/XMLSample.java | 75 ------- .../apache/log4j/xml/examples/extension1.xml | 28 --- .../apache/log4j/xml/examples/extension2.xml | 35 --- .../apache/log4j/xml/examples/package.html | 26 --- .../org/apache/log4j/xml/examples/sample1.xml | 22 -- .../org/apache/log4j/xml/examples/sample2.xml | 31 --- .../org/apache/log4j/xml/examples/sample3.xml | 28 --- .../org/apache/log4j/xml/examples/sample4.xml | 23 -- .../org/apache/log4j/xml/examples/sample5.xml | 34 --- .../org/apache/log4j/xml/test/DOMTest.java | 90 -------- .../org/apache/log4j/xml/test/testlog.xml | 23 -- src/main/resources/META-INF/LICENSE | 202 ++++++++++++++++++ src/main/resources/META-INF/NOTICE | 5 + .../log4j/lf5/config/defaultconfig.properties | 0 .../lf5/viewer/images/channelexplorer_new.gif | Bin .../images/channelexplorer_satellite.gif | Bin .../lf5/viewer/images/lf5_small_icon.gif | Bin .../org/apache/log4j/xml/log4j.dtd | 0 .../log4j/performance/ListVsVector.java | 0 .../apache/log4j/performance/NOPWriter.java | 0 .../apache/log4j/performance/NewVsSetLen.java | 0 .../log4j/performance/NullAppender.java | 0 .../apache/log4j/performance/SystemTime.java | 0 .../log4j/performance/history/FALKNIS.logging | 0 .../log4j/performance/history/GIL.logging | 0 .../log4j/performance/history/NAPOLI.logging | 0 .../log4j/performance/history/TORINO.logging | 0 .../java/org/apache/log4j/performance/logging | 0 .../org/apache/log4j/performance/package.html | 0 .../apache/log4j/performance/xml/logging1.xml | 0 .../log4j/performance/xml/logging10.xml | 0 .../log4j/performance/xml/logging100.xml | 0 .../log4j/performance/xml/logging1000.xml | 0 .../log4j/performance/xml/logging101.xml | 0 .../log4j/performance/xml/logging102.xml | 0 .../log4j/performance/xml/logging103.xml | 0 .../log4j/performance/xml/logging104.xml | 0 .../log4j/performance/xml/logging105.xml | 0 .../log4j/performance/xml/logging106.xml | 0 .../log4j/performance/xml/logging107.xml | 0 .../log4j/performance/xml/logging11.xml | 0 .../log4j/performance/xml/logging12.xml | 0 .../log4j/performance/xml/logging13.xml | 0 .../apache/log4j/performance/xml/logging2.xml | 0 .../log4j/performance/xml/logging200.xml | 0 .../log4j/performance/xml/logging201.xml | 0 .../log4j/performance/xml/logging202.xml | 0 .../log4j/performance/xml/logging203.xml | 0 .../log4j/performance/xml/logging204.xml | 0 .../log4j/performance/xml/logging205.xml | 0 .../log4j/performance/xml/logging206.xml | 0 .../log4j/performance/xml/logging207.xml | 0 .../log4j/performance/xml/logging220.xml | 0 .../log4j/performance/xml/logging221.xml | 0 .../log4j/performance/xml/logging222.xml | 0 .../log4j/performance/xml/logging223.xml | 0 .../log4j/performance/xml/logging224.xml | 0 .../log4j/performance/xml/logging225.xml | 0 .../log4j/performance/xml/logging226.xml | 0 .../log4j/performance/xml/logging227.xml | 0 .../apache/log4j/performance/xml/logging3.xml | 0 .../log4j/performance/xml/logging300.xml | 0 .../log4j/performance/xml/logging301.xml | 0 .../log4j/performance/xml/logging302.xml | 0 .../log4j/performance/xml/logging303.xml | 0 .../log4j/performance/xml/logging304.xml | 0 .../log4j/performance/xml/logging305.xml | 0 .../log4j/performance/xml/logging306.xml | 0 .../log4j/performance/xml/logging307.xml | 0 .../apache/log4j/performance/xml/logging4.xml | 0 .../apache/log4j/performance/xml/logging5.xml | 0 .../apache/log4j/performance/xml/logging6.xml | 0 .../apache/log4j/performance/xml/logging7.xml | 0 .../apache/log4j/performance/xml/logging8.xml | 0 .../apache/log4j/performance/xml/logging9.xml | 0 96 files changed, 235 insertions(+), 1178 deletions(-) delete mode 100644 src/main/java/org/apache/log4j/net/test/Loop.java delete mode 100644 src/main/java/org/apache/log4j/net/test/SMTPMin.java delete mode 100644 src/main/java/org/apache/log4j/net/test/SocketMin.java delete mode 100644 src/main/java/org/apache/log4j/net/test/SyslogMin.java delete mode 100644 src/main/java/org/apache/log4j/net/test/intermediarySocketServer.lcf delete mode 100644 src/main/java/org/apache/log4j/net/test/jms.lcf delete mode 100644 src/main/java/org/apache/log4j/net/test/logging.lcf delete mode 100644 src/main/java/org/apache/log4j/net/test/loop.lcf delete mode 100644 src/main/java/org/apache/log4j/net/test/socketClient.lcf delete mode 100644 src/main/java/org/apache/log4j/net/test/socketServer.lcf delete mode 100644 src/main/java/org/apache/log4j/net/test/syslog.lcf delete mode 100644 src/main/java/org/apache/log4j/net/test/syslogMin delete mode 100644 src/main/java/org/apache/log4j/varia/test/Loop.java delete mode 100644 src/main/java/org/apache/log4j/varia/test/checkForHoles.pl delete mode 100644 src/main/java/org/apache/log4j/varia/test/doRoll delete mode 100644 src/main/java/org/apache/log4j/varia/test/elf.pl delete mode 100644 src/main/java/org/apache/log4j/varia/test/externalRoll delete mode 100644 src/main/java/org/apache/log4j/varia/test/resiliency delete mode 100644 src/main/java/org/apache/log4j/xml/examples/ReportParserError.java delete mode 100644 src/main/java/org/apache/log4j/xml/examples/XMLSample.java delete mode 100644 src/main/java/org/apache/log4j/xml/examples/extension1.xml delete mode 100644 src/main/java/org/apache/log4j/xml/examples/extension2.xml delete mode 100644 src/main/java/org/apache/log4j/xml/examples/package.html delete mode 100644 src/main/java/org/apache/log4j/xml/examples/sample1.xml delete mode 100644 src/main/java/org/apache/log4j/xml/examples/sample2.xml delete mode 100644 src/main/java/org/apache/log4j/xml/examples/sample3.xml delete mode 100644 src/main/java/org/apache/log4j/xml/examples/sample4.xml delete mode 100644 src/main/java/org/apache/log4j/xml/examples/sample5.xml delete mode 100644 src/main/java/org/apache/log4j/xml/test/DOMTest.java delete mode 100644 src/main/java/org/apache/log4j/xml/test/testlog.xml create mode 100644 src/main/resources/META-INF/LICENSE create mode 100644 src/main/resources/META-INF/NOTICE rename src/main/{java => resources}/org/apache/log4j/lf5/config/defaultconfig.properties (100%) rename src/main/{java => resources}/org/apache/log4j/lf5/viewer/images/channelexplorer_new.gif (100%) rename src/main/{java => resources}/org/apache/log4j/lf5/viewer/images/channelexplorer_satellite.gif (100%) rename src/main/{java => resources}/org/apache/log4j/lf5/viewer/images/lf5_small_icon.gif (100%) rename src/main/{java => resources}/org/apache/log4j/xml/log4j.dtd (100%) rename src/{main => performance}/java/org/apache/log4j/performance/ListVsVector.java (100%) rename src/{main => performance}/java/org/apache/log4j/performance/NOPWriter.java (100%) rename src/{main => performance}/java/org/apache/log4j/performance/NewVsSetLen.java (100%) rename src/{main => performance}/java/org/apache/log4j/performance/NullAppender.java (100%) rename src/{main => performance}/java/org/apache/log4j/performance/SystemTime.java (100%) rename src/{main => performance}/java/org/apache/log4j/performance/history/FALKNIS.logging (100%) rename src/{main => performance}/java/org/apache/log4j/performance/history/GIL.logging (100%) rename src/{main => performance}/java/org/apache/log4j/performance/history/NAPOLI.logging (100%) rename src/{main => performance}/java/org/apache/log4j/performance/history/TORINO.logging (100%) rename src/{main => performance}/java/org/apache/log4j/performance/logging (100%) rename src/{main => performance}/java/org/apache/log4j/performance/package.html (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging1.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging10.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging100.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging1000.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging101.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging102.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging103.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging104.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging105.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging106.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging107.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging11.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging12.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging13.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging2.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging200.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging201.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging202.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging203.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging204.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging205.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging206.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging207.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging220.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging221.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging222.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging223.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging224.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging225.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging226.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging227.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging3.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging300.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging301.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging302.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging303.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging304.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging305.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging306.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging307.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging4.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging5.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging6.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging7.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging8.xml (100%) rename src/{main => performance}/java/org/apache/log4j/performance/xml/logging9.xml (100%) diff --git a/build.xml b/build.xml index 7dd26e3d2b..5451fb6242 100644 --- a/build.xml +++ b/build.xml @@ -45,9 +45,12 @@ - + + + + @@ -92,7 +95,7 @@ - + @@ -111,6 +114,7 @@ + @@ -163,6 +167,7 @@ + @@ -176,7 +181,8 @@ - + + @@ -192,9 +198,10 @@ - + - + + @@ -242,8 +249,8 @@ - - + + @@ -290,7 +297,7 @@ classpath="${classpath}"> - + maven-compiler-plugin - 1.3 - 1.2 + 1.2 + 1.1 + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + + diff --git a/src/main/java/org/apache/log4j/net/test/Loop.java b/src/main/java/org/apache/log4j/net/test/Loop.java deleted file mode 100644 index 3b06b88165..0000000000 --- a/src/main/java/org/apache/log4j/net/test/Loop.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.net.test; - -import org.apache.log4j.*; -import org.apache.log4j.net.SocketAppender; - -public class Loop { - - public static void main(String[] args) { - - - Logger root = Logger.getRootLogger(); - Logger cat = Logger.getLogger(Loop.class.getName()); - - if(args.length != 2) - usage("Wrong number of arguments."); - - String host = args[0]; - int port = 0; - - try { - port = Integer.valueOf(args[1]).intValue(); - } - catch (NumberFormatException e) { - usage("Argument [" + args[1] + "] is not in proper int form."); - } - - SocketAppender sa = new SocketAppender(host, port); - Layout layout = new PatternLayout("%5p [%t] %x %c - %m\n"); - Appender so = new ConsoleAppender(layout, "System.out"); - root.addAppender(sa); - root.addAppender(so); - - int i = 0; - - while(true) { - NDC.push(""+ (i++)); - cat.debug("Debug message."); - root.info("Info message."); - NDC.pop(); - } - - } - - static - void usage(String msg) { - System.err.println(msg); - System.err.println( - "Usage: java " +Loop.class.getName() + " host port"); - System.exit(1); - } - - -} diff --git a/src/main/java/org/apache/log4j/net/test/SMTPMin.java b/src/main/java/org/apache/log4j/net/test/SMTPMin.java deleted file mode 100644 index f9961a6c6d..0000000000 --- a/src/main/java/org/apache/log4j/net/test/SMTPMin.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.net.test; - -import org.apache.log4j.*; - -public class SMTPMin { - - static Logger cat = Logger.getLogger(SMTPMin.class); - - public - static - void main(String argv[]) { - if(argv.length == 1) - init(argv[0]); - else - usage("Wrong number of arguments."); - - NDC.push("some context"); - test(); - } - - static - void usage(String msg) { - System.err.println(msg); - System.err.println("Usage: java " + SMTPMin.class.getName() - + " configFile"); - System.exit(1); - } - - static - void init(String configFile) { - PropertyConfigurator.configure(configFile); - } - - - static - void test() { - int i = 0; - cat.debug( "Message " + i++); - cat.debug("Message " + i++, new Exception("Just testing.")); - cat.info( "Message " + i++); - cat.warn( "Message " + i++); - cat.error( "Message " + i++); - cat.log(Priority.FATAL, "Message " + i++); - LogManager.shutdown(); - Thread.currentThread().getThreadGroup().list(); - } - -} diff --git a/src/main/java/org/apache/log4j/net/test/SocketMin.java b/src/main/java/org/apache/log4j/net/test/SocketMin.java deleted file mode 100644 index b3a2fee8c8..0000000000 --- a/src/main/java/org/apache/log4j/net/test/SocketMin.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.net.test; - -import org.apache.log4j.Logger; -import org.apache.log4j.BasicConfigurator; -import org.apache.log4j.net.SocketAppender; -import org.apache.log4j.Priority; -import org.apache.log4j.NDC; -import java.io.InputStreamReader; - -public class SocketMin { - - static Logger cat = Logger.getLogger(SyslogMin.class.getName()); - static SocketAppender s; - - public - static - void main(String argv[]) { - if(argv.length == 3) - init(argv[0], argv[1]); - else - usage("Wrong number of arguments."); - - NDC.push("some context"); - if(argv[2].equals("true")) - loop(); - else - test(); - - s.close(); - } - - static - void usage(String msg) { - System.err.println(msg); - System.err.println("Usage: java " + SocketMin.class - + " host port true|false"); - System.exit(1); - } - - static - void init(String host, String portStr) { - Logger root = Logger.getRootLogger(); - BasicConfigurator.configure(); - try { - int port = Integer.parseInt(portStr); - cat.info("Creating socket appender ("+host+","+port+")."); - s = new SocketAppender(host, port); - s.setName("S"); - root.addAppender(s); - } - catch(java.lang.NumberFormatException e) { - e.printStackTrace(); - usage("Could not interpret port number ["+ portStr +"]."); - } - catch(Exception e) { - System.err.println("Could not start!"); - e.printStackTrace(); - System.exit(1); - } - } - - static - void loop() { - Logger root = Logger.getRootLogger(); - InputStreamReader in = new InputStreamReader(System.in); - System.out.println("Type 'q' to quit"); - int i; - int k = 0; - while (true) { - cat.debug("Message " + k++); - cat.info("Message " + k++); - cat.warn("Message " + k++); - cat.error("Message " + k++, new Exception("Just testing")); - try {i = in.read(); } - catch(Exception e) { return; } - if(i == -1) break; - if(i == 'q') break; - if(i == 'r') { - System.out.println("Removing appender S"); - root.removeAppender("S"); - } - } - } - - static - void test() { - int i = 0; - cat.debug( "Message " + i++); - cat.info( "Message " + i++); - cat.warn( "Message " + i++); - cat.error( "Message " + i++); - cat.log(Priority.FATAL, "Message " + i++); - cat.debug("Message " + i++, new Exception("Just testing.")); - } -} diff --git a/src/main/java/org/apache/log4j/net/test/SyslogMin.java b/src/main/java/org/apache/log4j/net/test/SyslogMin.java deleted file mode 100644 index 23a93f1ea4..0000000000 --- a/src/main/java/org/apache/log4j/net/test/SyslogMin.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package org.apache.log4j.net.test; - -import org.apache.log4j.Logger; -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.Priority; -import org.apache.log4j.NDC; - - -public class SyslogMin { - - static Logger CAT = Logger.getLogger(SyslogMin.class); - - public - static - void main(String argv[]) { - - if(argv.length == 1) { - ProgramInit(argv[0]); - } - else { - Usage("Wrong number of arguments."); - } - test("someHost"); - } - - - static - void Usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java " + SyslogMin.class + " configFile"); - System.exit(1); - } - - - static - void ProgramInit(String configFile) { - int port = 0; - PropertyConfigurator.configure(configFile); - } - - static - void test(String host) { - NDC.push(host); - int i = 0; - CAT.debug( "Message " + i++); - CAT.info( "Message " + i++); - CAT.warn( "Message " + i++); - CAT.error( "Message " + i++); - CAT.log(Priority.FATAL, "Message " + i++); - CAT.debug("Message " + i++, new Exception("Just testing.")); - } -} diff --git a/src/main/java/org/apache/log4j/net/test/intermediarySocketServer.lcf b/src/main/java/org/apache/log4j/net/test/intermediarySocketServer.lcf deleted file mode 100644 index af3a758de4..0000000000 --- a/src/main/java/org/apache/log4j/net/test/intermediarySocketServer.lcf +++ /dev/null @@ -1,23 +0,0 @@ - -# ---------------------------------------------------------------------------- -# This config file is intended to be used by an intermediary SocketServer that -# relays its log output to another SocketServer. This is used mostly to test -# SocketServer cascading. -# ---------------------------------------------------------------------------- - - -log4j.configDebug=true - -log4j.rootCategory=DEBUG, SOCKETSERV, CON - -log4j.category.org.apache.log4j.net=DEBUG -log4j.appender.SOCKETSERV=org.apache.log4j.net.SocketAppender -log4j.appender.SOCKETSERV.RemoteHost=localhost -log4j.appender.SOCKETSERV.Port=15000 -log4j.appender.SOCKETSERV.layout=org.apache.log4j.PatternLayout -log4j.appender.SOCKETSERV.layout.ConversionPattern=%-5r %-5p [%t] %c{2} %x - %m%n - - -log4j.appender.CON=org.apache.log4j.ConsoleAppender -log4j.appender.CON.layout=org.apache.log4j.PatternLayout -log4j.appender.CON.layout.ConversionPattern=%-5r %-5p [%t] %c{2} %x - %m%n \ No newline at end of file diff --git a/src/main/java/org/apache/log4j/net/test/jms.lcf b/src/main/java/org/apache/log4j/net/test/jms.lcf deleted file mode 100644 index a8e353594e..0000000000 --- a/src/main/java/org/apache/log4j/net/test/jms.lcf +++ /dev/null @@ -1,6 +0,0 @@ - -log4j.rootCategory=DEBUG, A1 -log4j.configDebug=true -log4j.appender.A1=org.apache.log4j.net.JMSAppender -log4j.appender.A1.TopicBindingName=LOGBN -log4j.appender.A1.TopicConnectionFactoryBindingName=TCFBN diff --git a/src/main/java/org/apache/log4j/net/test/logging.lcf b/src/main/java/org/apache/log4j/net/test/logging.lcf deleted file mode 100644 index e10dbc8c2c..0000000000 --- a/src/main/java/org/apache/log4j/net/test/logging.lcf +++ /dev/null @@ -1,9 +0,0 @@ -log4j.rootCategory= , testAppender -log4j.configDebug=true -log4j.appender.testAppender=org.apache.log4j.net.SyslogAppender -log4j.appender.testAppender.SyslogHost=localhost -log4j.appender.testAppender.Facility=LOCAL0 -log4j.appender.testAppender.FacilityPrinting= -log4j.appender.testAppender.layout=org.apache.log4j.TTCCLayout -log4j.appender.testAppender.layout.DateFormat=NULL -log4j.appender.testAppender.layout.TimeZone= diff --git a/src/main/java/org/apache/log4j/net/test/loop.lcf b/src/main/java/org/apache/log4j/net/test/loop.lcf deleted file mode 100644 index 5913848788..0000000000 --- a/src/main/java/org/apache/log4j/net/test/loop.lcf +++ /dev/null @@ -1,9 +0,0 @@ -log4j.rootCategory= , A1 -log4j.configDebug=true -log4j.appender.A1=org.apache.log4j.RollingFileAppender -log4j.appender.A1.Append=true -log4j.appender.A1.File=loop.log -log4j.appender.A1.MaxFileSize=100KB -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%p [%t] - %m\n - diff --git a/src/main/java/org/apache/log4j/net/test/socketClient.lcf b/src/main/java/org/apache/log4j/net/test/socketClient.lcf deleted file mode 100644 index 66cc5aaa78..0000000000 --- a/src/main/java/org/apache/log4j/net/test/socketClient.lcf +++ /dev/null @@ -1,20 +0,0 @@ -# ------------------------------------------------------------------------- -# This config file is intended to be used by a client wishing to log using -# a SocketAppender to a SyslogServer or equivalent. -# ------------------------------------------------------------------------- - -log4j.configDebug=true - -log4j.rootCategory=DEBUG, A1, CON - -log4j.category.org.apache.log4j.net=DEBUG -log4j.appender.A1=org.apache.log4j.net.SocketAppender -log4j.appender.A1.RemoteHost=localhost -log4j.appender.A1.Port=15000 -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%-5r %-5p [%t] %c{2} %x - %m%n - - -log4j.appender.CON=org.apache.log4j.ConsoleAppender -log4j.appender.CON.layout=org.apache.log4j.PatternLayout -log4j.appender.CON.layout.ConversionPattern=%-5r %-5p [%t] %c{2} %x - %m%n \ No newline at end of file diff --git a/src/main/java/org/apache/log4j/net/test/socketServer.lcf b/src/main/java/org/apache/log4j/net/test/socketServer.lcf deleted file mode 100644 index 574d644489..0000000000 --- a/src/main/java/org/apache/log4j/net/test/socketServer.lcf +++ /dev/null @@ -1,12 +0,0 @@ - -# ------------------------------------------------------------------- -# This config file is intended to be used by a SocketServer that logs -# events received from various clients on the console. -# ------------------------------------------------------------------- - -log4j.rootCategory=DEBUG, A1 -log4j.category.org.apache.log4j.net=DEBUG -log4j.appender.A1=org.apache.log4j.ConsoleAppender -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%-5r %-5p [%t] %c{2} %x - %m%n - diff --git a/src/main/java/org/apache/log4j/net/test/syslog.lcf b/src/main/java/org/apache/log4j/net/test/syslog.lcf deleted file mode 100644 index 417ad6988e..0000000000 --- a/src/main/java/org/apache/log4j/net/test/syslog.lcf +++ /dev/null @@ -1,20 +0,0 @@ - -# ------------------------------------------------+ -# Set the host variable to match your environment | -# ------------------------------------------------+ -host=torino.qos.ch - - -log4j.rootCategory=DEBUG, A1 - -log4j.appender.A1=org.apache.log4j.net.SyslogAppender -log4j.appender.A1.SyslogHost=${host} - -log4j.appender.A1.layout=org.apache.log4j.PatternLayout - -# ----------------------------------------------------------------- -# The ConversionPattern should be terminated with a "\n" instead of -# the usual "%n" as the syslog host is most probably a unix machine. -# ----------------------------------------------------------------- -log4j.appender.A1.layout.ConversionPattern=%-5r %-5p [%t] %c{2} %x - %m\n - diff --git a/src/main/java/org/apache/log4j/net/test/syslogMin b/src/main/java/org/apache/log4j/net/test/syslogMin deleted file mode 100644 index ee0cea0ec9..0000000000 --- a/src/main/java/org/apache/log4j/net/test/syslogMin +++ /dev/null @@ -1,21 +0,0 @@ - - - -# Read the .functions file -. ../../test/.functions - -declare -i start=$1 - -setPERL - - echo "log4j.rootCategory= , testAppender" > $LCF - lecho "log4j.configDebug=true" - lecho "log4j.appender.testAppender=org.apache.log4j.net.SyslogAppender" - lecho "log4j.appender.testAppender.SyslogHost=localhost" - lecho "log4j.appender.testAppender.Facility=LOCAL0" - lecho "log4j.appender.testAppender.FacilityPrinting=" - lecho "log4j.appender.testAppender.layout=org.apache.log4j.TTCCLayout" - lecho "log4j.appender.testAppender.layout.DateFormat=NULL" - lecho "log4j.appender.testAppender.layout.TimeZone=" - - java org.apache.log4j.net.test.SyslogMin $LCF diff --git a/src/main/java/org/apache/log4j/varia/test/Loop.java b/src/main/java/org/apache/log4j/varia/test/Loop.java deleted file mode 100644 index 0fa1c36053..0000000000 --- a/src/main/java/org/apache/log4j/varia/test/Loop.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.varia.test; - -import org.apache.log4j.Logger; -import org.apache.log4j.PropertyConfigurator; - -/** - This test program reads a config file and attempts to log to the - appenders specified as many times as specified by the second - loopLength parameter. - - @author Ceki Gülcü */ -public class Loop { - - static Logger cat = Logger.getLogger(Loop.class); - static int loopLength; - - public - static - void main(String argv[]) { - - if(argv.length == 2) - init(argv[0], argv[1]); - else - usage("Wrong number of arguments."); - test(); - } - - - static - void usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java " + Loop.class.getName() + - "configFile loopLength"); - System.exit(1); - } - - - static - void init(String configFile, String loopStr) { - PropertyConfigurator.configure(configFile); - try { - loopLength = Integer.parseInt(loopStr); - } - catch(java.lang.NumberFormatException e) { - e.printStackTrace(); - usage("Could not interpret loopLength ["+ loopStr +"]."); - } - } - - static - void test() { - for(int i=0; i < loopLength; i++) { - Thread.yield(); - cat.debug("MSG "+i); - } - } -} diff --git a/src/main/java/org/apache/log4j/varia/test/checkForHoles.pl b/src/main/java/org/apache/log4j/varia/test/checkForHoles.pl deleted file mode 100644 index 2f1a2724f1..0000000000 --- a/src/main/java/org/apache/log4j/varia/test/checkForHoles.pl +++ /dev/null @@ -1,53 +0,0 @@ - -# This script checks for holes while rolling a log file. - -$input=$ARGV[0]; -$MAX_COUNT=$ARGV[1]; -$LAST_EXPECTED=$ARGV[2]; - -$counter = 0; -$expected = 0; - -for($i = $MAX_COUNT; $i >= 1; $i--) { - checkOrder("$input.$i"); -} - -checkOrder("$input"); - -if($expected == $LAST_EXPECTED) { - print "All files as expected.\n"; -} -else { - print "Missing output or unexpected output in $input$i.\n"; - exit 1; -} - - -sub checkOrder { - $file = $_[0]; - if(-e "$file") { - $firstLine = `head -1 $file`; - chomp $first; - $lastLine = `tail -1 $file`; - - if($firstLine =~ /MSG $expected/) { - print "First line of $file in expected order.\n"; - } - else { - print "First line of $file not as expected.\n"; - exit 1; - } - - if($lastLine =~ /MSG (\d*)/) { - $expected = $1 + 1; - } - else { - print "last line of $file in unexpected format.\n"; - exit 1; - } - } - else { - print "Skipping inexistent file [$file].\n"; - } -} - diff --git a/src/main/java/org/apache/log4j/varia/test/doRoll b/src/main/java/org/apache/log4j/varia/test/doRoll deleted file mode 100644 index 46cedb174e..0000000000 --- a/src/main/java/org/apache/log4j/varia/test/doRoll +++ /dev/null @@ -1,21 +0,0 @@ - -# Read the .functions file -. ../../test/.functions - - -LOOP_LEN=$1 -HOST=$2 -PORT=$3 - -declare -i i -i=0 - -while [ $i -lt $LOOP_LEN ] -do - sleep 1 - i=$i+1 - java -Dlog4j.configDebug org.apache.log4j.varia.Roller $HOST $PORT -done - - - diff --git a/src/main/java/org/apache/log4j/varia/test/elf.pl b/src/main/java/org/apache/log4j/varia/test/elf.pl deleted file mode 100644 index 235f650204..0000000000 --- a/src/main/java/org/apache/log4j/varia/test/elf.pl +++ /dev/null @@ -1,34 +0,0 @@ - -# This script continously renames the $input to $input.$counter, -# sleeps for one second, increments $counter and starts over until -# $counter reaches $MAX_COUNT. - -# The script is used for testing the ResilientFileAppender. - -$input=$ARGV[0]; -$MAX_COUNT=$ARGV[1]; - - -$counter = 0; - -while($MAX_COUNT > $counter) { - - if(!(-e $input)) { - print "File [$input] does not seem to exist. This can happen.\n"; - } - elsif(!(-f $input)) { - print "[$input] does not seem to be file.\n"; - } - elsif ( !(-w $input)) { - print "File $input does not seem to be writeeble!!!!\n"; - } - else { - print "Renaming $input to $input.$counter\n"; - rename $input, $input.$counter; - } - - - $counter++; - - sleep 1; -} diff --git a/src/main/java/org/apache/log4j/varia/test/externalRoll b/src/main/java/org/apache/log4j/varia/test/externalRoll deleted file mode 100644 index d265df6dcb..0000000000 --- a/src/main/java/org/apache/log4j/varia/test/externalRoll +++ /dev/null @@ -1,42 +0,0 @@ - -# This script - -# Read the .functions file -. ../../test/.functions - - -TEMP=temp -PORT=6700 - -MAX_COUNTER=15 -MAX_MESSAGES=500000 - - -setPERL - -echo "log4j.rootCategory=DEBUG, testAppender" > $LCF -lecho "log4j.appender.testAppender=org.apache.log4j.varia.ExternallyRolledFileAppender" -lecho "log4j.appender.testAppender.File=$TEMP" -lecho "log4j.appender.testAppender.Append=false" -lecho "log4j.appender.testAppender.Port=$PORT" -lecho "log4j.appender.testAppender.MaxBackupIndex=$MAX_COUNTER" -lecho "log4j.appender.testAppender.layout=org.apache.log4j.PatternLayout" -lecho "log4j.appender.testAppender.layout.ConversionPattern=%m%n" - - -rm ${TEMP}* - - - -./doRoll $MAX_COUNTER localhost $PORT & -java -Dlog4j.configDebug org.apache.log4j.varia.test.Loop $LCF $MAX_MESSAGES - - - -if perl checkForHoles.pl $TEMP $MAX_COUNTER $MAX_MESSAGES -then - echo "Externally triggered roll over test PASSED." -else - echo "Externally triggered roll over test test FAILED." - exit 1 -fi diff --git a/src/main/java/org/apache/log4j/varia/test/resiliency b/src/main/java/org/apache/log4j/varia/test/resiliency deleted file mode 100644 index 20fd390fa5..0000000000 --- a/src/main/java/org/apache/log4j/varia/test/resiliency +++ /dev/null @@ -1,41 +0,0 @@ - -# This shell script checks whether for a given computing environment -# the ResilientFileAppender can cope with renaming of the file where -# the log output goes. - -# Test show that under Linux the ResilientFileAppender correctly copes -# with renaming of files. On the other hand, under Windows 2000 the -# premise of ResilientFileAppender is false because under Windows 2000 -# it is not possible to rename an open file. - -# Read the .functions file -. ../../test/.functions - - -TEMP=temp - -setPERL - -echo "log4j.rootCategory=DEBUG, testAppender" > $LCF -lecho "log4j.appender.testAppender=org.apache.log4j.ResilientFileAppender" -lecho "log4j.appender.testAppender.File=$TEMP" -lecho "log4j.appender.testAppender.Append=false" -lecho "log4j.appender.testAppender.layout=org.apache.log4j.PatternLayout" -lecho "log4j.appender.testAppender.layout.ConversionPattern=%m%n" - - -rm ${TEMP}* - -MAX_COUNTER=3 -MAX_MESSAGES=50000 - -perl elf.pl $TEMP $MAX_COUNTER& -java org.apache.log4j.test.Loop $LCF $MAX_MESSAGES - -if perl checkForHoles.pl $TEMP $MAX_COUNTER $MAX_MESSAGES -then - echo "Resiliency test PASSED for this environment." -else - echo "Resiliency test FAILED." - exit 1 -fi diff --git a/src/main/java/org/apache/log4j/xml/examples/ReportParserError.java b/src/main/java/org/apache/log4j/xml/examples/ReportParserError.java deleted file mode 100644 index 007d4cbd77..0000000000 --- a/src/main/java/org/apache/log4j/xml/examples/ReportParserError.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.xml.examples; - -import org.apache.log4j.helpers.LogLog; - -/** - - This class is needed for validating a log4j.dtd derived XML file. - - @author Joe Kesselman - - @since 0.8.3 - - */ -public class ReportParserError implements org.xml.sax.ErrorHandler { - - void report(String msg, org.xml.sax.SAXParseException e) { - LogLog.error(msg+e.getMessage()+ "\n\tat line="+ e.getLineNumber()+ - " col="+e.getColumnNumber()+ " of "+ - "SystemId=\""+e.getSystemId()+ - "\" PublicID = \""+e.getPublicId()+'\"'); - } - - public void warning(org.xml.sax.SAXParseException e) { - report("WARNING: ", e); - } - - public void error(org.xml.sax.SAXParseException e) { - report("ERROR: ", e); - } - - public void fatalError(org.xml.sax.SAXParseException e) { - report("FATAL: ", e); - } -} diff --git a/src/main/java/org/apache/log4j/xml/examples/XMLSample.java b/src/main/java/org/apache/log4j/xml/examples/XMLSample.java deleted file mode 100644 index 8ea09f2844..0000000000 --- a/src/main/java/org/apache/log4j/xml/examples/XMLSample.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.xml.examples; - -import org.apache.log4j.xml.DOMConfigurator; -import org.apache.log4j.Logger; - -/** - - This example code shows how to - read an XML based configuration file using a DOM parser. - -

    Sample XML files sample1.xml - and sample2.xml are provided. - - -

    Note that the log4j.dtd is not in the local directory. - It is found by the class loader. - - @author Ceki Gülcü - -*/ -public class XMLSample { - - static Logger cat = Logger.getLogger(XMLSample.class); - - public - static - void main(String argv[]) { - - if(argv.length == 1) - init(argv[0]); - else - Usage("Wrong number of arguments."); - sample(); - } - - static - void Usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java " + XMLSample.class.getName() + - "configFile"); - System.exit(1); - } - - static - void init(String configFile) { - DOMConfigurator.configure(configFile); - } - - static - void sample() { - int i = -1; - cat.debug("Message " + ++i); - cat.warn ("Message " + ++i); - cat.error("Message " + ++i); - Exception e = new Exception("Just testing"); - cat.debug("Message " + ++i, e); - } -} diff --git a/src/main/java/org/apache/log4j/xml/examples/extension1.xml b/src/main/java/org/apache/log4j/xml/examples/extension1.xml deleted file mode 100644 index af78d1ea2b..0000000000 --- a/src/main/java/org/apache/log4j/xml/examples/extension1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/apache/log4j/xml/examples/extension2.xml b/src/main/java/org/apache/log4j/xml/examples/extension2.xml deleted file mode 100644 index b4b3518ce9..0000000000 --- a/src/main/java/org/apache/log4j/xml/examples/extension2.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/java/org/apache/log4j/xml/examples/package.html b/src/main/java/org/apache/log4j/xml/examples/package.html deleted file mode 100644 index db195a1bb2..0000000000 --- a/src/main/java/org/apache/log4j/xml/examples/package.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - -

    Example usage of log4j with XML (including source code). - -

    This package's shows how log4j can be used with an XML -configuration file. - -

    See source code of XMLSample.java showing how to -configure with an XML file. Sample XML files -sample1.xml, -sample2.xml, -sample3.xml, -sample4.xml, -sample5.xml are provided. - -


    -
    - -Last modified: Wed Apr 12 22:27:25 MDT 2000 - - diff --git a/src/main/java/org/apache/log4j/xml/examples/sample1.xml b/src/main/java/org/apache/log4j/xml/examples/sample1.xml deleted file mode 100644 index d13ca9e671..0000000000 --- a/src/main/java/org/apache/log4j/xml/examples/sample1.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/apache/log4j/xml/examples/sample2.xml b/src/main/java/org/apache/log4j/xml/examples/sample2.xml deleted file mode 100644 index ad48640393..0000000000 --- a/src/main/java/org/apache/log4j/xml/examples/sample2.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/apache/log4j/xml/examples/sample3.xml b/src/main/java/org/apache/log4j/xml/examples/sample3.xml deleted file mode 100644 index ad85ab7ab4..0000000000 --- a/src/main/java/org/apache/log4j/xml/examples/sample3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/apache/log4j/xml/examples/sample4.xml b/src/main/java/org/apache/log4j/xml/examples/sample4.xml deleted file mode 100644 index b957ff1953..0000000000 --- a/src/main/java/org/apache/log4j/xml/examples/sample4.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/apache/log4j/xml/examples/sample5.xml b/src/main/java/org/apache/log4j/xml/examples/sample5.xml deleted file mode 100644 index cc16200851..0000000000 --- a/src/main/java/org/apache/log4j/xml/examples/sample5.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/apache/log4j/xml/test/DOMTest.java b/src/main/java/org/apache/log4j/xml/test/DOMTest.java deleted file mode 100644 index 1683e6a8c2..0000000000 --- a/src/main/java/org/apache/log4j/xml/test/DOMTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.xml.test; - -import org.apache.log4j.xml.DOMConfigurator; -import org.apache.log4j.Logger; -import org.apache.log4j.LogManager; -import org.apache.log4j.Level; -//import org.apache.log4j.xml.examples.ReportParserError; -//import org.apache.xerces.parsers.DOMParser; -//import java.io.FileInputStream; -//import org.xml.sax.InputSource; - -/** - @author Ceki Gülcü -*/ -public class DOMTest { - static Logger cat = Logger.getLogger(DOMTest.class.getName()); - - - public - static - void main(String argv[]) { - - if(argv.length == 1) - init(argv[0]); - else - Usage("Wrong number of arguments."); - - test(); - } - - static - void Usage(String msg) { - System.err.println(msg); - System.err.println( "Usage: java " + DOMTest.class.getName() + - " configFile"); - System.exit(1); - } - - static - void init(String configFile) { - DOMConfigurator.configure(configFile); - } - - static - void test() { - int i = -1; - Logger root = Logger.getRootLogger(); - - cat.debug("Message " + ++i); - root.debug("Message " + i); - - cat.info ("Message " + ++i); - root.info("Message " + i); - - cat.warn ("Message " + ++i); - root.warn("Message " + i); - - cat.error("Message " + ++i); - root.error("Message " + i); - - cat.log(Level.FATAL, "Message " + ++i); - root.log(Level.FATAL, "Message " + i); - - Exception e = new Exception("Just testing"); - cat.debug("Message " + ++i, e); - root.debug("Message " + i, e); - - cat.error("Message " + ++i, e); - root.error("Message " + i, e); - - LogManager.shutdown(); - } -} diff --git a/src/main/java/org/apache/log4j/xml/test/testlog.xml b/src/main/java/org/apache/log4j/xml/test/testlog.xml deleted file mode 100644 index dd54e58c44..0000000000 --- a/src/main/java/org/apache/log4j/xml/test/testlog.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/META-INF/LICENSE b/src/main/resources/META-INF/LICENSE new file mode 100644 index 0000000000..6279e5206d --- /dev/null +++ b/src/main/resources/META-INF/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 1999-2005 The Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/main/resources/META-INF/NOTICE b/src/main/resources/META-INF/NOTICE new file mode 100644 index 0000000000..0375732360 --- /dev/null +++ b/src/main/resources/META-INF/NOTICE @@ -0,0 +1,5 @@ +Apache log4j +Copyright 2007 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). \ No newline at end of file diff --git a/src/main/java/org/apache/log4j/lf5/config/defaultconfig.properties b/src/main/resources/org/apache/log4j/lf5/config/defaultconfig.properties similarity index 100% rename from src/main/java/org/apache/log4j/lf5/config/defaultconfig.properties rename to src/main/resources/org/apache/log4j/lf5/config/defaultconfig.properties diff --git a/src/main/java/org/apache/log4j/lf5/viewer/images/channelexplorer_new.gif b/src/main/resources/org/apache/log4j/lf5/viewer/images/channelexplorer_new.gif similarity index 100% rename from src/main/java/org/apache/log4j/lf5/viewer/images/channelexplorer_new.gif rename to src/main/resources/org/apache/log4j/lf5/viewer/images/channelexplorer_new.gif diff --git a/src/main/java/org/apache/log4j/lf5/viewer/images/channelexplorer_satellite.gif b/src/main/resources/org/apache/log4j/lf5/viewer/images/channelexplorer_satellite.gif similarity index 100% rename from src/main/java/org/apache/log4j/lf5/viewer/images/channelexplorer_satellite.gif rename to src/main/resources/org/apache/log4j/lf5/viewer/images/channelexplorer_satellite.gif diff --git a/src/main/java/org/apache/log4j/lf5/viewer/images/lf5_small_icon.gif b/src/main/resources/org/apache/log4j/lf5/viewer/images/lf5_small_icon.gif similarity index 100% rename from src/main/java/org/apache/log4j/lf5/viewer/images/lf5_small_icon.gif rename to src/main/resources/org/apache/log4j/lf5/viewer/images/lf5_small_icon.gif diff --git a/src/main/java/org/apache/log4j/xml/log4j.dtd b/src/main/resources/org/apache/log4j/xml/log4j.dtd similarity index 100% rename from src/main/java/org/apache/log4j/xml/log4j.dtd rename to src/main/resources/org/apache/log4j/xml/log4j.dtd diff --git a/src/main/java/org/apache/log4j/performance/ListVsVector.java b/src/performance/java/org/apache/log4j/performance/ListVsVector.java similarity index 100% rename from src/main/java/org/apache/log4j/performance/ListVsVector.java rename to src/performance/java/org/apache/log4j/performance/ListVsVector.java diff --git a/src/main/java/org/apache/log4j/performance/NOPWriter.java b/src/performance/java/org/apache/log4j/performance/NOPWriter.java similarity index 100% rename from src/main/java/org/apache/log4j/performance/NOPWriter.java rename to src/performance/java/org/apache/log4j/performance/NOPWriter.java diff --git a/src/main/java/org/apache/log4j/performance/NewVsSetLen.java b/src/performance/java/org/apache/log4j/performance/NewVsSetLen.java similarity index 100% rename from src/main/java/org/apache/log4j/performance/NewVsSetLen.java rename to src/performance/java/org/apache/log4j/performance/NewVsSetLen.java diff --git a/src/main/java/org/apache/log4j/performance/NullAppender.java b/src/performance/java/org/apache/log4j/performance/NullAppender.java similarity index 100% rename from src/main/java/org/apache/log4j/performance/NullAppender.java rename to src/performance/java/org/apache/log4j/performance/NullAppender.java diff --git a/src/main/java/org/apache/log4j/performance/SystemTime.java b/src/performance/java/org/apache/log4j/performance/SystemTime.java similarity index 100% rename from src/main/java/org/apache/log4j/performance/SystemTime.java rename to src/performance/java/org/apache/log4j/performance/SystemTime.java diff --git a/src/main/java/org/apache/log4j/performance/history/FALKNIS.logging b/src/performance/java/org/apache/log4j/performance/history/FALKNIS.logging similarity index 100% rename from src/main/java/org/apache/log4j/performance/history/FALKNIS.logging rename to src/performance/java/org/apache/log4j/performance/history/FALKNIS.logging diff --git a/src/main/java/org/apache/log4j/performance/history/GIL.logging b/src/performance/java/org/apache/log4j/performance/history/GIL.logging similarity index 100% rename from src/main/java/org/apache/log4j/performance/history/GIL.logging rename to src/performance/java/org/apache/log4j/performance/history/GIL.logging diff --git a/src/main/java/org/apache/log4j/performance/history/NAPOLI.logging b/src/performance/java/org/apache/log4j/performance/history/NAPOLI.logging similarity index 100% rename from src/main/java/org/apache/log4j/performance/history/NAPOLI.logging rename to src/performance/java/org/apache/log4j/performance/history/NAPOLI.logging diff --git a/src/main/java/org/apache/log4j/performance/history/TORINO.logging b/src/performance/java/org/apache/log4j/performance/history/TORINO.logging similarity index 100% rename from src/main/java/org/apache/log4j/performance/history/TORINO.logging rename to src/performance/java/org/apache/log4j/performance/history/TORINO.logging diff --git a/src/main/java/org/apache/log4j/performance/logging b/src/performance/java/org/apache/log4j/performance/logging similarity index 100% rename from src/main/java/org/apache/log4j/performance/logging rename to src/performance/java/org/apache/log4j/performance/logging diff --git a/src/main/java/org/apache/log4j/performance/package.html b/src/performance/java/org/apache/log4j/performance/package.html similarity index 100% rename from src/main/java/org/apache/log4j/performance/package.html rename to src/performance/java/org/apache/log4j/performance/package.html diff --git a/src/main/java/org/apache/log4j/performance/xml/logging1.xml b/src/performance/java/org/apache/log4j/performance/xml/logging1.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging1.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging1.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging10.xml b/src/performance/java/org/apache/log4j/performance/xml/logging10.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging10.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging10.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging100.xml b/src/performance/java/org/apache/log4j/performance/xml/logging100.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging100.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging100.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging1000.xml b/src/performance/java/org/apache/log4j/performance/xml/logging1000.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging1000.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging1000.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging101.xml b/src/performance/java/org/apache/log4j/performance/xml/logging101.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging101.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging101.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging102.xml b/src/performance/java/org/apache/log4j/performance/xml/logging102.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging102.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging102.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging103.xml b/src/performance/java/org/apache/log4j/performance/xml/logging103.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging103.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging103.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging104.xml b/src/performance/java/org/apache/log4j/performance/xml/logging104.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging104.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging104.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging105.xml b/src/performance/java/org/apache/log4j/performance/xml/logging105.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging105.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging105.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging106.xml b/src/performance/java/org/apache/log4j/performance/xml/logging106.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging106.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging106.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging107.xml b/src/performance/java/org/apache/log4j/performance/xml/logging107.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging107.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging107.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging11.xml b/src/performance/java/org/apache/log4j/performance/xml/logging11.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging11.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging11.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging12.xml b/src/performance/java/org/apache/log4j/performance/xml/logging12.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging12.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging12.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging13.xml b/src/performance/java/org/apache/log4j/performance/xml/logging13.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging13.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging13.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging2.xml b/src/performance/java/org/apache/log4j/performance/xml/logging2.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging2.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging2.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging200.xml b/src/performance/java/org/apache/log4j/performance/xml/logging200.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging200.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging200.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging201.xml b/src/performance/java/org/apache/log4j/performance/xml/logging201.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging201.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging201.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging202.xml b/src/performance/java/org/apache/log4j/performance/xml/logging202.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging202.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging202.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging203.xml b/src/performance/java/org/apache/log4j/performance/xml/logging203.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging203.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging203.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging204.xml b/src/performance/java/org/apache/log4j/performance/xml/logging204.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging204.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging204.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging205.xml b/src/performance/java/org/apache/log4j/performance/xml/logging205.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging205.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging205.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging206.xml b/src/performance/java/org/apache/log4j/performance/xml/logging206.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging206.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging206.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging207.xml b/src/performance/java/org/apache/log4j/performance/xml/logging207.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging207.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging207.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging220.xml b/src/performance/java/org/apache/log4j/performance/xml/logging220.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging220.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging220.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging221.xml b/src/performance/java/org/apache/log4j/performance/xml/logging221.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging221.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging221.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging222.xml b/src/performance/java/org/apache/log4j/performance/xml/logging222.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging222.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging222.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging223.xml b/src/performance/java/org/apache/log4j/performance/xml/logging223.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging223.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging223.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging224.xml b/src/performance/java/org/apache/log4j/performance/xml/logging224.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging224.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging224.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging225.xml b/src/performance/java/org/apache/log4j/performance/xml/logging225.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging225.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging225.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging226.xml b/src/performance/java/org/apache/log4j/performance/xml/logging226.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging226.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging226.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging227.xml b/src/performance/java/org/apache/log4j/performance/xml/logging227.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging227.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging227.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging3.xml b/src/performance/java/org/apache/log4j/performance/xml/logging3.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging3.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging3.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging300.xml b/src/performance/java/org/apache/log4j/performance/xml/logging300.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging300.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging300.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging301.xml b/src/performance/java/org/apache/log4j/performance/xml/logging301.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging301.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging301.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging302.xml b/src/performance/java/org/apache/log4j/performance/xml/logging302.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging302.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging302.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging303.xml b/src/performance/java/org/apache/log4j/performance/xml/logging303.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging303.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging303.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging304.xml b/src/performance/java/org/apache/log4j/performance/xml/logging304.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging304.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging304.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging305.xml b/src/performance/java/org/apache/log4j/performance/xml/logging305.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging305.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging305.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging306.xml b/src/performance/java/org/apache/log4j/performance/xml/logging306.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging306.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging306.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging307.xml b/src/performance/java/org/apache/log4j/performance/xml/logging307.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging307.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging307.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging4.xml b/src/performance/java/org/apache/log4j/performance/xml/logging4.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging4.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging4.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging5.xml b/src/performance/java/org/apache/log4j/performance/xml/logging5.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging5.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging5.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging6.xml b/src/performance/java/org/apache/log4j/performance/xml/logging6.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging6.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging6.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging7.xml b/src/performance/java/org/apache/log4j/performance/xml/logging7.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging7.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging7.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging8.xml b/src/performance/java/org/apache/log4j/performance/xml/logging8.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging8.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging8.xml diff --git a/src/main/java/org/apache/log4j/performance/xml/logging9.xml b/src/performance/java/org/apache/log4j/performance/xml/logging9.xml similarity index 100% rename from src/main/java/org/apache/log4j/performance/xml/logging9.xml rename to src/performance/java/org/apache/log4j/performance/xml/logging9.xml From 336f697d027e5bd91d2d07380073823428ba4ce7 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 15 May 2007 00:43:19 +0000 Subject: [PATCH 292/342] Bug 37930: Maven now builds NTEventLogAppender.dll git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538030 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 35 +++++++- pom.xml | 22 +++++ .../log4j/nt => ntdll}/EventLogCategories.mc | 0 .../apache/log4j/nt => ntdll}/MSG00001.bin | Bin .../log4j/nt => ntdll}/NTEventLogAppender.rc | 0 src/ntdll/build.xml | 77 ++++++++++++++++++ .../apache/log4j/nt => ntdll}/nteventlog.cpp | 0 7 files changed, 131 insertions(+), 3 deletions(-) rename src/{main/java/org/apache/log4j/nt => ntdll}/EventLogCategories.mc (100%) rename src/{main/java/org/apache/log4j/nt => ntdll}/MSG00001.bin (100%) rename src/{main/java/org/apache/log4j/nt => ntdll}/NTEventLogAppender.rc (100%) create mode 100755 src/ntdll/build.xml rename src/{main/java/org/apache/log4j/nt => ntdll}/nteventlog.cpp (100%) diff --git a/build.xml b/build.xml index 5451fb6242..6d7ab5e186 100644 --- a/build.xml +++ b/build.xml @@ -360,15 +360,44 @@
    + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -380,7 +409,7 @@ - + diff --git a/pom.xml b/pom.xml index 6dbddb3daf..e417b695b6 100644 --- a/pom.xml +++ b/pom.xml @@ -113,6 +113,28 @@ + + maven-antrun-plugin + + + + process-classes + ntdll + + + + + + + + + + + run + + + + tests/src/java diff --git a/src/main/java/org/apache/log4j/nt/EventLogCategories.mc b/src/ntdll/EventLogCategories.mc similarity index 100% rename from src/main/java/org/apache/log4j/nt/EventLogCategories.mc rename to src/ntdll/EventLogCategories.mc diff --git a/src/main/java/org/apache/log4j/nt/MSG00001.bin b/src/ntdll/MSG00001.bin similarity index 100% rename from src/main/java/org/apache/log4j/nt/MSG00001.bin rename to src/ntdll/MSG00001.bin diff --git a/src/main/java/org/apache/log4j/nt/NTEventLogAppender.rc b/src/ntdll/NTEventLogAppender.rc similarity index 100% rename from src/main/java/org/apache/log4j/nt/NTEventLogAppender.rc rename to src/ntdll/NTEventLogAppender.rc diff --git a/src/ntdll/build.xml b/src/ntdll/build.xml new file mode 100755 index 0000000000..5a21b2c5de --- /dev/null +++ b/src/ntdll/build.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + windres could not be found or failed. +MinGW toolkit must be on path to build NTEventLogAppender.dll + + + + + + \ No newline at end of file diff --git a/src/main/java/org/apache/log4j/nt/nteventlog.cpp b/src/ntdll/nteventlog.cpp similarity index 100% rename from src/main/java/org/apache/log4j/nt/nteventlog.cpp rename to src/ntdll/nteventlog.cpp From dcae7f694cb286bf111db545138885fafc9f3be8 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 15 May 2007 04:44:53 +0000 Subject: [PATCH 293/342] Bug 37930: Maven now runs most unit tests git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538056 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 78 ++++++++++++++++++- .../log4j/util/JunitTestRunnerFilter.java | 2 + 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e417b695b6..5290119a47 100644 --- a/pom.xml +++ b/pom.xml @@ -92,7 +92,53 @@ maven-surefire-plugin tests - true + plain + pertest + + org/apache/log4j/LevelTest.java + org/apache/log4j/PriorityTest.java + org/apache/log4j/CategoryTest.java + org/apache/log4j/FileAppenderTest.java + org/apache/log4j/LogManagerTest.java + org/apache/log4j/helpers.LogLogTest.java + org/apache/log4j/LayoutTest.java + org/apache/log4j/helpers.DateLayoutTest.java + org/apache/log4j/TTCCLayoutTest.java + org/apache/log4j/xml.XMLLayoutTest.java + org/apache/log4j/HTMLLayoutTest.java + org/apache/log4j/PatternLayoutTest.java + org/apache/log4j/spi.LoggingEventTest.java + org/apache/log4j/spi.ThrowableInformationTest.java + org/apache/log4j/spi.LocationInfoTest.java + org/apache/log4j/PropertyConfiguratorTest.java + org/apache/log4j/MinimumTestCase.java + org/apache/log4j/LoggerTestCase.java + org/apache/log4j/PatternLayoutTestCase.java + org/apache/log4j/HierarchyThresholdTestCase.java + org/apache/log4j/xml/DOMTestCase.java + org/apache/log4j/xml/CustomLevelTestCase.java + org/apache/log4j/customLogger/XLoggerTestCase.java + + + org/apache/log4j/xml/XMLLayoutTestCase.java + org/apache/log4j/xml/AsyncAppenderTestCase.java + org/apache/log4j/varia/LevelMatchFilterTestCase.java + + + org/apache/log4j/helpers/OptionConverterTestCase.java + org/apache/log4j/helpers/BoundedFIFOTestCase.java + org/apache/log4j/helpers/CyclicBufferTestCase.java + org/apache/log4j/helpers/PatternParserTestCase.java + org/apache/log4j/or/ORTestCase.java + org/apache/log4j/DRFATestCase.java + org/apache/log4j/RFATestCase.java + org/apache/log4j/varia/ERFATestCase.java + org/apache/log4j/net/SyslogAppenderTest + org/apache/log4j/nt/NTEventLogAppenderTest + org/apache/log4j/net/SocketAppenderTest + @@ -132,11 +178,41 @@ run + + + + test-compile + mkdir_tests_output + + + + + + + run + + + + clean + rmdir_tests_output + + + + + + + run + tests/src/java + + + tests/resources + + diff --git a/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java b/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java index 341bd3481c..43214d7791 100644 --- a/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java +++ b/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java @@ -42,6 +42,8 @@ public String filter(String in) { return null; } else if (in.indexOf("at junit.") >= 0 && in.indexOf("ui.TestRunner") >= 0) { return null; + } else if (in.indexOf("org.apache.maven") >= 0) { + return null; } else if (util.match("/\\sat /", in)) { return "\t" + in.trim(); } else { From 2b289a86739c1b912fd7c8566da06dbdfdacd0c3 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 15 May 2007 17:10:36 +0000 Subject: [PATCH 294/342] Bug 37930: Almost ready for a Maven-based release git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538256 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 17 +++++++++-- src/assembly/bin.xml | 61 +++++++++++++++++++++++++++++++++++++++ src/site/apt/download.apt | 8 ++--- src/site/site.xml | 12 ++++---- 4 files changed, 85 insertions(+), 13 deletions(-) create mode 100644 src/assembly/bin.xml diff --git a/pom.xml b/pom.xml index 5290119a47..1dadc0b367 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ jar Apache Log4j 1.2.15 + + 1.2.15 + Apache Log4j http://logging.apache.org/log4j/1.2/ @@ -127,7 +130,7 @@ - org/apache/log4j/helpers/OptionConverterTestCase.java + org/apache/log4j/helpers/BoundedFIFOTestCase.java org/apache/log4j/helpers/CyclicBufferTestCase.java org/apache/log4j/helpers/PatternParserTestCase.java @@ -205,7 +208,15 @@ - + + + maven-assembly-plugin + + + src/assembly/bin.xml + + + tests/src/java @@ -290,7 +301,7 @@ log4j12.website - scp://people.apache.org/www/logging.apache.org/test/log4j/1.2/ + scp://people.apache.org/www/logging.apache.org/log4j/1.2/
    diff --git a/src/assembly/bin.xml b/src/assembly/bin.xml new file mode 100644 index 0000000000..d72f087447 --- /dev/null +++ b/src/assembly/bin.xml @@ -0,0 +1,61 @@ + + + bin + + zip + tar.gz + + apache-log4j-${project.version} + true + + + + *.txt + *.sample + *.xml + *.rdf + INSTALL + KEYS + LICENSE + NOTICE + contrib/** + examples/** + src/assembly/** + src/changes/** + src/main/** + src/ntdll/** + src/performance/** + src/site/** + tests/* + tests/input/** + tests/resources/** + tests/src/** + tests/witness/** + + + + target + . + + log4j*.jar + NTEventLogAppender.dll + + + + \ No newline at end of file diff --git a/src/site/apt/download.apt b/src/site/apt/download.apt index 1af266f55a..e74df75839 100644 --- a/src/site/apt/download.apt +++ b/src/site/apt/download.apt @@ -18,9 +18,9 @@ Download Apache log4j 1.2 ------ ------ -Download Apache log4j 1.2.14 +Download Apache log4j 1.2.15 - Apache log4j 1.2.14 is distributed under the {{{http://www.apache.org/licenses/LICENSE-2.0.html} Apache License, version 2.0}}. + Apache log4j 1.2.15 is distributed under the {{{http://www.apache.org/licenses/LICENSE-2.0.html} Apache License, version 2.0}}. The link in the Mirrors column should display a list of available mirrors with a default selection based on your inferred location. If you do not see that page, @@ -30,9 +30,9 @@ Download Apache log4j 1.2.14 *-------------------------+---------+----------+-----------+ | | Mirrors | Checksum | Signature | *-------------------------+---------+----------+-----------+ -| Apache log4j 1.2.14 (tar.gz) | {{{http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.14/logging-log4j-1.2.14.tar.gz} logging-log4j-1.2.14.tar.gz}} | {{{http://www.apache.org/dist/logging/log4j/1.2.14/logging-log4j-1.2.14.tar.gz.md5} logging-log4j-1.2.14.tar.gz.md5}} | {{{http://www.apache.org/dist/logging/log4j/1.2.14/logging-log4j-1.2.14.tar.gz.asc} logging-log4j-1.2.14.tar.gz.asc}} | +| Apache log4j 1.2.15 (tar.gz) | {{{http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.15/apache-log4j-1.2.15.tar.gz} apache-log4j-1.2.15.tar.gz}} | {{{http://www.apache.org/dist/logging/log4j/1.2.15/apache-log4j-1.2.15.tar.gz.md5} apache-log4j-1.2.15.tar.gz.md5}} | {{{http://www.apache.org/dist/logging/log4j/1.2.15/apache-log4j-1.2.15.tar.gz.asc} apache-log4j-1.2.15.tar.gz.asc}} | *-------------------------+---------+----------+-----------+ -| Apache log4j 1.2.14 (zip) | {{{http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.14/logging-log4j-1.2.14.zip} logging-log4j-1.2.14.zip}} | {{{http://www.apache.org/dist/logging/log4j/1.2.14/logging-log4j-1.2.14.zip.md5} logging-log4j-1.2.14.zip.md5}} | {{{http://www.apache.org/dist/logging/log4j/1.2.14/logging-log4j-1.2.14.zip.asc} logging-log4j-1.2.14.zip.asc}} | +| Apache log4j 1.2.15 (zip) | {{{http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.15/apache-log4j-1.2.15.zip} apache-log4j-1.2.15.zip}} | {{{http://www.apache.org/dist/logging/log4j/1.2.15/apache-log4j-1.2.15.zip.md5} apache-log4j-1.2.15.zip.md5}} | {{{http://www.apache.org/dist/logging/log4j/1.2.15/apache-log4j-1.2.15.zip.asc} apache-log4j-1.2.15.zip.asc}} | *-------------------------+---------+----------+-----------+ Please read {{{http://httpd.apache.org/dev/verification.html}Verifying Apache HTTP Server Releases}} diff --git a/src/site/site.xml b/src/site/site.xml index 1e49a44999..90c34effad 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -19,7 +19,7 @@ Apache log4j 1.2 images/ls-logo.jpg - http://logging.apache.org/test/log4j/1.2 + http://logging.apache.org/log4j/1.2 images/logo.jpg @@ -27,9 +27,9 @@ - - - + + + @@ -63,8 +63,8 @@ - - + + From 710099c2de683e2defc7fd4703e9f552260fea4d Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 15 May 2007 20:51:38 +0000 Subject: [PATCH 295/342] Bug 37930: Remove obsolete files, Maven refinement git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538313 13f79535-47bb-0310-9956-ffa450edef68 --- BUILD-INFO.txt | 39 +- bin/StartLogFactor5.sh | 20 - bin/StartLogFactor5Console.bat | 24 - bin/lcp.bat | 2 - build.properties.sample | 8 + build.xml | 152 +- build/manifest.mf | 7 - build/package-list | 59 - docs/FAQ.html | 1116 ---------- docs/HISTORY.txt | 1833 ----------------- docs/TODO | 75 - docs/TROUBLESHOOT.html | 301 --- docs/css/site.css | 140 -- docs/images/ceki-72x101.gif | Bin 7712 -> 0 bytes docs/images/chainsaw-fullscreen-small.jpg | Bin 55917 -> 0 bytes docs/images/chainsaw-fullscreen.jpg | Bin 208947 -> 0 bytes docs/images/coverSmall.png | Bin 57875 -> 0 bytes docs/images/cyberlab15.gif | Bin 238 -> 0 bytes docs/images/ecaward_finalist_logo.gif | Bin 3015 -> 0 bytes docs/images/logo.jpg | Bin 8184 -> 0 bytes docs/images/mark-72x99.gif | Bin 2206 -> 0 bytes docs/images/psmith.jpg | Bin 8052 -> 0 bytes docs/images/yshapira.bmp | Bin 31514 -> 0 bytes docs/lf5/images/blue_on_white.gif | Bin 908 -> 0 bytes docs/lf5/images/console_window.gif | Bin 56097 -> 0 bytes docs/lf5/images/lf5.gif | Bin 35277 -> 0 bytes docs/lf5/images/lf5_about.gif | Bin 9451 -> 0 bytes docs/lf5/images/lf5_category_explorer.gif | Bin 62477 -> 0 bytes docs/lf5/images/lf5_collapseall.gif | Bin 62701 -> 0 bytes docs/lf5/images/lf5_colorchooser.gif | Bin 62676 -> 0 bytes docs/lf5/images/lf5_compactview.gif | Bin 53415 -> 0 bytes docs/lf5/images/lf5_configure.gif | Bin 62471 -> 0 bytes docs/lf5/images/lf5_deselectall.gif | Bin 65637 -> 0 bytes docs/lf5/images/lf5_detailedview.gif | Bin 57900 -> 0 bytes docs/lf5/images/lf5_expandall.gif | Bin 64917 -> 0 bytes docs/lf5/images/lf5_loglevels.gif | Bin 62411 -> 0 bytes docs/lf5/images/lf5_logo.gif | Bin 2398 -> 0 bytes docs/lf5/images/lf5_logo_small.gif | Bin 970 -> 0 bytes docs/lf5/images/lf5_logtable.gif | Bin 61525 -> 0 bytes docs/lf5/images/lf5_ndc_filtering.gif | Bin 42345 -> 0 bytes docs/lf5/images/lf5_openfile.gif | Bin 51140 -> 0 bytes docs/lf5/images/lf5_openurl.gif | Bin 61066 -> 0 bytes docs/lf5/images/lf5_properties.gif | Bin 52169 -> 0 bytes docs/lf5/images/lf5_recorddetail.gif | Bin 55142 -> 0 bytes docs/lf5/images/lf5_remove_categories.gif | Bin 66759 -> 0 bytes docs/lf5/images/lf5_search.gif | Bin 59820 -> 0 bytes docs/lf5/images/lf5_selectall.gif | Bin 65440 -> 0 bytes docs/lf5/images/lf5_small.gif | Bin 19171 -> 0 bytes docs/lf5/images/lf5_standardview.gif | Bin 54007 -> 0 bytes docs/lf5/images/lf5_view.gif | Bin 63526 -> 0 bytes docs/lf5/images/small_right_arrow.gif | Bin 76 -> 0 bytes docs/manual.html | 1222 ----------- docs/od.gif | Bin 5741 -> 0 bytes docs/overview.html | 12 - .../log4j/xml/examples/ReportParserError.java | 51 + .../apache/log4j/xml/examples/XMLSample.java | 75 + .../apache/log4j/xml/examples/extension1.xml | 28 + .../apache/log4j/xml/examples/extension2.xml | 35 + .../apache/log4j/xml/examples/package.html | 26 + .../org/apache/log4j/xml/examples/sample1.xml | 22 + .../org/apache/log4j/xml/examples/sample2.xml | 31 + .../org/apache/log4j/xml/examples/sample3.xml | 28 + .../org/apache/log4j/xml/examples/sample4.xml | 23 + .../org/apache/log4j/xml/examples/sample5.xml | 34 + packaging/.functions | 40 - packaging/install | 189 -- packaging/package-list | 59 - packaging/tarmake | 72 - pom.xml | 29 +- src/assembly/bin.xml | 1 - src/xdocs/contactUs.xml | 115 -- src/xdocs/contributors.xml | 185 -- src/xdocs/documentation.xml | 200 -- src/xdocs/download.xml | 386 ---- src/xdocs/earlier.xml | 44 - src/xdocs/history.xml | 63 - src/xdocs/index.xml | 88 - src/xdocs/lf5/configuration.xml | 131 -- src/xdocs/lf5/examples.xml | 581 ------ src/xdocs/lf5/faq.xml | 62 - src/xdocs/lf5/features.xml | 266 --- src/xdocs/lf5/overview.xml | 93 - src/xdocs/lf5/readingfiles.xml | 116 -- src/xdocs/lf5/trouble.xml | 324 --- src/xdocs/plan.xml | 82 - src/xdocs/stylesheets/compatibility.xslt | 77 - src/xdocs/stylesheets/lf5.xml | 44 - src/xdocs/stylesheets/project.xml | 50 - src/xdocs/stylesheets/site.vsl | 335 --- 89 files changed, 390 insertions(+), 8605 deletions(-) delete mode 100644 bin/StartLogFactor5.sh delete mode 100644 bin/StartLogFactor5Console.bat delete mode 100644 bin/lcp.bat delete mode 100644 build/manifest.mf delete mode 100644 build/package-list delete mode 100644 docs/FAQ.html delete mode 100644 docs/HISTORY.txt delete mode 100644 docs/TODO delete mode 100644 docs/TROUBLESHOOT.html delete mode 100644 docs/css/site.css delete mode 100644 docs/images/ceki-72x101.gif delete mode 100644 docs/images/chainsaw-fullscreen-small.jpg delete mode 100644 docs/images/chainsaw-fullscreen.jpg delete mode 100644 docs/images/coverSmall.png delete mode 100644 docs/images/cyberlab15.gif delete mode 100644 docs/images/ecaward_finalist_logo.gif delete mode 100644 docs/images/logo.jpg delete mode 100644 docs/images/mark-72x99.gif delete mode 100644 docs/images/psmith.jpg delete mode 100644 docs/images/yshapira.bmp delete mode 100644 docs/lf5/images/blue_on_white.gif delete mode 100644 docs/lf5/images/console_window.gif delete mode 100644 docs/lf5/images/lf5.gif delete mode 100644 docs/lf5/images/lf5_about.gif delete mode 100644 docs/lf5/images/lf5_category_explorer.gif delete mode 100644 docs/lf5/images/lf5_collapseall.gif delete mode 100644 docs/lf5/images/lf5_colorchooser.gif delete mode 100644 docs/lf5/images/lf5_compactview.gif delete mode 100644 docs/lf5/images/lf5_configure.gif delete mode 100644 docs/lf5/images/lf5_deselectall.gif delete mode 100644 docs/lf5/images/lf5_detailedview.gif delete mode 100644 docs/lf5/images/lf5_expandall.gif delete mode 100644 docs/lf5/images/lf5_loglevels.gif delete mode 100644 docs/lf5/images/lf5_logo.gif delete mode 100644 docs/lf5/images/lf5_logo_small.gif delete mode 100644 docs/lf5/images/lf5_logtable.gif delete mode 100644 docs/lf5/images/lf5_ndc_filtering.gif delete mode 100644 docs/lf5/images/lf5_openfile.gif delete mode 100644 docs/lf5/images/lf5_openurl.gif delete mode 100644 docs/lf5/images/lf5_properties.gif delete mode 100644 docs/lf5/images/lf5_recorddetail.gif delete mode 100644 docs/lf5/images/lf5_remove_categories.gif delete mode 100644 docs/lf5/images/lf5_search.gif delete mode 100644 docs/lf5/images/lf5_selectall.gif delete mode 100644 docs/lf5/images/lf5_small.gif delete mode 100644 docs/lf5/images/lf5_standardview.gif delete mode 100644 docs/lf5/images/lf5_view.gif delete mode 100644 docs/lf5/images/small_right_arrow.gif delete mode 100644 docs/manual.html delete mode 100644 docs/od.gif delete mode 100644 docs/overview.html create mode 100644 examples/xml/org/apache/log4j/xml/examples/ReportParserError.java create mode 100644 examples/xml/org/apache/log4j/xml/examples/XMLSample.java create mode 100644 examples/xml/org/apache/log4j/xml/examples/extension1.xml create mode 100644 examples/xml/org/apache/log4j/xml/examples/extension2.xml create mode 100644 examples/xml/org/apache/log4j/xml/examples/package.html create mode 100644 examples/xml/org/apache/log4j/xml/examples/sample1.xml create mode 100644 examples/xml/org/apache/log4j/xml/examples/sample2.xml create mode 100644 examples/xml/org/apache/log4j/xml/examples/sample3.xml create mode 100644 examples/xml/org/apache/log4j/xml/examples/sample4.xml create mode 100644 examples/xml/org/apache/log4j/xml/examples/sample5.xml delete mode 100644 packaging/.functions delete mode 100644 packaging/install delete mode 100644 packaging/package-list delete mode 100644 packaging/tarmake delete mode 100644 src/xdocs/contactUs.xml delete mode 100644 src/xdocs/contributors.xml delete mode 100644 src/xdocs/documentation.xml delete mode 100644 src/xdocs/download.xml delete mode 100644 src/xdocs/earlier.xml delete mode 100644 src/xdocs/history.xml delete mode 100644 src/xdocs/index.xml delete mode 100644 src/xdocs/lf5/configuration.xml delete mode 100644 src/xdocs/lf5/examples.xml delete mode 100644 src/xdocs/lf5/faq.xml delete mode 100644 src/xdocs/lf5/features.xml delete mode 100644 src/xdocs/lf5/overview.xml delete mode 100644 src/xdocs/lf5/readingfiles.xml delete mode 100644 src/xdocs/lf5/trouble.xml delete mode 100644 src/xdocs/plan.xml delete mode 100644 src/xdocs/stylesheets/compatibility.xslt delete mode 100644 src/xdocs/stylesheets/lf5.xml delete mode 100644 src/xdocs/stylesheets/project.xml delete mode 100755 src/xdocs/stylesheets/site.vsl diff --git a/BUILD-INFO.txt b/BUILD-INFO.txt index 85f2fdc8c0..5facc46afb 100644 --- a/BUILD-INFO.txt +++ b/BUILD-INFO.txt @@ -1,39 +1,8 @@ This is the build information for the current log4j release. It contains the versions of tools and jars used to build this version of the log4j library. -Ant - v1.6.5; Available from http://ant.apache.org -JDK - jdk1.3.1_16; Available from http://java.sun.com/j2se/1.3/index.jsp +Maven - 2.0.6; Available from http://maven.apache.org +MinGW - MinGW-3.1.0-1.exe; Available from http://mingw.sourceforge.net/downloads.html (used to build NTEventLogAppender.dll) +JDK - jdk1.3.1_18; Available from http://java.sun.com/products/archive/ +Windows 2000 SP4 - -External jar dependencies - These projects were used in compiling the log4j -classes. The locations of their jars can be set in the build.properties file, -a sample of which can be duplicated from the file build.properties.sample. - -XML (jaxp.jaxp.jar) - Crimson 1.1.3; Available from - http://xml.apache.org/crimson/ - -Java Mail (javamail.jar) - v1.3.2; Available from - http://java.sun.com/products/javamail/ - -JavaBeans Activation Framework (activation.jar) - v1.0.2; Available from - http://java.sun.com/products/javabeans/jaf/index.jsp - -JMS (jms.jar) - v1.1; Available from - http://java.sun.com/products/jms/docs.html - -JMX (jmx.jar, jmx-extra.jar) - v1.2; Available from - http://java.sun.com/products/JavaManagement/index.jsp - -JNDI (jndi.jar) - v1.2.1; Available from - http://java.sun.com/products/jndi/downloads/ - - -External jar dependencies for unit tests - These jars are used as part of the -unit testing. - -JUnit - v3.8.1; Available from http://junit.org - -Jakarta ORO (jakarta.oro.jar) - v2.0.8; - Available from http://jakarta.apache.org/oro/ - -Clover (clover.jar) - v1.3.8; Available from http://www.cenqua.com/clover/ diff --git a/bin/StartLogFactor5.sh b/bin/StartLogFactor5.sh deleted file mode 100644 index 80e296c739..0000000000 --- a/bin/StartLogFactor5.sh +++ /dev/null @@ -1,20 +0,0 @@ -#! /bin/sh - -if [ -z "$LOG4J_HOME" ] ; then - LOG4J_HOME=.. -fi - -JAVACMD=$JAVA_HOME/bin/java - -# add in the dependency .jar files -DIRLIBS=${LOG4J_HOME}/dist/lib/*.jar -for i in ${DIRLIBS} -do - - if [ "$i" != "${DIRLIBS}" ] ; then - LOCALCLASSPATH=$LOCALCLASSPATH:"$i" - fi - -done - -$JAVACMD -classpath "$LOCALCLASSPATH" org.apache.log4j.lf5.StartLogFactor5 \ No newline at end of file diff --git a/bin/StartLogFactor5Console.bat b/bin/StartLogFactor5Console.bat deleted file mode 100644 index 42cb1eaf9f..0000000000 --- a/bin/StartLogFactor5Console.bat +++ /dev/null @@ -1,24 +0,0 @@ -@echo off - -if not "%LOG4J_HOME%" == "" goto start - -SET LOG4J_HOME=.. - -:start - -java -fullversion -set LOCALCLASSPATH= -for %%i in ("%LOG4J_HOME%\dist\lib\*.jar") do call "%LOG4J_HOME%\bin\lcp.bat" "%%i" - -echo using classpath %LOCALCLASSPATH% - -java -classpath %LOCALCLASSPATH% org.apache.log4j.lf5.StartLogFactor5 - -exit - -:usage -echo usage: lf5 (target) - -:eof -pause - diff --git a/bin/lcp.bat b/bin/lcp.bat deleted file mode 100644 index 4f267130b6..0000000000 --- a/bin/lcp.bat +++ /dev/null @@ -1,2 +0,0 @@ -set LOCALCLASSPATH=%1;%LOCALCLASSPATH% - diff --git a/build.properties.sample b/build.properties.sample index 3b9345b99e..f346d4500a 100644 --- a/build.properties.sample +++ b/build.properties.sample @@ -14,6 +14,14 @@ # limitations under the License. # # + +# +# Providing a build.properties file is no longer +# necessary for an Ant build as long as one Maven build +# has previously been performed. +# + + # base location of support directories # lib.home.dir=/java diff --git a/build.xml b/build.xml index 6d7ab5e186..dadb8ae40e 100644 --- a/build.xml +++ b/build.xml @@ -117,11 +117,6 @@ - - - - - @@ -576,10 +571,10 @@ - - + @@ -644,81 +639,14 @@ - + - - - - - - - - - AnakiaTask is not present! Please check to make sure that - velocity.jar is in your classpath. - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - -Dapache.user=USERNAME must be specified. - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -799,71 +727,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -894,7 +757,6 @@ classname="org.apache.log4j.net.SMTPAppender" classpath="${jar.dest}/${jar.filename}"/> - diff --git a/build/manifest.mf b/build/manifest.mf deleted file mode 100644 index 6d690879e6..0000000000 --- a/build/manifest.mf +++ /dev/null @@ -1,7 +0,0 @@ -Manifest-version: 1.0 - -Name: org/apache/log4j/ -Implementation-Title: Apache log4j -Implementation-Version: @version@ -Implementation-Vendor: "Apache Software Foundation" - diff --git a/build/package-list b/build/package-list deleted file mode 100644 index 407d0d79a5..0000000000 --- a/build/package-list +++ /dev/null @@ -1,59 +0,0 @@ -java.applet -java.awt -java.awt.color -java.awt.datatransfer -java.awt.dnd -java.awt.event -java.awt.font -java.awt.geom -java.awt.im -java.awt.image -java.awt.image.renderable -java.awt.print -java.beans -java.beans.beancontext -java.io -java.lang -java.lang.ref -java.lang.reflect -java.math -java.net -java.rmi -java.rmi.activation -java.rmi.dgc -java.rmi.registry -java.rmi.server -java.security -java.security.acl -java.security.cert -java.security.interfaces -java.security.spec -java.sql -java.text -java.util -java.util.jar -java.util.zip -javax.accessibility -javax.swing -javax.swing.border -javax.swing.colorchooser -javax.swing.event -javax.swing.filechooser -javax.swing.plaf -javax.swing.plaf.basic -javax.swing.plaf.metal -javax.swing.plaf.multi -javax.swing.table -javax.swing.text -javax.swing.text.html -javax.swing.text.html.parser -javax.swing.text.rtf -javax.swing.tree -javax.swing.undo -org.omg.CORBA -org.omg.CORBA.DynAnyPackage -org.omg.CORBA.ORBPackage -org.omg.CORBA.portable -org.omg.CORBA.TypeCodePackage -org.omg.CosNaming -org.omg.CosNaming.NamingContextPackage diff --git a/docs/FAQ.html b/docs/FAQ.html deleted file mode 100644 index 6f3957d472..0000000000 --- a/docs/FAQ.html +++ /dev/null @@ -1,1116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Log4j project - Frequently Asked Questions about log4j - - - - - - - - - - - - -
    -
    - -
    -

    Frequently Asked Questions about log4j

    -

    Ceki Gülcü, Paul Smith, Chris Taylor
    - May 2002, last updated on September 15th, 2004

    -
    - - - -
    -
    - Section 1. Generalities -
    - - - - -
    Question 1.1What is log4j?
    - - - -
    Question 1.2Is log4j a reliable logging system?
    - - - -
    Question 1.3What are the prerequisites for log4j?
    - - - -
    Question 1.4What are the features of log4j?
    - - - -
    Question 1.5Is there example code for using log4j?
    - - - -
    Question 1.6What documentation should I read to learn more about - log4j?
    - - - -
    Question 1.7Is log4j thread-safe?
    - - - -
    Question 1.8What does log output look like?
    - - - -
    Question 1.9Why should I use log4j when JDK 1.4 already ships with a - logging API?
    -
    -
    - Section 2. Using log4j -
    - - - - -
    Question 2.1What are Loggers?
    - - - -
    Question 2.2How can I change log behavior at runtime?
    - - - -
    Question 2.3What is the fastest way of (not) logging?
    - - - -
    Question 2.4 Are there any suggested ways for naming loggers?
    - - - -
    Question 2.5How do I get the fully-qualified name of a class in a static block?
    - - - -
    Question 2.6Can the log output format be customized?
    - - - -
    Question 2.7What are the configurable options for FooBarAppender?
    - - - -
    Question 2.8What is the recommended way of migrating from - java.util.logging to log4j?
    - - - -
    Question 2.9Is it possible to direct log output to - different appenders by level?
    - - - -
    Question 2.10What does the Windows NT Event Viewer complain about - missing descriptions for my event messages when I use the - NTEventLogAppender?
    - - - -
    Question 2.11Why can't I map my logger names to the loggers that - appear in the NT Event Log when I use the - NTEventLogAppender?
    - - - -
    Question 2.12Are there suggested approaches for logging in JSP pages?
    -
    -
    - Section 3. Advanced questions -
    - - - - -
    Question 3.1Can the outputs of multiple client request go to - different log files?
    - - - -
    Question 3.2Logger instances seem to be create only. Why isn't - there a method to remove logger instances?
    - - - -
    Question 3.3How do I get multiple process to log to the same file?
    - - - -
    Question 3.4How about the timesamps of events generated by multiple - processes across multiple hosts (possibly across multiple - timezones)? -
    - - - -
    Question 3.5Why can't log4j find my properties file in a J2EE or WAR - application?
    - - - -
    Question 3.6Is there a way to get log4j to automatically reload a - configuration file if it changes?
    -
    - - - - - -
    Question 4.1Why should I donate my extensions to log4j back to the - project? -
    - - - -
    Question 4.2What should I keep in mind when contributing code?
    - - - -
    Question 4.3How can I contribute a new question/answer to this - document?
    -
    - - -
    - Section 1. Generalities -
    - -

    This section contains general questions about log4j.

    - - - -

    log4j is a tool to help the programmer output log statements to a - variety of output targets. -

    - -

    In case of problems with an application, it is helpful to - enable logging so that the problem can be located. With log4j - it is possible to enable logging at runtime without modifying - the application binary. The log4j package is designed so that - log statements can remain in shipped code without - incurring a high performance cost. It follows that the speed - of logging (or rather not logging) is capital. -

    - -

    At the same time, log output can be so voluminous that it quickly - becomes overwhelming. One of the distinctive features of log4j is the - notion of hierarchical loggers. Using loggers it is - possible to selectively control which log statements are output at - arbitrary granularity. -

    - -

    log4j is designed with two three goals in mind: - reliability, speed and flexibility. There is a tight balance - between these requirements. We believe that log4j strikes the - right balance. -

    - - - -

    No. log4j is not reliable. It is a best-effort - fail-stop logging system. -

    - -

    By fail-stop, we mean that log4j will not throw unexpected - exceptions at run-time potentially causing your application to - crash. If for any reason, log4j throws an uncaught exception, - please send an email to the log4j-user@logging.apache.org - mailing list. Uncaught exceptions are handled as serious bugs - requiring immediate attention. -

    - -

    Moreover, log4j will not revert to System.out or System.err - when its designated output stream is not opened, is not writable or - becomes full. This avoids corrupting an otherwise working program by - flooding the user's terminal because logging fails. However, log4j - will output a single message to System.err indicating that logging can - not be performed. -

    - - - -
      -
    • Log4j versions upto and including 1.2.8 are - compatible with JDK 1.1.x and later. Log4j version 1.3 will - be compatilble with JDK 1.2 and later. -

    • - -
    • The DOMConfigurator is based on the DOM Level 1 - API. The DOMConfigurator.configure(Element) method will work - with any XML parser that will pass it a DOM tree. -

      -

      The DOMConfigurator.configure(String filename) method and its - variants require a JAXP compatible XML parser, for example Xerces or Sun's - parser. Compiling the DOMConfigurator requires the presence of a - JAXP parser in the classpath. -

      -
    • - -
    • The org.apache.log4j.net.SMTPAppender - relies on the JavaMail - API. It has been tested with JavaMail API version - 1.2. The JavaMail API requires the JavaBeans - Activation Framework package. -

    • - -
    • The org.apache.log4j.net.JMSAppender - requires the presence of the JMS API as well as JNDI. -

    • - -
    • log4j test code relies on the JUnit testing framework. -

    • -
    - - - -
      - -
    • log4j is optimized for speed.

    • - -
    • log4j is based on a named logger hierarchy.

    • - -
    • log4j is fail-stop. However, altough it certainly - strives to ensure delivery, log4j does not guarantee that - each log statement will be delivered to its destination. -

    • - -
    • log4j is thread-safe.

    • - -
    • log4j is not restricted to a predefined set of - facilities.

    • - -
    • Logging behavior can be set at runtime using a - configuration file. Configuration files can be property - files or in XML format.

    • - -
    • log4j is designed to handle Java Exceptions from the - start.

    • - -
    • log4j can direct its output to a file, the console, - an java.io.OutputStream, - java.io.Writer, a remote server using TCP, a - remote Unix Syslog daemon, to a remote listener using JMS, - to the NT EventLog or even send e-mail.

    • - -
    • log4j uses 5 levels, namely DEBUG, INFO, WARN, ERROR and - FATAL. -

    • - -
    • The format of the log output can be easily changed by - extending the Layout - class.

    • - -
    • The target of the log output as well as the writing - strategy can be altered by implementations of the - Appender interface.

    • - -
    • log4j supports multiple output appenders per logger. -

    • - -
    • log4j supports internationalization.

    • -
    - - - -

    See the examples/ directory.

    - - - -

    Make sure to read the short - manual. It is also recommended to you read The complete - log4j manual which is much more detailed and up to - date. Both documents were written by Ceki Gülcü. -

    - - - -

    Yes, log4j is thread-safe. Log4j components are designed to - be used in heavily multithreaded systems.

    - - - - -

    The log output can be customized in many ways. Moreover, - one can completely override the output format by implementing - one's own Layout. -

    - -

    Here is an example output using PatternLayout with - the conversion pattern "%r [%t] %-5p %c{2} %x - %m%n" -

    - -
    -176 [main] INFO  examples.Sort - Populating an array of 2 elements in reverse order.
    -225 [main] INFO  examples.SortAlgo - Entered the sort method.
    -262 [main] DEBUG SortAlgo.OUTER i=1 - Outer loop.
    -276 [main] DEBUG SortAlgo.SWAP i=1 j=0 - Swapping intArray[0] = 1 and intArray[1] = 0
    -290 [main] DEBUG SortAlgo.OUTER i=0 - Outer loop.
    -304 [main] INFO  SortAlgo.DUMP - Dump of interger array:
    -317 [main] INFO  SortAlgo.DUMP - Element [0] = 0
    -331 [main] INFO  SortAlgo.DUMP - Element [1] = 1
    -343 [main] INFO  examples.Sort - The next log statement should be an error message.
    -346 [main] ERROR SortAlgo.DUMP - Tried to dump an uninitialized array.
    -        at org.log4j.examples.SortAlgo.dump(SortAlgo.java:58)
    -        at org.log4j.examples.Sort.main(Sort.java:64)
    -467 [main] INFO  examples.Sort - Exiting main method.
    -	
    - -

    The first field is the number of milliseconds elapsed since - the start of the program. The second field is the thread - outputting the log statement. The third field is the level of - the log statement. The fourth field is the rightmost two - components of the logger making the log request. The fifth - field (just before the '-') is the nested diagnostic - context (NDC). Note the nested diagnostic context may be - empty as in the first two statements. The text after the '-' - is the message of the statement. -

    - - - -

    - Although both APIs are conceptually similar, the log4j API is - significantly more flexible and offers many more features, too - numerous to be listed here. You will discover that the - additional features and flexibility turn out to be - indispensable in the context of a mission-critical - application. -

    - -

    The open and collaborative way in which log4j is developped - ensures that it continues to preserve and even widen its - competitive edge. At some point, input from bright developers - from all over the world is bound to make a difference. -

    - -
    - Section 2. Using log4j -
    - -

    This section contains answers to questions encountered while - using log4j.

    - - - -

    Lggers lie at the heart of log4j. Loggers define a hierarchy and give - the programmer run-time control on which statements are - printed or not. -

    - -

    Loggers are assigned levels. A log statement is printed - depending on its level and its logger. -

    - -

    Make sure to read the log4j manual - for more information. -

    - - - -

    Log behavior can be set using configuration files which are parsed - at runtime. Using configuration files the programmer can define - loggers and set their levels. -

    - -

    The PropertyConfigurator defines a particular format - of a configuration file. See also the examples/Sort.java - example and associated configuration files. -

    - -

    Configuration files can be specified in XML. See - log4j.dtd and - org.log4j.xml.DOMConfigurator for more details. -

    - -

    See the various Layout and Appender components for specific - configuration options. -

    - -

    In addition to configuration files, the user may disable all - messages belonging to a set of levels. See next item. -

    - - - - -

    For some logger l, writing, -

    - -
    - l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
    -	
    - -

    incurs the cost of constructing the message parameter, that is - converting both integer i and entry[i] to a - String, and concatenating intermediate strings. This, regardless of - whether the message will be logged or not. -

    - -

    If you are worried about speed, then write

    -
    -   if(l.isDebugEnabled()) {
    -     l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
    -   }
    -	
    - -

    This way you will not incur the cost of parameter - construction if debugging is disabled for logger - l. On the other hand, if the logger is debug - enabled, you will incur the cost of evaluating whether the - logger is enabled or not, twice: once in - debugEnabled and once in debug. - This is an insignificant overhead since evaluating a logger - takes less than 1% of the time it takes to actually log a - statement. -

    - - - - - - -

    Yes, there are.

    - -

    You can name loggers by locality. It turns out - that instantiating a logger in each class, with the logger name - equal to the fully-qualified name of the class, is a useful and - straightforward approach of defining loggers. This approach has - many benefits: -

    - -
      -
    • It is very simple to implement.
    • - -
    • It is very simple to explain to new developers.
    • - -
    • It automatically mirrors your application's own modular design. -
    • -
    • It can be further refined at will.
    • - -
    • Printing the logger automatically gives information on the locality - of the log statement.
    • -
    - -

    However, this is not the only way for naming loggers. A - common alternative is to name loggers by functional - areas. For example, the "database" logger, "RMI" - logger, "security" logger, or the "XML" logger. -

    - -

    You may choose to name loggers by functionality and - subcategorize by locality, as in "DATABASE.com.foo.some.package.someClass" or - "DATABASE.com.foo.some.other.package.someOtherClass". -

    - -

    You are totally free in choosing the names of your - loggers. The log4j package merely allows you to manage your - names in a hierarchy. However, it is your responsibility to define - this hierarchy. -

    - -

    Note by naming loggers by locality one tends to name things by - functionality, since in most cases the locality relates closely to - functionality. -

    - - - - -

    You can easily retrieve the fully-qualified name of a class in a - static block for class X, with the statement - X.class.getName(). Note that X is the class - name and not an instance. The X.class statement does - not create a new instance of class X. -

    - -

    Here is the suggested usage template:

    - -
    -package a.b.c;
    -
    -public class Foo {
    -  final static Logger logger = Logger.getLogger(Foo.class);
    -  ... other code
    -
    -}
    -	
    - - - -

    Yes, you can extend the Layout class to create - you own customized log format. Appenders can be parameterized - to use the layout of your choice. -

    - - - -

    Log4j uses JavaBeans style configuration.

    - -

    Thus, any setter method in FooBarAppender - corresponds to a configurable option. For example, in RollingFileAppender - the setMaxBackupIndex(int - maxBackups) method corresponds to the - maxBackupIndex option. The first letter of the - option can be upper case, i.e. MaxBackupIndex - and maxBackupIndex are equivalent but not - MAXBACKUPIndex nor mAXBackupIndex. -

    - -

    Layouts options are also defined by their setter methods. The same goes - for most other log4j components. -

    - - - - -

    We suggest to just use global file search/replace. You should be able - to replace all the "java.util.Logger" references with - "org.apache.log4j.Logger", and you should be on your way. -

    - -

    If you're on a Win32 platform, we recommend Textpad. You can use the - CTRL+SHIFT+O to open all *.java files from a directory including all - its sub-directories, and then use the search/replace function to - replace in all files, and then CTRL+SHIFT+S to save all. Should take - about 60 seconds! :) -

    - - - -

    Yes it is. Setting the Threshold option of any appender - extending AppenderSkeleton, - (most log4j appenders extend AppenderSkeleton) to filter out all log - events with lower level than the value of the threshold - option. -

    - -

    For example, setting the threshold of an appender to DEBUG - also allow INFO, WARN, ERROR and FATAL messages to log along - with DEBUG messages. This is usually acceptable as there is - little use for DEBUG messages without the surrounding INFO, - WARN, ERROR and FATAL messages. Similarly, setting the - threshold of an appender to ERROR will filter out DEBUG, INFO - and WARN messages but not ERROR or FATAL messages. -

    - -

    This policy usually best encapsulates what the user - actually wants to do, as opposed to her mind-projected - solution. -

    -

    See examples/sort4.lcf for an example threshold - configuration.

    - -

    If you must filter events by exact level match, then you can - attach a LevelMatchFilter - to any appender to filter out logging events by exact level match. -

    - - - - -

    The NT Event Viewer relies on message resource DLLs - to properly view an event message. The NTEventLogAppender.dll - contains these message resources, but that DLL must be copied - to %SYSTEMROOT%\SYSTEM32 for it to work properly. -

    - - - - -

    Unfotunately, the logger names are hardcoded within the - message resource DLL (see previous question about - NTEventLogAppender), so there isn't any easy way to override - those dynamically... in fact, I don't think it's possible to - do it, as you'd have to modify the DLL resources for every - application. Since most native applications don't use the - Logger column anyway... -

    - - - -

    - The suggested approach depends on your design requirements. If you or - your organization has no constraints on the use of Java in JSP pages, - simply use log4j normally in <% ... %> statements - as indicated in the Short Manual and the rest of the documentation. -

    -

    - However, if your design calls for a minimum amount of Java in your JSP - pages, consider using the - Log Taglib - from the Jakarta Taglibs project. It provides logging JSP tags that invoke - log4j. -

    - -
    - Section 3. Advanced questions -
    - -

    This section contains answers to more advanced questions about log4j.

    - - - - -

    Many developers are confronted with the problem of - distinguishing the log output originating from the same class - but different client requests. They come up with ingenious - mechanisms to fan out the log output to different files. In - most cases, this is not the right approach. -

    - -

    It is simpler to use a nested diagnostic context - (NDC). Typically, one would NDC.push() client - specific information, such as the client's hostname, ID or any - other distinguishing information when starting to handle the - client's request. Thereafter, log output will automatically - include the nested diagnostic context so that you can - distinguish logs from different client requests even if they - are output to the same file. -

    - -

    See the NDC and the PatternLayout - classes for more information. The NumberCruncher - example shows how the NDC can be used to distinguish the log - output from multiple clients even if they share the same log - file. -

    - -

    For select applications, such as virtual hosting - web-servers, the NDC solution is not sufficient. As of version - 0.9.0, log4j supports multiple hierarchy trees. Thus, it is - possible to log to different targets from the same logger - depending on the current context. -

    - - - - -

    It is quite nontrivial to define the semantics of a - "removed" logger escecially if it is still referenced by the - user. Future releases may include a remove method in - the Logger class.

    - - - -

    You may have each process log to a - SocketAppender. - The receiving - SocketServer - (or - SimpleSocketServer) - can receive all the events and send them to a single - log file. -

    - - - - -

    The timestamp is created when the logging event is created. - That is so say, when the debug, - info, warn, error or - fatal method is invoked. Thus, the timestamp is - unaffected by the time at which event arrive at a remote - socket server. -

    - -

    Timestamps are stored in UTC format inside the - event. Consequently, when displayed or written to a log file, - timestamps appear in the same timezone as the host displaying - or creating the logfile. Note that because the clocks of - various machines may not be synchronized, there may be - timestamp inconsistencies between events generated on - different hosts. -

    - - - - -

    The short answer: the log4j classes and the properties file - are not within the scope of the same classloader. -

    - -

    The long answer (and what to do about it): J2EE or Servlet - containers utilize Java's class loading system. Sun changed - the way classloading works with the release of Java 2. In - Java 2, classloaders are arranged in a hierarchial - parent-child relationship. When a child classloader needs to - find a class or a resource, it first delegates the request to - the parent. -

    - -

    Log4j only uses the default Class.forName() - mechanism for loading classes. Resources are handled - similarly. See the documentation for - java.lang.ClassLoader for more details. -

    - -

    So, if you're having problems, try loading the class or - resource yourself. If you can't find it, neither will - log4j. ;) -

    - - - - -

    Yes. Both the DOMConfigurator and the PropertyConfigurator support - automatic reloading through the configureAndWatch method. - See the API documentation for more details. -

    - - -

    Because the configureAndWatch launches a - separate wathdog thread, and because there is no way to stop - this thread in log4j 1.2, the configureAndWatch - method is unsafe for use in J2EE envrironments where - applications are recycled. -

    - - -
    - Section 4. Contributing to the project -
    - -

    This section includes questions about contributing to the - project

    - - - -

    Contrary to the GNU Public License (GPL) the Apache - Software License does not make any claims over your - extensions. By extensions, we mean totally new code that - invokes existing log4j classes. You are free to do - whatever you wish with your proprietary log4j extensions. - In particular, you may choose to never release your extensions - to the wider public. -

    - -

    We are very careful not to change the log4j client API so - that newer log4j releases are backward compatible with - previous versions. We are a lot less scrupulous with the - internal log4j API. Thus, if your extension is designed to - work with log4j version n, then when log4j - release version n+1 comes out, you will probably - need to adapt your proprietary extensions to the new release. -

    - -

    Thus, you will be forced to spend precious resources in - order to keep up with log4j changes. This is commonly referred - to as the "stupid-tax." By donating the code and making it - part of the standard distribution, you save yourself the - unnecessary maintenance work. -

    - -

    If your extensions are useful then someone will eventually - write an extension providing the same or very similar - functionality. Your development effort will be wasted. Unless - the proprietary log4j extension is business critical, there is - little reason for not donating your extensions back to the - project. -

    - - - -
      - -
    1. -

      Write a test case for your contribution.

      - -

      There is nothing more irritating than finding the bugs - in debugging (i.e. logging) code. Writing a test case - takes some effort but is crucial for a widely used library - such as log4j. Writing a test case will go a long way in - earning you the respect of fellow developers. See the - tests/ directory for exiting test cases. -

      -
    2. - - -
    3. -

      Stick to the existing indentation style even if you hate it.

      - -

      Alternating between indentation styles makes it hard to - understand the source code. Make it a little harder on - yourself but easier on others. -

      - -

      Log4j has adopted a rather conservative approach by - following the Code Conventions - for the JavaTM Programming Language. We use 2 (two) - spaces for indentation and no tabs. -

      -
    4. - -
    5. -

      Please do not both modify the code and change the - indentation in a single commit.

      - -

      If you change the code and reformat it at the same time - and then commit, the commit notification message will be - hard to read. It will contain many diffs associated with - the reformatting in addition to logical changes. -

      - -

      If you must reformat and change the code, then perform - each step separately. For example, reformat the code and - commit. Following that, you can change the logic and - commit. The two steps can be performed in the reverse - order just as well. You can first change the logic and - commit and only later reformat and commit. -

      - -
    6. -
    7. -

      Make every effort to stick to the JDK 1.1 API.

      - -

      One of the important advantages of log4j is its - compatibility with JDK 1.1.x. -

      -
    8. - -
    9. -

      Always keep it simple, small and fast when - possible.

      - -

      It's all about the application not about logging.

      -
    10. - -
    11. -

      Identify yourself as a contributor at the top of the - relevant file. -

      -
    12. -
    13. -

      Take responsibility for your code.

      - -

      Authoring software is very much like running a marathon. It - takes time and endurance. -

      -
    14. -
    15. -

      Did we mention sticking with the indentation style?

      -
    16. -
    17. Did we mention writing test cases?

      -
    18. - -
    - - - -

    Log4j uses velocity-anakia - to generate its web-site, including this FAQ. We have devised - special macros to help us automatically generate labeled - question/answer pairs. -

    - -

    If you are not a commiter, you can simply submit your new - question/answer pair to the log4j-dev@logging.apache.org - mailing list. The committers will take it from there. -

    - -

    If you are a committer, then you must edit the - /src/xdocs/faq.xml file. The format of the file - should be self-evident. After you have made your changes, run - the command -

    -
    ant site
    - -

    After the appropriate transformation, your changes should - appear in the file /docs/faq.html. -

    - - - - - -
    - Copyright © 1999-2005, Apache Software Foundation -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt deleted file mode 100644 index 5cf719ef14..0000000000 --- a/docs/HISTORY.txt +++ /dev/null @@ -1,1833 +0,0 @@ - - - [*] Changes that are 100% compatible with existing client code. - [**] Changes that requiring little or no modification to existing - client code. - [***] Changes requiring important modifications to existing client code. - - TBD, 2007 - - - Release of version 1.2.15 - - SyslogAppender: Added "header" property which if set to true will cause the appender - to produce the HEADER part (timestamp and hostname) of the syslog packet. - Default value is false for compatibility with previous behavior. The - SyslogAppender also now sends any header from the associated - layout when activateOptions is called or first logging event is sent and - any footer when the appender is closed. - - NTEventLogAppender: Updated NTEventLogAppender.dll which corrects missing event messages - and which should work with earlier releases of log4j. - NTEventLogAppender.dll also now supports registration and unregistration - using regsvr32. If replacing an existing copy of NTEventLogAppender, - use "regsvr32 NTDllEventLogAppender.dll" or manually remove the - HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J - registry key. - - - Fixed following bugs: - 40944: PropertyConfigurator.configure(URL) does not close resource stream. - 40937: In Turkish locale level "info" is not equivalent to "INFO" - 41339: Javadoc of PatternLayout should use %n in TTCC layout examples - 41219: Stacktraces of exceptions disappear occassionally - 38680: Incorrect message when specified custom level class does not implement toLevel - 37282: SyslogAppender leaks descriptors - 41040: SyslogAppender should prefix message with TIMESTAMP and local hostname - 40502: SyslogAppender assumes all lines start with tab - 41169: NTEventLogAppender.dll :: "missing" event description - 41487: Warning when configuring inner-class logger - 41186: AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts - 37864: Add target to generate binary and source compatibility report - 41708: PropertyPrinter.printOptions breaking signature change in log4j 1.2.9 - 41735: RollingFileAppender may delete files during rollover - 33708: XMLConfiguration of loggerFactory does not work - 42087: SyslogAppender does not limit packet size to 1024 bytes - - - September 18th, 2006 - - - Release of version 1.2.14 - - - Rewrite of AsyncAppender to eliminate reported deadlocks (bugs 26224, 28006, 37904, 38137), - and to add an option to not block if the event queue becomes full (bug 38982). - - - Added support for specifying a port for SyslogAppender (bug 39687). - - - Added cc and bcc addresses to SMTPAppender (bug 19125) and password authentication (bug 24969). - - - Fixed following bugs: - 40159: NullPointerException in org.apache.log4j.NDC.get. - 36787: org.apache.log4j.lf5.util.DateFormatManager.setTimeZone assignment error. - 38559: Monthly logs not generated at midnight with DailyRollingFileAppender. - 40145: PatternLayout specifier %r is not consistent with documentation. - 37119: Space after log level causes default level to be used. - 39135: Bad patterns in ISO8601DateFormat and DateTimeDateFormat. - 35743: SyslogAppender throws NullPointerException upon misconfiguration. - 15501: FallbackErrorHandler throws NullPointerException if no loggers are set. - 38564: Bad documentation for WriterAppender.encoding. - 37866: NTEventLogAppender not build, tested and placed in distribution. - 38662: SMTPAppender does not output newlines between stack trace lines. - 30294: SMTPAppender will not run within sandbox. - 16922: MDC with SMTPAppender doesn't work. - 31507: Misspelling in HierarchyDynamicMBean. - 35123: Additivity not exported by PropertyPrinter. - 31003: RollingFileAppender, if removed, can cause NullPointerExceptions. - 23021: AsyncAppender blocks on thread death. - 40412: NOTICE file added to distribution and jars. - 40378: Chainsaw of log4j 1.2 does not show TRACE level. - 40501: TRACE level missing in short introduction to log4j. - 37960: Update site generation to velocity 1.4 and remove dependency on logging/site project. - - - December 4th, 2005 - - - Release of version 1.2.13 - - - Fixed bug 36800. Location related info now emitted for TRACE level log - messages. [*] - - - Fixed bug 37122. Console appender now behaves as before to fix - compatibility problem with JBoss introduced in 1.2.12 release due to fix - for bug 31056. Can still be configured to detect changes in the System.out - and System.err streams as needed by setting the follow property. [*] - - August 29th, 2005 - - - Release of version 1.2.12 - - - Fixed bug 36262 by removing final qualifiers on member variables - in org.apache.log4j.chainsaw.LoggingReceiver which would cause - spurious compiler errors with JDK 1.1 and 1.2 javac compilers. - - - Fixed bug 36267 by adding a jndi.jar property to the build.xml. - - - Fixed bug 37268 by adding "release" target to build.xml. - - - Fixed bug 36213 by removing references to obsolete documentation. - - - Fixed bug 35965 by adding protected accessors for member variables - topicConnection, topicSession, and topicPublisher. [*] - - - Fixed bug 34026, SyslogAppender now checks Layout.ignoresThrowable() just - like every other appender. [*] - - - Fixed bug 35947 whereby DOMConfigurator would call LogLog.error to report - XML validation errors that caused no problems in the interpretation of the - configuration file. [*] - - - Fixed Bugzilla 14551 and its duplicates by fixing the JavaDoc links - for the XML sample files. - http://issues.apache.org/bugzilla/show_bug.cgi?id=14551 [*] - - - Added getNext/setNext methods to org.apache.log4j.spi.Filter and deprecated - public "next" field. This mirrors the same change in the upcoming 1.3 - version and, hence, provides a migration path. [*] - - - Added o.a.log4j.Logger.trace(), o.a.log4j.Logger.isTraceEnabled() and - o.a.log4j.Level.TRACE per bug 35711. [*] - - - Implemented serialization for Level per bug 34758. [*] - - - Fixed bug 31056 whereby o.a.log4j.ConsoleAppender would ignore redirections - of System.out and System.err that occurred after configuration. [*] - - - Fixed bug 23705 whereby o.a.log4j.xml.DOMConfigurator would not properly - interpret relative path names in external entity declarations. [*] - - - Fixed bug 35691 whereby o.a.log4j.xml.XmlLayout would not properly escape - class names that contained '<' or '>'. [*] - - - Fixed bug 35052 whereby use of String.intern() in o.a.log4j.CategoryKey - would cause application to slow down. [*] - - - Fixed bug 9150 whereby o.a.log4j.FileAppender would not create log file - if parent directory did not exist. [*] - - - Fixed bug 23021 whereby o.a.log4j.AsycnAppender would deadlock if a - unchecked exception occurred in the attached appender causing the - dispatch thread to die. [*] - - - Added jdiff target to build.xml (bug 35516). [*] - - - Fixed bug 35831 whereby log4j would not build with a JDK 1.5 javac. [*] - - - Fixed bug 35893 by adding log4j 1.1 compatibility method - to o.a.l.helpers.Loader. [*] - - - Fixed bug 34981 dealing with additional null terminating character in Windows - nteventlog.cpp code. No effect on Java related code. [*] - - - Fixed bug 36332, broken links to J2SE classes in javadocs. [*] - - June 18th, 2005 - - - Release of version 1.2.11 - - - Fixed bug #34491 whereby the class o.a.log4j.or.jms.MessageRenderer - would not be compiled in the build.jms target. Bug reported by Andy - McBride. http://issues.apache.org/bugzilla/show_bug.cgi?id=34491 [*] - - April 28th, 2005 - - - Release of version 1.2.10 - - - Version 1.2.10 was not released following the accepted rules and process of - the log4j project and Logging Services Project and was recalled and removed. - Please do not use version 1.2.10, it is not an official log4j release. - - November 1st, 2004 - - - Release of version 1.2.9 - - Log4j version 1.2.9, is identical to version 1.2.8, except that - several key methods have been deprecated in preparation for version - 1.3.0, the next major release of log4j. These changes are intended to - enforce the rule that client code should never refer to the Category - class directly, but use the Logger class instead. Similarly, client - code should not refer to the Priority class but to the Level class - instead. - - For a more detailed discussion, refer to the document entitled - preparing for log4j 1.3 at: - - http://www.qos.ch/logging/preparingFor13.jsp - - February 19th, 2003 - - - Release of version 1.2.8 - - - Fixed bug #11570 whereby XMLAppender would throw a - NullPointerException if the input message was null. Many thanks to - David Vandegrift for reporting the bug and to Hendrik Brummermann for - supplying the patch. [*] - - - Fixed bug #12366 whereby various versions of Xerces would not parse - log4j configuration scripts expressed in XML format. [*] - - - Fixed bug #14827. The "removes" buffer used in the flushBuffer() method - of JDBCAppender is now cleared, solving the memory leak. Thanks to John - Landers for reporting the bug and suggesting the fix. [*] - - - Fixed bug #15599. SocketAppender now honors ReconnectionDelay of 0. - Many thanks to Scott Schram for reporting the bug and providing the fix. [*] - - October 9th, 2002 - - - Release of version 1.2.7 - - - Log4j now searches for the file log4j.xml as well as the file - log4j.properties during log4j initialization. [*] - - July 31st, 2002 - - - Release of version 1.2.6 - - - Addition of new options in JMSAppender and new command line arguments in - JMSSink. [*] - - - Added new method getLoggerName() in LoggingEvent class. The - getLoggerName is the preferred way for accessing the logger - name. The public access categoryName field should not be accessed - directly. Similarly, added the getLevel method which is now the - preferred way of accessing the event's level. The public access - level field should not be accessed directly. The javadocs now mark - the categoryName and level fields as deprecated. - - Modified existing appenders to comply with these new directives. [*] - - - Log4j now will check if a system property named "log4j.ignoreTCL" - is set. If it is set, then it will ignore the Thread Context - ClassLoader when loading classes. This solves the irritating - "appender is not assignable to Appender" messages observed when - log4j.jar is loaded by multiple class loaders. - - The error reporting for this problem was also improved. [*] - - - Fixed bug #10528 whereby calling the MDC.get method with a null - argument would throw a NullPointerException. [*] - - July 5th, 2002 - - - Release of version 1.2.5 - - - Minor changes and bug fixes in LF5. [*] - - - Calling an AsyncAppender close method also closes the embedded - appender instances. This resolves bug #10185 submitted by Paul - Voutier. [*] - - June 12th, 2002 - - - Release of version 1.2.4 - - - The JDBCAppender is marked as slated for replacement. Do not build - critical software using it. - - - Added LF5 documentation and examples. Further tests are required - for full integration. [*] - - - XMLLayout can now output messages which contain embedded CDATA - sections. This resolves bug #9750. Many thanks to Michael - A. McAngus for supplying the relevant patch. [*] - - - The dispatcher thread associated with AsyncAppender is now marked - as a deamon thread. This resolves bug #9750. [*] - - - Added missing NTEventLogAppender.dll as reported in bug #9606. [*] - - - In response to bug report 9435, the log4j.dtd was changed so that - is now made of logger and level attributes instead of - category and priority. Changed XMLLayout to conform to the - DTD. Chainsaw was changed to adapt to the XMLLayout. [*] - - - Added missing LevelRangeFilter file. [*] - - May 24th, 2002 - - - Release of version 1.2.3 - - - Fixed bug #9285 where the SyslogAppender would incorrectly compute - the length of the datagram to send to the remote syslogd host. - Reported by Mamoru Kadota. [*] - - - Fixed bug #8505 where the stack trace of exception would not be - properly printed on the Compaq tru64 Unix platform. Initially - reported by Fabrice Claes and later by Espen H. Kolstad who also - provided the fix. [*] - - May 22nd, 2002 - - - Release of version 1.2.2 - - - Log4j configurators take the "NULL" string value as a synonym for - "INHERITED". Both of these two strings are legal level values for - setting the level of a logger. Both values are case insensitive. [*] - - - When loading component classes, log4j will now first attempt to use - the Thread Context Loader and if that fails, it will use - Class.forName. In log4j 1.2 and 1.2.1, only Class.forName was used - and the TCL was ignored. This change is a response to bug #9305 - opened by Scott M. Stark. [*] - - May 17th, 2002 - - - Release of version 1.2.1 - - - This minor release fixes bug #9155 reported by Nicko Cadell. - LoggingEvent.getMDCCopy() method now sets mdcCopyLookupRequired - instead of ndcLookupRequired. This bug would cause the wrong MDC - information to appear on a log server. It could only occur if the - client wrapped an AsyncAppender around a SocketAppender or if the - server used an AsyncAppender for its logging. [*] - - May, 2002 - - - Release of version 1.2 - - - Fixed bug #8527. A closed TelnetAppender would continue waiting - for connections even if its ServerSocket was closed. This caused - the TelnetSocket to sit in a loop and complain about the closed - socket. [*] - - - AsyncAppender throws NullPointerException problem. The bug was actually in - AppenderSkeleton. See bug #5444 details. [*] - - - Added support for recursive variable substiuton as requested by - Eric Chastan. [*] - - - SocketNode now used a BufferedInputStream as suggested by Kok Chong - in bug report #3933. [*] - - - Fixed a problem with DailiyRollingAppender which would not - correctly compute the rollover period in certain timezones. See bug - report #7550. [*] - - - Fixed documentation bug #2726 in FAQ.html. [*] - - - In WriterAppender, fixed bug #2383 by adding a flush statement in the - writeFooter method. [*] - - - In XMLLayout, Fixed bug #7550 by escaping the method attribute. The - XMLLayout also outputs each item of a stack trace in a separate - line. [*] - - - Fixed bug #5932 as suggested by Heikki Linnakangas. The - LoggingEvent.getMDCCopy method now clones the MDC instead of just - referencing it. [*] - - (rc1) - - - The ANT build script was modified to use jar files specified in - the build.properties file instead of the CLASSPATH environment - variable. The build.properties file depends on local paths and is - supplied by the user. The build.properties.sample file is included - in the distribution. The build.sh and build.bat scripts have - been removed. This is the way many other jakarta projects build their - projects. The jar files in the dist/lib directory were also removed - since they are no longer used. [*] - - - The DOMConfigurator now interprets the string after the '#' - character in the value attribute within the element as - the fully qualified class name of a custom Level. This is consistent - with the way log4j handles "level" values in other places. The - class attribute is still honored. [*] - - - Added Oliver Burn's chainsaw tool to the core log4j - distribution. Visualisation and dynamic filtering of log events is - bound to be a very important area of activity in the future. [*] - - - Added the org.apache.log4j.jdbc.JDBCAppender which as the name - indicates sends events to a database using the JDBC API. Thanks to - Kevin Steppe for supplying the code. [*] - - - Added SocketHubAppender class as contributed by Mark Womack. This - appender sends LoggingEvent objects to a set of remote a log - servers. [*] - - - In the Category class, the getChainedPriority method has been - replaced with getEffectiveLevel method. [*] - - (beta4) - - - Replaced the custom class loading based on the thread context class - loader with a simple Class.forName() call. This solves two allied - but distinct problems encountered when using Ant with JUnit - although the bug is more general. In one instance of the - problem, log4j would throw java.lang.NoClassDefFoundError for - org/apache/log4j/AppenderSkeleton where log4j.jar and related - classes were clearly available to the Ant classloader. In another - incarnation, log4j would reject a custom appender claiming that it is - not assignable to a org.apache.log4j.Appender variable. This would - occur when log4j.jar was available to both the Ant classloader and the - system classloader. - - Thanks to Dave Herman for providing detailed scenarios exposing - the issues involved. See - http://forum.java.sun.com/thread.jsp?forum=38&thread=70946 - http://forum.java.sun.com/thread.jsp?forum=38&thread=70946#479697 - http://marc.theaimsgroup.com/?l=ant-user&m=101139178705895&w=2 - for more details. [*] - - - (beta3) - - - Fixed the complaints the compiler issued when using the - Logger.setLevel() methd. [*] - - - Incorporated the performance enhancements to ISO8601DateFormat and - AbsoluteTimeDateFormat classes submitted by Andrew Vajoczki. - - (beta2) - - - Source code written for log4j 1.1.3.jar will compile fine with - log4j 1.2X. However, code compiled for log4j 1.1.3 would previously - systematically throw "java.lang.NoSuchMethodError" runtime exceptions - when run with log4j 1.2 - prior to beta2. This problem has been - corrected in beta2. Pheew, that was a close one. [*] - - - Log4j 1.2 is now backward compatible in serialization of - LoggingEvents. For example, a 1.1.3 SocketAppedner can write to 1.2 - SocketServer. Similarly a 1.2 JMSAppender will work with 1.1.3 - JMSSink. This should ease the move to log4j 1.2, especially in - large deployments. [*] - - (alpha7) - - - The src/java/org/apache/log4j/examples/ directory moved under the - top-level directory as examples/. [*] - - - Fixed the ArrayIndexOutOfBoundsException that was thrown by - AsyncAppender if multiple threads were trying to log an event - containing an exception near simultaneously. Thanks to Thomas Tuft Muller - for reporting this bug. [*] - - (alpha1-alpha6) - - - Improved error reporting in DOMConfigurator. Thanks to Thomas Tuft - Muller for contributing the enhancement. [*] - - - Log4j is now configurable using JMX. JMX support is not of - production quality. [*] - - - Added support for different encodings in WriterAppender. Thanks to - Ben Sandee for submitting the relevant patch. [*] - - - Modified SMTPAppender to allow multiple email sessions. Thanks to - Jon Skeet for supplying the relevant patch. [*] - - - The CategoryFactory class has been replaced by the LoggerFactory - class. The makeNewCategoryInstance method has been renamed as - makeNewLoggerInstance. This change requires subclasses of Category - classes to be modified and recompiled. [**] - - - The Level class replaced the Priority class. Priority class now - extends Level to preserve backward compatibility. [*] - - - The Logger class replaced the Category class. Logger class - extends Category to preserve backward compatibility. We proudly - mark this change with a single star for 100% compatibility. [*] - - - The Category.assert method has been replaced by - Category.assertLog. This change was necessary because assert is a - language reserved word in JDK 1.4. [*/**] - - - Removed deprecated methods setOptions and getOptionStrings defined - in the org.apache.log4j.spi.OptionHandler interface. This interface - is implemented by most log4j appenders and layouts. In particular, - all appenders and layouts shipped with log4j contain these - deprecated methods. They have become totally redundant after we - moved to JavaBeans style configuration in log4j 1.1. [**] - - - The disable(Level) methods in Hierarchy have been removed and been - replaced by threshold methods. [**] - - - Added buffered IO capability to FileAppender and subclasses. [*] - - - The location information (or stack information) was not correctly - transmitted by JMSAppender. [*] - - - Added event reporting capability to the Hierarchy class. - - - Added new system property "log4j.configuratorClass". This property - allows the user to specify the custom configurator at the default - initialization phase. This property replaces the previous - interpretation of the reference part of "log4j.configuration" - as the custom configurator class. This interpretation was sometimes - erroneous and caused headaches. [*] - - - Introduced the Mapped Diagnostic Context or MDC class. This class - is similar to the NDC except that the diagnostic context is based - on a map instead of a stack. Moreover the MDC is automatically - inherited by child threads under JDK 1.2 and above. [*] - - - Corrected a performance bug in the NDC class as observed by Dan - Milstein and independently by Ray Millard. [*] - - - Removed deprecated methods disable(Priority), disableAll, - disableDebug, disableInfo and enableAll in BasicConfigurator. [*] - - - Added supports java.io.Reader objects in the method doConfigure(), - instead of only InputStream. Thanks to Mark Womack for submitting - the relevant patch. [*] - - - Corrected the restart bug in DayliRollingFileAppender. Thanks to - Jim Moore for supplying the relevant patch. [*] - - June 19, 2001 - - - Release of version 1.1.3 - - - Added a missing namespace declaration in the log4j:configuration - element in log4j.dtd. The missing declaration caused the new - generation of namespace aware parsers to barf when parsing log4j - configuration files. [*] - - - Reduced the size of log4j-core.jar to 78KB. [*] - - - Minor documentation changes. [*] - - June 7, 2001 - - - Release of version 1.1.2 - - - Corrected a problem with the static initializer of the Category - class which would use the wrong class loader to search for the - default configuration file. The associated search algorithm has - been also simplified. Nevertheless, the preferred method to specify - the automatic configuration file is by setting the - log4j.configuration system property. [*] - - - Documentation improvements. Added a new section to the manual - explaining the default initialization procedure [*] - - - Enhancements to the org.apache.log4j.examples.appserver package. [*] - - - Corrected a bug in the way the NTEventLogAppender printed - exceptions. [*] - - May 20, 2001 - - - Release of version 1.1.1. - - - Added missing custom priority support in PropertyConfigurator. [*] - - - Made a number of fields protected instead of default access in - SMTPAppender. [*] - - May 19, 2001 - - - Release of version 1.1. - - - This release has the same code as 1.1b7. It differs only in a few minor - documentation changes. - - May 9, 2001 - - - Release of version 1.1b7 - - - Made BasicConfigurator disable methods static as they were in log4j - 1.0.4. Thanks to Francisco Marin for reporting the bug. [*] - - - Corrected a two related deadlock problems introduced while fixing - bug 1505. Thanks to joelr@viair.com for reporting the problem. [*] - - - The configureAndWatch methods in Configurators did not close the - configuration file, preventing its editing. See bug 1686. [*] - - - In DOMConfigurator.setParameter special character conversion now - precedes variable substitution. This change was suggested by Steven - Velez. The vast majority of users should be oblivious to it. [*] - - - The TextPaneAppender is no longer maintained and has been - removed. It is still available under the contribs/ - directory. This change has been discussed in the log4j mailing - lists and no one objected to the removal of the TextPaneAppender - class. - - April 26, 2001 - - - Release of version 1.1b6 - - - Aaron Greenhouse from Carnegie Mellon SCS found a series of - multi-threading related bugs in Category and AsyncAppender. See bug - ids 1505 and 1507 in our bug database for exemplary bug - reports. They are worth the detour. [*] - - - InvalidJarIndexException is only available in JDK 1.3. Referring - to this exception type caused log4j 1.1b5 to break on earlier JDKs. - We now avoid referring to it. [*] - - - Added PriorityRangeFilter by Simon Kitching. See the Threshold - option in AppenderSkeleton for a more convenient alternative. [*] - - April 22, 2001 - - - Release of version 1.1b5 - - - In HTMLLayout, the Title option sets the HTML document - title (...<title>). [*] - - - Corrected an important performance bug in LocationInfo. Hein Couwet - and kr@it-practice.dk have independently identified the bug. This is - yet another example of the difference made by the number of eyeballs - studying source code. [*] - - - Corrected the incorrect value returned by LocationInfo.getClassName - method when running under IBM Visual Age. Thanks to Mathias - Rupprecht for supplying the relevant patch. [*] - - - Corrected a bug where the build.sh file in the distribution would be in - DOS CRLF format. Thanks to ma.darche@free.fr for reporting the - problem. [*] - - - Corrected InvalidJarIndexException thrown in applets while - searching for the default log4j configuration file. Thanks to - Michael Lundahl for reporting this bug. [*] - - - Added missing PropertySetterException class to log4j-core.jar. - Thanks to ma.darche@free.fr for reporting this bug. [*] - - April 20, 2001 - - - Release of version 1.1b4 - - - Mathias Bogaert observed that in version 1.1b3 the search algorithm - for the resource used in automatic log4j configuration was - different than in 1.0.x. Beta4 uses a more powerful mechanism which - is also compatible with 1.0.x. [*] - - - Paul Glezen correctly observed that if log4j is deployed in a - client/server mode where multiple log4j clients log to a log4j - server, all hosts must be upgraded to version 1.1 in one go because - the internal LoggingEvent class used in client/server communication - changed in log4j 1.1. - - April 18, 2001 - - - Release of version 1.1b3 - - - Added a RollingFileAppenderBeanInfo class that fakes the - maxFileSize JavaBeans property as a String type instead of a long. - This allows us to resuscitate setMaxFileSize(long) method that was - removed in 1.1b2 breaking 100% backward compatibility. This addition - restores 100% backward compatibility. [*] - - April 18, 2001 - - - Release of version 1.1b2 - - - The directory structure has changed to better suit Jakarta - conventions as follows: - - org/** --> src/java/org/** - xdocs/** --> src/xdocs/** - - If you have a CVS checked out copy of log4j be sure to check out a - fresh copy. [*] - - - Added a few jar files required at build time to build/lib so that - it is now possible to compile log4j out of the box. [*] - - - Whenever a priority parameter is expected in a configuration file, - one can now use a custom priority class. See OptionConverter.toPriority - method for more information. Note that the <priority> element in - log4j.dtd remains unaffected by this change. [*] - - - Added the setQuietMode(boolean) method to LogLog. In quiet mode - LogLog will not output anything even in case of errors. [*] - - - Log4j components are now configured as JavaBeans. The setOption and - getOptionString methods have been deprecated in OptionHandler - interface which is implemented by most log4j components. [*] - - - The stack trace of a throwable passed in a logging statement is not - parsed into a stack array which is serializable. This allows cascading of - log4j servers to properly propagate throwable information. [*] - - - In XML configuration files, the <configuration> element has been - deprecated and was replaced by the <log4j:configuration> element. [*] - - The following perl command can help to migrate: - - perl -p -i.bak -e "s/configuration/log4j:configuration/;" file1.xml .. fileN.xml - - - The "log4j.configDebug" system property has been replaced with the - "log4j.debug" system property although it is still available. - Similarly, the "configDebug" attribute has been deprecated and - replaced with the "debug" attribute in log4j.dtd. [*] - - - February 23, 2001 - - - Release of version 1.1b1 - - - Logging can now be disabled per Hierarchy. It can also be disabled - using configuration files using the "disable" directive. The - "disableOverride" directive takes precedence over the "disable" - directive. As a result of this change the disable family of - methods in BasicConfigurator has been deprecated and replaced by the same - family of methods in the Hierarchy class. [*] - - - The FileAppender has been split into three parts: WriterAppender, - ConsoleAppender and FileAppender. ConsoleAppender takes over the - console logging functionality of FileAppender. As a result support - for stream and console printing has been deprecated in FileAppender. [**] - - - The FileAppender now correctly outputs the header and footer of its - layout. This problem was reported by too many users to list here. [*] - - - Appenders and Layouts now get to see the raw message object in - LoggingEvent not just its rendered form. The access modifiers of - some LoggingEvent fields were changed so that they can be accessed - in less error-prone ways. Thanks to Jim Cakalic and Anders Kristens - for their valuable advice. [*] - - - Added getLayout(), getErrorHandler(), and getFilter() to the - Appender interface. [*] - - - Added getOption(key) method to the OptionHandler interface and modified - implementations of it as appropriate. [*] - - - Added the much awaited DailyRollingFileAppender. [*] - - - The structure of the distribution changed somewhat. The log4j.jar - files can be found under dist/. The javadoc directory has been - moved to docs/api/. We are now totally dependent on ANT to perform - all the steps involved in creating a release, including - compilation, jar file creation, generation of the javadocs, and for - the creation of the distribution tar and zip files. [*] - - - Removed org/apache/log4j/varia/ResilientFileAppender.java which was - bogus to begin with. [*] - - - XMLLayout will now mark some output as <![CDATA[ .. ]]> so that it - does not get interpreted by the XML parser. This was suggested by - Mathias Bogaert like a long list of other fixes. [*] - - - Corrected a bug in CyclicBuffer.resize method that would not update the - next insertion point. Thanks to Ole Bulbuk for accurately reporting - the bug. [*] - - - The LoggingEvent class now supports serialization of priorities - derived from the org.apache.log4j.Priority class. [*] - - - Improved the search method for finding the "log4j.properties" file in - the static initializer of Category class. Thanks to Calvin Chan for - supplying a better method. [*] - - - The code handling the FCQN (formerly instanceFQN) parameter was - cleaned up. There is now a well-established and simple manner for - sub-classes of Category (or wrapper classes) to define the FCQN - variable: just define a static variable, say FCQN, consisting of - the fully qualified class name of the subclass or wrapper, supply - this variable as an argument to forcedLog method if and when - the sub-class or wrapper invokes that method. [*] - - - Made the instanceFCQN an instance variable instead of a class - static in Category.java. In related move, the Category constructor - now takes an additional argument setting the instanceFCQN. This - makes life less miserable for Category subclasses. [*] - - - Corrected a bug in the OptionConverter.instantiateByClassName - method that would not return the defaultValue in case of error. Thanks - to Matthieu Verbert for identifying this bug. - - - Corrected the missing stack trace in e-mails generated by the - SMTPAppender when using certain Layouts. [*] - - - Updated the "Adding Conversion Characters to PatternLayout" - document to reflect the latest changes to the code. Also added the - org/apache/log4j/examples/appserver directory containing the - associated example code. [*] - - - Added the BufferSize option to the AsyncAppender. [*] - - - Eliminated the SecurityExceptions thrown in Applets. Thanks Timur - Zambalayev for reporting this bug. [*] - - - Fixed the erroneously thrown IOInterruptedException when the AsyncAppender - was closed. Thanks to Tom Palmer for accurately reporting this bug. [*] - - January 12th, 2001 - - - Release of version 1.0.4 (the 20th major release) - - - Corrected a serious bug in Hierarchy.java that would cause a - NullPointerException depending on the order of instantiation of - categories. Thanks to Wolfram Gewohn for reporting this bug. [*] - - - Corrected a bug in the getOptionsStrings method of SMTPAppender - that omitted to mention the EvaluatorClass option. Thanks to Mark - Balster for reporting this bug. [*] - - January 11th, 2001 - - - Release of version 1.0.3 (the 20th major release) - - - Fixed a NullPointerException occurring in AsyncAppender after - invoking Category.shutdown. Thanks to Frank-Olaf Lohmann for - reporting this bug. [*] - - - Modified the OptionConverter.selectAndConfigure method to take an - extra argument of type Hierarchy. This method is used internally - and should not affect most users. [*/**] - - - Added the warn method to LogLog which is used internally by log4j - to report on itself. [*] - - - Displaced a number of HTML files under the docs directory. The new - structure is compatible with the jakarta site and results in a - more consistent navigation experience. [*] - - - Made a few improvements in the javadocs. [*] - - January 11th, 2001 - - - Release of version 1.0.2 (the 20th major release) - - - Added the missing build.inc file to the distribution. No code - changed. - - January 10th, 2001 - - - Release of version 1.0.1 (the 20th major release) - - - This version corrects some documentation and build script bugs; - code has not changed. - - January 8th, 2001 - - - Release of version 1.0 (the 20th major release) - - - Package hierarchy now starts at org.apache.log4j. [***] - - The following perl command can help in the transition: - - > perl -p -i.bak -e "s/org.log4j/org.apache.log4j/;" file1.java .. fileN.java - - - Added the fatal() family of methods to the Category - class. Moreover, the EMERG priority has been removed from the - Priority class. This priority has been replaced by the FATAL - priority that is more widely accepted. This change will - require EMERG log statements to be replaced by FATAL log - statements. Assuming EMERG log statements are rare, this should - have a small but bearable impact on existing client code. - - Moreover, the Unix Syslog priorities ALERT, CRIT and NOTICE are no - longer recognized. Support for these priorities was minimal and - few users should suffer from these changes. [**] - - - Removed the methods setRootPriority, getRootPriority as these - methods were redundant and had been previously deprecated. [**] - - - Removed the DOM Level 2 dependency in DOMConfigurator. This makes - log4j XML configurable using Sun's parser or Apache's Xerces. [*] - - - The static initializer of the Category class now takes the - log4j.configuration system property to search for its configuration - file. The type of the configurator used to parse the configuration - file depends on the value of the log4j.configuration system - property. [*] - - - Enhanced the PropertyConfigurator and DOMConfigurator to support - customisation of independent Hierarchy instances. The - org.apache.log4j.net.SocketServer has been enhanced to take - advantage of this functionality. The old code of SocketServer has - been moved to SimpleSocketServer. [**] - - - Enhanced the PropertyConfigurator to support variable substitution - for all options *values* (but not keys!). [*] - - - Categories are now aware of the Hierarchy they are linked to. This - will provide a basis for several performance enhancements planned - for the future. [*] - - - Added support for object rendering. It is now possible to register - an object renderer for a given object type. When the given object - needs to be logged log4j will invoke the corresponding renderer to - transform the object into a String. - - As a result of this enhancement, all the String forms of all the - printing methods such as debug(String), info(String) have been - removed as they are no longer necessary. This change should be - backward compatible but requires recompilation of old client - code. Thanks to Michael Smith for noting the recompilation - requirement. [**] - - - Added support for user defined category factories in the - PropertyConfigurator. Thus, it is now possible to configure log4j - with a properties file and still use custom Category - sub-classes. The DOMConfigurator had already a finer grain - support. [*] - - - Added the SMTPAppender that in case of an error or fatal event - sends an e-mail containing latest N logging events in its buffer, - where N is chosen by the user. [*] - - - Added the method getInstance(Class) to the Category class. [*] - - - Corrected a bug in configureAndWatch method of configurators that - would configure log4j only after an unnecessary delay. [*] - - November 30, 2000 - - - Release of version 0.9.1 (the 19th public release) - - - Corrected a typo making NTEventLogAppender.dll register the wrong - category message file. Thanks to Peter Hayes for accurately - reporting this bug. [*] - - - The DOMConfigurator and PropertyConfigurator can now automatically - detect modified configuration files and re-read them. [*] - - - Added AsyncAppender which buffers log requests and serves them - at a later time. AsyncAppender can increase logging performance - tremendously if logging operations are interspersed with long - and blocking non CPU-intensive operations, typically I/O or network - access. For CPU intensive applications, using the AsyncAppender - will actualy degrade logging performance by 10 to 25 percent. [*] - - - The log4j.dtd has been modified to allow appenders to refer to - other appenders by IDREF. [*] - - - The DOMConfigurator has been modified to take advantage of ID/IDREF - attributes when referring to appenders. This change requires a - DOM Level-2 API compliant parser. DOM Level-2 java bindings are - available at - http://www.w3.org/TR/1999/WD-DOM-Level-2-19990923/java-binding.html. - - - Added the configure(String filename) method to DOMConfigurator. - This method requires the presence of a JAXP compatible parser. - - At this time, the only DOM2 and JAXP compatible parser seems to be - the Apache xerces parser. - - - Added the PriorityMatchFilter allowing filtering by exact priority - match. This was a common request by users. [*] - - - The configuration of a category is now an atomic operation. This - ensures that log requests are not lost while configuration is in - progress. Anders Kristensen was to first to observe the potential - problems in non-atomic configurations. [*] - - November 20th, 2000 - - - Release of version 0.9.0 (the 18th public release) - - - The "log4j" element has been renamed to "configuration" in the - log4j DTD. This change requires that log4j configuration files - written in XML be modified. Since the log4j element figures only - once in the XML file, this change should take little time. [**] - - - ResourceBundles are now category instance specific and no longer - class static. Moreover, like other properties resource bundles - are inherited from the category hierarchy. [**] - - - The jar files log4j.jar and log4j-full.jar now contain versioning - information in their respective manifest files. [*] - - - Corrected an inconsistency in the NTEventLogAppender which broke it. - - - Fixed a bug where configuration files were not parsed correctely - due to trailing spaces in option values as returned by - java.util.Properties. Trailing spaces are now removed from option - values. This bug was quite disconcerting because the - trailing spaces cannot be seen without careful examination of the - configuration file. [*] - - - Added the XMLLayout. - - The output of the XMLLayout consists of a series of log4j:event - elements. It does not output a complete XML file. The output is designed to - be included as an external entity to form a well-formed XML file. [*] - - - Added a new abstract class org.log4j.helpers.DateLayout. The TTCCLayout - now extends DateLayout. [*] - - - Corrected a rather subtle performance bug in the buffer management code - in PatternLayout. Thanks to Vladislav Dutov and Constantine - A. Plotnikov for for insisting on the correction of this bug. [*] - - - Created a new package called org.log4j.spi. This new package - holds classes that are hidden from the casual user but are needed - to extend log4j. [*] - - - Added org.log4j.varia.ExternallyRolledFileAppender to handle - externally triggered file rollovers. [*] - - - Added support for multiple hierarchy trees. [*] - - - PatternLayout can now be subclassed to support new conversion - patterns. [*] - - - Extended the DOMConfigurator and the log4j DTD to properly handle - sub-classing of Category and Priority classes. - - There have been also minor adjustments to other classes to handle - sub-classing. These changes should be invisible to users. - - All categories except the root category can be sub-classed and also - assigned priorities sub-classing org.log4j.Priority. - - The root category always exists and CANNOT be subclassed. - - The ProppertyConfigurator remains unchanged. Thus, it does not - handle extensions of the Category class. [*] - - - Added filter support in appenders. The DOMConfigurator and the - log4j.dtd have been enhanced to support filters. [*] - - - Added error handling support to appenders. The DOMConfigurator and the - log4j.dtd have been enhanced to support filters. [*] - - - Added support for correct interpretation of location information in - IBM's Visual Age environment. Thanks to Wolf Siberski for supplying - the relevant patch. [*] - - - Added getAdditivity method to Category. This feature was requested - by Constantin Mitran. (mitran at ecircle.de) [*] - - August 27, 2000 - - - Release of version 0.8.5b. - - - Corrected multiple bugs in default initialization code of - Category class. Thanks to Jeff Turner for identifying and supplying - corrective patches. [*] - - August 24, 2000 - - - Release of version 0.8.5a. - - - Added the %n conversion character to PatternLayout so that a line - separator can be specified in a platform independent way. [*] - - - In 0.8.5 internal Priority integer values were decoupled from the - Unix Syslog values. This broke SyslogAppedder. A new function - Priority.toSyslogInt is introduced to solve this bug. [*] - -Corrected a bug where the internal prtar tzvf iority integer - - August 23, 2000 - - - Release of version 0.8.5. - - - All log4j internal output is now prepended with the string - "log4j: ". This makes is easier to differentiate log4j internal - logs from messages output by other sources. [*] - - - Sub-classes of Category class must now specify their fully - qualified name when constructing logging events. This allows the %C - conversion specifier in PatternLayout to work properly even with - sub-classes or wrappers of Category. [*] - - - Added the method disableDebug to BasicConfigurator. This method - disables all print requests of debug priority regardless its - category. Similar methods disableInfo, disable, disableAll and - enableAll have also been added. Disable type methods can be - overriden by setting the log4j.disableOverride system property. - - Calling BasicConfigurator.disableInfo is equivalent to the now - deprecated flagAsShippedCode method. [*] - - - Given the above changes, the system property - log4j.shippedCodeFlagOverride is no longer honored. [**] - - - It is now possible to sub-class Category. The sub-classes may - continue to adhere to the category hierarchy. This was a frequently - requested feature. [*] - - - Corrected a problem with the additivity flag being ignored in - categories without appenders. This bug was discovered by Anders - Kristensen. [*] - - - Added a method BasicConfigurator.resetConfiguration to reset the - log4j environment. This method should be used sparingly. [*] - - - At the initialization of the Category class, the file - log4j.properties will now be searched from the search path used to - load classes. If the file can be found, then it is fed to the - PropertyConfigurator.configure(java.net.URL) method. [*] - - - Failing to access system properties within the static initializer - of BasicConfigurator class is no longer reported as an error but as - a debug message. Thanks to Gilles Schlienger for reporting this - problem with applets. [*] - - - Corrected a bug which caused infinite loops when using conversion - patterns with a single element, fortunately under very rare - circumstances. This bug was first reported by Igor Potraev, the - author of log4p. It was independently reported by Joe Haberl from - IBM Global Services. [*] - - - Added a mechanism to lazily remove references to dead threads in - the NDC class. Indeed, in previous versions calling NDC.pop within - a thread but forgetting to call to NDC.remove before exiting (that - thread) resulted in a memory leak. [*] - - - Corrected a huge memory leak in SocketAppender. This leak was due - to the ObjectOutputStream indefinitely holding a reference for each - written to the stream. Thanks to Dan MacDonald for very accurately - describing this bug. [*] - - - The log and l7dlog methods in Category no longer ignore the shipped - code flag. This bug was reported by Mario Schomburg. [*] - - - Added missing NDC information to LoggingEvent.writeObject - method. [*] - - - Corrected handling of SocketException in SocketNode. Thanks to - Gerald Gutierez (ggutierez@emobiledata.com) for reporting this and - the previous problem. [*] - - - Phased out custom shell scripts to build java documentation and jar - files in favor of Jakarta's ANT. It was becoming a nuisance to keep - the ANT build file in sync with the custom shell scripts. [*] - - - May 11, 2000 - - - Release of version 0.8.4d. - - - The NT EventViewer no longer complains about missing message 4096. - - - Minor corrections in documentation. - - - Added missing icons GIFs into the distribution. - - - SocketNode now attempts to close the socket when exiting. Thanks to - Moses Hohman (mmhohman@rainbow.uchicago.edu) for noting this. - - - Removed the com.ibm.log4j from the javadoc directory. This seems to - confuse VAJ. Thanks to Steve Ashcroft for reporting this problem. - - May 5, 2000 - - - Release of version 0.8.4c. - - - As a result of the infinite loop problem (see next item), added - over 800 new test cases to stress-test the code in CategoryFactory - class where category creation occurs. [*] - - - Under certain rare circumstances the Category.getInstance method - entered an infinite loop. Thanks to Mario Schomburg from IBM Global - Services / Hannover for identifying this problem and proposing a - patch. [*] - - - DOMConfigurator and the log4j.dtd were out of sync on the type of - the priority directive. As a result, priority directives all - defaulted to DEBUG. Thanks to Peter (petervt@users.sourceforge.net) - for accurately reporting this bug. [*] - - - Minor additions to the FAQ. [*] - - - Added the NumberCruncher example showing how the NDC class can be - used to distinguish output from different clients. [*] - - - Added the %x conversion specifier to the TTCC_CONVERSION_PATTERN in - the PatternLayout class. This is consistent expected output of - Trivial.java example. Thanks to Jerome (schrom@users.sourceforge.net) - for reporting this bug. [*] - - May 3, 2000 - - - Release of version 0.8.4b. - - - The value of the additivity option would not be parsed properly by - the ProperytConfigurator if the line containing the option - contained trailing spaces. [*] - - - Release of version 0.8.4a. - - - The localized logging methods (l7dlog) omitted priority based - evaluation and erroneously logged all requests. [*] - - May 1, 2000 - - - Release of version 0.8.4. - - - The close method was added to the Appender interface allowing - appender implementations to release any resources they may have - allocated. [*] - - - The package naming scheme of changed from "com.ibm.log4j.*" to - "org.log4j.*". The new naming reflects the open source nature of - the project and is consistent with the URL http://www.log4j.org. [***] - - - Added internationalization support. See the newly introduced l7dlog - methods in Category class. [*] - - - In the FileAppender, the File option now admits variable - substitution. For example, if "java.home" system property is set - to /home/xyz and the File option is given the value - "%{java.home}/test.log", then File option will be interpreted as - "/home/xyz/test.log". - - Thanks to Avy Sharell (sharell@online.fr) for contributing this - feature. [*] - - - SocketAppender is now officially part of the package. It is capable - of sending logging events to a remote SocketNode. The SocketNode - logs events according to server (local) policy. For example, a - client can log events to a local file and also send them to a - remote server (a SocketNode). This server can log the event to any - number of files, to the console, to any number of TextPaneAppenders - and even re-transmit the event to another server, and so forth. - - This paradigm is common in most logging systems, e.g. Syslog and NT - Event Log. Many thanks to Andrew Harrison for showing a way to - actually implement the paradigm. [*] - - - The Category.callAppenders method now accepts a LoggingEvent - instead of creating one itself. This was necessary to accommodate - events generated at a remote client. [*] - - - LoggingEvent class changed slightly to support remote logging. The - category field (a Category) has been replaced by the categoryName - field (a String). [*] - - April 14, 2000 - - Release of version 0.8.3b - - - Corrected a bug in Category.removeAppender(String) which would - never remove the desired appender. Thanks to Moses Hohman for - reporting this bug. - - Release of version 0.8.3a - - - Corrected a bug RollingFileAppender which would throw an uncaught - exception in case output file could not be opened for - writing. Thanks to Vinay Aggarwal for signaling this problem. - - April 13, 2000 - - - Release of version 0.8.3. - - - The log4j.override key defined in BasicConfigurator has been - renamed to log4j.shippedCodeFlagOverride. [**] - - - The getCurrentCategories method in the Category class would not - return the correct value. Thanks to Timothy Potter - (tpotter@agency.com) for reporting this problem. [*] - - - Appenders now admit a priority threshold as an option. All requests - with a priority lower than the appender's threshold priority are - ignored by the appender. [*] - - - Integrated Christopher Taylor's DOMConfigurator parsing XML - configuration files. [*] - - - The jar file log4j-net.jar has been replaced by log4j-full.jar. It - contains DOMConfigurator.class in addition to the com.ibm.log4j.net - package. [**] - - - Added support for the ANT build tool. Thanks to Christopher Taylor - for supplying the build.xml file. ANT is available form - http://jakarta.apache.org. [*] - - - FileAppender's File option now accepts the values "System.out" or - "System.err". If one these values is suppiled in a configuration - file then the output is directed to the corresponding stream. - Moreover, the default constructor of FileAppender no longer sets - System.out as an output target nor does it define a default - layout. [*] - - - Added caller class (C), caller file name (F), caller line number - (L), caller method name (M) conversion specifiers to the - PatternLayout class. - - The category conversion specifier now takes an optional precision - modifier allowing the user to control the number of right most - components in the category name that will be printed. - - Corrected a bug occuring when the caller file name and line number - information were unavilable due to JIT compilation. In that case, - the PatternLayout would not properly use the rest of the available - location information. [*] - - The above enhancements and bug-fixes originate from comments by - Nelson Minar (nelson@monkey.org). - - March 23, 2000 - - - Release of version 0.8.2. - - - The SimpleLayout and TTCCLayout are replaced by the PatternLayout - in the log4j.jar file to keep its size small. These two layouts are - still part of the package. - - - The PatternLayout class is introduced. This new layout is - configurable using a conversion pattern which is parsed at - runtime. This allows the user to choose the output layout without - writing any code and only at a marginal performance cost compared - to the dedicated layouts such as SimpleLayout and TTCCLayout. The - PatternLayout also allows the user to determine minimum and maximum - field lengths. - - The PatternLayout was written by Jim Cakalic - (jim_cakalic@na.biomerieux.com). [*] - - - All internal components now use LoggingEvent instances to specifiy - logging information. - - - Corrected a problem with a missing variable initialization in - SyslogAppender. This caused NullPinterException to be thrown when - logging exceptions. - - Added a default constructor to SyslogAppender. The lack of this - constructor caused PropertyConfigurator to throw a - java.lang.InstantiationException when the appender type was set to - be SyslogAppender. - - Thanks to Yves Bossel (ybossel@opengets.cl) for accurately - identifying these bugs. - - Modified some other related option handling code in - SyslogAppender. [*] - - - Made NDC.get public access instead of default access. Thanks to - Y. J. Chun (monac@softonnet.com) for reporting this problem. [*] - - - PropertyConfigurator now parses the additivity option for - categories. [*] - - - Corrected the value of the ADDITIVITY_PREFIX constant to match the - documented value, that is "log4j.additivity". [**] - - - Corrected a really bad bug where System.out would be closed when - PropertyConfigurator.configure was called. Thanks to Christopher - Taylor (cstaylor@pacbell.net) for tracking and reporting this bug. [*] - - - The PropertyConfiguator now prints debug messages if the flag - "log4j.configDebug" is defined in the configuration - file. Previously, only if the system property "log4j.configDebug" - was set would debug messages be printed. A question by Shawn - Kircher (skircher@vninet.com) induced this change. [*] - - - In AbsoluteTimeDateFormat, DateTimeDateFormat and ISO8601DateFormat - the separator between the seconds and milliseconds has been changed - to comma from full stop, in order to be compliant with ISO8601's - preferred sign. Thanks to Jim Cakalic - (jim_cakalic@na.biomerieux.com) for pointing out this discrepancy - with the standard. [*] - - - Corrected a bug where RollingFileAppender would not work - properly on Windows systems. Thanks to Heinz Richter - (heinz.richter@ecmwf.int) for noting this problem. - - February 19, 2000 - - - Release of version 0.8.1. - - - Core classes are now independent of the format of the options - file. Configurable core classes implement the OptionHandler - interface. OptionHandlers allows configurators to learn the - relevant option names. The configurator feeds option values to the - OptionHandler which configures itself. - - As a result of these changes, the Init class has been broken down - to two separate classes: the BasicConfigurator and the - PropertiesConfigurator. [**] - - An XML configurator for 0.8.0 has been already written by - Christopher Taylor (cstaylor@pacbell.net). - - - Added multiple appender support per category. The appenders follow - the category hierarchy, i.e. a child category inherits the - appenders of its parents. - - - Added an assert() method to the Category class. Steven Marcus - (srnm@awaretechnologies.com) requested this addition. [*] - - - Atomatic stack printing is no longer supported. This was an unused - and unreliable feature which unnecessarily complicated the - code. [*] - - - log4j now emits a single warning message when no appender to write to - could be found. This is typically the case when the user forgets - to configure the log4j environment. This change was suggested by - Jim Cakalic (jim_cakalic@na.biomerieux.com). [*] - - - RollingFileAppender adds file roll over capability--implemented by - Heinz Richter (heinz.richter@ecmwf.int). [*] - - - Corrected a bug where a java.lang.NoClassDefFoundError would be - thrown because com.ibm.log4j.helpers.SyslogTracerPrintWriter was - not included in log4j.jar. Thanks to Jim Cakalic (jim_cakalic@na.biomerieux.com) - for signaling this bug. [*] - - February 9, 2000 - - - Release of version 0.8.0. - - - There has been an important API changes. The Log, NOPLog and ILog - classes have been removed. Their functionality has been migrated to - the Category class. [***] - - In this release, instead of writing - - ILog.debug(CAT, "Some message."); - - one will write - - CAT.debug("Some message."); - - Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> observed that - one could use the Category objects directly for logging. - - - It is no longer possible to instantiate Category objects directly. - Instead, one would use the factory method - Category.getInstance(String name). [***] - - There category instantiation code was moved to CateogryFactory - class. This class has package visibility and remains hidden from - the user. - - This stylistic improvement was suggested by Luke Blanshard - (luke@quiq.com). - - - The Init class offers methods to initialize the log4j - environment. The Init.flagAsShippedCode method replaces the NOPLog - class. - - - Changes in the documentation to reflect the API changes. - - - The NDC.cloneStack and inherit methods now tolerate null-stacks. [*] - - - January 29, 2000 - - - Release of version 0.7.5. - - - TTCCLayout now takes a java.text.DateFormat object as a - parameter. The task of formatting the date is delegated to this - object. - - Added four classes extending the java.text.DateFormat class. These - are RelativeTimeDateFormat, AbsoluteTimeDateFormat, - DateTimeDateFormat and ISO8601DateFormat classes. - - Thanks to Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> - for suggesting the ISO8601 date format. - - These four classes can be parametrized with a particular - TimeZone. The TTCCLayout class now accepts a new configuration file - option called "TimeZone". - - These four DateFormats are less malleable than the - java.text.SimpleDateFormat but they are also much faster. - - As a consequence of these changes, the setRelativeTime, - setDatePrinting methods in TTCCLayout have been removed along with - the associated configuration file options RelativeTime, - DatePrinting and TimePrinting. [**] - - The current code is inspired by code contributed by - Heinz Richter (heinz.richter@ecmwf.int). - - - The Log.emerg method has been deprecated. If you use statements of - EMERG priority, please use the Log.log form instead. [**] - - - Added getDepth and setMaxdepth methods to the NDC class. This makes - it easier to manage the nested context depth especially when - callees push but forget to pop. - - - Moved the documentation in com/ibm/log4j/package.html to - com/ibm/log4j/overview.html. Many users were failing to read the - com/ibm/log4j/package.html description due to the unfortunate - layout of the text. Hopefully more people will read the package - overview in its present location. - - - Added the com.ibm.log4j.net package for doing remote logging using - TCP sockets. This is still experimental code. - - - Added new debug, .., emerg methods that do not require a category - parameter. They assume the "root" category, that is the decision to - whether print or not is made by comparing the statement's priority - with the default priority. [*] - -January 21, 2000 - - - Release of version 0.7.4. - - - Added a new ILog.init method accepting an Appender and a - configuration file as parameters. - - - FileAppender's setWriter and setFile methods where not instantiating - a new tracer. This caused stack traces to be lost! SyslogAppender - had a similar problem. [*] - - - The FileAppender and SyslogAppender where not calling the layout's - readConfig method to set layout specific options. Thanks to Heinz - Richter (heinz.richter@ecmwf.int) for reporting this bug. [*] - - - Corrected a bug in Log.log() method where the appender was always - called with Priority.DEBUG. Thanks to Oliver Boehm - (Oliver.Boehm@abaxx.de) for reporting this bug. [*] - -January 14, 2000 - - - Release of version 0.7.3. - - - Added Syslog compatibility. One can now choose (at runtime) between - remote syslog logging or file logging. [*] - - Syslog logging performance, although not appalling, is significantly - slower than file logging. - - - Priority class was enriched with the previously missing priorities - NOTICE, ALERT and CRIT. The internal constants were also aligned with - the syslog counterparts. [*] - - - Added the Log.log method to support the new priorities. [*] - - - TracerPrintWriter is now an independent class instead of being a - nested top-level class in Tracer. [*] - - - A number of writers, namely the SyslogWriter, SyslogQuietWriter, - SyslogTracerPrintWriter, were added to the helper package. [*] - - - Log.force method was removed. The various Appender.doAppend - implementations take over its functionality. [*] - - - FileAppender and SyslogAppender now use QuietWriter. QuietWriter is - a FilterWriter which hides exceptions and instead emits a single - warning message to System.err. [*] - - - The layout is now an initialization parameter to the appender - type. Previously, the layout and the appender where independent - parameters to the Log constructor. [**] - - - Many small improvements and corrections in the documentation. - Syslog related documentation remains sparse. - - - ILog.init() and ILog.init(String configFile) have been changed to - call ILog.init(,,,) with "com.ibm.log4j.Log.class" as the first - parameter. This makes it easier for people to get familiar with log4j. [**] - - - Added missing files to the make directory. These files are useful - for those wishing to use the log4j make environment. Thanks to "Lee - Hall" <LHall@JavaFoundry.com> for reporting this omission. [*] - - Until recently the make environment failed to compile RMI stubs in - a single run. This nagging problem has been corrected thanks to - help from Thomas Eirich (IBM Zurich Research Lab). - -January 4, 2000 - - - Release of version 0.7.2. - - - Some users have been rightly complaining about the verbosity - TTCCLayout's date output. The full date output is now shortened to - "dd MMM YYYY HH:mm:ss.SSS" for example, "06 Nov 1994 08:49:37.459" - In addition, users may now choose to print only time information, - as in "08:49:37.459". [*] - - - The package now uses Writer instead of OutputStream as its output - target. This makes the log4j code smaller and easier to - understand at the cost of a slight performance degradation. As a - result of this change a few method names in FileAppender class were - changed. [**] - - - Preliminary experiments with SyslogAppedner and SyslogLayout show - that syslog compatibility is not far away. The difficultly is - adding syslog compatibility without making radical changes to the - current log4j architecture. - - - Corrected a bug in the NOPLog.createInstance method which always - created a Log singleton even if the system property "log4j.logType" - was set to NOPLog. Thanks to Robert Gottofrey - (Robert.Gottofrey@wdr.com) for reporting this bug and the - associated test case. - - - Removed the inconsistent "Layout" configuration option in - Log.readConfig(). This change should be transparent to most - users. [*/**] - -December 20, 1999 - - - Release of version 0.7.1. - - - The LogCreationManager class has been removed. Its functionality - has been transfered to the createInstance and getInstance methods - in the Log and NOPLog classes. The new way of creating instances is - both simpler and less error prone although just as flexible. [**] - - As a result of these changes, the init family of methods in the - ILog class have been adjusted to the new way of creating the log - singleton. - - - The Appender interface has been introduced. The method of writing a - log statement into an output stream can now be varied by using a - different Appender. The new FileAppender offers the same - functionality that was previously part of the Log class. [**] - - - Changed the time format used in TTCCLayout to be of the form "Day, - dd MMM YYYY HH:mm:ss.SSS GMT" for example, "Sun, 06 Nov 1994 - 22:49:37.459 GMT". This format is almost the same as the format - specified in RFC 1123 and also the format recommended in RFC - 2616. The only difference is the additional milliseconds - information. [*] - - - The layout specific options were not read from the configuration - file due to a missing instruction. Many thanks to Vikram Sridharan - (Vikram.Sridharan@alysis.com) to patiently pointing out this - omission to an unbelieving maintainer. [*] - -December 16, 1999 - - - Release of version 0.7.0. - - - Version 0.7.0 and above will be distributed under the IBM Public - License (IPL). The IPL is an approved open source license (see - http://www.opensource.org/licenses/ for a list). It grants similar - rights to the previous ALPHAWORKS license agreement, in particular, - the right to redistribute and to modify the package. - - - The Log class can now be parameterized with a Layout object. - Layouts determine the format of what is printed, where as the Log - class decides when to print and to where. [**] - - As a result of this modularization, the CGULog and NOPCGULog - classes no longer exists. CGULog class has been replaced with the - TTCCLayout (Time Thread Context Category). This should make it - easier to create new log output formats. - - Some time in the near future, the Log class will be further broken - down to allow different strategies for writing to output streams. - - - Renamed com.ibm.util.log hierarchy to to com.ibm.log4j. I wanted to - do this for some time. I feel release 0.7.0 was the last - opportunity to do so. I am sorry for the the trouble caused by this - change. [**/***] - - - New NDC class. This class implements nested diagnostic contexts as - suggested by Neil Harrison in the article "Patterns for Logging - Diagnostic Messages" part of the book "Pattern Languages of Program - Design 3" edited by Martin et al. Nested diagnostic contexts is a - nifty feature that was missing up to now. [*] - - The StressNDC test class seems to break JDK 1.2.2 beta on AIX. On - Linux and NT using sun's JDK 1.2.2 it seem to work OK. In any case, - tests done with StressNDC and associated perl script seem to - indicate that the NDC class is bug-free. - - - Corrected a date formatting bug in CGULog class where on some - environments the wrong month was printed. Thanks to Christopher - Williams (Christopher_Williams@mail.northgrum.com) for signaling - this bug. Also changed the month format from a number to a three - letter abbreviation such as "Jan", "Feb", ..., "Dec". The new - format is unambiguous regardless of local date format. [*] - -December 8, 1999 - - - Release of version 0.6.2. - - - Clearer documentation with still much room for improvement. - - - Corrected a bug in the Tracer class which always used the Unix line - separator instead of the system specific separator. Thanks to - Vikram Sridharan (Vikram.Sridharan@alysis.com) for singaling this - bug. [*] - - - Corrected a runaway comment which gulped the CGULog.readConfig - method. [*] - - - Added the init family of methods to the ILog class to ease the - setup of a basic logging environment. Thanks to Mark Donszelmann - (Mark.Donszelmann@cern.ch) for this enhancement. [*] - - - Just an hour after releasing version 0.6.1 detected and corrected a - bug where the Tracer class would correctly print Exception stack - trace but not the type of the Exception. Replaced the - distribution on www.zurich.ibm.com without changing the version - number. I hope nobody is using the intermediary (and buggy) release - of 0.6.1. [*] - -November 16, 1999 - - - Release of log4j version 0.6.1. - - - Better documentation with still much room for improvement. - - - For consistence sake, added setDefaultPriority and - getDefaultPriority methods to the Category class and deprecated - setDefaultPriority in the Log.class. [**] - - - Corrected a major bug where if two categories were homonyms the - second instance would not be properly initialized. - - - Increased the speed of Exception logging from about 4000 - microseconds to about 1000. It seems that for some people Exception - logging is performance critical. Improved implementation is a - variant of Nocolai's (XNH@crisplant.com) implementation. [*] - -November 9, 1999 - - - Release of log4j 0.6.0 with incomplete documentation. - - - Added a stress test program to debug the new Category class. It - turns out that the test program was as hard to get right as the - Category class. Given the favorable results of the stress test I am - quite confident that the new class is now bug free. This assumption - has been proven to be wrong. See above. - - - Created a new class called Category to manipulate categories - instead of plain Strings. The new class is just as easy to use. - However, the evaluation of whether to log or not to log is at least - 10 times faster. The NOP class performance remain unaffected by the - change. (You can't improve on the performance of an empty function - call.) - - Many thanks to Alex Blewitt "Alex.Blewitt@ioshq.com" for his - valuable comments. He was the first to observe that finding Strings - in a hash table was an expensive operation. - - This change will require some recoding on your part. See the FAQ - for more details. [***] - - - Modified the force in Log and CGULog method to use a byte[] buffer - instead of a StringBuffer. The old code was clearer but the new one - is at least 25% faster. [*] - - - Added regression testing. - - - We now enforce a policy where the OutputStream set by - setOutputStream is a user managed resource whereas the OutputStream - opened using setLogFile is the Log class' responsibility. - - The setLogFile method now closes any previous OutputStream if only - if opened through setLogFile. If the previous OutputStream was - opened by the user and set through setOutputStream the previous - OutputStream is untouched. - - Similarly, setOutputStream will close any previous OutputStream if - and only if it was opened using setLogFile. - - - Added a new method logOutputStreamExists to the Log class allowing - the programmer to check if there is already an opened stream before - trying to set a new one. A stream can be opened as a byproduct of - reading the configuration file. - - - Changed the behavior of the (private) Log.Append method in case of - failure to write to the OutputStream. - - Previously, in case of failure, we reverted to System.err. Now, we - emit a warning message and discard all future log messages. The - new behavior is consistent with our current unreliable logging - semantics. The change prevents an otherwise functional program - from failing because the terminal is flooded with logging messages. - - - Renamed the iLog to ILog to remain consistent with our class naming - scheme. The initial intention was to add ILog and deprecate - iLog. However, I am running CVS on a fat16 partition, causing - serious problems when files differ only in case. - - - Corrected a bug where the LogFileName was not remembered. Thanks to - Jens for signaling this bug. - -October 28, 1999 - - - Release of log4j v0.5a - - - Now the programmer can choose to truncate the log file instead of - always appending to it. This functionality was first requested and - intially implemented by "Jens Uwe Pipka" jens.pipka@gmx.de. [*] - - - setLogFile now opens the requested file instead of having the - Append function open it later. Cleaned up some related code in the - Append function. Although nobody has requested it, there is still - no method to close the log file. This is harder to implement - reliably than it sounds. [*] - - - Simplified setLogOutputStream so that it does no longer return the - previously set OutputStream. [*] - -October 27, 1999 - - - Released log4j v0.5 - - - Joe Walker (joe@eireneh.com) observed that the - LogCreationManager.getSingleton mechanism was cumbersome. There is - now a new class iLog (indirect Log) which hides the need to call - getSingleton. Performance testing on my 233Mhz Thinkpad shows that - this indirection has small performance impact on non-logged calls - in the order of 40 nanoseconds. The impact on logged calls is - negligible. [*] - - - Added a jar file to the distribution. The jar file contains only - the files you would need to use log but not other classes needed - for testing nor examples. - - - Corrected a bug where CGUNOPLog was not integrated to the Makefile. - - - Added new public methods isDebugEnabled and isInfoEnabled to allow - programmers to check whether a debug/info statement will be logged - without incurring the cost of message parameter construction. This - addition was suggested by Luke Blanshard Luke@quiq.com. [*] - - - Renamed the private method evaluate to isEnabled. Also made it - final with no apparent speed gains. In addition, made the - Log.force method public. [*] - - - New syntactic sugar debug, ..., emerg, methods to log objects. [*] - - - Modified the interface to deal with Throwables and not just - Exceptions. My thanks to Luke Blanshard for signaling this "bug". [*] - - - Added more tests to the LogPerformance class. In particular, to - test the influence of indirect debug calls. - - - Added a "make" mini-tutorial for those who want to modify the code. - - - License updated to standard alphaWorks license allowing - modifications to source code. However, this license explicitly - requires that modifications be communicated back to alphaWorks. - -October 15, 1999 - - - Initial availability on alphaWorks. - -Refer to the FAQ for the lineage of the package. - - diff --git a/docs/TODO b/docs/TODO deleted file mode 100644 index 7fd2756501..0000000000 --- a/docs/TODO +++ /dev/null @@ -1,75 +0,0 @@ -TODO - - -- Add support for string options in SocketAppender - -- Add a properties file option to log4j:configure in XML. - -- Really quiet mode for LogLog. - -- Deprecate configure element in DTD. - -- Support for duplicate appender suppression in configurators. -- Clean up the association of renderers and hierarchies -- FailOverAppender - -- Graceful congiguration merging - -- Integrate tons of GUI code. -- JDBCAppender. -- Time based rolling. -- SSL logging. -- Authenticated logging. - - -ONGOING TASKS - -- Better test suite. -- Better documentation. - - -DONE - -- Add priority#priorityClass to Configurators -- log4j: namespace in DTD -- Mapped Diagnostic Contexts -- Allow the raw message object to be seen by Appenders and Layouts. -- Complete multiple hierachy support. -- JMSAppender. -- SMTPAppender. -- Automatic configuration file reloading. -- AsyncAppender. -- Written a short user manual. -- Added XMLLayout. -- In DOMConfigurator added support for sub-classes of Category - implementing OptionHandler interface. -- Added support for Filters and ErrorHandlers. -- Added support for multiple hierarchy trees. -- Added support for sub-classing of Category. -- Socket logging. -- Integration with NT event logging. -- File name option form environment. -- com.ibm.log4j to org.log4j package renaming. -- DOMConfigurator. -- PatternLayout replaces TTCCLayout and SimpleLayout. -- TTCCLayout customizable with any DateFormat. -- Better control over NDC stack. -- Act as UNIX syslog client. -- Make Priority intances flyweights. -- ILog.init methods with Layout argument, with Appender argument. -- Contexts a la Logging Pattern of N. Harrison. -- Improve catBag lookup speed with wrapper classes. -- Truncate functionality. -- ILog facade to LogCreationManager.getSingleton() -- JAR file -- New syntactic sugars to log objects and not strings. -- Exception --> Throwable - - - - - - - - - diff --git a/docs/TROUBLESHOOT.html b/docs/TROUBLESHOOT.html deleted file mode 100644 index 82590c2a60..0000000000 --- a/docs/TROUBLESHOOT.html +++ /dev/null @@ -1,301 +0,0 @@ -<html> -<head> -<title>Troubleshooting log4j - - - -

    Log4j troubleshooting

    - -

    Ceki Gülcü Paul Glezen -
    February 2002 -

    - -
    - -

    Here is a list of commonly encountered problems when using log4j:

    - - - -
    - -

    log4j tells me to initialize properly.

    - - Logging output is written to a target by using an appender. If no - appenders are attached to a category nor to any of its ancestors, you - will get the following message when trying to log: -

    - -
    -log4j: No appenders could be found for category (some.category.name).
    -log4j: Please initialize the log4j system properly.
    -
    - -

    Log4j does not have a default logging target. - It is the user's responsibility to ensure that all - categories can inherit an appender. This can be easily - achieved by attaching an appender to the root category.

    - - -

    Duplicates in log4j output.

    - -

    The reason for observing duplicates in log4j output is - either due to having added the same appender multiple times - to the same category (typically root) or having added the - same appender to different categories ignoring the fact that - appenders are inherited cumulatively.

    - -

    log4j does not eliminate appender duplicates. In other - words, if you add the same appender to a category n - times, that appender will be invoked n times to - append to its target.

    - -

    A slightly different cause is adding different appenders - all sharing the same underlying output target to some - category. In the most common occurrence of this phenomenon, - the BasicConfigurator.configure() method is invoked multiple - times. Each time it is invoked, this method adds an appender - with a System.out target to the root - category.

    - -

    One other common mistake is to forget that appenders are - inherited cumulatively from the hierarchy. For example, if - you add an appender, say A, to the root - category, all other categories will inherit A - as an appender. Thus, if you add A to a - category, say C, then an enabled statement of - category C, will print to A twice, - once because A is in root and once because it - is in C.

    - -

    Options are not parsed correctly.

    - -

    The PropertyConfigurator relies on - java.util.Properties class to read in the - configuration file. This class preserves spaces in - options. For example,

    - -
    -fruit=orange  
    -
    -is returned as an option having the key "fruit" and the - value "orange ".

    - -

    The spaces in the value, i.e. "orange ", are due to - invisible spaces at the end of the example shown above. Thus, some of - the options might not be interpreted correctly due to trailing - spaces.

    - -

    Caller location information is printed as a "?" - character.

    - - Location information is extracted automatically by the PatternLayout - conversion patterns %C, %F, %M and %L. However, some just-in-time - (JIT) compilers make it impossible to extract location information. It - is also possible that the compiler that generated the byte code may - have omitted the LineNumber table as is done by -O option of javac - and jikes.

    - -

    You can remedy this problem by disabling the JIT compiler and by - compiling the code without the -O option.

    - -

    In wrappers or subclasses of Category - -

    Wrappers or subclasses of Category need supply their - fully qualified class name to the Category.log method or -to Category.forcedLog methods so that the caller location -information can be extracted correctly.

    - -

    This approach will work correctly in all cases except if - the class invoking the extended category instance has the - same prefix as the extended category class. For example, - calling an instance of com.foo.BarCategory - from the com.foo.BarCategoryTest class will - not yield the correct caller information. To circumvent - this "bug", either perform the tests from a class with a - different name or add a dot to the fully qualified name of - the extending class that you supply to - Category.log to - Category.forcedLog methods. For the - com.foo.BarCategory example, supply the - string "com.foo.BarCategory.".

    - - -

    ClassCastException when -instantiating a Category subclasses.

    - -

    This exception is thrown because log4j does not support -homonyms. For example, the following will systematically throw a -ClassCastException

    - -
    -  Category c1 = Category.getInstance("bad");
    -  MyCategory c2 = (MyCategory) MyCategory.getInstance("bad");
    -
    - -where MyCategory is a subclass of -Category. The problem occurs because the second -getInstance invocation will retrieve the category created -in the fist invocation. This instance is a Category -object and cannot be cast to MyCategory.

    - -

    By default, the PropertyConfigurator will - create and configure - org.apache.log4j.Category objects. Thus, if - you try to instantiate a category subclass for an already - existing category, and try to cast it to the subclass - type, you will systematically get a - ClassCastException.

    - -

    To address this problem, the - PropertyConfigurator admits the - log4j.categoryFactory key. The value of this - key will be used as the factory to invoke when - instantiating Category objects. - -

    The DOMConfigurator has a finer grain - method for setting the class of the category object to instantiate. - - - - -

    Log4j class not found/defined

    - -

    Naturally you should check the classpath. But you should also -be aware of the presence of multiple classloaders in the JVM: -

      -
    1. the bootstrap classloader -
    2. the extension classloader -
    3. the application classloader -
    -

    If you place log4j.jar in the jre/lib/ext directory -but place user-defined extensions to log4j in the application -classloader classpath, log4j configurators will not find them. - -

    Servlet, JSP and EJB containers inside of application servers -usually have their own special classloaders in addition to the -three mentioned above. While this provides for a greater -degree of separation for different webapps, EJB containers and the -application server runtime itself, it can provide headaches to the -uninitiated. - -

    Classloaders are usually hierarchically related. The bootstrap -loader forms the root with the extension loader as its child. The -application loader is the child of the extension loader and it's -this "app loader" that we use by default when we write standalone -Java programs. - -

    Upon receiving a class load request, the classloader usually -delegates it to the parent before attempting to service the request. -This allows the bootstrap and extension loaders to deliver any classes -that are part of the JDK or its extensions. Only after this delegation -fails will the classloader attempt to find the class itself. Note that -classloaders do not delegate requests to children. - -

    Application servers often use the application loader for its runtime -classes and create separate classloaders for its webapp and EJB -containers. These additional classloaders may descend directly -from the app server's runtime classloader. If log4j is placed in the -classpath of a webapp classloader, another webapp classloader will not -necessarily see it. EJBs wouldn't see it either. If log4j is intended -to be made available to all objects participating in the app server, it -should be included in the classpath of a classloader high enough in the -classloader hierarchy to be seen by all classloaders. - -

    A good article on classloaders with examples using IBM's WebSphere -application server can be found -here -in PDF format. - -

    I cannot log to syslogd under linux.

    - -If you are trying to log to the Unix syslog under Linux using the SyslogAppender, -then the Linux syslog daemon must be configured to accept log input -from the network. Otherwise, you will get an IOException: -connection refused. - -

    This can be done by adding the -r option when starting -the daemon. Or more precisely: - -

      -
    1. Login as the root user -
    2. Edit file /etc/rc/init.d/syslog -
      -case "$1" in
      -  start)
      -        echo -n "Starting system logger: "
      -        daemon syslogd -r
      -
      - -
    3. /etc/rc/init.d/syslog restart - -
    - -

    log4j:WARN No such property [xyz] in some.appender.or.layout

    - -

    If during log4j configuration you get a warning about an inexistent -property, then you have probably misspelled a property or entered a -truly unrecognized property for the component you are trying to -configure in the configuration file. - -

    Log4j version 1.0 did not complain about unrecognized properties -whereas log4j version 1.1 and later do complain. - - - - - - diff --git a/docs/css/site.css b/docs/css/site.css deleted file mode 100644 index 149f6c0dd7..0000000000 --- a/docs/css/site.css +++ /dev/null @@ -1,140 +0,0 @@ - -H1, H2, H3 { - color: #101099; -} - -A:link, A:visited { - text-decoration: none; - color: #006699; -} - -A:link:hover { - text-decoration: underline; -} - -.centercol { - margin-top: 120px; - margin-left: 210px; - margin-right:210px; - max-width: 800px; -} - -.leftcol { - position: absolute; - left: 10px; - top: 130px; - width: 190px; -} - -.banner { - position: absolute; - left: 10px; - top: 10px; - height: 130px; - width: 1000px; -} - -.menu_header, .menu_item { -/* width: 190px; */ - font-family: "trebuchet MS", Arial, Helvetica, sans-serif; - font-size: smaller; -} - -.menu_header { - border:1px solid #AAAAAA; - background: #CCCCCC; - padding-left: 1ex; -} - -.menu_item:hover { - background: #DDD; -} - -.menu_item { - background: #EEEEEE; - padding-left: 2ex; - border-top: 0px solid #AAAAAA; - border-right: 1px solid #AAAAAA; - border-bottom:1px solid #AAAAAA; - border-left: 1px solid #AAAAAA; -} - -.source { - border-top: 1px solid #DDDDDD; - border-bottom: 1px solid #DDDDDD; - background:#eee; - font-family: Courier, "MS Courier New", Prestige, Everson Monocourrier, monospace; - font-size: smaller; - padding-bottom: 0.5ex; - padding-top: 0.5ex; - padding-left: 2ex; -} - -table.ls { - background: #FFFFFF; -} -table.ls td { - background: #f4f4f4; - vertical-align: top; - padding-bottom: 1ex; -} - -table.ls th { - background: #E4E4E4; -} - -.index-faqSection { - font-size: larger; - padding-left: 0em; - font-weight: bolder; -} -.index-question { - padding-left: 1em; -} - -.faqSection { - font-size: larger; - font-weight: bolder; -} - -.question { - font-weight: bolder; -} - -/* this class is used for screen output placed in

     tags */
    -.screen_output {
    -  padding-left:  1em;
    -  padding-right: 1em;
    -  border-top:   1px solid #AAAAAA;
    -  border-right: 1px solid #AAAAAA;
    -  border-bottom:1px solid #AAAAAA;
    -  border-left:  1px solid #AAAAAA;
    -}
    -
    -
    -.big {
    -  font-size: larger;
    -  font-weight: bold;
    -}
    -
    -.small {
    -  font-size: smaller;
    -}
    -
    -.red {
    -  color: #AA0000;
    -}
    -
    -.msg_title {
    -  padding-left:  1ex;
    -  padding-right: 1ex;
    -  font-family: Courier, "MS Courier New", Prestige, Everson Monocourrier, monospace;
    -  border:   1px solid #AAAAAA;
    -  background: #DDDDFF;
    -
    -}
    -
    -.msg_meaning {
    -  padding-left:  1em;
    -  padding-right: 1em;
    -}
    diff --git a/docs/images/ceki-72x101.gif b/docs/images/ceki-72x101.gif
    deleted file mode 100644
    index 7c7f002cfeef27261534e033850193edf33765c3..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 7712
    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
    BGbaE5
    
    diff --git a/docs/images/chainsaw-fullscreen-small.jpg b/docs/images/chainsaw-fullscreen-small.jpg
    deleted file mode 100644
    index e4de51fcdbf592647637cd1cd4a601c52dd64aeb..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 55917
    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
    
    diff --git a/docs/images/chainsaw-fullscreen.jpg b/docs/images/chainsaw-fullscreen.jpg
    deleted file mode 100644
    index 14835d1fd621e8a4279e12033285df6561fda850..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 208947
    zcmeFZ1yEe;wg%X^Yj7uM(BKXU1P>4(xCIODZfP_GcL?roK^vFg9-QC=3+@ix(>dq9
    z_sE?(_q};DRWo<$(A7m%@BPb?Z>{yOwf2V0K~@3Sa#FHV02mk;z&q#%09gP?0FV(8
    zkq{A(k&uv3P>@m4@i5TQ(9nr-pJ3sUlTcESlaP^7(Xug6J!PRGBV*)y#`2tlo12@G
    zK|q9`Q<#m5oAcKsFeoS}=xFFf7#KvH)MV70|Cj$D9RM6;xOecra4=5+usASqI53cI
    z03`qbg8<#_uMPj>4+a(v9sv;v83h#$dP5yH02T%g4i+8`0RbK!dbbbsIshIA0hgNN
    zCE^ohL!_q;c$|JQ*~m2FRh{@M&3knzN0va32#
    zXt-34@r@kEQ3+_d*XT}uk@g2=|1-k;|5ud#Ct?3Z*E|3n4hAYbI2?c&V9myszIphp
    z|5Toa(9Lz=y>P6O(~%xxX3nlg{Uzw>_tpBAc~<(*?-cj#L-9v*L>z^H(aaVj+h(eT5f%!cfwum?xEH))zcRr?(19sx6HfVoY0F
    z+FC~In{4tX@1oys`=d}iSd}GS9(92czR{0gEhqtnPnVV?uReFL(pm$XUXCsYBL&3i
    zMd7CND`vKi?$=Gezq%od>6&*8Ki^zY_^=*&MmZD3@nH4MS(D|$4nbRIck3Vm0tgB8
    zItZmcqo62cl3JGSpom|h=};%s4%0GNl*P*QaIrCdx`=Ul1OHLfAkiH`QPyRjqkmM1
    zqY#NsRr-lqKzywI%r?xHSUH99?W|9sxoaC${V{7iNTbvYh;ioOwf->v8u#r!(w43L
    z_l{N1DRoi8{pD?bdG{9y2Vu(t7TeG#AC_`mkL1K^Ef_2eDlC?naMDk-3*O(?eXufD|6g8uSW7Kn9YGrLS
    z#*K3T|6$lw=4@VxrJ9P_ISx5Snw&iH#m3#nxbPSj(t8M?RF}rDl+HPd=O1&sb>EV=
    z1@HugK4k48PQP!(98}@6{nSAI0!cU{7avq|Ehh8j_@TEYc7-QAF`6ef`H9yUHC3*|
    zxIIcQ|0qh2ac|urfc^`HU~j$x{TLJ6BKJTS0T28eND1(SBlK|F+w7zv&x|SJ?G3_{)0bpbaAhU)s6?%{p9Te~;f5TpgZMSjaJS6SXJ(8C^ouJFe{#(te38O$)$AU~;d=pUdpTdb8DA&_^yGzV~3G;k7h*J!Ey)&iUFnz0C}y
    zm=;#G9}@(_UDXcOtJFnOsXF|ezpE7}
    zQN6Tz<}xMx=TPCA9qB|LW*sgOIHKp{M&DLFxFuFk8d!{HOv|IMEVS_
    zg_17SCDkSQ*&K?%U#domL5e|OnDr-1YOT4gxwSs}{RzlK(Fb%T4%?O-@+n
    znv#`q6aLAoyzf$j0-EORe^M%29TD&N<(mP=gEPU4Gv_E>H;mmEAitz7I$AP
    zT-;MC_{bMGXMF|ydzwPbIme|QG@3wpItXCmlNGvnY{9|iP0F~klLp^m+4(0jzq~nY
    zp=36(>x1`;3i;i61!08(}8c^ah`c
    z;Sb=*a5CDai@;
    z0t}d`{iv(LfjIpl0u6oBv|kOcID{OasfY#fC3kDD1f{yv=jUIb8L{A*nvG+yxkQQGDTiOe7fUaLLi6
    zc=v&_(k6;!{C$GAq=pxo&D~Zlb9l>t>=@{+NW}X8c617$oO9xDl
    z$lhqJ`^gU-%BwN3|MZTibaKhhfk+T81hB($ae32{E^5I#Au1S@hC{2-6xK_thkD#*#5-&Q^Tj^CU9}fPtYB2`Q{tyO5=x+aaPt$jfuQ
    zwbjZ>GsQ}$pc*vnT8jO`*S;e>?&7NWuxzyn6vz?tK1@;Ttv_$H5Kj1P_5rs-c~|^4
    z2vknGFjH?jLG9nGMa#xUbvhiw;(Ofpu#B~>sz3K)HYI$PQ;8~Iuu~64RP7_5^P15P;JFL)=AyME*h_Q!|o%Q}Fl8
    z*ykGc?!}j(v&Neo(EFjZffSQ1=!Q?lQa;UQnnlpiY>KuDda0RB+N^$QNK{YAk6g>r
    z3k1lJJyCcYM))kLwbguixvtfrFmDXLx+U|yyv$rpKg#X1HNuAo~)r$^>TVex`-$kOhZ?m-u)AEV*J%G%y~b)eYk%0oKn9mk5TR>sGb3g1OfD@HET)s
    zR4;KJAn;ia^t$ceuD2TMEht$DNeZh-K7H7Tk&9W$F85Ley-&>6rwJ9>#_X
    zqwq?v6xfwFDI9cd@sqDS1tpl_u0NKzO<3|`huCt*p+2eQu9C~je4V)0S&npqS(?A&
    zY0b;0|JDXhfI=H2Y8@aP@RKPrzkFA_FPIHj%jSJVe@LGBw1P8sJBz}{KfK6w?
    z&1YZLUO#tr?&M~ev#csXiUH2^aGPi+Tt!zb1~gn7B2lrqw1v?%<-HimBpg5S!%htZ
    z0gOvE*-+C=IddCe!;?6xl*}*6+!+XTzVIp}%b2?yyx}jIjF5^Gc`d^9VMI=Do6gDE
    zFo@0z?=%g!{I0VBE}%BC@2uohmz+yIROL{8dDZsWRp`eJtfKyVEBRhkOV;86gnM~-
    zd$t948VEo=<{ZJ(jDPPSlEW{qlA4f^0h|H?2kERb$>qkzHJrR%LmlTfQIg^Fm2}FyH2A1(xecs_(
    zCkZz%8TfUvEYFkgVOH;~JlNQ{FG7jpTViG1m`WIlX=ASenCHF6eEup2HWU;1jn+1S
    z%l%{<97K9I8&ca~!1Bkq(bF9}*@vO~K`mES8`TrDWQiXb>dQaAy4Nviu@D$qdlx|f
    zuBHMpRUr6GZ@)QI(*jV@-2A+b&I%4fer^4?-sA3FT=B9S^g>s;O5I52X$W9V_gWR~
    z2eqlNrVzjn==dO~HKkjG%zKn1D7JF%oY;V;I}bx+VX>vH&5WjWce@)NAipS(H+BhL7Wg4t3>VGvW@4<*1;9WYHfkZ?_!SPL_
    z82B4!)iC70W@6O>neX0c&D}Jff~Sjwbxy+9ox;~?&hS`{*c5l;?sCEJPWN>nfTYYY
    z;kMIVJ@H$wg@N!{uC^OmD%iflmwp|94|q3qq^S{t3yO)GDTCkVWwPg=S1c(yWNf!P
    z={G_EsM}vN&(XxLpRhv!_|o^xnW(^TED*rz>-Kv!3-FiKvfTZp#CcW`9-2F59M_xa
    z<+}{E;=QKCFW=jmLsjeEP*&-b2C7D9cYFEnb%>0WoBa^HG`Q9f#e)E{v>RlF}XuV(s@)
    zOtsUt`>brNHf%W5jg0T5L7}ETfeHOFn)Zqx8cGTD>1Mds#O5w&P?EbqNjAu8@1CP(
    zDU>)Y0(|x+jgOH6Ha%2CMD*5dVwsi(<#^%V-QSaOrg>s}O;UEWq03)e>nJ|mGS4ud
    z97~NC_ltBh4tV%`Ys{ZVm{rvJV$B&<4cCT{~sk^ybYTzenXL{gmIYd@~=
    zeg?I|H4uOwCj@Y!Mg|5P`_#205t4ZJpv&pY(l#fk;i1RMdIOL=L$zjL<2M<<>R;uz
    zbMBg6r^G17CuV?zn?#(H!*qRY*gsp^_C$;&CJ*Rkx{-c3B7ZjS9;_ZLsX!s3sBBc_
    zL80}Ew(ntS(+y@Hxl&0KaO}BA*KDy%?_#Dove=yb*0&quhKfKpV8`KY-0*3{pa9`(<&%viIZ4jn@P&%wRr_d_SbW*e8e8<&;P
    ztj)g=UDQP?+I{uC*sxetDUkDCiTFmO=tiXU`+uWCx&J9StbNOs;r1uJAC&&44e+bIFa7|V!eDHYD}^Aj|`;#l`%yF
    zH8rrR4UGa(94D??jS;$=@Bm}z5FB)K=U6s8rorJoaf3Z$!Eb$CM
    zT3RkaDtH$H*oaJCWg4Ml$Tw8i$UT+y{zSqsKl*~0H71r5
    zsS@AXlH{;korH8>@`Xvm~ld=Lo&0ROX
    zmuw6&e9~+qd4yCZ)&j(1G|SDI|G+*J^nb+0Vrx3ruc7I`|3Fr0CgJCI4$kDLp|T#d
    z<>hxZxk&O)0xL=OH8aMhS)kn^m7#yRkC`5+r`#`Ox=q=Q9QEWEBJ;g7qu0^>uz`wZj%Cbu#
    ztsm{XT}7ua1S*))a!IO{5@kOyZI7+}97>82Q5!X^^&yb;-u@Dkw*c~(szmA2H5=Vg
    zR~Is8eOFiSN9B+I?i2aSk&qDX=x}%9d*PIQu{H9E_U%~+;3?nrI0S%vm;eEYw%_2i
    z_qNCw9e;BR*S>2X-f?E)c|WSV%k{aXhLIWcUM~FLe3VP!&U@u-7OZ(gjBf%sYI2j<^$V3rl+#Qy
    z-TlPP!sb{eXn56o!BYcj^pTh2pnJ%?!GQpJqpqdSGjGnJ1)V4`cU${QpQJ1HGptgj
    z#u1?9lAYOE@0L)=eB&rbOdpv;53OhVurl(5H=|w_HWo!P&m{0GUmgT7RtSCtJjwlS
    ze+FF;0P|haP4IMyn?TT%?USJeXc`4i9|_e<%^+?{!}wopW5!t0I&%$dc%gMAAl2j+
    z%U~gD{+5Y?A1+^>tE%Iypf3bskJh24mfxByW^3ds7@nRosWE{Xm
    zC>6DVVU}q1Zi?0M046AJ*!2D@rhv7vz@DDjJ&mW*{Vi}q8Ui2@TO*wSZcjp`CU!mk
    zko{k58D`7350V?XdLxC1$Qv0zITNcO<>5WXskdwyOOVzq3qExH5---PW}A3A(j(&o&ln}cRI
    z{)*xAZ@t8z;qTu!{{fFj+*qNZ4QYTqX@d2Hed~9>lVY3wL*(h)!gpCb*8D`EBtwJ*;#@gfCKl?<69RIbjV1q*#4`DEi-Hs^2+vGl5Ro_No-b}K8ETUF}r7BYYDzW
    zElgoe^OfZvGPz(lD`JyE7EI*?d;e*p^+#0puaQY75tsg9H6gY}3^jn;V}F2Z7Gu4c)P~n2az>05-Eza0
    zA-&s8bb2~zD)&IZV)>{wq+2mxUO-2&OB4+P=!?t-Z-|Y`?baU9-?YeAECVep30x0~
    zdiQK&BsX;#>wTXjg;&A*=aphLIryVgNUttN*1HWx4^VS_{h*SCPAr&6Gt(+PoC)^c
    zgaF!OfF~}IZeR#Nb@PUXjPh7x?941qOWXaE#WBxDQ+gimjia87jqPTlEV##{wBf}L
    zyILBqtlppm#)8AHr)HDh(*e8mjb?1B^bJWVvw1$;BDsLH<2=8)7*!9bWgSavzdB_H
    zvqfG8Uw0#y^RPOiCFw#S~skKUL4Cu1B=|hVXq{2w!xR#y6ol(@fW_h7_hFgFv|6B8-K
    zb#Y0vFzpKtkcJydx!n&yMKx-0cS8sP5K1SD-QPe@0>GzG*Zgw|#VYmg&9}M{_4PNP
    z)&#r!h=YQ@2a+i#mZgGLgW0>GmUgL^%Z7iS|vic^ObEae#x
    zfOh8V*az>4r>)gY2(6vgEj8Q=@*d>f9`lHrb^6B_=~MbFR^^H!uQ@^vSn}wN!lM_L
    z{I=FN#hT3JYTLa8RCMT@4IW8${5KML;36CAGy2}1ygpg5#Bg)(KmI(w`jvI~&8t%w
    zVpJ3HYToIm?@@xNu&pwxBHgBKRQllw4HHLv`B`}o8|j*{{{D9$Ix+m`lZ$W18ASp
    z5_$r>b4%X#(ATzI+5(?F*ri6?uM^$4&KyYo#_->CN^Tg%yr|`|mi?}|HN>p=gnvmn
    z!8>`$e=)h_XWVh+zry$Ud-&S7e=RC4zrPoLtOS3v`k$=f-^%ryyZrwtoG3`w4Q^N%
    z9yXvAU)a{*F0oT~ZRjx@0yyW=7h0!ZIdL(7w>@1zDjG($_t~3k;ev)r7nS!|5P$^F
    zIdS1#J|#2`+hHIeT~8{#9|iUiUTMEC&0p3U+8iMxgf}tOv!@~+HAZaSN
    z$%H;o#gcdD(ggSp+Aru38D^~iw0{X(09vb^t&>M#GhHyXBP->$iatFw?|&n`L`glc
    z7m36`$2yB^>&u+pst9!lvL*#n`zjv
    z5=fuakZ*ag=hI^UAYLL7sRZ@58@87F=&0*d;_k%d_9JNQ8x+k;e9
    z`6AN{lxZF`V|!W?kS38X#_DTiNrx-@RX+Y6)2x9DAcgt7ZK|6CdZmjCMyg(Up8Y^e
    z(X!|}yw4r(--*85V8XqN#(413Zk!b660I{fNqPp4;Y6#!DN^Gh7c>eZMSTrt1v4AV
    zp;=D>P!N-t;cmDf>nqZfHL1KbHDKfhv5{Iv7gAdE0+df3!dIOI3zFH&*HV|5eryt0
    zHS^WSy8ob-5X5J}uHqjU-6?F9
    z=Jv_Q)J!t{AB_h?}|+`-rpGJR;DW5^qiP{(AlN*a3}grtC{ljp&cHb=T$mqW~-
    z=U*Wt*d#8Ar(vTQ+Reg|HaU!1Q)1$h%aM))kz?6e<>_L};sP7|?ayS>C*-_ii3d8_
    zqe}xCzG3b*q`RITvf6IaG^S&7`j#>?Qa;V_y_>bsT`pZ)NL`ZB`D{zA7KemcNac%U
    zm(S1R^D^FB%*Xk5QCVboG%})5U&^p!%t=pVx;sV=DVdDpU@Y}1fr<|bJi@_jh5L?X
    zlTxs4?SrCFv02cx1T3MzhWh;%?r>r@x=-s!?~%p)kj`_|+k8V$R%F{u5|;wXa=718
    z9STX1;eIGgbBMfGNtdH;zH&?tYm=xoM3fQOu2P*8I7o5aIq5}?lzoC;_L*v*+Vv#n
    zVOd~A`XQx2i;L#d^7C*w$NMVllSnt$PO^1;Dg`gv6R9XPDbC$ML4vzsBqPE1ADeM{
    zs7=k>(~aNxVhp>U5A2*_78E4XCBs%xA*!!WVN0JDnN-WtvFS@9%!r5Dqp>|#S_Ske
    z^`!tllFReP$kVdNVJGS}e0?@1;%To$Ec`apPTlmY4B?3Rz_YXjjI?*#*FIRfE~6ye
    zbKT5@>1^XfA#F#a0sKf&j{Kclc~(UF)TD=u
    zV&}Y-(v|$z&|?hcGYCNU3DmGzo^y^}1)6HCF?mCe8d2mD5B*|k3A<{W?Fi89NguR1
    z&k<{z&ZVh6jAY_g9)nMzslCy!ev!Yf>G@aJQUp#(^kheJ8GteI021IJy>xxoyPeiF
    z0E~JAw%#$X-~!_|Ljb(9BRDz=JR`MIqc);joGP*t1SW}wI6lqOkxy5v1NQXNJrp!|
    zQJMWuC6OBZiyc8QA9UU>Xoxo+ad#W(zfnS+ql_*_ri%6q
    z4Q0QG147%MszZlO;?+Mi`p~E6>Mlt-7}`B$L}AP32!%I#fiQ=@&QR#&7n2snHF>dS
    zRx-a!FrSzNf93Dm(A3_Jf^gc!7ymMvVN}sgs#B`-Yecft1l~=Y+nmDO#o#kVPJ2gY
    z_HM@kq@W9r?3mm{p=ZhDn8Y&TFX5eeQ1s?71etxO4{Z&P6(diUmP+du2M^iuFxMnI
    z0c{7}-lZ#bp6I?T6-X~+@Litq+ihRNx>5U+HvgR0Wbh~Iss@}8GFag=d?eZ+QMGUe
    zq1eu+M<amkf`_Z<&qg*hyH#+O6XY_Lju@R9=xEI(j&MP=GCq
    zKQr>3BhU9fybHlZA6%!7*?xH=1`eh(Ro23=)eIF%9iZ3oFbXlW4>t*KG_K`)(M9&W
    z7+B+ibpx)0`sF`XQB;t>Bb7KIDBiePF~ZgL(5XNA4$I3G5WY^_St;B+F{2>PQPPQ6
    z=={89aalZ$K-7o^9~W^hD33pax8$(@r-TKO9^!T(1n_>B^6bG10`P_QDD^RwA@1&8
    zZuL+QZPqPp_4jKjt|ffkaJ~9bE@)8v+oUX}?BYxp!=7
    z({jG4O|BDBbPdo7%Dc0kOoWJq+19
    z&gv$-f;pBSJzSzVC%tg2E=`G$_(^Y1`b18&T`+Wtdc}KIBR+2=z=Pl3My`NGav%VE
    zAk&7hR>6{imBUxi0eN{(7?NN30_JyROmR8i!zba}!VIlA8s9KSLr;Oh1NPop7~vXc
    z(#EDXv|Havlt~j&VGlT;lMR#d@3u#H_TZ|+bJDW}#>F)TZzxEUO%9iRo70u?`wsUp
    z9QJLr=NFNeg`MCs2%v4{7N^vc{XU@mpk?Kjrz9(GQ6YiL1A0;&%Dg*-CVaw|f!{c{
    z!FRt->g7$$ikg=Mt;4S${g}&_d5#Y4X=?ic&7gUMz0~{Ohr~#T!S;&dhyu|SOocwr{l%3d5VkZc|
    zrw5vLnpwhg?E7N1*!^hK;~m%k%uN&t(BGneJZL<1>=scMnzM0$=E*>kWL5hlR~(N=
    z{Z1$2X4Jdc#*jyYoF7qSGcL{Ih4?>UgJBm(LcV&)5BE%Cn$>7~EF)=gChc%wzqB$0
    zP_YLA=dr}W$(Z6*iRx=U_VozYWKLg%v
    z%r-e@e13fx=iM|sN^=G}
    zH>g1mTJh!Nevv;7v$&R}-t6dRlQ`Qny%i7cOlfm(mcVnzL
    z8iElgc4Tm++}U?9xqFG`5uTpK$_~NRbEdYeP2(qRS3B0kZMGkbfPE9~kBOyRNRfU(
    zum&Dei}jXpTD@W>VRQVoqr_sK{fHU=g>plbLBmixlEZ!$*@9nNtAR*
    zgNgY_w2C#D`D=Y>dzYK!efyn_?)%t99#(gQuJWt}U6GM*P3_J0XM;t`h=};gvb2oE
    z!f~;~?xS$$V>cu`M|W<}aTqGlB4z^cr%(>q;GsS%OuY&O-2l0h;@#`(v#|br9WqQf
    z*ykcYwv$u+$0LRk5)!dKkM8
    zHiG~v&D+nPF*Do=sr0m<(S51c8LJh2@4bFNZ_r!=zYbTa9mA8(J$yD+rYSs{EvuFA
    z7A6hAN2$8fD*v0dn6i8R#QhdYPC77+adnxPbK`19y*;eE9ntWUtM8k7`kUVr^moXA
    zTv#-123}u=J#^leGH6a#9@e2*rP9_pkm0`Ca}bie$_wg5P(A|}g*(iYNtRnYL#3X!
    zb}WJE`3j5>d#u3U(tWpD7*-!7Bu+4T^IhmNljyR2X}N?WnmOK`k@#{@ZduiqJce1+
    z!3Yi5zh3MbJ9Aya#?Kb(!tCJ^Dy;||sNR!96%G2>;dr^`_@1`hGbFXDyJ6t^noz8d
    zCI5vLvRWb~P8SKG88W@EuV$>Lzh|5VV&V@o9ZAQ`1=sd-Zm7lrZ6JW_6tVgP;7{`~
    zFn9slk;vmc)KDkb#2gP^fFAI&bJ*|h>>z;d@duCl
    zL%D%A&~weVal(fO5Hxx>-_q++EzN0EI%qbyC4tsO+v_2Kdj-nh7Z*sfpW6Ldp?YUK
    z3;y`2{pbLC?0+JCxm5XpfdgDw0D|cwO&59oJvXEP0|8KzOM{y$!J%@cr53zRBQf=j
    z=y|-?`Qg6D4e&@RP5}dC8`v^b{x3h0>&S-Wzn>{L^)T=fT9iWJhpR_=!DR4A0kmZA
    zW+mjsS+QOPOV+)k9BocT+}fx>4>SW{y5?*g=%$&(%5!m9s$o4EBmLM%`3OC_nbZK)P6a&klX^A!D&=;ThNSj$p%{&s_Fg&6|67O>+&ikqKq)
    zaq8{U4B(#0mN3a$mmoD;J>?Mex7c~|0E9)r2>m{ziZIQWeZ~sRzP_3H$ZF8Ifiy+1
    zU4j0H2lCs5oJ2&BQLjw$bYIeQDr)`#_{1BHEKxe_IbGcq3&Di&7-5;jGZyPf?nvC{
    zk&)w@X+fP1AgcOls%VTs=A_g<0(+iX+#S!N_KbtFw(i6q(vgOQY53`yy?oT-nD^e_
    zX%QR~p}{Gk)-GY<<(`=j>KIF6Dfc+SOD7^HT1xjsQ=EaMH^xH9m`Zps-;{ORKi>P~
    zxECtN4k;!%`_l+ZkA&RM`2p&uT+P9!-qrASsRa`6>Q78c#XhyI6e{5f+GgV?)Gq~9
    zXuk?G3KzIZ-XvnJ6Yo!^3Z93VQr5avEK4a6E;~Z>6mrg{d?NOvm1*D~J
    zG#~cKuwSfC_6iQ4n1d!XmF)1EmJTy{!tH6}bm4XUu+?!nD@dq_Vi8w$9D6xCDEuTH
    zJu|ymN#(v&H#Xp+uw|I&c+mSJN(EiYp$$Eik`pC_8TG8#gpa_GH&8q7sjtkhb)q|)
    z&o7H*w(04P>5au-jTY`$aLijL*4+TuD(i}cP@kv=WbfVvC53z#x3kLEdtL5j@#J+)
    zMX!o*og@>E2^`Hw>&)kd8ivB^u{YzAxx1C_89LGy8zloQDt6!5hdYf`HwU_di10h#
    z3}^caqB2Ldo?IrqFF1WWE#6tUq^Dp6~*}p|W<%~HCB>RT+Qqsxsx?WP(nt-q8_r(Wt|A%OkuhaNtFE1m|s%X*lIAPT9<#D$Lh
    zr%g~q`G--4IO{_dzK0>f1C|QG!@+f86Lg6mHT1b&w%k7UD-w7JwOb!4;~PJJ)Pl3#
    zG^VYJGegZfVyT5Hvus{(nAKopure|Ka1Q4}N#GhKFK_)R|*
    zHuu4;!@f@KrGucUM38H}%AzDE69;;zE;>I|00=2Ea2*N$m+Fc1eWEzhK5h;Am|G#S
    zrB|zA(JgV=mg19a~y>D6VhD?rrAi_#Zxv&tH1!JavHr1NLV*;9x`7}
    z>mSP6(#W$cgrIi(5HO(EOI4RbxdP!j!sweP^{Jy2TDl#7H_+9d+c~y0T-WTIXU)fy
    z$TCCnBi-PgJUzygdLbCf%&tH4F~E>~K~rxzxFK{=+R}KDL>f8p$c2byuod`;BAJG5
    zuQ$xwLn7n-hM5z3CSul;(!4Y4Hcy{V
    ztG+HhU13C650Hz~(S5oR`5d-}>De1;gsu#vf;TX_TiJHoLya-X5)|l|>rcfyB1*i#
    zIZc8ct*&RG8#XtQ$k1TBRGV-6Tgd(!D=wCjO#^!biHBHgUx%10k>E{TtVlnSh!ZM*
    z)1`nZlWqLvK~HRez%GLQ2ch>qN^e*kz4t!=RyB%0w%2J0oO6C4Sd_Q0D_MN8Nf#y)
    zGahV2hHW+5HsAw2{f|hT21DD|XCv>SWJS9|gYb72z;kN-Ns(cKB8ngGYvT4K(x@os
    zTa8X*SGSq$10?VMOlMHt(Oo?t@n8*7g88Jsv$y{gDEa^`c$_o^OV7NUE~kmn=1%ux
    z1w?Z(A`y!`2)UJ>Dd4wAY30eR>sRapC_^e4RP)L&<&SPLEh*#0?rmerE8m*zHTe?5
    z9d@mNzfZ1Bm9f#`NO;-MMvUXC(SiX}lh9W;Q65!-0~woP+aIqe`k0dG!Lz#v{oBoX
    zV7<~4T-Tg7SoDVpM3}zUF)0oTe)B%Dci@1O;7w=?2Wjqp(#kp6lo%uMdPzv3A$Csz
    zlwtCWCW{5@?A~*_MB|<6U(tB>V4yi=%Of=Ny*!z!$vK3TK9aj;UasP8e};vM#nG!zvi*p-w1#Ak}n{R+;Rvl#M`PK!v`|;~j;}sJ%=N=1;W5
    zalIFt8&ijeh#b`hEHFo>MPlVaErL4|}>wvNHi8Lqpzzw#)nm^*CQ~aPdJS`H7
    zui&~+cY<3-hgs*-`$i>nO6*JmLVC|^&3Kp_ISQd83N}c
    zY#z4GVa#D6Hl`_>I2*C!VdDF5ag7;b1J6Z2=N6q|2tSnIo>@9Z{4cMozD0Ml-n(3)=J3M9LyD%
    z+jzRp8g9?|;(m7x;hAPKZ^E$6Jk)c2PAr5bH?4QRdi7^FoUywgvD(l`Z?(`lHVhz&
    zI&z8$ZbQAwbAR{pL}riWTP@+j8o2F<;N?+=4)Rg1gMf$uOq*12>ml$m!Ab**s4E$V
    zB%+yut{gZZJ_+2LhbBN}Raz$>7j%zXt-x{wsStqv33Fd|n+9#QMVZOQ9}03eB^Z3EH5ritT7
    zw7W3{ey|K*a#Q5nW~&-PTs@YrPBio%_T-_6Tk-KeHdGI0p`~yfpjN
    zdlM-YQC*m@iG_qT1=nM)5$HyDMV3N*ew;QM@SSBdwVU=t}7RZ|Tr#c=e=?(oA2V)ow<;R3778
    z&>0d6L6r)clO`3yMs!z$uet=p&HDxpc55;Mm&Y
    z*fc8!re+`wDSy9K(yRv$p7E3ti*}VP?ka&4UCxA$xE!%o$Q#Z!JGZa-Zxj#XWT&!c
    zoUO=JmP|C+ZPptiOaRX{-gJ=Ras}*KZUPLiy(HVlSy!v#R3m*vN0)5Mspaih{TX3i
    zS7?D6)Zmz~9lMJM4+@>ugu+rs^bHR5qL-ICec+!i;*gyn^Ck%lRoKLBs-y||%Q6j3
    zsdn=hI^b}^Z-=Hor`P7y?B;}-3XIrDa{+)b2y|M
    zq+)zOX@y2q6*%^#WxxOoyVfvNR+OugdFC+63rZb|%A4oRLSA~bKeGn$WAS;kK|-+uo2&{Qi=l`=iObIK63%8np=Q<~K}q55Wg
    zR;j5mL&|_PXl#%cw|8)d9SvmfqTaid7mnYDuMbVkqnMUT7D^Vb=ns3x3Dij%TF3Sq
    zOZyC?sHmOQ@_q}9M&vaA0PUQnYMN`FdT3AvHrD+OPSkUGq$_R@s!}m4qC(c5D
    zkni&Bt;*g_berEm+=aFykFV7@`!lWt+cA&OZP57k95)cbvA1OuueQo-Ow+eEPdk5C
    z(eZLmnb70NKp|o0daxvJb7tiZCk*H8c623w$X5kTWw*YH9WiP6v?yM<5AMKTp!0Q4Oqc4cgzZ=JO-6A((Z4ZfE-m>=fwA8z2v;Q8djS-c_qLjJOR
    zs2zPz!>uV|e8%~kU0HcK1>ZziHjWV2NA>uR(zvhl-KjX&s`EfvT37QuZJEV8uDE#z
    zy!p&MXtb|#;v@2eQge=j;fnX46Zv9_X
    zAyRh(Lmm
    z>vtK_tTHztx
    zA61~1WMaSzerXlHugc^4B%>Sa%s
    zKHbQn9VCry^$xwR0N1H!ilMmSFqQS%HOd{>}$M{
    zWUX>SPP$V0Jaho>ON&T5-{%nwt~wxB8AMT{IXw=`CJ8F
    zM7(_8kfdFuC#PjSB$wj!>6Pn5?RZht=;)7q$Ax1J->my7s}C40GcH5TS5wy7Gv-+l
    z*0#=P+)A4spU;9*;7gM?Y#MYqyPZzSmxAzMx_*8@o#7TL)uNi=&c-OysOp5*mhTO@
    zOnz19C$^-a_J6SV7C>=!-MV07!68U+0znfTf_nrH9$bT4LvRR?27(7CcyJ5u?(Xh1
    zu0a}i>CF3`x&L?ao!?GP&8>Uy)KscNztFvP?X~xM*0a{`2=z=4-3*{)4CcuoO
    zen-r?&CJILNu|=-FvccU1*Y}l-GC7z9oW1*
    zFtP|zT>g9jj(+{J71d7n@!YAKkTw~8Tm*O>Q~Kcis)i`&*3v-*RZ5ZjCcSZ+jy&G5
    z9THD3>k=E0aqYu%#3jvr_mlOV@~EA&;Pddk7kprgKBG@;vSsQB@ziGCw5{WI*)t|n
    zPD=_xjP%x@Y78n@^()=L`VPyL0u!_f*s3DH(3|s<6JcC;Y;pzJgOATu6sZoKbE57?Kl+nxNZ|}0{cvSROsC=5U47NJ4rpUNXFbwG~#KL
    zP`_=Z^!VEfw1MwGkZ+1xw}b*Qx6+atWuGI70^6v(V&|+N&(_eXl(WTUrQ&HY3D*;|
    zHJ1PZM*kiUenh_DWpk1~2QgmyesEyYl
    z!{O2@GDsp7_IuXsZ%z=cmrWuqug0_!vQn4#oRlf2RBRWzB
    z=-x9e3-YtKB%pqO<@!cU67au9=qO$H<(ErpuQoXX4nNj6@W!+UjK=u}4U~G>wX!a|fCR2`6ACOsgY(MWhCG6Bq2LRF(~**&j`0mhRkC)I?;x%3hEnE3y;x
    zC9@|{H&poOaq9}x*bZP03RRVimRwSvdJI8Qekg|Q`0v0GfqJ{fF9G`}l{oDh9iZ9}
    z=xeYvQVI{&^*KQ?-QSkY>qya@I|aX@3VHNM6F_Wx+9`NAyRO&_vK*Lp9{bNFNm
    zm*Lm}_x_XI+|FH?3t=@A)ONa*X*=eky~B(tlpByrgxyBipuU
    zpmo7+ZM4>6dD5ueVfKi44`;YT76tf%!ahdl0`<3gsjLld)&M%GcQk-&ar5_|t|G6YjD
    zK%Fq+yDvAYqQ8IIvV4)np2nRo&;m)!kV?h|7&Z#ejomRw)UaMm~o}Q
    z{PHhzB1PAT%5~^I>B&+*8-1pBB3S}kw@l#4nGOvvw`|8T*8H{_m8#&r<4exwQH&^J
    z#ELN?^4VIe`mIXkpcPtJA0rkQDxF~}XyhZPTjwtw%7R({0tvH=9pf9o8InWO#2XGZ
    z;RF{&54doN2R?YS5#Yl|(Fs{&Fqgn*{()Q+#YI7}df)bmYM{cCk1*!iTp{*|?R^zL
    zhOaOv`^TQ&IZ`v5#;ka&(ZFz1Jrbes3
    zi!ZP!$=NlpUYLz+G+}LSZti?f`lo{<
    zJ6LDXSDO1XNg)DYf|%~csf*eQk5)jlbxyvUTaflBZd<^+CLq(U6b=}x90E7SN?qlGXE$zS6C<$(~Y$!BJYNGpXLqKe2k4XHH~-{34)IRQi*%v
    z*sCYiO)i%wbV^+rwBbA$Khh0Bs33%e7+vO%|F;7#dlCW6oLuY<-nt?6`vZXE
    zn2Mb}0Lmh=^*ZEt5vb34fOI};oxK;xcqq?>j7g3Hbh=U?hskdbGmv@3d%&85Y_h{?
    zA}Z2u;7tI3-{4+?VjSMO_QhZyPB8|bn-u#=YYrHivjDyAw+Cyn-^5qyw}Qeg{%CZ2
    z>BTP)js@hm?sEVB@Xz}$#SJOFHk`c$7}wllHQb}OX!8I-1(Zhi*Qe3nr}e!C9tmqs
    zGORYN9Mkyf4L>P->pwd&{d>Fr+6i*`aGheBo+6t!7nlb#Cw04VN4HiV8KU2%
    zCKjVsK0j!+YvSks1&aI2;%fbUG5&vbW&TCsW+jQu-g8(3sws&IN@o6mZ1W3r1PE5x
    zU!TnXBD%k?bLC;GeK-jZpq_?tVPP-fzPymD2S`uEZ|^JN|7<7xKW`1>o2j25YkykS
    z4O*DqF%#8yAQea2+{k|rBlvS5lUx7)f&AZLcjHMeSkYSKW<|M3hAonKWuWSQO0#nP
    zZC^~7sW9JaZ9rNCJUU%!k_BHH;H?P!HN_8~&G@2>YNPdO=e{Nq()O_#_amj>t?VF;
    zz3<-O5M(*->sVL|3YYLozi}JEEiY!TkOvL}m}z(0VsM&*rQi&$OzT8bsj9@Fk4<>B
    zl%NY9$1Z{1Z?TH8i^og<3a|~ZHaJzPTDiRhc&roeOC67K@4W%bpfnCR8ml*d?|hhv
    zzXpN|vcI2;@&Um+FGJ%M^o&OOtC_vbuo;Awv^GO6hJ{E?8}P+@&lxZnNIg)&^-b&xLaS#u{0(RfP=3{(vjWO4hRAC_Ni3v
    zwY97s?%H+Q+bRFf28L|x;t?HiQ52qI?{hj+ak`tgHti4>O%2P{{c>V|b9dI#^njVe
    zV=1f}Rmpu&;sSj*uTuA03B-bM4nnL@fD!>Zd0~cu~^wnIfL4@p}<6%M<9rqU9wY8DyR&8cv)D<&-V#
    z%n#u6#O{+lT-}&_o{r00ecWg*I4A*GOO|$euv%wzSl42i;x^;;6u%jnmrZsUX#29g
    z{Gpy?PuScXb5E3Hib^U**@IO+0S)X|l31H;i@t{N?adh{2AYa=kCc`K$Q_=T*Wi{p
    z-jgEysllo?dXG4FI)1p~gZ*ZH9j#3PpY}S(kcQQ_mNgzVC-CMw21{U<+ef&+Z(NTgJEzs+~vAQPd$6ID;vc^VBmoYcO
    zPc>q{3dI{~^&81?3ea5?enZ&2x*XSDw#F|FsMfK}J9(7ygSfif1?9btP$0*q+?UH-
    zYCEMpnP-W7QpOCh*Op-s!RxH1C0RVp{!I_1Km>gQ+`6_2QoWiaw0Gn*ZNk*nu^
    zlH76J(O?osrnCRl>*&%Yx{uB1j#K;>=tHatlkhnHx95w!+ukqhY^?;DWR5-5Ceo{0
    znpE=^AL7V=5|0?4RcVI3M{b9fBj$@g2CLLjb`v6O-fj}rR$K>c&vxDxacN(FMyv88
    zGg*}qlWA7hmO7oKp^qxeTc+
    zBPIO`U)Ztmc0lz4*6Z8%C%l>Gel{2c-qSw~qbyC%)z&6SB|uFw6VG$mRJ)n4r$f2<
    z`c$Blul9I2*-fqkZ^?3YhRn+H=<*s|rTnt`a*mKY?g-hh2H$QOII;VD=s7aX^cD{9
    zRE&dmX$$jdOU&Wxij<_YIpvqw=J}+@5-u6Mu*j7(CLp9@!q1|XP#5OQ>om@}Hruwt
    zSPF`H9WT=mcqfcnmk1xZqeSbIwEu`HSN*as8Y#f;Jy39I8yPpjUL3g4;?p+`-UgzC
    z9}QtmxzBe3hfrc%j5H83X-Q0%@0m#@R41yC%f`$+qSgg?7^(tT)ih*P2}Vr6x+dUr
    zdrU7<*<&*pz4V-qB)Y_Sj)dDm^wo6jt0sX$grfLqMLQX{bwE_ITUan>;0TbX{xrFU
    zs!=yBfcs}LeDE^msncnd%!d=A2a#SVTSUyDXX~zw%i{guwz>Vz)fd-nWpRqu&SudS
    zg=3sBLP6I#2Hq(0A4yZt`tLMFp?l)=!3IrI`~dPZ3&gpCG(uCM!}z5rk)#{oPay-~Qo-od7CdRKp>g2FG*Ln2Wf
    zI|X3*$^mMm1aO+ZE>*?7S346JvI}TE#hGb6z-EX0F)y+lPKg+T0vKh+8cd!DF
    zsfEnJcLuK--D7tXQ-c`&OP(&7hK>Z4oCJ`^YDQ*zt=v_|d{
    z9G&PHwz7wIsye*X4w!iX&98fA57h0U$-#%D4%(J0j*a*-jAi|d-iYDez{RaZ&w)eA
    z@2}o^Kscv#$Ibx2NUl6ZKW(#GeaF=A&fLoq&@&(R
    z5)WKr64kd`mnf=2j_e8qqCqaurvV-m3J@4rNgepMrX~D#rQ>C{E52X2+qqW-jsG0T
    zupY!d7@;7jZc&++S@8>01K{NZg+Od5fMWVn{a!+B0$FT)y3@=r&;bqP93|_{4xS;{
    z3J0}bt6?*$g)gkUk1e*-9sW^6D`#$|OJn}Amr_a_-_XfPUF@EY6EY^G2E?E80n{e3
    zwP#=9J`1IAgw|_ivq#-eA^_pTGC0SXh8$x9O^vvg1`ynI7oZj1c5p&1pL}6vdpkNd
    zUAhqEP}{yXyl_%!>N{VwQoeYlv`&3eu)=~)VR8hFQXUm*SHhrFv-`=Igv*#D_!Z@C
    zS^_i9Bpjcl^(SQk&?z9$(qAp^N;Y-n;Pm?Qp|q^<+
    zc*Sj2eFEh?e!=To)cha|PT9K~ccS6aN9g)b)ZV(cv+1}HkYhz%f9a-K-k$Nmd_UFs
    z)==Ydb~JM^Iwq*zunR4?KbDIx5;yLRHIP_#7w($!5bU*m)8Yb*-R07@&FR$+m52FY
    zYTZW8`%t&fth{=>Vi%`=rGp`LAP22?2?&xE{6OeJ=;=NBlyPR~gyIuo3e5y8X^l+FwXZQ+$nu+Hz3MYep%`j6@p0}d7NB|GyHvv(xzz$)i`s)l*9Y+EXsyIvoaMrEd0~|%85TGx9
    z0qnP^R;|~M0JR|XSBYb3n=7~iE`h~q05$=|`!I7r%H9w^AXOXOBSDUTlsI=KO<2S$
    zOd|<$h0eEdNdfn1GVe_ef{&9tzPjtb$Q;Xd+YAe-;P8ulMd6G4seC;Q*cjw$$|K~e
    z?Fw?eyz+$mNV%e6b((zH6Ffw?&|_dEKzgC`$VUWW_~l#fQcm~2_6GS6;KT+GUeRa(N;Gr)EZr4+W&;xV9~aF;8i
    zv6!m2*(NDn3_5x6S>R5&T7v`Yxs0mbNYOU64;|mg-EKasXoPo#6ko33F6uAoLOR4)
    z;$4*zO6cIjgTthtCyt>Ns|a6u5hEfg)&9*QEozGq-vtoxxwn9$5K}vLbT=ttuDBXK
    zr+kXj*>jYPH7gEU?oLbbN$tO^Ztk|ZB0EAw)|MEgPUfB+s-Y{f*?JlHU49lb=`
    zBSG5~ll*PtYvzo8t}iKz;2s4Yl}(+w6tI1UcbeiyI&DH0D8AEc*Yra=d$6#KdP(d(da?`;O?xG>;<0p
    zYYtBw#W$zNDX__fIFHDwWc87ePm1p4di#Rwy3l}g!>r&9L7Jw7)
    zo|05SvDtdow=EB@n$<-Sql%{Cu>i^igMaks|MDpio(!DTWyK6M@
    z(WB9Hn(*Z@BK2MUhz^PrjKrp*7G(O@i|U1zPq_pD5d5}Gvi`aVi456;#HQvTbFTq5
    z*_$V|Vz*bfv+O^tP*tr-sLQ6*;x369`B3!VcNGSIp~mEOzs(9?5uI-(>9`w*Ys0
    zGNv<1jiTH(vZb2ZWX!)__4{_CN(Y3ex~0l9D!cmE_6!?!Wf_)8QBb_Zy2Te7H$!D+
    z558z7c-`FUXl;+)H2tAQ%eBcTlTW4ar3tq8o2?r|r}kyhpRGl1@m)#I8_>=??U73t
    zYcDsY^dRP@x`?4@i%S%|$0iFm{ot=*c`7EIHLi$eiBqW>>yoBxq5Zr`dKorfzR{T~h;M$vfKYSrh*7QV3WlD_nPT0#
    z-&sNZnfw?NM%Ne+a
    zx9Z6e$djp=%_EUJu4Hv~S`2WPzSf$$e7DRSGE;k=UBe}T1{|#~e
    zf2IBZGn&Etx?}(DHAA$JN5W;zMCDuMmO7E7rS#=-=?%w)v
    zYR#^SV(M)8>W**+b?@6oUEN;f}C>
    zk_}-d2%5(7@xG}LRiec}-)A_!Otde+mXxM@d89>(e2SLs+%xO;#m1Ff18YEfET>5yi0r~Y^p@VssD<^=v6I=E`rY~BNfd?hY*gU%1KSSQ?nVZUGARY
    z&nu0Sta)7t>k1K{nBkA=FpR;-zQ-KOW6~H0e8J8?tL5eMYA00{%V${6*T{(7&9v^l
    zi|baO83=Q()jFiHEx{ai){X+%uFwrzPKOjh{ycKoVKkn$!OA8WJ|AL8Q(Ma$kc=a##!Xh%Ajkw1-^gw3sW`1b2nrSa%Wl)*M#ap^p8z^Sv0-G`00L
    zX~RH@@?eUfJ=w(o^`)&IBviLdx|e2!3vQKK4MeBttoRF1O?e@uR4}g_>5TM-#XOBG
    zE*?9R#F^b)hXNs<9-`ZuH*Z`%_tTQ+xf)&J*T#)9CiSqCpUTAGCS2YR)r@}GTX$1cE@Jddd}68EIl
    zxZ6o>6yS{Z_TTcsLq7rbzl40~Ot8`>c!aadqV*Q-Nv9jYjL;5za230K;#x8LSNhVJ
    zYr!AvrPANnOIKjF=iA2*-&HdE$rmykIQk5gOz;*p{O)-Go9#bC*G{qkGyuO7-VFR4
    zlW^RjI+_+Wh&)c~Fc2FWyu%H^WzK*$T$)S_GUF<}HjJ>>o*^Q0{%$5OI5C5qfT+F9
    zqqI>zaIt?oi@=srloxb9xYaPd5i&3gOI;Q+F-1<`D)7vd<@+W_IX|+LjWwHY8QE`_
    zqt(s?i{{58G3S3K&a++R#Gn$d9i^FI!;mB#%F)Ln6v=txxI0;$Uv16o7FszlE{TS+
    z85XO-ND<9}Dk5(pB}_xoo8*0Cg*zm;kqV!VTJJZq!(1uo^Sd!dP}G-jb2=kSos246
    znp>JwuU{J1Z4GgSSnL8U2KY3*=QQ`MwNi9^+bfInM(a-Oh!+O%Pv%Bmjx6-r!6IOO
    zXJWNtRq$E!OOd<#v~pM=?5S%k{OdNPcgEFozGw8tTz@`l!Ae^pxd>X^lApI=AYMXg
    z+~9AjG)GI#LCa5PzBuiAJoAOVJE!w!lC`2qP+SF10g;c=79xe|>r`=)UaQq}YX~7!
    zbJs!MqePBL+u}?%9#pfNo6ze-#T--d7(umTXUNdxW`F8AC^O{mUPw=O;BQm`-PmMs
    zOBfr!7I8yRm3Bo106;wXe=)jyj$unxqIeT3Izd?w*6`VnIDAhbvVyIVQRP~^WGm2W
    znAAHW$JaIX64Xh`wIjy%Mh|ux-0)U9g8#Te9YfFP~;#5
    zG6}PTVY1)c*8=R8tb1z|FnhHKquLj_sjLcj9zIq9fWP##@3gRbEMJ5VDH6R0hXkYn
    zAsf83u3w+Ti+Sg>GxbF`_IWSK_Fs2bb)p(-048m>gq(1(@*k|P!kg=T3M*=Mz?4C9D5fdhsW
    zb^Xiys#S)*H^NVA6~K13(O%Swjt+5|3^H;f^!TXXL@|uqKO*K+u@8N81?VeBK}IJO
    zd@<0r6KJPkFJ?VyA{oh+7Uw;6@FRpBk`bKuN-;f{R@-}*)6^4KSG@gB^yc4$5mleL
    z`5H1%$0NTaIK9tew29Nls;B}>lMl;pG&RWigvoB{@phH3*2OqFG18sIq6!fsy6Lak
    zj$tbfR{HL(pUxZABD!rS$koLg^$iH$pgq-uW5s-_Lxf=N*FL2#v+g&Z#25R9@F5>_
    zxHPmv0Ih(;^b^s@=fvn01M3t6_3{Y$1~Efl0i~L0>*!&owI@MsLvJ4$A(_)|b#mif
    zTgerE{aS4Fu-%Yo6yfrHQuBxOkiXR63nNG79o8?W$7uacPW`GHQ#{Yv@XYEf0~UCq
    zX$Hw9C(4WiP<*(~`|g_ER}n?n-#6B`HcVb%@`FoR*Fzjw53$A*HrWc#2;Vevib^gT
    z+cDB%%?q0oYBSX451L)}=P6JJvweSSW){v6S|fG%h4j7WijxD>9T6b-R29FGsZA1j
    z4WGG`(Ub;4JjeQJH?U3#Xand_K%k7*{s30?$&&9eZz*f>RgB2P#9~&$8?=FLLJw)i
    zZPhKuuskerYVRqKMN;ElT-5OM3Q?EK5P8w9l5`Ul1W~)Vbl!Ez730v=4c^J_;Q~vI
    zt6MK$ciu@q8QVj3v`_}*1O=F{GDclnCm(Yi`*6)tZQvr*io?qF@ltQWO~3=Kf2Ia2
    zg*|YA$nzFmH(C}M0TlZX-@%SaOYD5P?7d1Uk*x^@(YXmdYPDeFx%SP)B}`kayhB9U
    z5;Wwm>;7H{&M1|RFRPR#6YZF!qV4EOO`!pyH6$F!2d3aw4&*@X8Mdy=%LS1_gN2a~
    z4Y;1_OE_JT;Fv+St|9=~VrlF1OeOv(%*TGoyt{pa{<3(lkD8WP%z_WA%XXXVPW+uO
    zAzo8Vl*)d`ZE<(ikA~(*kHONaJ&a4Nu|*^9Fk>_Z6jd85Ejiwe$j>TD-j<>blh^nolEnNUEdK4^^xb<1hTw0
    z&;>OijUP%z)C5-zKDAg2(~_)01G6O;Vtis2)xIl(&@0cH*vju`X?(f-(4+3X|G-c^
    zTRkBSt$nI5P9IMGxODH?yL9v-TCJzY%-A&0|j=eM;1kY6q(Z*AFt6eH#*1^TLRu+O^tdb~m_G8(Z
    zJcqIng6K>+TNa2
    zmIkvk$|Wa+wd`t5<8g%RSY>FAJyuH9!9qt7r?n&b$=OMFx^lz8Fu{;YN*gX={vIcM
    z04aCpT|;y_SF||w*fQ7g-W$3JtFm4S9nVQ>=B+qq`O>JDyIetT~EIxttR8X!k@Rnsq{%ezNf;hdeTI?A~87qH^)?k*V5K)+Fi
    zPP7VtrxZaYN|Xvc#(^&4gl9G{a+0|(u+vxJBlqqD+x
    zN8#dpV4h^mqq2uoAfJP6HJ{50E%pg^qOBCwKEanSqYBviB@n4`)3Ul*wu~^=+{Tpd
    z{CF-KaV;NH?7o-4g=ttg^C0?cU59KbGK)c~q{Y!XWGo
    zN)%cxz@3M%h4)rC@g*}?<+D)mV4QB#7f}PSlMBvk@Y3)ZnHlLAdB2*gd
    z!gVx}VfHkO(0LjI=HXWRJ0LG35TZD(!r>i_fQ3*bteTzd`mNt7yeR+DwIb1$q>K*i
    zmzU7y?--f=f$FX}aF^_&r8rZjP_nT&PRCyr;iY>pVTn(?#h@*E9SBz!YgWv7m1wdw
    zO}Vmh5?1Q^hE4{Y%c9=*v$97fO!p;XOloOlrvTKCT#zrocp{E5?)GwTTfjVK$a0w*
    z!mC9mv@VHP`S~~$c7TQi0%3k4Dp;6_zwE8@kUHD(Pmh{TeCN>Q8M`6I;6{gaA)*kg
    zJi&c*&?vxqzryD=-Q5FgwBH^&-N@fy2d?u
    zh=myAWxtvcDy5HTZ;oa`QcKE1`5H{)-I-@vjaI+iHh8Jh4f@^0oOCw{ltmm;WqHWp
    zOP&`et*yBzWk>t@lnc6!%tj{uBqENhTXGeRdRh*bY}Zv=E#)5W+_2Pr>79$N)9+V~
    zPS?diqkbaBD^|lhLHRS0ayGeM--H8WKuo)lv?y*)tYMSv1`tTl9VJx
    zU!q2aZ0!#7apqJ=M*gkfgchcuJYmT
    zqIHK0N9jkd*}-NZ0HPDkT$R9t2$4&>;R&x5^L=gWgK+Mgo`WJ{EQyyT_SwkM^Wv|3Q
    z05E`PaC>9-fMPv1B(`J;2@t!LNx==fZ5`UP$P76SZ~F(<=|8eq|LyNeK3%~@6~|l8
    zjc4EdM;sRw5XWWrKSH-`W841~^zldJR*Shn*zqj<)xzw9PY!@%_yu)+}lgw
    z=c^~Hzd*kSZZ!d1|5IcDj4cJ;oa1Sl{|?e<4*)THB?G-I(qmh7aC5iJadQ=Kf%%?moS
    z2A#AUY(*f5;RNziMV;6mvZ)353_b#MMFXC0wY{;97b-Ddw{>`1h8oGnWCj5&rtu*b
    zh=*VYzS9P<1AxS!6;-3RC;+B$jSiUp1nT>-z5?gJKtyiQ)@n&`Sk<7`Mu3*@5rk{s
    z#_IDPJ4RN7W3*;kKu$!jyv&`u<-^Vr+pVoLf437Kzms^@;fE;*H*hq3sB6)6#~B7t4=<3w^B?ag6bY
    zXie|JNMbL!jjxTEeM8U@FuZk0h1NMq_Bgk1yOs+JYYJ|Kf}ghpMEsY!ER*Q21K|9t
    zwE_I4sXWr@??K2BWt8swzd$pE)4hAd+D}pg^M}_FFz3UxI@*PP$ZS6MQ7U{~ynl9|
    zMIO$3_{6u@*s3G*veI^7p$7gO_CuCa-oho-;}-}RUQgWPtWn6N*pUzX$)>AiUT*vk
    z_u5ZhQ^Pq#V`MLgB*Hfb9Xtzp_q4eTLv29!QOB*%$v9;rt;*#;fU!q|v!*T{HTdYM
    zZ0mfiWq1-BF;q@_rtK2r#Xi2o7JrXw
    zaVaA7Ke|ZhegyA*I2P*wqGLK@v@IX&>HPepo>tIF)|PuD9`Za+fsULqJ0Z{n1D)aZ
    zN{hiaXF(;McI)*~e4eF)4pOH=Q{ltn4`FZdEI$^9D892{v3bSDqaQlcMn~)U_upc0@dAL-AyFQa*>+*}6l)
    z%+z{q9Fm6KO;*_)2$t%-fGr!mYg=-72-Sap$R8PvAAEBC+nhc>TX~4MTZQ<$FWLsS
    z!3`E_+iE#(#t>U%=O607NE4Ilxcc!Tu=vs=(LFLNq~Gy_vD%?beUk4Xj>2F*eq>)=tV)*fan*D=jtoVX;qUe&v#5+gsqy=)Hp!C)?2+0c5pVz2yQhDyp%P=c
    znmfMmiw^T7v$&p-*Ap%FiMC}0f=mEK2xnfvNap8$Qpty~JT^6bySH%0X~xAIv=+aA
    zum&lg#9!tL!6AT7LxgNoL>(xyj8J&3G_8iu5d-h!WIymD(M_Q1x^Y8}RJ%H;7&=HF8m3EdBT3Qa{T
    zq}sP_oeKoqxwN-{k0`=J17%GQ1Dm<+1Y$g5$HqOlAB^YAmB`ySaI)&{{wm^i8`)lm
    zF(=P6c1wNNarRHzd>*_AA-M5i$9`Tefnh~@y`kDIFY!IBm0~NPkBhO=Gl;P_BzF_
    zl-hdvXmK@jYnp%s?dDj3I^0<0hqPT6ooLps~cP@qot0_?$m5{TDZ>F^zV*V0rU)Kg&_jfa%^)FBbyak22b
    zVXSGY=U^&_X0SD+nk^adEx<5sTw4B=mOnLar%Z`;l2dK8Z2ym(*tK$tD0N(3nGXTd
    z3JNX}yoz)fTf)JffFF9_7mz
    zAB`q84J%Hs^`C?KXNUETS{P_80%5BFNbZsurtsSJ$3Rwqi4p1HVg%hlS7v`Dqc6
    z;;nc_7i8O;Hf8x@aJX|v;O!>`r1I34Mi~(&InfO86G}=9skfMI14$-Q5`LPr--g47M*8*EC
    z_H0;5<|Iq>mZva-RvZcroxK}ndygvzh+t|XX)ohzk6P}x!eOD7(!0WjLq?Lk^4-sW
    zFE8!O2G%oh`l_*bt?hM9eYv!XTs4!B;|9rQ#4on~e74kS33aPeig^1Qx>KkN#os$-
    zjqkW#?uXXAbbzO-IBPforB
    z%aUXTKXY^x6MbK#r^EkDmX`}*1P9}6=tuW}^HxsFR73974Y)OuO{zl3;2$XO?R!!T
    z==Eo5rF!WL%yU)Rcq5d>tT-bX(amV<^b*1O0KpWQR~pHc*6WaM6+i9f;6LU1&$crO
    zGK<09x!%Lm;K;u~LjtsOF@MvXf7_6=G9&(%e&RfFK<3KL;1E|CrliVdlt*&??z;!MzLs|=&0&UyImPdkUG
    zUwvyTqEpeNM#Z~Og-<1KsV!YyuPE+548`})UHqdtTD|aqc__qae<(U6Qx8uHer4q?
    z&uRUoYKPva>x0XeR)mkMhpeynyY!#c)V9{^NfJqCPM1XUR#VWY^vrGaiFG$(&D|9s
    z!fg7?UJjYt>b{x1n}9+3KJWbF1LEQRn*tqcvL=_L5dEb$D4o#V{KpO$&zMTl)RMR~
    z87LaFy}#RVNixfIl2yeoT;^LO&0aS9H&<81T|HI79)fW|Qb1awtE5UGXf62{0)oQC
    z*U3Nj2l^RLA2jj(Va6r@U{fcXpp;T9Kk*clsc)JRtHLvmT_V#P1%n$Dzx&a<
    z5~H7%4iJJ#dU$e<0%4wvSf3t3Ma?f$?s?UdhNo&szi%eX&P
    z6L2}8^WLWmo=VK_yr_UH|jv<@AbU$xavcGI1uj->{V@PH-U5>_e#%JG`nb#rY_<#DnX6J^yaH)t|I
    zUe{g7IeqceuBP_Uy&sTqvCOIU7Jv4qIk_-7K#+{~&jtLi)vfU89FMf$vXHMO{R=({
    zgyR>;IR{Si#~rwo|6xVN;I(~|6skX^vbc8sm;)YPr!%vgg!2ZsM#^wia@_(A~`>+qSicVx+bkM
    z^J@a?P~BBD%Pyn950aKol~*fwnHRc~ESAy*?U^Omm9OsqtBLrwf^0bB@e#pe42%aD7{MGxF%w$SXWmbbo&ZoxH-W72ag*KD5qc34t(nj+s!s?%<%|RuDm+sv=ZiI_>|~Fx>ZL3E
    zh}5H5mCTDJpn^k)F|5blWt}HOGEu62YMpGIm?J0jHbf&p@#T<3-0|m&MeIXdrUJxJ
    zBvlGFvfBYMbC~=76+64cl;_YvU*^`bU@-@SCgwlJ)76R^VH{
    z%@o)gg8iaBF9Vr4;N+0s0%hFBe}Oj90k}yYc=MB{iRv%Og08}-;No#q7ceTg@ADC{
    zl>*OJ8jk;9(fr?l5(=TR_`iCQT#22MrNNum0r)DrRCuyUjVL*1VS#*!mw>{U*?uQ}
    zCv7b>9G-Wpk+BE>b5@YstFM1tSJ`57!gv3<6S$5x{tu*UYkSVhEyU`H+Vt$^o#uH(
    zkudXgbjm@@r%yT4qB}sIgARM*2NZ6DfgK=x9q0#om%%yVID|P3&ZkeT?b;wUcdmmi
    zzVwD!ub+k_OQ@;1kQ}S_wREHjP71C7QU@HkHizaOGIXhrgq0*eXaI1D`ci?)e=A1n
    zo)Hf+rYdn?0wjudSG)3Ov#BO$epKf-%F`4xI>p)=cUt6~T3q(FD;Aaind?Udv(gU_
    zvBd_v%XZ0^a>3MRys)L}kR6H*{$2Ua1c_#z>tCQm&h`%`2j5#R{;2M+tybCn%s$5b
    z!0V9=Gn;*2fUA(9ChhZjbF(r|ZqJvs(x%@4%B#@rKxaqHuQ3xf_>s
    z6kTscfi3Sg;TUgQQc;3vd*$lcG^e{L4J1i6UWe%`#jI12WH=F{pV&{{v}<;Ik0b(CyR>@ic5=Z
    zbL*;7Wu859Lsp~13Akc2={2HEpkMAf
    zG8x3!mxb95(II=6IG0-xH(^TTl1+e<-SY1{8f0~=Z8^&&LE89Ky*rk@cxJ)W3^`)y
    z$Vd_-)ZAkqm3*a7tS6*WQPI*2;dPS}cB$F6M9wt-+Aqqlw&3GPN?
    ztShqOj(Ob<`q~#}WG>`OIGbmPKd{Lmq{1brjF#|H!(X7-hxOYO+-=Bg-^KY!udfQ+
    zdTZvf?lAuAqf3u)Wz1NT`Eaa=n>&oOzmC5?LjzamI%W#P<=Tv#dlC>}OCU5z?d4-^
    z5O2?zDtnCUiDb6XDQ5mvpJ{W_ak9;Nj3m!oQeWI-oFUv-xZo>k#&cPa$kC63?Io`
    zf>UjJ5qoTmVrq|+j~3Ag1iS#<3HNT9sH=9ks^D&@wXPYtz4^bGd+Vqwx31xP14<*^
    z-5r87Qc4R5(wlC?4bmlUq(tcsDW#-q(@08}(rmh=yJ7oYKIh!ex%HgqocnplJI43@
    zu?I3XUh7(G%{kXvbItjihyXhvCkqh&1LCDQR=|r9Ng0lWn-Y%8z&dFyECJB}yAG%O!^>Q!fju4iHG
    zd8avJyzm!Gz}dA_Ry+EFIk)54N9B2A@x~Y~+tAf%?8pNz^bF?C}^B+{~8qKQjF8;+hJTG|91bkE9tm4gsc9nk0k&
    zk=jiy`qWh(g#px`mnTNJwyx%tWm7dwGggkxEw1c{(EfT+c^NA;>N-69H4SYWt7pgj
    z*jv3vV!AHS*B3Ov1>aA~m-VX&cp+HG)kiqZK#-F>=Q+mEij<(hT`hDwj@X=x9?F#F
    zQTp;&C`YAd!7jTytQB=WK7msV%ZzmX=-qU{UiHThf028uQHwMcp;wd3uRa`W0{x|x
    z-9Sj}SFPpP+dCF9#SZW*Q23^s)x7~>$F;1S70mxSBL|M?!1iL}J#bB(&**dWIS;QoIt+P{o-TUtF{tUn>TP1uEMH&r1k5mIJEiX+
    z-NXAHKM(9Ln+E+CoW&Ahp;j@`$xJt!=5*xR0YJfpM5EqGwmW)A1F{lQ1%fb_oYLgA
    zXVXN^oc$u&Zk_jGDAyh%SJ6pa0fjFK-Thv4Ry?E&3s#N6
    zfIue)Pu<Cy#cBfZ=YA
    zzuAUPjb8mQWSPI1ZlYgp*E*aH(b@{-yqbjCJOOg1|5uBL*-e^y1JK<|tiPMiCf^T{
    z+f<~$guFg=liUN`vy9((|7mzGPTxwEJvaHW1N$GkLTo(^80mDZ9)@xJ81#oR8I}D)
    zCC7$`sn`8kkp>sTH4;+TH6#?*e4U3X%we`6Z}pSI$7(@Hqp`Z`jIABBa@&_ppNDvJ
    z<99FJ_rCcE|Fmz7{N?>TE6%~XG4gtl#bg};P8FPfP5A-ML%rx0uLcAV
    z_{Dk>n5R9Y8R)h037%hHd?0$w)sLJ%mq{Sa9Z$U}qaF^P%qG$BZ@J#OSxjR7y1V11k!KQEp32dfVF&pj$VSUOFRte92bKVV-{wS{
    zX&FA-zMka50rv2KJlFlBRz|`-)xbk!GvCN9~^_K
    zSZwj3)i-;_hXmeJ0#qx_HoMMR&O3E~cy^~)yEvSHdW**yKBoV@v85H=$R7c{^Y
    z=I@NWi6r1C3-AXfs#1M>(|7)Vsd-YB`DZ^&tIV&O=F<)ze^=5aIG*UrV+zD#1-iE1
    zaS8?Yibu;0MNNXPk^^FQ>TbN-wE;QU9t?z}NsbGxS@=c!=&1I6+G;-gLG
    z-F)K;y+I$_{5Su@BU@PfvN3RSj4B3*9j?UN`No2Pm|kE4E6jw9(Uju>LSEZlp0?fb
    z0?pp!6csqb%M$NVNL|0;lG=hx-Q3a*_}hFPNGh~h>*A%ni25RL#+uQGx19ZA{%_eb
    zk^km{?elN3C%Oa1tghg1udL8|9{5A2h>wf^J$ePVt%-CWk+m3#Rk(xosJ<@x&P5(9
    ze6~!HoXK(@bj^u*>|2rupN|#i6KO6O=$)vyKTtoGv_B%e+PWBzqd0==+kFM|cij(K
    zNsJz-rA-dhyHM;xdK~mrJzc%k9^CDOx&t)6gf&LGM13Phi=z*Yr
    zYt`s6jU#CzZkmGx#D~j0l)&zQ3}P@Y%~jm1ocn~Az0wx6-O_biiK@J4z(tQ@yumlW
    zq64EoIp=W1787IPIjWjis%2_yPiY=>5pzH921`sB0g?mGvw#obr?%g<^?X}-3sEx{U-Pr_k{sU(=J>~GhsDpkocT<}b{KChi;|;#`_oIS
    zD1LDjuNsA{d~wZSfFm9TGgpLhyog?T6_JO+I_Zvr+*X@sO*mj7RG0PP=&*cY-!mPK
    zm9&0EJX31#IdK{(xZr-2#Ik(%@H@y8OFj?9Y_(3b+uSq1_=_PNEFtzjcn-CeKRAqu
    zg+IuGv)!8PP=!xQ7=@7*=v5ozV(BF*EaMs(@O{0>Lg3TlK)-wf&P)qLP@uN2PR0@L
    zmGbLDsm6=Wy^cf=PE)y()KWW#FI1D@ilz(`aR#5^`l>k@UxIaW#gmp}CDNDRt;SbWr=*4nKc#&?_Sp3vDb`L?_|
    zj9zm}4g1K1A77f={BwVP2u);g^EcyR=suOSkh*fb$+-a}_Y+j8{YNBAQ80>*ukA
    zL9!4E0lu~QZamPPIVOzS#Mav(;?iV7kZZZzRwu$Vp6#5R=4kUC??Nu}=xiGTJyic7huO#c>GPUWu5QiIX`==b`J4Dt2$y=&
    z9W8&fSxuR|p;E8mrw_ppl?IV#Sv1y<>7t595hX9REpZzn+MC(4O{7#b*efXCP$DfW@Z^
    zfZ>}LJ-uu*!8(8Gfy)z=tJtcIpC_lJ2U-j(J1Ic>%M^l{1x{4Nv^CCb6-v
    z4j%spW2m~YGP`S9`PL2`pK;&dDZbu0Kb$j!#s}O`SZl4gg5UIon+jr1hEhjbkj^hM
    z_)zF2Bdo&5UG;8DdA+bZW{m__QrOEgju$PD6cvq96FQNQUPefg?qA84rC~j~%Sfsv
    z6uqNEhb-NtN$he=6F2m$4hWj)WXM}qiW$t|mOfecfs$O1x*y%V_K0=LQ?D85eA$N|
    zNi7vBI^^h`2h`nxKMESCn&PGDF`z6bhbF~j6It0#La@V%V=`BewQhhl<|j3d{I#`v
    zO@)%HP`j^{hLI)$>%<2{SkJQUrg;`?(uZfWQbR0)pRg=wys~B-e17NPS`-bdw5_vPOpEyHwu-dKxk49RVOW^;qGbCC=`LLc_ipUq|jqAfI(TnK$&R%sKv`
    z6J5fPa+A)-6u#_)Y=MtcAta2(h&70UYE>G#Q#3xz2I~nU(Iu&b7aAeA_r~a>yH5qr
    z*gQwa3gb1Ty1D(2-9(gXo~@CdM$nA^(CggLrF>W4`_GnD0yRg-S*q&z2CCJW7AfuE
    zGJci|D|gALZR-x69nR?)W%Gy1Jn#5mC+Ggdh=71gROWm^!Vb8~(
    zUsx+4bZqf_D8{mHE9=`&{$4%i7zhayT5HUsXL
    zXH(aLl98v7ImhIyc>%Jy)149OrlE-DuAPCigVen|c+0`eBQrflp`+Q#sS3Fo+d~jl
    zRA>X2OdlQ+qvMxEPq^ixXi!PMwc`;2?a(POjm{}_J
    z_SoH21UU)2Ghxfsa=xU$C~Hf76gTi~ekcyHXWVk#^iA?KqbQJC=rc;}e_{^KN
    z(Us!fp)^5Sl20c&1LYK9J%V+C_Ys*BJb`^gfdMccDOXhFfCQ#kzuRV|9n32`PS!j2
    zP8PT0zIO5HauRd|>u^Xjzkkx3jzM#B9Qmg{{%M`FYlbQJe`B^nI|GPxk!e7o;^twV
    z+YyA18o?nW1FK&NZfUVnyHAHz^Qq9rxfXmm4>B){7~9s=2IE^l=$5S|HL>mKyn{Q_
    zLU%Uw^its;XB+UJCP~4*F*_)nr6Z9vm=&0)QZGx89Kn+u9C%CSRNnYSQ!AuIrOU{*
    z+V)J>I&`+wBAA+LMg{XyzG|52nFc*H^MAR^6t**a1nEt6xF`=hO1U)or)E9%tE}6|
    z)7X?ZdG{nest)4EGT!V~*+LfijGl7(aubiWa!T2dWxf)b3qB
    z)l|4=?CN|gu&AK-^JmhJx~4)EAKR|;&^-Q=J&?_HJ7VPhb=ZHR2v1+;@vLP`^C5Iz
    zcUrvmhbfc`NZxfrbE&IWVT{RZBz3i0;@*7xb}_y@7d1Rf3Tfh|BLO+
    zZ@-8CRLS1QH^(*uuH&Bm%u^*ic7V&W5Pf;l`F*RV3hISkK}}z?x#|=3P|Z-)n9C{N
    zRigtqte4qsJu10}meVDoYq+-1gv`!cc_`Q5>E*pSxBfHyr?~ktEAq_o*^=g7ulm^C
    zk+kq8O_GJF;~ihfWJ%^g?P)5r8-)Qvb7qZ&W)1$ssGAID5ndoGPTb;Y^bwEZx`WhX
    z=R{uSglg~E!a`$&uKU+dMG+AeB^3v9q2EIDH!B`w%TEY^A&s?i?OmL?ST+vJtFeCS
    zF9^fN!#e?_gj$s0Jote?1%m=pZ&ClMKM13TOS?>bN93FRfNLr7MuNcfQ|B3dLZbQ@
    z!Gg^MV~6R`xHPJlSJq#M@-HeIG8t21+YB;-k5yf67$1N6y8QK7QA8H?O}V~h2wyB3
    zG}#~9f-6f>_dcnxE_aPYjJI)*H+-JC6g=PKpA0`w{5+mc9r4vVrH99n`ECm@Pf#P2
    zBf;8+E-Dk-lKmnXjj}?(>Y!z$IL6n!m0QF0Ds&1?*}bOanXTB5IpYw^gY-?7-v{keqhjX;I6rJgpMuQn>r@q+=
    z>f@02Xjf?;!8EldtK`ELAxV
    zPI(2MRH)ZjY`@FXI1O8-F_Dt=;C*yL1EaQACQubg2nPh7DG
    zL=apctl(@P8rwhqJ3;iX{{1smRAwOq0G!O9Q38iz!Jl%gDBFsGWx0(zFOOtaL8<_qHW#@1)YXo^7)|ynZR|Vif4foWhg2J3T
    zlC~TUq^=K!rS`U)uT?1ieJtSIHli*8hR59TItz0&8m;-NxJI}KE
    zuXbc}>1a@$zj^dF0(C#&ZYMv6%(rwrPm^|%W}6Ba?3J-rIM)(>D}epIRsL~-$+2V~4u|ps?U}Pn
    z(2M14==>D)JjL3tbLOduUCL~p&$!*K+sPW$EV@j0pk351(lkz&QiHtpdM;J_PX|hIK?PmMUKv($3%D(Ao!F0gj){J7}#Q^(ASvAu-Dj#~n*i^GMST
    zRLq!S1XC%eQGE;eGk0);2pCE+W!GcTn^Ak$#2tyCcAHR0I;GS7ZJh?5>);qZti}g7
    zL?1HZmgvNay*=Oy2q3n~_P1t0&n54q^vTsUR_`OCbGPswCTu!Nh!Q<6N>vn69Dekm
    z{+6avRL$PRDpmQYKYVVa)0o|UdgC*}hEB|o!~}~JJ9c6+yjQnR`!R?!%)*KJjm4O6
    z3GN;uII^ns2GE2rXp9R=$CLm^_^jP|qimxho0BHPyj!A?Tnfr$_t}w-4#Ma@ndp8;
    zLtro^|NZ&0dZKm=TlVO(%Dd@q__Fi;;?j3(w>hiGRgkqZ!++!`MO^JXheD6<{nm`1
    z$UN4p3?zG=C)6=Vg^9+;V0wd{xVXBgO$0n3b7W!97g*;0SY~z*dGVY7q@6KS^?{c2
    zgPJFAa_YwYl^o7+tZ)bTnTlQsgIdY`kqz
    z@-zT7UY8tf6DWy7B7+ISKuRv$-iIYnr1VL?MvZbqxd~^!W-#K`?XEeJsG2D!nP0cS
    zru0aahk9}jH%Llzq;=pwZZLV*stdJE%QDj0C1cR-sEh3V#L1*6wfc@tor|EA5xwBKen$PnvPg}T
    z8+o4Gw<4C%cWV!Mv@G&a6|QfB^nRakCy`;a&*G%RD=_s|V5XApqzA|THYG@FCWNp7V^wR)NxG)=
    zHn3&&z}p_Cs4^Ry+e8E;(iVLnuRxT@gt`IRR*Hlwj&{^|mz?Qt7oPVn8LX7qcxY`rJ$yddFuECp+a2_Z1L9w?pGN;O|nfR4b;
    zgq{iG(~s+o)KC>aj5`bq!3+!Z4Yz;G>)DB{&1BQ92PO
    z$l(!Fr@QmKl2cR?d^cv~$)}o$;CBU{Synf&>eKzHn*^!zWO?(D9;rCAHog#8t)
    zN-R)QhA1?9=F=F=8aaeG4xekQLZ0`kgpAk%aD#_RD40DBe5z5Guw=^!E%PcWbj+8r
    zul?Y{*j-U)+Td~+h%UpuG5?zlD>%zH`zT#Di_0&VAnJD!Oe3t1ckrz@Z=UKvn#Ko6
    z2?B37sYW!c8(`HDOlY$(T{(xmHw|TIoOrlaN`7h
    zoZcs=h0CHwgPc@D|DqvjwHtLYneV?+c{INL-fY(ILfQY#yCipll(TTA3#aLg!}!@5
    zf!EU-!WF)xWg0!a0u?`HfL*x5dN*Z5a^7bB0x-OTM=v6I`zad-(yjZUJ~jgp4PG0M
    z;W5$Ixbe$9(@#M52XLVN4ZJM_QSs)PC@3x5g*8VKG!^x4$MTP?{LUEG6J{my&
    z;wgxh3LNMJWwm-OPj|x#$#xUlW!;jwzlg-hcr!hp99#n-d#Ab>C-9hAW75Vv7rB@5
    zFWXOY_4t6e=55inME&}J3m1Wk+o|GVA(wE@uwW;0z_TD>M^p8FOIr5abhZPs1JrEE
    z3EMTaPqb5aGhl{H8W<9ZBz*+6ycLXz85VE&8Xkp^e*M+@^ttYlZVpMD3a4CS<#AQ-
    z@YG-*JStOQFib7#oD*@sh?1jG=EGqu*_p)n;>mG(y57F@#b6$qW3YWMh7NrTurf-&Xct
    z7!}&zR*tW~Yg@|O*FPD2mJk1lW%~6Yl_%4MeYChwJyP77;k=o!1hA(&=@F9_v##yR
    ziXWe-p#5)+d{`sE!2M#mZ;R5yQ*|}%>!O*cbU;K}JuGK-E2V#j3WLaGqcm3J&7xEz
    z7R>><$-BPJeS?4{YRx&s<)y0itx;$>osYIZ^+tYg>>N4+ff$=3pGC+Rh2d^UL4@z`
    zjr=Yy5@$~i((`SeCR97$824s$LLo|pZ!>o$wAPV7H@N+
    zi6cN^xKaOf8pEnuu9+nIu9c@_x@t)QV{|1lXj3R(I!CYQ)h7xs?h?rAtCc9G5RI^B
    z|Ajk$t_9%EceIZCaCjAuR14LHRs4<&XH=XRky3dsu!O!Q(7X8QhmZqV30%fp6ArF-
    z1;@)Rte6Kg@;0Sx*|?Vic4*u!2r7EZKOR28WoTNn)_~PNi!?lVnFj%Y^0jUo+?JsV
    z!UjG{R+NI*f&Em(El+OJBwsuN{Un+!EVGBX4DE%3r!!gU1?0tNh3XTo}?_pm_D-fmyPe5
    z$Q^55wETuE`R>Iy{w6Y|e1vUd!mQnM%cw{`p}iz*{DW_s31}BJi+E^{ah7wdLH%3
    z49OWk*v_eqiLNtD!x*pd-orB03ep%+B#}wW5M7zf*_@?E`&%Z{eC$}ndkI;doASrV
    zqI^n}QJ}l9>)y|MzsYdny-?<5eyZ@dQaaf!6=|GUM!+?EV8-d4AD8R~vug1{B|yBF
    ztojuikmK;4o6aWS?lcXt_2cMH=08wB{(sA-Oqj=mP^!k9
    zikJnnHi1?29ZLf7x{DoZuo#;t`*dWV^QkHO6UC6`jqn23+N%CL%MbZWwiP&f!^HVT
    z7Na7x_7xfFs9yESEf!KzhK7EUGQx6oOgKettc}^g3x(1Zq9*dj+lXT4#i7xIif5_x
    z?F^n*i-k8<+^YairkE5;Om?&=tXOq}NKCK%ls2UWw~zPSFZh*-=*-GaWu*+fG+i?Nc+i6IQ5@
    zDA;l3P*-hPL3RoV1`*G9R@|iQdcrNLN6y=|Y`xR9yU*`FTDu=V+mT)U9pqRMEZ#>v
    zQmTnX5CR$Pfk`)+9VT&=@OwlM?U2zmsiPH-yaP{XXDAZR%;bE06QgqqW
    zLr{T2-w{9@BE1%0B5PE@SvlR8aNi#+Z`+l(mJb%yc?3mgkn!{C6bOhXVmk1L*VTWj
    zQoI*%f1tt$Lw^+)6xVG`mxK|*+=~7Ax|ywKnmI9mtC&&~_2`M`9#71Ig=U?uYB`rD
    z57W#nMvug*%wR`LI%zE!hVtZad!fFzv0AUVC0#U^V3&EafpkCfy$)qU}N;MPlun9Zf7Exl&1l3cy4*}Qw>90UUN8i&1lsl69{rq_+g{EpQ8
    zT4N_T%2&87-N+77+V^>WNDcJ~
    zxMwYjRdC&bx7)8CT|+kA(}NQjZ?NC<;U9zJ<;)|)Ku=&Q_5ZCc@3
    zs_HrE=EWV($HS1d$j8l9pJH?f?j0Dw_!ZCFB?7w_-ylhY*dD)^1}>~qR6pYs_SyTc
    z3_)FM*w*mc_{-&JhA}SUE)19L+VRlo1VI!mC6_tbF3MbyX`epCs@K_nBq#Dyf4BM(
    zr#8A~a#=)V0CwQ=G)4Ockztyy3R@%qH^lohV!UD@Y%q}yniUsqP2vvg9oSBrJfauapoZlyFw
    z9T_CDx+|GlYetW|iEv~~yv*>GRDWtxJs9B(*q)>i>L!}QKL+f5;yz6FJ_~~+wSBH`sw#&&7M{F)cBCU!+v5*CW134@G5}_@A#qFd{nDq&n*dfYXIbS;G7Fv
    zG&R%XUPVj>Q(c>W@96lv>2sIvNM+P5*96@WlioH749j@yInYpVLmrc5Ig&KfNhXrp
    zR?q>Hx7O+7%y&*9%wK$h>r
    zNUi`UpKE(9r0A99bC9&BVL4sG)PDt$q4oWS-{8;Sou}O`JtXP{rL+k~ug4WMmP<~y
    zLved?w_*pJo9~oZOuP`z&pv#52XexmdF1H$@+(KY)~bp54%PnMtu3&J&XF<}d{z*4
    z4mYH8bGn&$(n=dmwGfuN*khJ&JTIBPMUr6(8QEd!oYiocc3H7W(5P`l8+*-IDkoMJ
    zPCjCLf~k0X1)y;7^|
    z84z&9K|JS-3VOT{VrPZAq0Wl<}jq
    zmlk{NI$0-kSirUNW?z)cWAJ&Qe7%p^?U8!JA_&!oIdwKKKYq@hny2EZk2vwVybq4B
    z*S3s_ue^=uOklpvPa+l%-MR3+FmAP^uIvU`NlSP0N4)b0Xa2fpI?m$&5hMy8K6I_C
    z3z^=HPtza-VEP5b;YhbJR?AwVw2*}kA_A!R)q$lg78$}|w-_U`qT?q0Z97xU!L=`+
    z1BIOl83$*X_f9syDoY`@Q%B7JKXQ}4jTZcZmXlKq?TP=piRXr4Yh4TZFN!5Gs_uEZ
    zRs~byC3NULp!%ZxFuU%~3b?Z&j*i>{wt|FOy3m);T^ydaocy6N=27R{qC%nfIDH~q
    z%4>pQ`!cf|lYR~vL>mmV%mhZ_mHfVGT)Fl^97y8tG1l0SqEjE}e+;6%_Xo
    z{j#Pj+^O~X)2$~SkVC$Cys3m0Cq%i3h{W;2*yj4NF9{ec+W)Td$B!!Ejv-jx=6Yble7CiVEM3|`U6M5VLJ`5pa@Ynp58t_5-16V8T^)ha)=
    z2?FkcPch7gjnikeuoyL@=;|G9Msy51ycUY~4l$(~uSbcBo4pw}KI{pLp~&)+%3fjU
    zx}uo!_}@YGlP{x7!JBZV6qtSelvS-ZAE9tkwDLD{_ps`PcYdIgmI0SjNhFBa#R;YO
    zCrS93EC0g;xOvC3h)@a3q_K8BcG1lXY=N{|naV6r>-+5HUXG;>B^C)@5}j$w3P)Bk
    z51N?FD24aX2j^P+_&}hV_fLz9?V!(m6kt$EPXi2U{kSg9t{!87LmPkTp(mpo+SH6{
    zh`!30`GF&kSwlmI=^C16Lp);X?+((>hp0JD{_=1^Y@*R*Bp^TPIB%)~wn=VmYki(2
    z5wAn%G)cJat^GE?aASU&hGxulNVw<9Dm4LNJv%KNUe_t_l%AZ4dDpX0K7GlSzTV3+
    zC@1{0`=Rh2BX<*>>|!>O-h~C1mIKHiN2~0hB+)HLe|~5kTs&i9i)k9)n52Ri^GMd5
    znU1ioELCXS%4kf2hU!qN5=fw{@r`^^KPol03{6|VPV?-_m}r^{kN^tWwGngJ;oFsM
    z+LrZYw`b1_Oq1A|g&RGPdyOp2pd@O#ynE0(gOvUEeBZEtmYv?ZeG@p>E^t!>6S_F9
    zPixv^6@NL!mnh|vmeeT~T1w3}`huOgAKrLqxaWU5ZkzLVaEhV6R#)~tjqDtF2Mt}B
    z-H?sf|EfjEb-+h$Y?rmBGI^k*K5GcOtWonJRrPG|0x_$Z2%|{rx0aLyN!FUWigCx1
    z;TD4d7Qvr@uTe$F5Ag1H3~#!k4wdJ1n??P@+zv|AnC)6$cNxnXtho_6jK%74w~sC6@)!a;xLFScAm2cV1Z
    zE8g28PoL`@+}z#Vq-A|FN;1o+$YeW}B3*>#fG$+>@;m5O5Vw&ls!k11+%T3H^6<*?cZy@Dck64@5VM4{j2MIY%KL!pbRWdx`mdSsNJ+3ZJfU6IpnuuP^W%
    zgJfKbc47@lq(eyx6zm24AHoyWZNwYhoG^dmSVcTIqr*h+%vCJVmZuVwEUY6?v;(@OzsZo*Z)8=vK6g-xxA2{R)9!KB2r)qcKA@WR?Rx)LL##0Lqf{t@^
    zuNOOOw}{y_%&TmVC)znW%&)q+r^F9-zGW+wDEkK|$zLK-|G1bh9Q(uNb1&(u9cO1F
    z;NhVM_J5b(IHxrK9azy&F~58rRNFFrI-1K*J029Z*dhR_U#6~VF;><7<(*HOZL7Vhp?{L
    z(dd*72k45R)QwLE;9pbHGbRS`pw?YC?bib@CWv(lAE4(btMMj3gJ1D)+sm+WzW^wC
    zd%y5NZ4tdAQr}2{UBvTsvhCCi6FPe`gGk_T%LdRv5_O<
    z{-BciONs<3YC+bW)x5I|*M^O{(PiQ<^FKd_cFMr!2Kg9BUAzT&&)xvIjW0mS>GKF`
    z6U8g5rA_xO^0B42T0T9dHE;CejZRC>uw_#@BuR6>exneIwaffAo}&F0Qe71yp9~`D
    z(h&iXurj4OD+yM!5{G?go@1FmPpekdkaZLLQw$=KLBz<#)2=`(H=X$s%8!>=b
    z-9|G8a%E2nPMj`-#)E9$Z@PH;$(~y1JTFt*B=Ewd)8hEd>3#hj#MZeS-Vn4Gt@u-duqOu8d4Gbzc~QgdHgYy;AafaR0(NpR)VFfc7IpkH85{%k31LZ$
    zlpral7recwVVc<#MNjm=4_uaPPwvZ=rQ)
    zbJmGMFz0uW&@AP*W73AntRyRzEC2D1mt15nDYIHX2WMTzWU?k*xsTOI988j7O;
    z>vB<+(oaaso>w{cP{{%C6!80zYJcWel}hbrkEc8&)d8$*-ey^68GFMQhPTYIZ&17J
    zSm>va{eMIXB(74c#gXg-)gnHJd-(7L8}X0puO%#WtGh`=D$!@e=xIji5L5lAjf@Qvt@Esm?V9`GCA4q_`O|l)FivW8){$@lxbt
    zgABCG2l{S4c!LWY8mcFnO-6hsVLmizf5vPXdr-dLmr6V>-skR@bOn{hR6`w1hi`Z4
    z%r4^isnETV?mu9o?`}fIthC_l86tF!>dW`Yu>W>e(d^C(!#F}ay==!QibG<
    z!aE;0tY#gVrZ5{-d=%I7xQGKTgz$Bw#%H1BxQJkdW3=xen$r@jwt6B8-B(M9uGBe0
    zyTl0s##>hWkm&g3R?uMpO^~19SYW65Q(5ET#=Q^5$1sOe$h@j%bF6O=TlTR+_MatA
    z8w^e=g)r2;YVY7clc#RYFZ9<>kmT;v&U3q2M_4&4l#3=`2La#}sei|}5(h1XUU1#J
    zk-8DT5*xSgjM%(dp|y_ewZ^GymFp{D(ZfGlaF(I!%vs{>^R%?B+DEgOthLt(3ZfXZFydQ`18B!rWkpKeij0*
    z(>Xu3^$;0U4a<*b1y@AMK
    z_7)KP5pBjlv??Ni)37GNhqbc!3V!iE`#khB%aCgNmPYWx{pxrZwktN^lG*~pFrcl#
    z{~9|{v|D|4M6*BDtErqPJ8qq5xA
    zz9Y?ErAA5ftS>fW>kiyE-);J6Q_97j=FOj5HKeLv>Vl9}9YEp7>vf8|RYp;?<@pgh
    z0QBl3{pv7tJ3C|l%JoM00HMCpy@weZp91kuUn^x>sf*3AD;M3o(o6>@fOrSdTj+GO
    zoyg-wj>Lw2CD~tA@7%E5%ej~fF=I`OrZEv$mHhsLLK>BKi%EkqRbYD%h*w*|Y-Y$pZNNukW+MB37qjp#Q
    zFL93njZG89*D7}Jc`64!mo+9zSv@M~AzpM1_r8rfi|H^UBX!rQ^ERy$@_y{Sr@;
    zg-^V4D;p;0!M77o6ZPKO=IB|t)~;IdDUi(blZ`NwSxtF3w5ZOb8yg$i%1&=jG;atC
    zZ^Ps6DiFx7tpTwVdiB-MW#gV%qNGw0uP1AS#%=Yf05hk$cQ_5DGmNzSEAH>WIX`jD
    z{xv}Ci{2#tmaD+?8LLi#>vN2657UHQCgI@Iqxbcs72P`S{
    z-z+I$Ygqr=dj4xKpdk0}#`gb{KVjbxh>P9bZ=Rvaf@kI$c1T=8wuNe>tm|S>_3|cZ
    zdtLk}?H0?PKlfg$=bK6pdQw@;odHj@W<{SihyI0CIXYOP#h(|sE1mG>qrfB>q%ly{
    zi+)zEKF=n%A=*}3EnPdG*b7tvEU`PgOpJb!gylog(yC&Rl$oM9)3s`aMHayBrKgx(
    zCVhu-Gw&u}xVNxj@1QATT5kn%$ss
    zM@ZWa+Dqic))|AKiIBzz5J#wUeHd4?T%i#YaHYTOKV<@|*}X3UpgpNUlCAdJews>>fFtT7QE
    zqrQ{~=AF1KW5$Aa8U2Ml5zH2g$go&Cca3%N`UtgU=;Exu*N_gMcFhn)SKj3zTs4Vf
    zgWruXCsumq`mGAdD$g$3aI?4TvqteK4ljH(Q>qEnixh`y&E?(~7ErsRmMi3aW34l?
    zBfdogDTOl68@D~>+)i)(bIbbmT&0o$d8*8?@nIzh$jUS8Z;a>~7`p?+(KX9nNm89viPG`EADC3#=#ZnVW$0l3GK<$g=a_#b7
    z;-|{WL-NxmZ_;c#6du~3So5GmgMg1Ppl}Ew4vy1}Jt_DO8bqAB9hP))^7^@6xV`gLxY9K-
    zVPOf87PRZ-b5PSOcZwle;6pP%*z!T(-xo)`bj!G=HijO+XFe3@^*=23`XtdF?=A|?
    z0BxLk><_UNmcFw+jkR>MgR{Dc#}De&nz}~^lX2WX`qO`Z9rpQN?7NYEQC$n%pC2u?
    zNI25Gz7FJFw~noU2T>RIa=ffE0oYPNOMC#s=;v?qS^-{y*D_Ei!~CGkjo|5-T6RFX
    zb~at4Il5q_94?{$w>88m)sHCn7PEh=8}gSWhyLn&Ei<56+zF73e$1#_5O&`LQ7?rE
    zw7dIZ_^05HikyFs4DqmP?z$k?o+5+d{LjH2#<=^_|8otMYA3|alhq5dMXA6hXtF!t
    zA_;dCRl#Lz`jdBzgmiC;MZ&>Mh>J~DKPq7@Is1*1P0h1EA
    z#CwTp+Z;di9YmRhAPi~##{L1JD|PMA$OGGRjV%9GP4TKeSf?T8;azzTFR+dfxkF$y
    zT{pEDjWb%%O=uuO?i@f&Za1Qm-+PzPWDj^L?!W%`$3&j1F#wK|+|Ua{ARoW}NNC@(
    zY*Xh{V5VVkyjY?PE^U=0)_-tMBUd4*_i?O0DseXx8!N7M8KQqQ7k2bwh!>67yuYgU?UsOqHDTX6cdRsa?macP7X0
    zE);DU(k7lO*6?079@P1GY_)a;=&Ys+#hj}R?bN74kT-RU3`82cELP!u#Lh?(>j@~J
    zLp7vY%X2lQ4*3aV-;rH8LmaZ&sXpCV$;j?g$6pvge?mANYVC)a*j5Fr%8XTE#868V
    z*V0cdzm+?BX|@`sPUF7UIy-^lCLWH==6aFlNL>oqF>6dGM8^-wIXvC*owB|;_PQ;7
    zHIs_Hbnb)N)OYo{ERJRvpc4Lb!w2_0WD{i)hRN5ISW`%1w4|K~iz?)MGM4B%ofXIj
    z`T0~o?-v@dwVZWuBR5c4&c+t*#vLWd6`M+#8K7Mq!$)y`f35vSsAn!
    zv45F{#oB*@X!yq==AWao98c*eiS3n(QFwtXNFdTUfkU!g^vbzG3B}WDww1xQQQS^&
    ztfI@yS3)=HqB?q7&nuB1G+3O}z5^o55OIF4wVVKl7EVe5NY8Wv|A}PaqJeSz2>{Yl
    zxhPH4lX1DHgw;H?EBYg`z*>Y~YJHmn`pYzU1~nz4*lTVa%{kzAo9kAD%uoi;!q9`Y
    zgp|60o43&g%0wFSD+za{h}S
    z^&j!jnty|cN&QZ8`s&dH0Pl*ns4m+Wlgy)VEBjyS$XQ9Sy3rv7!9PRH0D*^IU;VOO`}r+KX8@3A?#XQ?^XK!3(ogmI>t5ga*8`$t
    zS}X^L6kv;P$@bGoe$7A3Hs%Mnb>k`hMxX&KmJBt-7cosukPiyxHuXKYeY61mz@asJ
    zGa^IM>NKrX2LnqlH=711dqY}vDu(zlia3O~!eikT8B$y=Rb#e9to&l?=*>5kIQ20o
    zhrGW>4~ma0pw-`Zaq)jdgvbI_`*&2Y*1m!@1Y6X6-hzJu?EawB^?VHCnj*1hN#&%j
    z%>Akc&#+I3uD3CYe?N>AUO}NU^<73q*9L)2LxSM6|(F(Cb3gA$kVLQ_PEwf01i>Z+~+&|9*}$J}s*`&t=zen-W~#
    ze#;>FZLnmUR5>;($chTkT?{~km2btF(^U?AxsblKydBu(=F2Fk2ET(+)FavNRSI%O
    zCI6K-BVXyc2%@>|lEtoI0D$eWv<;si3%DJNv$^PCx$SugQZ
    z4OmN>#Yhyb(GwnODEdCaS6i%_Q}^)j^z>g_h!4IQGvN}vn~ZxZ-*P|sVZ{Fl0H~(v
    zMu;~=L&YI=Kiw_NQ4G)9iObRyUm;IY0h1Ew>Z5FFwkxg2IlNFuzonK0Pw|``rui9D
    zJvG3EMeuakr}zdkDSI&PD+~Q&Fxvcdlpv7N54YcPY(e7b?jZtcXH~@&cb)EWdRUl7
    zc`%OuAe%aQx=%C5h@4pF`&sPw(HqW@&kWcw4$Y|~7{HPE=2lpedvTxsX<$a^f8{ae
    zxqG*Sl&+k8}s7nzIwDWK7^ihx-Ony~#dxpqo
    z-_{bz>-B=MQ0V^|F9}JV{c{-a55r}wM&UPqui|%`81AQI^ApPo5&I;r(2yaOLZ(SToo@}>ytl~`
    zWVIK0)~?=!)=XSC1`%5c(gYKjIMtlQ#kK&LLfWzniGZ-iu!T#nPzayQxcvQSb^PC0
    z1sb2$l~adTfV((KOjHwylX4@JIf}9Nd&HObwK6|r^ueT?yAk}dr8q1I)}z@5#VR~_2+2&$Ff_@WkH
    z2UOwhvc_VBe#MwT2#6l=gjY!<`MLvcCx`51}npo+lt^S$)4Hxy=;34wuE%NM4T@nH*8UuBDac}
    zEOJN^wlm4{@}6U_x4eH}83-~qX5P(Pl7aRW=F3B^lw`_*^Shn9?_!hASzg@Fk!?dX
    ze5K+hI0+WDkQdZybxu11)VTscxYCrJU+WhZZY$J@(9M4x&3}7;Ag?)117)x`j4K{t
    z@mc1;f@D8Jc}`#ezr;$J$Uk!jQKQ6Yj!92hJ4z2Na3R+h)JEAw9ey%&F$e_^5i;l}xIu&%1t
    zA8Si_bRsQFS-xqvhf|p%>;;o-qCkC<*wtg5tM|nF^V3P-Q`0ZIF%Lb|_M~znt&JZ3j|Y
    zwSM#Qv3$$N(yih#(|L^Zu#J1U{)se0-0SLir%{e*|4I;Hf?sUI>-FfQj^*LiiaUOX
    zt#%)Be@-lv>8^hV_pVvYjW^?_{X}Q1#^^-<
    zR$m=kp7(p8?b6yVAfQ*|>}?;W=gY7j4$GJke)n%x=R|`PRT5jbfxG|`BLMdi6?3e8
    zldxc1b~B_$ODM#X^Gs2PM|GBqcH9a1MgHXE_CR^{*zw@e&6Fql
    zGqniEQk$+7#EOR4UG4fQ>ZbY@Kj8J4;DB>>D5jx$K)zJ(#uvjKcw6`?Wrs1;(q<4o
    zRv!xHb2sW3{~~%qY6v;)kaE^`^Ul+Srw1MN#{KEyp0HL%Ait$b{Y$#O6ZQ*sK}14K
    zc%9*UjfSOXQ@xhnf@k7wr<_OEDK%ky2k3cANrsY7Q^;aF4>#KW=tJj6a8fA5ykF42
    z9P=yXXu4)kbt$b_%^YuVir8%PuK2Rk*%C`ESr>pN>lpivciN_e%;ZqbIrShFynWo6
    z)cG6dgL7kgv76f(iZsT0iLc{Kaw~7Sg@=fn
    z3vRaz6Sw6i!Y2~X8mRAZxEt-9jX0v#rl#`AF#`5*0wIHGb&?5+r^qb!a?-
    zt4TaVG1nn>q^sRNxO81Y2sbGTLi45x>X*eMg7nQ>NIS3ku^1_qMCi5w6-Y?dI8etp
    zs@_3%S8eF#i9*)*KI!H-nO5h`uky%$wGS+SHfH3&Ea|K)YYPlx
    zNPal~{MpfLJ{XX|0Zr^O_!=fSU+%wwNi|)Cl{&nUHg}>MOSPO?5Abq$HbZqX&
    z{iNapL{HZB+a>-+yksgkWw;|MY6f2%$8P|DJJkE1Exmv6qVG9f#b4OBpeNQe-PVkV
    z6Za#9Qrhloyah;5tet7aS}w+qq;I#Zn
    zJ#Y{DK(Glz;ovvzt2V>j^qQ(0RU(1yc7eOLHB-Pn1Ko*X%zljMNESLupN;dR=k4Dg
    z6rO-Mmj?gQ7kSpIo|ood#SGVm%*rU-j;xQ%)|08C#qWh{>}o^w(YADpT>Ce9F&1tj
    zCkKueUiLxvep{YrSURoxz<$3}cmc)!{JFEe76B~W-7APWd4$yI$jsIqt|PxFQLFBY
    z2tz8VGB)o1vpqZGrRhZ&JG^J|c;N;z}ARmNyW}2hAzbEJ0
    zBcr~@))G9SI@ENGrhRttveiKb6NZ2o0^3zP{Rz2j-4x`(8;?T#tBHnMWunblltIN>E|
    zbzVb#9z2sFV2{Z85Wtt7Tlq?%UO$dIabw6aV@*es;*+%Ud%kMMm#Q4#qUbLqe3HDd
    zz{_LEEBL>G0L>pY3+#0bMe-ZSS3EB*H!dp~Nz?PXF+`AhtS44*(g5dDby5n-HCB^#
    z+wy@&a!I%YCRrP+paThod$eKjipcgY&n6=L=gWQ@HuCHhIS!{~J9?NKd4!Z2DA{dq2#f`3Gvcm=|Byq??}Pt)(xfuiiO9PD<_5WDg>xe4Pe|JI~2*
    zTkIyeE*J8E=;P0k%4lon4a^)^B>0SC<2wH;XTF2H4zxz~ML*AXO
    z+$Qy2gRGN|t~{Ndgsg4a!gsv{XW=6^43RnrK^aFGBeBd)648LIK%IpTXppOd*gNRo
    z7(JyzJJ`eD1lI14UEy{k5}rnwSW0cmn7M~YqU^pBT9cAy+4A=)LZKskt6#JW-;Pu*
    z-5}(mji;)vsq>dymt%SpIk4RudOq0R4}aXzd%Q)m75Ba1@3l;eC^uLK28>1Y6G7eS
    z6G%r&*`yES5ZDHm*u_*(TZ+twG`Y`e=JnsIrxs*ra#|@&8!4&^|GqZr^FM<_{_lgT
    zs!X^l-s!MAdEBTFX=$mO2(QI6ftaYG7A0QtRGyt5?UBpazc
    z8ahe1ulEzo;t$HpsX_npn7d9M{
    zO6oKKBdYfcRyxZt9!sq-0;c>(UjGL51SXD3MJQ&Z3vw{1E0S{4tJ01%}8103cPZ4UtsET)HCxmOD
    zjOi{1J1^&R?f0-D`~1^^=SVEb;T@Tu&?c?O|4H-
    zt(7-jM#4?g<{+&DfA@Fac8(NtV+`-TQB!~{f?CSM%Ss;PoQmJtAo?FDXzc-wMB}0l
    z+u@CAB+=SAeBDNjmMkLd@{#3UP?!T}_^dnbQ5u|KiS
    zS?ea>cZf#l3!GrK85s9h|L*4tAzpCG|C9k-ZhHgiRizxce)P_KgtBb;`Jl_yO_ewf
    zYz23Yu1wOZ*e9GZS!l(iLCpcYRq~iP3s_7>wRH_i#8||LiT-Y5NnxwHqqh8(Ueo5$
    zLkkiY%%IkA1OFrp*@T%J^7+Q7OZXQlDAyP0*P43kQBSdU<2S3t4nor~NcH@Kst
    z%sZzxj1>{aj@Kw`i!|ZIM_r(yG>6F&&2K4A8R-K4TDNuA#I55jItAv}s0G93$ea&f
    zScl~X0p9?nNQ|9)Xg=>xRReNv^LuAqw_?XN5L3?0sUxA%B#5gMBE%g6siM*4*%Jh@
    zZ(cZ>PV~mmU3n}qPk?wpaGo=YS$$(2i`^tno4oCP=3)Tjr5gvy7B3d*A%f$)$t8g_
    z5bWR?n@+=0cY*+#6n~KQ7fiC2bs%wfo8jx)%ygR1txh!qj6Kw>`(=S_-_UixkbN=y
    z@CmRzwZ0onHOK6fTbX8|T7PbeKeg>1*ZV-)lT_!>+=Mq^Lfb5a>`DCWqeFInL^}6|
    zO8S~dVHzU7@4j?wL?og%)+=5TH3Kn#{od(C7v@1iCQ8l*V6GkT5F90ha3m;Pm%H>sl1m@r4&#VE0cis4!+c?R4K)k!WJB>*6Fo|)H
    zk3~Dng{mn{xOlJdNs?uoXX@#W7vJ(Z@fnB!V2B*l%N;JBiQ3GJmxz~)8^7diM?H}%
    z^>yhhBFifKt2i2h?AU_vtxf9Pl5Afpe*_?K0|ff?NLAV`&27n1y{`}XG
    zvj2ze#Qc8?fmUlM$;{$whauaPb}_Hb8Hv`lI9Ehym>8KS(5$Gcz~aCUigmQ>UbLH-
    zoQ9*mwChFfnFyk^KVuRyiyOpbhhcZ~;Kl&F00B@`N`DQQ%y=#F_y}3(hUU10{sP#I
    zjQIuNWBltD4~#{7JhNBh9g?h&y
    zvC{YB1mFniBTlWF6Za7c-)aW#?!hg;v75~@Gni3UY#A9k#S0rpa06Jv^mMa}p}%tZ
    z<(%nYrFGsW?F#$0?<%z(!^0Pgw;Wmr7$XIX9WEPRFLk6&m}kWzkG14M;;_k4!xfp|
    z<@25tk}4m#_I?7a+HY8{Ri<*zu(ZumMlRQ;H!g;xtf*tfs{=gr$7;ouNwX@lMOD@%
    zwa*Rk*A}$|eh4l9f5J`o&2!E2|zN)jd!;eMF2RvaBJ#HCin6mCATe4M8Ni-xkcZYD_r+3o9Z4LfLq2z(9g+5#9_
    zsEpkSD-4m6&ii&RL9fT9m{-BsgD{m+G=C^)&iGVo%%lr&7o*Cx@v_*CY$1xn`?-Qqo&
    zCNw2bf*%eI0<14W#!lee)qbQO?K#GBW!7{!R=YX+VEqS|x1%%-*@DGG{fR4_pAp9g
    z8!Zxv5p*5(>LyxVxH6m^Vb@p|EqB4by8%Huaq^5p;UB7v5x4!-sSR*tkvXp=6EOEV
    z^}hB@Pe`CdU3m5f4Td|e_5T9MtSE*Uhmc1)2rf%UBz*Jn!<}|Qgr_yF)=l;s(9nH@
    z?Co->GiWRU7b$2UD84R8X+>G+M@o(BCwCJdBPMEXpydBpJwEw6Za1{yoLoFm(&Yh*
    zKQ%9Hm9S8$K^=>Sa=4c5|E3?sO&^`j*Y13dH|K^*aW+p~f3nQ6$qmhTn#J%1NBFri
    zFP6<_B!B>ZoZQ;uz-+u}xG1O48jzo#V@d^-4m9btMU!PDln*Z$9l_P0KhGW~Aoz&|
    zEDayl!?WPnyQ(8UV|yB|$v7EonidqfQhz8U;NF808xA8f_9GXB9~L2LE!?mKo6(qg
    ziY0uMyZ9crB|&~QeZK?ET$Vf3ZHvBSwY+Ps4If4J@hZtVc(vozH}l_dLo!R34I8XQ
    zum!$!VLPM;W@J%(HY{G6F+JuVmD;40*En!Ux6y~LQ{As4)7|K<#B-pTBjbI%oDd_7
    zn5m(cC%JcD#L$n~N80(T%vJq#J<`hf=uK|7Ca6X!Nh41c)X*2(>`K4HkcJuVxcC(+?{U(w+NW@H!`1iz8&{N-kvpC;W|vga3oQx|lJS=*Uu$RV?Q#5*32B^g+oD|D`S;3Yk?3y!Rj
    z8=e{yzO}c!9|BDa-#>IkF5OEeE(AQ{tR3;HJ~nc;uHFMmG66#6`^^k`m@%7Xxni%x
    zfyz100}&TW&Hdc&Olt)kCQKuB8YyZHDF!CHu7-ykek2EY<0Eds^k#wL;g@egn$Z#ufl^y0?0lSk4zXo7ihUWKJ$HvwhYoxQxdBie*}ARR#BARNxFlB(FGQVK-B!-o2rv*US5#e$
    z)GtmAPQB}M;A}XS+FAqTOsFX91K@t2iD15D5Er|aF>gnj(FmUn5I<8>hGsLeI}}J7GC*c0J=o
    z0>YMbTznF^4{enLA!k4wD%WYb3F
    z3JOV~G8)Zx{_tmM6uy1D6coJWhZ00JeF>{X9eya>oMb;NWq2$_*WwueBjgL2P~QIN
    zh+-?qKmGtq!%qJjv(nGMMAf^=$<1*6NcKV&bT9TDFLuZVt@Fv~Q((~%Nm}$Xc-qq6
    zrmxT1og&ZgP%=;fZZxxP9yVnVI7^Vy|7uaPgd$EOJ;#qS?2+r-6qBFs+Rt!>it)nD
    zbp=`8^KFsV>Z+bpNqb7v6*am=#oHDxUPX@%*f$bls5>ZjL^;yw6SxXv|NJArj~4ih
    zeQ(YgrX$7KQN5aj%6+0}57z1vLmWGu0jtO&j;3x~+^v_N5Md*Fi@P>RHLrW*&F<8~
    z1i=POb^V}?Nm{0I)Qf@I8Bu#~ePL4Z8G4*z+-RO0Ihxv$<_i8;*cc@Ch~!^$I$4l1
    zZAD0nGLjAQ_Q=d@%@?I?$t+Vtt*P}PIi1fTWf9#hw#e)-)LSq?VLd5FqrtR|vrJaG
    z4O8DAC63_Wn&rK6Mu$JBYN&FNy))QSTN)nZPLzo`$Y7m5Y8G;EL2IEYi80$bkTYk>
    zF=>lV4)D*Rd`mPpopfCY?^TUZY(1SQvv!803(P#UjYQ1iO&mI-KVyXuL~g-H+z()m)Piw_;`6qOmQ<|2`@RS%F-(Wr
    zow7;k6cB!EHZg)93od0riN)M`wtN8*izUfjO=p^Y89_xA%*h1X~Evh5%R(yU$h&%v&eA{Kj=j3(Yg
    zUaY9E@w0wu{Zl(gH0OWY6X<9@q*nmp@b7vB{_XGor+Cel|I`a16@eG~pIwBO_#e=O
    zCgvxh{=u^TuD`SpPJR9>M4_}g>UuwuwZ9MXf#%|2s767|?W6qP1cyTXT6FWg5W;n?
    zus$Na8#?WK2wjxBkAf_3h^8SM!T-_lVCd?6yhx6)_ky`wp)H}$vL2o|N+^$1uU~S$
    zRqjLGK;Yye>bgsj}mcR6itOs*jHE}bKzqa=ew;snm!ojeQKdOZ2bxMz!?P-c_PjiCa>xfqc_vjY+bCrZ4AAe3aXq2
    zZpY*$xM{P=PfAfq-Vnah8MQ^EMuC=7geq6ZbI|PqLXMW{Lf%Z5MJ&CB$$5^#b{5k}
    zFoj)Iy!uuoV1Q_K5l`>p)&}yhBylr~w5Vs{4#9X63nh%sEvz*iu%#LWVz$*RvlQK}
    z;VH1gN!S2oPh5$Ia}GWERJ6%3V};Ke7!(wxatzS>J-brf?3#x97pCZd_cmD4f_bpO
    z51|H5ZUPa_o%Y6@VmmggWaGF(4zvi)LN0!Bb$NY(Wyj1kpnI>+>?`VJ>F&|$pWj;N
    z%Vfh{pnvW#wu@`FEimhVJ9ibZPFq}AroI!-*x6+$d<{-fP%jCh
    zPqwYEV)SghvY`X{ZGwWGBJu4xIbO04RvF%iV4=W_vZs-J&7up(n;DroDiX;hJO;*o
    zdpAb!3Y-7t47UBf2n&J<-S(}x>;h9Wp|ROwG*3!upPOSM3{m`GBQVsk!;W_6o2=9>
    z1DZ1n>}gBq@)x4aL{qq#p6#k0YuK|9wnRIYo|w;W=NSBz4}^5^wy;n5bJqMK`g5^;
    z`P4r2&|Ql7sd|J)_L$0SgWs9c9yw`RTjyT4mKu_!I(m1&+Ghca=4et>IvFwjl0s0r
    zpN&ck1)EWwPA972<7@WZk2rDkkR9>nSIWmEBSj@BcJHW-YQb->VaB=c#paiPwUF1Q
    z9C0v3t+AvQOW=;k)9*t;hBn@d`Be*pb=NI)aqw{}*vGR4>uUAjY-ueK=CJqcsO`{y
    zbpGHOQQx~FD@j=8I!a$7W22NXaug?SNm@E(yZ9Soa|Yv&hit!As23T(1LZ>XErpFV!x6s2;3
    zdMAM_TBiAG14__d!L$BUTs_tvX%iPNF(`kM7=nAxm_&LE<)(R6<~9l!WA#-A3^X+2
    zEfLBs!NzN2AmaBR-9hgoo9vjHWk+zVC`VDRyyF-Gp%PlL=_Ae$g1z-o-I^6V;L@k0
    z4GX{{hC*>3%(Hphn%(cj4?^F2gc@)d(m#8Pa@tgajym-C>CUb7&HDrQDg=a{u|?D_
    zcH)Nc)^Ti#AXppfEsSrCJzp|5!0NSH_l3iAVu#XN4f8P(mA8J=L7_g|S%j=HgGYc`
    zhhlBo0JJ1%D8)G#i+1)Sq+BS?Cd#7OT
    zKQG2s7}>+8ly6lkLUNHS!3}SvZ1OGY@J{!Lj61b7%&(j$7PYlSX)lsRL-r_x6@?YB
    zp_>E^r^8DHSGzJq-Q{_-a;sWXo>Vc{q^XO!PoH_KEb~&)gdjoDl>(5E$!v~7hHL1Ck{Xi5SXEfDxb6q
    zXoO7V3k}n`9SU1F@(*lHP_I>JS#Rsb=UZ<`&zO@>biO?7EM`d*f1b*A=v6QAjkmmy
    zc7|pAjgtde(|U^xU7WmwO`!~Ys)xr_sB%#O!#%zkq_j>?6AYQo<#lKGN(*`?*I|mI
    zjvF%&9zu3ujdszbQQuwNe!o_)xredNH0S2t4|4`*Qt?+sG`R|v@RGW}meMqyq#ew3p%r%-dx
    znSI3Z7)DY7i#|nz+6pE}6fS8E+ZPQ$_l34P_e?c{Nc6~Yo7AP6xjCFd{#_h5{xt=z
    z?fX<)g^v5uFwN0qmMj}X=F(2BDEmm%exxuMpFsr2$%k9H;vOOu(Yfa-4GHVraH+Jw_yv
    z&W4c7UedWUy7wukL}O1^zJc>)?5>gO)wvuMRCrzgOsZKwT&1su2!Hsx_6_S1o(lv3
    zSS0qm*O6UyiA!&@N|MfO867qx@0p8?_s|_bzD(*wE~dd8YNg2-?x(sHMnmc^t17l;
    zq~uuRC7^x=z>dP&Lv_JzcJVe%t+tvFKLM~niE#o9RrQC0m=ITz;O%#iSqWWT6z+u<
    zxYUh!_&l@xk)O4r`oGfYrrqp?z?FPYntl(gwsY2K1v?sJPBw1#Rp0>rxHpuGZwr-G
    z1VxRam>?DhLO&P|>MNC9GR#?Ux5
    z+J-dEq^yWx7d{vH$auddP4P@%fyLKrdsH^>47zt@TiQ~q_+yxCV~epXO<>L&+(4TK
    z!8aY%kWAIL0Xww%6*n%x0xbgIs$5`aC3DH_orMG=L9P^L8M&Rg?6)|+_Xbru?^Q-&eJNA7=B_
    ze8`a6Ibi_0mq&KkP$4?!dJ7;zWj63Z>I?Gb-wKYC)y<%3W~`k>nKMCKNd^&kI7$9u
    zXaojf3V#Gx)t8GbmCh9P4YSOePqTJhh0<7c-<(V=2Nd?Y`~r|G2HF=1MMFScyB9sY_;;7oU;`i-$#ZA3mYN@;%cKI4h)QLX1t;>
    z3{PWL>&jg80cY;%s$JzLHTvAOtf=yzWPV+KYAPUiDd&f@Z7kC99s*A@8JQg?y;j~Zby12<^^scYut#>3OW*}cJ;o78
    zpq&);8X>Xuj3S$FEEEb<3BOWqs>|mA$HN~dyqqPt^xUd>Bl{y
    z%hu9tsbcY_(gdv_B`8j}P@FQqM6)4l#Cia_Hp-lk;Tqmld8R^j)6`M9%UfzGU_O&-
    z|F`O1sR(UO=(vpX=q_GxAn|LSV8h7-x`ex{{T*J@xM6dMXU45T&9@>0l)MC(e8aw#AiuQ2)Y)cX@nedS~2UI@5lllqv<*65?
    zw5C5+t{i-C%iZl?lF6GfA#*YO{Qfb`1srbbQFi^aNV#F
    zZg|spHVJ8*i`5<}9-|q(VFj9eQZG4*Wh@SIWWd~F-fkVY4a|=3^uJ+khB19VS97Gh
    z;o-rXwxm_We>#NRLoG4{Tq=W7bjJ4Q3?~amEHs3CJC)f4A|_fA>#(SzO%<*fV&t|O
    z2y?VCK2BZO^}{nTxPF+@0O~2u)CRidHu$f=g>FU)v}(PRQjwyDLWuXisK#3z2jY4?
    z@LJk)nVpbsf0S>IJh8H#cnKtWQ~XgCHF`X_pQ?<{9_kIaho>=IwQ|860d$S(EYq?*
    zmr$A4+=;jJt^6Xk-xiA8V`t5JdGZpW7Dzdy=%-`QZzsXx3^>qUeV{nN
    zi){2%!viUV4IGEN*B0xEzKB@#HgCZb(Tq4YJHHfO1Qp
    zN1AunLI6l{GPK^^t<58xWf#|9yh465csh`NV2AjuvaiXBFMX2XPD1&WY>J5y_*o5^
    zV#S>7tfGo>+zf+7MPjz%RejhI;3_yTFvJ{VEf%d_=f2i%49d2^roAa8GRA7W7|geq
    z7+mt3zf;xOQY+m&V%QOQ?NS*g*BGo-aTX{Mvu+HFkLDVcQThe=^fdp^0`7yb&R^4+iRuI^VIqyW2P@4a3_Q0;l0xyA$Gf;yi
    zU;T3(Vmp)YDAcQ~m%0{<)|qyeHXdI!wd9=dnR8N%#gnU^VPGfl>az(*lp5Y-qpFlK
    zmA#xV>lcluj+520sV&UE^|aXNf2UcdQRNkDG#0R^=){EwOH;
    zc_5$XU`EPgQJVr-RIP*Lok%6;C2>eu-=cgSMwvvERS7hJANsUZT{E3`7TQe2bmbhyurzAD1xnyH
    zw4%DeHs_GAMVk+SAEJ*GVd|nFPEiYST-NJSeWLK+c{#NMx)+I6lc&@+4)}FH>UqOj
    zz@8W=)R7n*X6YegBa`8g%W6ZSCON|4-~Jh}?MuHF^Ema*BGaGwl9=_`p6cuLsQF{2
    zqvv(($*SUfR4Po)+v4in0J`l(Swx2BmV)3DE*ZY=Mr{t^s|0t?JG?MXcBG=UM0miq
    z(jys`{ZZq>Ko=e?Oie&{BkD}E8s6PX>PxI8WXLo89-;0B4k}m@e5&*oi|x|K^y|zk
    zzIqn^P))?F3@xqguX`0aCckRe
    zBp2&wK0%qjzVarncWa*m>J{uI`%T8GLhP}ur(o;@aE)%Oym|;yWWK=EFEa2g~{z#Q{MG5eWCFe1MR|C+rq=~lhcBaMV
    zjX^y#EeToX4gxuc4UvTLi+BSBwrI+bXt?i!@gIFQVZ(YVT^;14iHo<-HFsV(!3C>G
    z5p4A)2^vx|N)EnTci!ZyA3KE*pkntpF0WO-tEm#XR(TAS$`nMty>D4H4I8$ttc>C>
    zF#`CqQZuED#uV<~6@&pPD`E+_NRjx6Ef;d52F)chqu*583VAojKRtu&!`ME{TMa9D
    zmTcpbJMgUB=GVnPb)5@);~V1`YzH>F{L3|?v~po-=&qhwEHlPpi*u3e-Z_WG!`6lf
    z=Vto>vdIN-{jJd&_A0Dj%I;;DjE#JK``S4muONE1YEQwOXftQmQ2`)6E=(hNFRGzfA~;T*9)P<$
    z?zHDf?DbY1QUz7(Db9rq-MO4armR}!uS2+izx#L}4(K}KL+Ct(T6tS+4&uolM13=<
    zRS~`eo2=1UoHTy~{|XH$Zr=a(j4R|*FYSMn4$zu1o`$I+7Ht&&%&}`bk7mzi&)$n_
    z=S~*kli!miX0y(FX!x-kKe0L&Xp#NONMn-wx$!PCzolO+?0Z1F%)|}SzCAyeU7^PE
    zBDgMzspi8(Pi@Sm)VrqK(b0S64m86M&(e6fcwu;hjZADUS3~iJW;@cJMXe!zJY9DQ
    zn)V16!R5Z_;tOsl3N)x!@NZ)yoH3#xH@87Ca
    zPA~4inE2xRh8fh`^Qm8p`xqzW)P?rl16cU=$2mtxf=kKPjFsa4B$dE0v#sBHI6%5_
    zm!Y0w>#RTL-bDg}u9QYSxO+7{31UA%s&jWikP6Ww$LkU=tjVjvgZtOJVi#0l@=Yx=
    zVq4+8+2+Ph=e_SUOlarri`aJzLfWlaRZizZSv4a}b5IV0_1cCfDQK19hgsY1)}rL6?Gg0)eH<`TT8D
    zHbLUH!cJf2x}db-E15|>SG#g9;JaP<)84$VJzup&+?hvnE5X^hYymhEZeTL`@w#WT
    z;xtgU9Lg|X+s?cL400@9XH6fmP)r@oZa9I`N&Op-!_iX-?IMz?oW)AWfRjcFcI0Z3!_n1oJIG$8wzt4bY%{8e9U5}oNT3xmGe_#TW+x=4!htf>
    z8HT}vnl%@EG39jN%Hr5mEcL}>p=7>xaI41PX-%hN0D%N0YPs%so`(|h!CIHME$TRY
    zOm~l(tT7%_3CEJh1|mx5$Q|$0@PT=j7zeL8rPmt>nVi7)QFSHbc(S!dN>Qh4ok~KMn=aQ2^YH
    z|Kfh4%9uC-JkB};Zsokql$+9fR}Jz_@TGhy!${DX6U#=cLO|>--qAa`{9|U<|8n-$
    zUyw>`kgm%Anq&H3&)ynwwUn#O>`G9SF)(Ec;&o%5NIG|q<I3^;|Hg>Y3<7m{D(+XYT0yrJh{u)c=^GWrKB-+vQ~s
    zf~4=Bmv)4Yj#qlLG*QC9(!(IYk3>S=rQTSmKLEv8R|mB2Cyx_-gl^!K!qwj9{N=AM
    z=dwiQ@`~1DRHO5jjCqTK-8N&XEz3$QVI{g!
    zUXmz!e|z*u$sYDi`N!YRDVm9~+DC$S+J}45TZn_?3y8UbDHrg$n{lsyd~@)odi;{N
    zS@^jJd+{rEIwwT_APffF54bJfKA#QkdY8N2tPTn>fs8i;Sr>b
    zQko{(hjWrn26iqbsj3Qbbo)&BC)|pE=sTUQO5mlPrSx*It!ldfPP9gec(g=G|IQwg
    zdHhZiLkQ%Eoje1w=IU>EwMX;Qlow%A*3>TC6(?4Nbzl2O$LAF&gVr!=q(byy%xx2%
    zsGi2By%%1xA(m~{K>~MbVxrPF$-ng|pZYk$pH6$ccX^p}nQXo&^Sw>Nu~F}o6yoLn
    znSFZk3jj&RJXgfYCTmaAyBNh1I<*CwK3n5ew3T!02hwPI>SSc^TW^KwJrNtY@-TkM
    zIhSe#<0)q240CG~Z$(0u>RLZC%_2Yl`d%I^^#tDO?oERitR-^NT52vudtN*TzW`8Z
    z$o`b^v+>`Zu%Vk~DYOscn%iud%7A3FvY8$kP%gQMvag(Dbfd
    zBRR~ikHsqVQrE69(k-Lu)eb6!wlQ!8V;;5&;WJ7!VG3#nu?Mr5QL6aIcRYRfw9@mU
    zjb?hZsQ38x-C91W;cUDYcE13a;keXDz;c)Z#G1SUrMtTzqj^n%m_6@*4WyhgpDUpg
    zzbD+@0l`F8|L@o^f6tC
    zw&Tppt>%K=RPSDmhxI%z6?hJJR|W{Gt1#fxQvMqLJX=v7*{8Vu_;9H~xhDcx
    zb7_tkNAGA(q{UB6mcP$1-tx>Vev%V)m-xegQ>ktEbT!GCM8dE5#nE7iD5ahz*>GdY
    zSkpys#b-y2+5x0v9v>UVkQDR1oIc%Xz*$fI657Qm^)HgPT9!KP3InpXm)%AkIHu@JpA-HK|
    zsU9uqJB=3m*Nt`EcY9ui&N^-DcSnVI{@>jHcdxyqaJIVa5mM$Y|nWa9jO2J6kaMjT`l
    z&ZRWCaH^WQnXwo;b_ST(1`r`-XgdR2exrCQCUgddG<7*{&p?lvUvHv}FPkewaLX4U
    zo429<1Ualc3BLwX=lmW>9R*B+h^6WYb2oX9PI9_Yvpre!N1neQ(tn*B#$mPY#o>em
    zlPPs68|#GmRWWMz{zl`jC2-#sB%uCFsEJM$yU+4zdodAfvt0RtRu+*zd#sy*#65n}
    zV1)&SmNk7^|7aEO?{U;s8mZ=92Fp#Jicf8&uXQ}q|J1mD*?fjqaAm_VqQFc-Coy4jrM>2sv+lq*z)5dHFILJ@+g1F9^-dxBAYDhqb^f!E(8(!*T
    z66UOC`K<;G_d-zDrsUn~Mxuw-6Zx*eeR`C{pIntn;?tLS8S743fuB|-{Jyki$b70E
    ziSASicheWedXG|mCqC&wSQce75;(M=B
    zouql_Vl=_a`I!L*b^+kOdgsQml+4Zl4xgpHd+`!-X@@Q|@6yoZ7-qh`A9EZ%@85gd;IN@RKwwU_-FTXEDyRsHqhK
    zlkPnVHN@WXkrn^R2_q}_DmS0Be9x8M^=@KHfu30&F`wDiIc=*%J)C76vhhel+Vl0_
    z5$#cW-NKKCLfn4=xa*YPqCl3B3QD=+|^Ju_Fi{}8C&ydt^!n77rU}KDAJIgkACq5nQjS&0YL1$Y5U=W
    zlLNhy6RDd9_0tQdsz;wgF~~HQ5y=h+h1SDD=&g_`g#W+BYkMBu}-pG(Jr<%r@6=
    zPqQ4x$+~W0Rs?G(cvkz-C5O1ARin5i$+M{?Hk^@%d^wHXx3ySkoc83hEBTtS$So~J
    zrA}-l@+Q4L+4llDrWSFOfG5zIEKAJo3FJ|3erg$=?rpnhoL5%L)y+L#oRqwS-9uEx
    z2Cl*~L`^^u-$VF%?8J)oj{0e2hC1z#2SU2Sp7?+A%!YN{XhadplTrL>T#CF
    z7d~6rK@PPFK0|%u&Awl{zyENDvcpm(0By@p*JN=ltn|wn?6vzPgdzE`_vV(eDu`Nx
    zTB1>pMdMw>!Z|x_clhzTXG?)oa8t`9R}@An(DHifCZR_YaWf+Mi*c0{tUer7=maw9
    zyozpkPd|LN94wFOIe1A7k`)<59Vv!VmaFfN4vX2#z(2ji`sklXVa${5RbZap)*#oP~#)irA+2lL@KtVeWEIGz_1VK%}_jin$r|CV@v!Jt;
    zRXyz`5tr>|wKL&3E$@A9%*udko9K=%R&(eKs8
    zt|#wE=0&XFFEA8CE7S#dxs#R@z*oYzxCz$ZZM9-gGdqFzSb?m~yhRqsKrd4)8D#MZ
    z0-hrks0mVg=!YsBz9b-c$yFBtSQ~|xiz$Ics?Vz||D{?}i<68mfjVv})(qxLu&cFv
    zGgco1yb)74!828cuE=#iSZ9h)vCSu)y(i+Yt+=n*%Tis+_Ejph>Lym(}>uzuqJ&+~Yn~yLlxUkGYEE+WX6=t~7JokzbnbWv<4
    z?ZMr>1BH~;gw$$SKZsnp9`Q??0nr-yXvNJc`?!Jn1Ljf2$3YwWcDaRX8u~J#By8^x=MG~$zyg8L7`AQmH#imcF
    zUW~>U42wDM&lnKA+oKAaO<^f05suZ<$+hHaK9h5ScH_aq9%;4Gd?kv_X}EQ^^qepS)T&rz4&Aa
    z@T6dQSG&tPlsYwXXQ|z2%U9MtWjx#W-zt#(|7~&X#Ry-If_bA(X;#aW0ede8h|JB~
    z?TMiOWZx&xo%BC%SnZ5q`}7?OT@Lts$JEsY1{Z|nXQ}Auc+1sBNi%eHwrIRq8Q>`>
    z(t+f?jXls|`iv`yJ(T&}ER&z6iTwf)k-g
    z=UH|d=?i#!FT-T?Pg#l8PO{iX%NN$P7m5R9lkKayxu46M$Tp4*Vq)PY=*xIx4G7Qv
    z!3HNJ)Z+JqB|u`{{Do_tH}#;GZE?fZD5k>+alsRO59g#nbvDk6B3P2uq_%MD_05q2BE1?3i%Rqe6w?GqAkc
    zH4IZ)n;JKNcjRvNA0Mr2P)>oC)}of4`l_6rg;1<0<{4_b03r)C$RJ#*k$>Ewvy<-5
    zRbGSJlTsn{m>zude(Fs%$vc?}>Y)ad>%e#Kz4TgLbyi?H@!2EtV;Gy;RRB$A=np`T
    z$M2hpGyAi4y4*OF(^;r2j8RXktaf-5jk0B}Hyq&N9==V(d(z6MYUq
    z7&1DA_HKeGHY}RlpPrt|)>dnGe^A$9n^2wKUzWt?83$O-a9(wyTq-n@0x(k@HMsJ@R7mINW3(HA
    zfM$;SSz#ZcXl0#dpktoc^Ocvb_-q?4D7S!F6r+N#g;leSF@)`P426J45R3JqvzBhNWNNV7c}!hF`{-
    zS{P3lf;o1Pm|nNE
    zFxY>i_TOHG>irY`N_piZd;bsEAb+iAc-_p7G%Q!?yX)i8`?
    z%@hlW>tI@R^2ANI{Rk<|(kopkWU)@^UBpH;>YQvH8F53#nza`pa(DN
    zDSvr5J=NQB_x?*m{zfiOIa|x8Q}5QQu1>s|I-&Cwp(39OTF50-^6Px~@wl02`HA_?
    zv@+E=_<5}@Cz?;Nk@O3G)fL+oS^Zea_vuRi(`#U)w=J(aV0!|XwCF$Y2{7jzXQ!Mf
    zt7(U|E8;M}8Y>rfOU=o{?Njpb1MZ(Ch{g@Rmi}{>VK;Ihtt0*CoCDLL`~`mgzXHAo
    z9y1jF;a-688)9OVO!5ECx&Zp8Sp?<(Mar_$FD_qp{7@bt1FBl^I%i5vm&=Hh%4vT>IPoOiWUOdse6FhN-em-kl9~v@_
    zY^r-d)Z$c^Fb}l6+x%rs=U8o<#0{N^mk4}1P$r(qSXhOmq216#bQad3p-DJx3)3r`
    zH>_Lc`0#M643N;bCdACx;~i@xemWE<^C~Z#Ze&TiONOozmuQrIp{p0Q`{qbBok)$v
    z8iWMm{o@m3ex2Xk{~XQkS^qH}-B>F8^BQL_Tjb`a-{y_#b7*Lg?8ICrDD4IjBQn)X
    zcP@wTgzt^z^fu$)m8um1!H&_AXo^6FZc*}1;LFF!TYCksG+8#7ea}P1DPFhYr&q#R
    zk*nBNzl+K&^P;D&E^ns$#e)BvK|#>Ac?_1DH%k2>+f4MD26eGpz#y2f2k;5^c7EjY
    zgc7M^M+27Kt$-~l*(@%*DXOGcpH*J5Sly+&K9Idq+LMDlu}^-Er7SK_qIlj50(y^V
    zU?%}p!WNh=6b*Dl&h`{g_cJ(P0(q`u=Zi(hgFDEltXoEsVo%k
    zjUJoxjqDi{jO{exi6I#aJ%q|J_MMb(z1AL``>ty~2*|1D81X^ICPOc8e}1;)<_`M?
    zwuI+h6wEoKG@i@RcHJ4LG2c#XK4{@9BDw$XxxBAn48f>cx2tH`tK@*^r{TP5#H#^T
    zkGr?a{sW_)a_V1wI4;?+%mv1}S1eQM(mVyS#bXa=Y4w}v0hRP5!0nZpRMWtm@0m7N
    z@(D%;`$nVpw9VojB>m35>Bg6r++V~2AEKnE4QAS17tHiC0A8ug&1u`>8uouq5k@
    zt0;d~!lzvl85BDu0%t>IW^Nzs0wMfkq3zyfrl(
    zbv;p!Rj`*XV#tOM{VzX-J+KqEAFvX;?-CU%#Gg7I9lak>r;NmND_)$#EY<^IWBNyS
    zg^A301tqLJ9VXg(YDPa9@s5IWlvKZdBJ~~=)P%ioaCO|_RJcz50oXw^_yeE|`{6rv
    zE9GXxgMVGcJpwEkzMx-6P(FzyQeGZY!ffHJwjb{bMxgB7-e?{$=lElMC0&CVe5Jou
    zZ~gka(aOKmyW1_#1;4Jp!(b4WA$$HbSdsS^zj`kM7(?)q5>s7A&s@`FcJ#B$*qdDI
    zV?U808hRg;O?9=LW5@Qnhm=L%zDHGS)wXH9Q134nddXSqdgB!lnrufSO!Pso2$v4E
    z{M*IqMSkEch;$)b>%5&9TPFB<`tVX0Mgsq0CIPEZK<&6m1#P0A6+B`H@IC=xS*qSS
    z4CMI_-`u+0d(MTO{CfqMvB79l`H9_&d8vFRZ4wS#zC?C5Okf7wBGeCY>4_*1BTJ&h
    z>rVmmxLjQ(ko{v`cnb{5R*kFjEqMj`$GiC%@86-sD_NdAa5SGBu7~Y};fv^-*WZ;8u+>s!huYvZ58nnHtH0{Yrw_EiyS0M!m(x}5@=!sfgEBIbA
    z^-R!h^toN~t#>O@&IjL0=t}wyyU@qE@2n7(Omf8@8w70jh5O(`UTma=myuQean(F1U*;g&NQ{T;^Hu)dySUh88CBi8PL|e!(cGw
    zJHg+>SlcWAXxAr~OmM?W}^1-?XlH?DEB!d0F<;#a@Jqa@EXU
    z$dOe!3m!K^<&b@Ku0?urHfkdv5tz{z0!)vUCH>%MGPT`Qb74^30Cv&iDvIWc72XiJ
    zmAc>?m-vW>Iy?`9&wsuFKLsAs!{GC<;Qj}EUb08;Cz}Q61_>6)&t(te+D$`(D6U%uko!QdI9sVaQ>wp1MjCEpX)Q|oeyJyamOn~aPAmz5YmmIMx~
    zWtSYT=L7wG>j5`4OMTvII*(EmCmmPF*CpwJQRi;B4R~oja;5`?zg^=Ou4T?)%?Soq
    zF3dP_B9-W4ZLmyZLtUk7dHEN0Rv_m|_}6A(74%*8T1#nWNfsXto}KyGj^A~c^d|5w
    zfov_^IqZHS{`Xwhq?z57isNK&CSmX|IibsdcA~R~6AB%S_b_t}_^X&$0ugipM*!dr
    zApe(U^!VC^8ii{W!({^COuZR=V##CCdJ0v9V*4t8j8hJqM$pq&4yrgg@2JP*YIlxpN_sl#w3&yXW
    zSfH%O`}faI>9*ywY|_FX6KN;}ya^pL*Dkdr=eH)O79>rfTrP9-)r84_W3;$k1e;;h
    z=w~;K3jCeFrP*6}YW`#LA_T`gK1OByjKcE_Da&$+xndEJdXC_hs>h%I**6@ky4LC~
    zA2sK^pd9in3*A)N@kuF#R*AYMh8yC&5$gD9qDYe|77dOVT=xzc`8sS7@21(TxFf2~
    zdVr7mlYRK>6snRrPkEI`x*qcgW1Twe7YXSQrFe2_x|cSG$+B#^`wW}7=7$saPgcFn
    z7@ty4XIObHohEy3(yU<1T81M|TTDm3n2^du0-2Rkd`6y2=Erk)P4Ndz6!+JK;BUeA
    zRQ92XjXir>JL**UQ{DNeg@nlQsV!8hK*I*}Q*?QN8*mv|Sggrop=Dnv>Rd32zEh)k
    zZnJ!uQ}`Hc3OS{MKEU=B13mJKc36V>cfjC`tQ>qb3QG8|
    zj3X#NB-uVK218-Z{NDP?lQp@y?SV0ZrL2^b%2p;(tHqu(a*^Pt-rs`gldE3OIWUAG
    zFrRw31&Com{HzHDB~n5Jr1)w84R~r#pY|aZHak1ccxYbFCGqrHasub}aIWwCwVR(a
    zE8{);*7*3182y=gtUQ1qr~^MKuC6bwuB42FyBr#R*Fqk
    zj0%=5=HBBKrTD0{tR#K}M0*T2r$w91*>~Tvla$(J=Z%4kukm(8_%~8KU6
    zXa6=mYFsnjtNvrt^*GB!Tx99{67lz{x_@|zc=O0
    z)Ox2Ek*A@n@bt@smwxMR3fv1j5nWo=_?-5jU~;K)y-iSG@cGXMP3t@}r1Am?PBJlu
    zRSGXo?<*A3m41Gsj78!B3g5EtsV<*?y8X=1Tt6n{Jiee_8)^X~lNBM_!)?rg{2t)G
    zxIP=?=G{*+p2VPX&~07f7~EGS?BszQNnmNc=GpUywl+
    zeiV4t!(M$m`WEr|3;%hni5uGNhI1r8b92Lnrby?udJ&q>j2mbkb=_#ZZs1PD57g)v)k!LJ$zs0WE`ckR_k$ijD2CH-1yLBZvhfo)ysV`?~;X?TVgqPF=A1!q0X9xDe#U^!14Y0V6_aI@?^&%
    zamC_r)$17O301$Sq{-$2-5FgTZAMTY)=_GD5!W@(R9cO(O+a}uz4Ca_^TvUoXMMh^
    z&iW#6l#9yqFejYIi-+u3^18JqUI5TJ8F}n`;o+r9Z52om=tH6RtH^zhV0ThaPK{X>
    zTKB|;ni#S5FsHzFlMdzrPS7487+uvVdf}B+hZddg$Vvcok?=6iGKm4PJX7jwaj(P_T5{9G8x&jsOO@ZhDcbHL+WLZzeZJDSU#aw`AWcVh9bG
    z8v=Y8TEq-@kn|~@2eEEx2%mH_!i0EZBdF>G2aDP{nLM2_v&0|WLp!M#n>pQ~SZ{+9_vovXPO-`v>
    z>^S1-_|&3bSP{){F`!2X?0bFTc!y@)3WXM$30GgR5_}V!ScDCBWnw8gr1q`cI7(i+
    zA^7hz_U7;p0WM{jlFsW>V;2{|b_bv(mnD`ZogR46YN?@&>HriH{eWg430=MkzOJ30
    zQOKpddIocj7_#nf$aiP@`m?M$$GFZhOOcQtXl^$cFsMJ5p$?Hykq10+Rn@iesPSmV
    zt1(=$H{-^~ih~_3cjr=iEpmUS;HnHg=hCn~
    zrf;4;=0@P&v6X;Ug)fg0BlAJW^HvGs;nAyBcuumPeGP@SJR+6HlMbkchV_E~*^#DcAInA0Z64YA1V5`^WA%VM?;=JDl
    zL1#Zc47DPR0jz|ptTSH*zk3B*%Bzh%)*GgN^Z9##jS%5TB(g0(-|)U@Yx}b7wA_;~
    zxbVi>aXNeY@|Erqi@@e_a_jkEU=ECI{&^=x-y>d-h}2Jox2_FV?24Eglv1R9ICW#c
    zwl15v)vuPgtgOT_e4pZAeLspaX6RdAg8b4R@WwtA3QK$3NN6}k=uW&pn~fM12pTgR
    z&s;^9c0#X&V%SBT?vU~DGB@b)DBzB4mI*^7MQ2%m$~NxJ)rHvDQ2EX2!zw+7$SiCN
    zUt^CEp1-7VthuPl^m!xdmbkR0u_C3+#oEocxZuOtT}T^MiI_PXB&1{Z7?pRJKYpWW
    z>1{-KLXCByU8#ZIp`mFSnw(cj+(&`%OX5z56I
    zvV#9oc>+?|ATCej_eCmcMH_likmwLfdcd
    zN)Kmc>Bd_nNLCNKi!j>%eLCvCMAnFTf|})EyA`cePd`cU;5#2_&|>-aJY3bBT-|tc
    z5<^2O?dl9iiAHf87bd~ZXCZ6&iWNKDPDKWUS%%U_^!1}mifNYio-1s+DTb$kz1t46
    zZn)jkCzdu|mwvFQ5BmSJm6rZpASk^>#|iIKfTerZEtUc-+kWo-U0IbkPz&~k5}>6(
    z`1)WEj-)G74O4zQ6Mnsm~@MnvGzgY={iQN5)va$JE<+!;rWXIa3t@k11Sv^sh
    zCDa3s(>hsN9JpjT+%c`1uRIjw%S1|9q|A(*%7TU^K=@;Wz$Ns{zB#O>K-66PY
    zfiE3~0`&Y%9LO6&LA95l`U$MY%qu3HBrh>(Vx+Z~PoYW*!*)32s{ewTbNvf=&qs+O
    zXYzGTSZU+5Kh2X@cj^Chc)A6`7J1l#y(ag0V~WjI2>LqP$*$nO
    zGwss4u=+=smX=U;i9o^azu=bRHU-LKTuq2c|Fc5?7i=L*rWJHGSVuT|3I;6ITBd!*
    zu~O=sHGZLJ7*sGP5ut9lff4P!sEr6&%>)B~nWm}Z9sVT6rtsWh&LPDe>5fP~fIg*&
    zXVYm}j_4^zab#X2d}?Y$dPE&7ZW>7^KVPYdC`Xncmx^)DaF~d`VQBEbL$d2R**!E0
    zM+%k}ynB1@Ii}n@7*7>%Q5KD$x%$hwNJJdW7Kw-+HtH?D_aj~l?6izbyy1!
    zfJ$Iq3sOy173OkhNs6~mEDO#9D~k9`dt%>Qr*(L6MOf+fs+vao6S|?jBdIvXX7EPW!u-JJBTs>OhbxW!8EZ`E
    zBFpNqvQGX;@yIt<=Zv>uG+t-0>ubnjx%6>%6=~BR5k(bz_k&`9!48aTqq@gNf>$&G
    z)qNy_1Y(t{qJ>g6qQ7`d5bAgu)rCNWz*l1&vbB+?>WkK1z4@=S9__RJlcdzZFHJ7^
    zL9J0XZ?nN6bbd)MG9KW9mvrb8W`%yJ=b30lb`~kHj4)ta_`OCYsQc@5@+{KT)GhXv
    zkxSr}OmSyC*s`pHiDu8KVHi
    zOTN7}X6^1#d=PNM_W!tTkg;5S*MK2PXbFirH0Fw~@^Sha({`qFb+Z
    zW+e{_e~=SW+G5|rlJYE{9L4?wsx|_dH%fiQb7N&mq_x#EmShtiz%y`8!C}k!WravQ
    zSYw;bbUU))z9Ev=fGp`)lWe8vN4{&~*NAAfJ-(m{6^hq?A*r)m`8@kf<@k6axG%d7
    zR+}QzGNW-RWf+McIJWX|tK1Z$MTL_`N&?u&iX8d(!18(RfrY;8YAuB`sQgAjQJh0+
    zycc6An7KDmcqi67pQ)p0g)k+V$W;lV;Pi(C`c|BGKu5(j{Q=x!uBKI76|%d3
    zUB>)>ri7D%?KjHfvn*D-_wp?iUy4ww?}e|}B?(p%2M=?YS|#Ch#iX*MrB*CkglAbjG2YH2TzAPiAS68>@W}b7A={Nkpsy7_1*F&HG9YC%dd=e2mgxn(l%M?DJO7X>gCA}96T3>i@;mz
    zopd3YE;6!cu~&l|J9Z-Y9(Le;i#w;T#tc;~)y~gKS2mAv}T8}^0}1DS$L
    z#f*r0aorv0B8n`r>@2YAGn@>b(l9mjGEvxuX@ug4)F)P*n0Y)huK()!VJD2&bT)P!
    zT9DSmn`+sI)LJ<~-qziEecHw;l#O?UQ^F7f)gIo_$C+~Zf7cA5!pPgKXmP;Jzy)cw
    zG-Z(s4-L0ciqD{{3(<>U;6d~3s%FbO_*&C6Xt_L7J)`W*{}`1RFD>0Cna^YYhJCHk
    z+eaAtoGo~F)(J~<$y2!h1SoZE7NWA}WO_SD{|Q1Ggi6{vdW8?Sev{VUp!uwZCH#d+
    z?Rk#{`DmPi>$#D;%xeNekL_W4;mZ`4^XF<+H7$*4VpAQHhKXvCZwxY`;^CZb^{HMD
    zpY=LX{B+G+Wc4uf0xAwYW*8H{9;6y_(WWc2dvT+u9L`u2r4Y-#7_}9(#|+13uV{k3
    z0*4Pk;g^BP^y3xIlty`fZGkW>P|I$PAVqNGiF
    z^I%eO^Z+W-9(dCpe~#ev;xzI^QspJav2wvKz2B$^pZGIw(B`Yw#VgR!AgJEE7F6>P
    zRhLzBn`L${@3GG2yw22-l<{Ch$qjJAS9`X`H%s(B^ut&6vY+!Vs+FR51xc6{h?#1M
    z)wN>RQ+$xmBEuzkJ&0;=w;-Aq?JCBq0DKOox6{
    zbS1Jzd9@IdzMbTMD#reuW-ciaJ0_9OzK(^9DY2cl%s!_i$0`
    zV96NI^21}vXz12aAG&9%5@utJk>R=^RtMGaPDa5l*UtIMM2_WBUVZ{uw5Ivh(pd9|
    zqf&m5N=#@wuAji?EC3p_mBd8vr7;%aXiU#e#_({S%!$WW
    z*m-h5_mO4Nx1ldXSP_v0&oWp>lU}tg*)T{9hNVYLzk-Z5Dx=~_?Wiw|k?(!1@(37V9=qejG^!@aiTIzS*+=bhuKqBYC?{${T@tMi_MRf{Bh
    zX$~o&nHWt1H5Ky(yq11AKEZ_;D4>&^mSF$s#d$(slE33}g!Qmz$>v27aLqLp9N@?I
    zFlTE^kUW^@Wx9gKQu$E#&DE$^P4jdq_Ch+dUy2834F3n2Z%uc~*N`x*0xDL3$xf^Y
    z;5$P(o5(q99koSK@!}GD`yAWR`^r^9cGOhZC>~bqMAhMpwk3#^#mP_D(gA-wmq
    z9m;Bq*c6t{SU4I}Yq`e<+sEMm%?g-eXpBveH=a#}Ztk5w_SFZ|mC=RliSZ<`Rv3^G
    z>9oJ-cudHZ0lTos!Fl;kOO1P-b;=k#^lvn
    zHx~Z~9T6G}h{7=j+wB8PV$zZG0Osnmc&sSY%da3)a52LwzO_pG%3fRG$`Y+``Uy8G
    zsohRwSW_WP^I9}cwK-S;>MxFOchDTV#-1{$^c<%+^gaV+jp@QTn!l{2!x;X{K^w0R2oODf*7`F-@*=T;DDk`(D`vCoCfNZSh&YILKQi#I6@EB`3
    z>Bkt+5#EFsQ7mYtR_qAj9>oJdTV$!Zr*G9Trqqb{{T-;kQg!P7!<3UcSDTC=ecT88
    z>Eu*77=MDXMF%}@+Lj-XuD|Jn0rTXtV4Zt8vLd1ICxdC>c6}>^+ZrmCDBHb#vuYbf5BCtm?iMGoy}Gh}OlTe3$!22*&(cA%gHDqCFF568W^s{{He#B1JHmej`aty@Y|
    zZeknx^hp5580fr>c;Z|sVr
    z3F+6DTUS7ov8W~-tdc}k-NZU+Ify>f!5gC4im`*(hB=&vOg2WCBxZbDXVwHqavO6%tmSMhiA=Wikrn|hAr!<2Hq!ddx|OhZ4!dh_#inN)XY`25GG_kef8&T@1t7gGXXSHm$EHs_hlf(nxG}<
    z8bbl~+Qt}3r08J>`#Zs!=R1&o9;m&@SX{rI_*d|!^m-esRL3pU*n?gPQ}ZqJ5o53K
    z>+n(~$yz@z6Ja&JCEH$jR4ftXkdpQy3$m#&ntdDd-02g|Lu7HP
    z=XoW5=Wc!JfRhDUoRV-%PWu+Whh@mJ
    ztLIpK4swAV*2<@fWSc2IOaL
    zUv>Ec03O>4TVOs()gl*O1Cuc&t;nLqk%({*n+2}wyISiVsZEbT
    z@yxVlqeUcGy}ntKd|n+jx$;RtWT0`QrwSIIV?n$oTu1m1JmcauGW*xswM;C7MMkCTp=&L)Q9Dd+?W#pCLGeZJfV8
    zLkM3M$ia?rUg`2AQ?BICB>2-r3(b1dhDM_dszk01zmWChRHGJ`9wU#^;EI|C~&)ctMeCVsZ6E2Bn$uZC<5K_&E=)jDpvo)oAeHgq9x+kuZxW
    zqP;N(=zQArkfum@6VE`mVu)DNM!@-$r9J5`b{
    zW8Qa9GY@QER9Pf{eL@PR(jWuiP!KUo(bk&-zJ@ZuK_Abb4q?)f_XQ)@1NS8lfgC<`
    zl@Z2nyNngg3iYqod!YVzI~Up&JtfJP>sW^tLaF{~o-*b_%ggJvGI=WeY6~rrLYSZK
    z=2mB0r~IxOXvE^69vtE1q-B(_tI4jAGPXNZb^3I
    zAY9qO53!2Pos-HxwiaD*gdwqR}T~q+%Wbqyuc>-oSBZ(1+HVPtk)5
    z7=E;+Kz0n^{XV8tb~FJ>{EV0VBC%JkH0KhO!_Nx`bp
    zMi5m3*F0Apb=+VHCaN8W8q&1;VzGMsAfC%N-ZGOXRQ`&svTm#dYg8K#!+|d8zCQST
    zz|2sRDD+;V-`daEXrHY#Z?C4X#R8M$TPnku5#u#__1Fd54Kc0UjbD=)0pTwbJMt{m
    zaJ$T0-%jwx+swi`V%!Vq;u-@c~j7yP23h{J)IlfSwx?dZP1
    z9hR0RC;qawHG|dKkmo+n?Bly`en@ekk;q$7H>=k`0zgEoQT704+=%y1XPQ*1t8pYh
    zL58A$Aj7k?430w?pJ8c$znJStPZ4IEba4+Ej9>QNry@~fmZx2EczE1*W+VS{g@}f~
    z>V{E|Nx=^yM?ubF5Y$UsrHV7ag%|URRji5dynGiGS^bzF@V4ZJ<4_iCWaheOUIC0_
    z|60O0Rw!maj)B({VI+j(^2wQsw4hHwszLf)lKjzVmYM9U)J+*5`R}4`p#WokMr3kO
    zYZLXkZt$Dyh0Pf}4Ht>P998p~!Q#miTOOayc>{V(c_JXL2Co+y8E(ev7Q
    zCfd*;YiX%%EHe2~LUE~hrYc(uX=wBUo<%0c)A%=ul*cc7hKK#zqfk4TY0rptWB=*a
    zJxKe!qn#hHT03XO20ILNyMAn*SzY!B=k4V&X(ID3m4Al)hL8JG(<7yLV)wRoa}Za3
    z>WK?szBY{XVu}>cOEm_B>c18=1|)QDdo)gr
    zi4cB)$-OA=dv51x3U6{$rmZjYlBBA^5Z2!H+Ay!>o$!!)K)XD`bF_&u-xj}Brji=G
    z!iML~LOtd&+oGXkD}lgh&SiRv{K`7LXWlTCv$c1go8D5Y;lUq(!)rJ7i*~OZm%Ed6
    z&$ZSw0B^V>euOdj0VQ4>2WmW8Iy@T0-oRRpd&RNCPpqs!z<X}+UmP?X%
    zGZokiTqhqEjiXOPh$Y7EyEz*wsW1TmmhYM+U`@ScipgWjiA+L2NmUc};d7{3_(RG@
    zH0R8vfQqElbVv2kPQ!)A>a`jXY5nm)8s|u4LH>hTJLiB*n+OuV(%(O7Gd4-@C+kSB
    z7x3m5_iSEQYBNmGs(dDMM!cs;Ff6vbbGaG_uG8ThgY9n3Xgg9GoX57U?PAi+^3CDH
    zbr~lM8dFiNGc{gX7}=4xM%)jM*nGxmv;e3ItB(+n`cV0+Fbje6RxMOrE^g<3xDYMD
    zC)3){;q?OJaFRo$5KpY=vFcLPoD@)kg`$pNc=NJ#qnVRB>`T}6eHiYHUYC9U^0Xm)
    zf~4atP$u=ArjQY}B*3?UtmlJ#|l#Fgjynow`7pjJivC)2pmBFbyUFRNh
    ze6;6aXI*&F!_0;sgTm5a--sl=Adfo!`qOKAIt7wG!jQ5<`^C0ui)q-oX8|rrN=`@)
    zOU!+CzX~PqDp~!Sh!DF)X?;bJ%+8yN{r{vq3uU5A|>VjmzHb
    z)X$sR4C)a%-;6J{zElypR8=teRyu&w_dta3``1ta1MKtaYW>H~pZ;`Z99fX3c7C1yDIW}n94upBYsdMhKM#)^Xe!P+^S_aO3WPlW1Auhyea>wOdt=8+=o@QW
    zYsl|v(HWvL3=v8Bp^BGiQ@XYHlj9F&@3#QEC)r{9ULTR9NLj;
    zaqS^gifQ43qig#b@u^!-qNAl6&5ocmc1E(X)|wn{E&Mf!O0zdAIR~c85?b3l)oh$f
    zdtEAqG{h(p7fl4%WqP}9)bfgiYp#Tb*@@_5(04XR
    zOchG}AXm<8CvJg`shLh&lR`y#2nq}leuOfD@NPKvT&;~8T4yRY+h*pjt_E3hh?Fqi
    z;c+LjlLFqM;KlW7`L1!eqj5uc$d$=ibwnq*(c(N*BRE2I+;%_k)9hM{9CAp_Qk08%1aVgSJ?~T=@{mk>-tkx-<
    z_=J#_9R?fufU8_pxx;SxT}Vvm?E7?CdoW!sH0PaF!j`!0$Fn^N1cUEh=eO+#dnE^J
    zboH&X6+cH}$Rk#WDlBX;rwdXX35j=EL$T$m5qx8j(Yk;bQRUyy*K{<7iWl-`b0yr9
    zH8&A@hyh7X<0`gqhqhxxNSt+Xf~I>kO%u5>>RKut1S}c4@^~@HWLbf0Xx=>9L72!F
    zks{P$o22YWU&Y)!5x=>0oxF@^jw?L@rn4_YPi={lyE$T@_+%=9=Vn3cBgg
    z_7&8@>D6bk6qF<%L_InjdK96CG0hhzb+G>UXl`st$
    zP4)=7Q6CybZ6YuGTk?uU)|1Rf>x3_F5l2X03E^}K>ro+r7+Cy7klgi<%F=Nkvvg;b
    zPx!5YvMX9C@Z($3ACOtnG{v#6UEp7%>N3m-q2#Sw3@C(d-Svb4qj_j{d$x1*0|bf?&nm}iSk(Bl;Ng761A|GJ+ZHEraZ%}kXZir`8$<_
    z<54?>Vr^1)6El?&M3zh`zCnzBFSEC6J{+58?{TBTgf`iJgD;W|Z^nlF#Zt$Iz^PQ3Ip{CXILx%iC!eb3HL!!^g
    z8-pA@h|lc#NU|~8NV{H}C#9P7z8EjzIGBqtBjap+A3=&p3~E8t7bjX}1i8ebnK7Gx
    zGH&?u0ZF^%DdfLDXUQeJkO?1cRE;&oZK2zz2JW-eukv?w9x}kbQB5pZrLm!rSIxPm
    zJBla;OeNu}T@=e9MJt9c*5ur{#8Z8d&U@pKmx1NzT5+ikka?e
    zxJ|r{k=~LsSv$GHIG|;+BpnN&>t=t(e%}~E{0AV>Xtu#AUJ)hZV2xs~cAaQNuMgrv
    zyW4jZq_wC#xXfKL)?yGxX-R9iRE#}Lj_+MUFlV_&DW|4X+x{Z(GX1Jb7LPlp_~e<9
    zwS57fc}&%}jUde2qJ^(M{Cq+PCgg2_xp$d)PG)BLvUwO5@86mN|1&jq+-Wd+eb4nie{d1Q%-(zLwbpm9wb%N5Vunq<
    zQ>-w?C|hu--s3B7IIX(TwBWglENR7u;qV9kZV1J33~HSW=*
    zH=|UfC}*iUs%et#SYAFa!{DCQZ=O4l^J|vT9r9Fc3N)r5RxJPMb(hEZv}1QmXEY|+
    z1F7VAc+X}&0o&jV0_lrlZ~3&&FS^5BJpAJW=`atU+rr2X*eaz9eE3o=4b)3H!n?X>
    zu*3!YYSDaR=p2fGrzU629TQ|d7$}Q7(FiXDlC|={V=|UaSpS#K_0uOmx3!mS*PH|J
    zLI7VZ!GGVX-ujnK?$ra}g^zx4W*YYWl))q3Az9LOS{YfAKPM;r&%a~b`8jR-W`8`(
    z0vyhr^XAil-pyx+2H66uCoI%gt~s#|
    z7q1zFP-eU{KlAl?h=HY!K}e8Bv-Uc1f3*C3I?4o|P;-_$$BTsQ_+59@LYvz5x-@g&eJf_X2kWeEO^H(By{
    zS)o#SagMpTr3Nz!x4k$H1D)yW{z~$ukAQfLBgGN-!};oYmAQdJ`(
    z%A?XVO?Nk~hof!rNTQiKpIO!2)k=HLL&+~E3JOp-H+h9ek*gr0n^#sHw$VPc=@Vjf
    zucW|@r`90xW>4q3F7%RLbAh8z7fCg)*~v29u2!mDt%G!|7aRJ@=UM(|6b>6mqQ=o8
    z=80r~dhMnLsu#vU61hEYeVleDM0AXja+>-ki+bY?vPc1(MMqxZg?7j^6?BFz3`Jzt
    zW5&rZIYHp4(c+roVcyYsz9#o*CB{DiM@byS$aPTa`4s0T+c2CW4>#d3^
    z`*~WSJr7vNJ<6DSwE$FNijHMv;!ere=}%c%Pa?lL*zcYg@#S4ZmR@8}ZZ)3$C(*%w
    zq4LM>8(#9PUWRUjuZ=8^tm-ClKTXBxBfma+?-I+vU>ZAPZZs+JL|I{{_(T+&=!np7a=MR^ndK$VqsR(BM2-
    zESlbITdVFt7E)q?f#l6wLhhj72mlKvjhnX(@<@$2B^ho{psf@Vv8f+tWKz
    zza!ZSO?D%+f`@{1B}zkHJe
    z+>~XvFII{Q&T1>%{2%3tu3?yWoxp2v^FFSm*)6kYJIJ%c8m~^b({SV~{scOIihX!(
    z-#7!Kf%E?I0A|7+qnP*Xwp|b0@xQb^tKq8>%I~0d5^|q$PWwcD*RMllboYIjh~GVn
    z!;+qED(IpWb{TQ2#Z8jKzAxnzyLyVtY{dbk25iTkhdA=(Uo(CGpt1QU`$(IGGM#jV
    zqsY#i{XxzJc`70=c*Co`)Yr-UHoZ4<@2|FNRfj&F9w$AR+%$y4Ge2Hd!!`0hAG7@H
    z{^Wlx0>cCrjxHhRK!71|C|@pJDeig}0Hjhu$8@8E|7EUX3-r6ChorR5k$ndrtA>kt
    z7N-5LAHJi0%01ys@(7^;l{E^q%mjVg(mQ=Kqg()s37hMcUvCvwYOqrGDBC-_y(#F$
    zR0Jum2a1d6uW_MY36OVo49P>?IfP45KVL&78f!=RN?7EudMsy{xjKVU)-dkifE)_3
    zW7K0<~s%I5y?k03`695B+1o{xz+hhWLNstB9D=wVRux{&t3GPC;OLYmkII-gT2_N4VwKx?oe||u6CUQxrxIgczL+aOx0bl@DM-3yT?*-@L7p#
    zuvW775wBOPIcqU;wB8x{po*t_`eF~+dA$$*1pVh0>fo`}mDml>D{`^DPu2*CAG;G@$`2P3B06WYv^*aN{Y7h51DfOu{+*T=V^Kg!+p~Z*gQMK
    zGt^&m!X(Ha)%vD+T?I#xz9Qo8t(N0MG*ggT$eu->Ah_I_)#U`$xPi`a^CL=ay!$wg
    zpKqm7j>~hCI|Zl*VX;;#3pw%?N!2(AI@%3ie2xGf1(Hx5!l;i^X7iq88
    zA}~CxTG8km4bAR1+w}IIL>gRa?m0l(uC~E$PhBmg9FT0LNui1
    zOJm*C>FulCaEzeaU4vPY@)U_Zu1@8J!7~;T-qmG^sOVo%)C7Ia=>YbaGJwP7PuNsS
    zdCCs7^Nv((JWK9Z<8b5gmXi!Am34e`?ddU%<7u`O$W!9)t=OFlOlu}=Y^?nfS~FD&
    z8Fq4>f^nF~v4r;b0VSN}&z~-aa!ht%ii>j%3TBhvo=8qcXl|x0tW_iL)zNkR8DCA>
    zz9pCQ(goxFHRe&ip+|8>5#-O}^deah35q4bwOiH{o6lL%jh*^SBmY5xV1N4OZWLg@
    z{HGt~2mH*Ropj=&esZ?|um02HVVm3Rb4!rgJMu7@M|Dx&$1{_TP67RHEV$)rW#CsE
    zAkmRF)5XP;&+cZG+)qE)=o^4xynU)f)$Mm*
    z&1zPU9(D_LeH!En=Su=O^$bV$PWYHE_{mO1f`XG_0y4t!b0VA5nxqm*9`2Cq)y5
    zPUBypw}sTga7u~1!lvhuYtJe4n4-1o6{bgBl0B&{pujZ}*|w0yZaxmIlJWJRKt`P_
    zfytgSP*lPQ5dHiqe_X=>et~0={lT>TZQtj(uloecOB^7E@$3I?s`%9?Q$SyCSqJS6zK1-ID83c%vnWlSq--
    zR3qk&-G(#DW_7(>+Ee#e26?qjUxuZ;c<z(@EB|7A1+yDYLEnkcL!ixx2wJBk`A
    zNC32`Ijei?>$w4SWa;Y;QhOz(LAe=|$T+6kj~$sLct3!a?c}ekoDV+MJXYjF9@G%!
    z^?A~L*yuEA(VXp1etuMWwBnqWiOjSEf>OxMDCd)KWNQMDw{0`|V9t~zmHCus$=wJ1K(;s+38WmpvAN$B0}e()1wdiZ
    zC#gR`;PBPj>(Nhhi&}Wd1U_tPuXpO2F9-w~_<#t^^Ol*OgwfmL4YbBc9Mk$3VE|wQ
    z!tfmvqS*T_Wi__)Nu)(@Q{+5kFTR5URzUm+)ldA5KC&bz8%WBk@#O>7n3_zw=BgUC
    z9it;#&
    zV2_q{eqG$1x)o}?`-jVY-|8(>gwlK?aMzajIo#-XOPCW=f_j42!Sg6|xRP4rtX4EOjsO(7+bWe{;F$7mF|<5VaNI+
    z5G8M8o#gB+femBP0v+
    zPWjN?Kpfk)ZrNX=aRIh?DsZIw^~Cw6qCN6<&5$1#TQ3y=vArtBBFlNWZ
    z3*xzlm?gJ7^ME|ZLR8p0-=!HLn;fHAL+Tl>aF`yWPNYSqM7n_84dNT5OHdY%ZW`&k
    zRO5MM9??rX%8x2wD(Vp{4s21fZ`Pa`gI0)-h;%>C>ES>fIN>2f7&SS{
    zKiMD8QO(YKV8a?C34i%gQW~g}qxne3MqF~UC>*8vp6bZ3*Z+tXJ2(n-B<@};C&fh|
    z)>`u{q-2wPVjQvEoqRiC=}EKo^lH)99AdB7@Ouq8L+*}F^91+?)ggBp$1nXuo3<1C
    z9eElq@Tc_1-NY@ab0V{)8>8VUE_ayzOc;n)?feI+}*
    zu85kcCXOW!@M3sOfDfs%kWI^gOUNm`H4a}H0YG?4=*OYk>7urCG)j$HnHf9IqwDSF
    z?Dsj<=NjlDuWJD32d*c-zE1lNipWMdogpFadl4tJ|1sLwucP&g84p)&Nfq$H3{;Lx
    zdK7E)j8L(bXX~a$Ed#s;WI7YI56O@l4edmqo|PETK8)+Z7)c7M)KBD7K%b?w4asLS=R^8a}`(!n4vv;
    zIs-eitl7K8kWcTM7?e(qYFTQ-2S=hf3$&L+UtVMan}MAY26%Jstg~ekBop-fQ6sP=
    zGM0dBi2=BB(zW{Lcs3|&qh?PjcRYFg6IW_%+M70Y=mgBrM{z1S`$wuk*VeSkJz3m-
    z>=;hcS8wl?7$jeBT9ShNX7>fZgGLSCOf)tFiM$)gp?2eOlZn3L-^TzT(XE!?mpJU#
    z=P7`0l=6)q*H)#ybAtNxcZ2OKMG-0DxNpl@Xz1R$U#0QBDx1_by0c3EO|$VShVFe5
    z#$KZIbOme>jr-P1^p;d1#S%xq@1RB0zH)4s)rXVW6TaV;^!spJ&E>(=y1YBQEN|v@
    zyn>P$sl)H(>{EvEZ-rzTi?1(xdB~4e^>XZzSvN-X?A*8r<}cYi?_A(ywm3ZbTDKU#
    z&-*B8CS_q}m3~?`db$@7YW&{{)h9W#TBy<1Nj{}YA;l$vRohhILQH@eM1z28q@~c&
    z8*ptI7&PP^u|-s}HnQmuW9x%&%iXiaZA=fEKs%`Y4$^q$!0zp^0q7~Xs+>0Ey>|GOEd8&##MPJf&}vNo%Pe2=$KC#*b*7vE3k;|PK6z};iVL$RTBOAg
    zPfl%+=H{;M?)xL2VH~iaCrXB@x+n-k6v^CbEV-i=^vr791abue_R-_VHj*5Og%Tqj
    z)<$0%_7mUVTkY>*e3nh^+6t^5Z1xyvF8F0rxxzlNjj>cFZ@I_|6za=a3yJQ$l@mm@
    zJQS3tJICmoCP<{qWo(3A2Vx{D=(`Rn8kuOZ0$0+5NM56Hw$
    zy;qR@R4ui6-tRPEDl)4@9#K3>+Q?nZ3y#pv()*}qbmdDiA3
    z&{CMxP-kuPTvnq3CE1z*B>|JY0JY#_!8?22f%oXR#jpoJO_&Q7(JFHP<&)Udfi>iQ
    zUo&P8+a5dD&Vk2}JNaoG^LrE5zxAcY(o%)5Vn4@(TFS;NwDy#t6PPRykR$q&C{1Ox
    zD@S(uYFA=#7!i}v
    zjw`A_L2YmcpQUbpx723C`&5uUv7t|zhG^8qXJx(92rf3a9^O(XI-m(?EPN63G?}>q
    zk-GVt6ghF=x4bkjNy9cYf&X~|8kF4I$g9f!^I
    zh<@%R>Mc0M^unAt+-6C+Ff=wV6Dw(Vv0AgDlfjJ9tjT48AI&0W18=Zv(q!|l3W4t%
    zlXLPbl%h`J;|c`y!EY;*|4r#f-q~|;c6{L^&Z(5nFQntg@?ghmNkZ2R#^GRQv2?_I
    ztQ(Uz6y@Ellw>+HyTho1xy~XPAG1rz%s@AqP4bO&g;IX>YLA!z14_^G+uxRNY_bHupmK*^UWb1NJs`Cod|1{PqH;UmuxMi9
    z{wTA4$*5mv?e3A_Jz`wf0Vz$uZm^#zzv(qX?2U9e2$YNs|8T0#fAg^7Ga;}qT0<{U
    zdIz{!uiBU!?`mk4l#-2F7V{+-@a+Y%O{$1`su5>9?Y5i4OA$98neKwtTohVoYc~bq
    zqmR-W;rpyend{t$?dEl#55I2MZ!R=B1OG}XpBO`1bKZWoV+h2LZ;4k%pX$Zp57=C<
    z^Kso%5#cho$f$?y$`PkR@2kgWUHA>q(%pAdT-YAXC8i+J0T}{D5?Y)x`!_?qvQOsv
    zVB())qc_nLCBsyp-nyc*NauRw+4;r&qx%Gk6`qlsKd{GWM@rwOao3D
    zbNf3epHlt|zR!1#a$R6j@jvnJB#{5LZz)&=bd+06jV>>y{2|?g)!xIB6T|BTZB(fK
    zf&Tc=`viwO<{a@k@jFCXB$nl3go`M%L&*1Q!q;p4GXa-(GcEKoY;xnj!GEVG
    z>oRVp8_nqH#C;a}fLW2`pdKCl0r65)jFYDKB27BJ9eh$h!ZxI({GuE?DJO}@uYx3;
    zPN6zJuYFs(K#?)a_4)_XV!isCJ(2@eQAAd2p%69Zfpe+9}jU^Bh4pmECv$%$L3%K&Z9TJAf}t(PWm9AP?ktQ{9lczuV2LZJ%`*3*It
    zlr7w<5)wz1?-nApZrtnXG3YmVJXdc=nYZ3L(+qErOe7c|Jk%pBQnQeK?`
    zOco6lz8iMmCaQ%#>o59cCw*4Z_LqP!;vkfX#`tPaAb(@z(lz_-iT3)%)mwGuBWwIA
    zFxXMXjJL+26ToCalNc29oLN9Ll*%^tqm;=7{@|*hp40ueJDPiNEM-fJb!OT_p_I$m
    zgdK1HYosj17LYS=TKdgEelztr4IqE>hw`IA>~*%`rK#JHztIK>S^9q-i2j@RaGqpl
    z+Y}invZaaF$;Qh}#t@)Xwt~`~jOVu63P%EHxmA`5%eghW^7e5hF;G{JMRMs#TC5Uv
    z)4^h*(+zuvycC#Vl!9zF074)A{eB0e5*ZK~83Xq;mr6;y0VqIM92)%OaN+XiMD}Y)
    z{qT1XF620olb-qnk~#_$PAt&|{Y~Kn%K!BBCuTqr>|_Wigk;wF_(x%goxuBHomek`
    z!Qg%k@ah+xid?S=C_q`j1p(OZ&^@i-ofni^Qxp(9_$qBNWRl9{8cV0q_B-ehtqfoZ
    z0e%1|D+%^zkTTN~*Fk{QeF^pL0N&4_OmKM$e3v1uc12!4Ub~=J0>5a6qdLa=o-S@iG5v$jz+Yx>hIDgC_gr&XZ#m@QFl)kGwNjxY#*<43
    zP(s5(GhzY$KxvvPlgBHc{o6)HVv)-L^?PA<1!RU`OTsu{T=-IHd^a4NSRcis-Ww#UP7
    z@%89I)ye7xW5F_6(8JR&!ahM!6#5nnmN-QBL)A<15INo4G8eV07NhXWD(K~n$?u?r
    z2!OYg{nP_EWZW~LM;s6U3;b}B4;ichBBoXXGrsjJ0w!XkS(bFDm9Vaiwa*
    zYLD%fP0V#j#Fyz=IgI|~tw__TdGo`p+bc17Aa&FmemUK-Umu2#Yht|%QG@9&#%3INl+Pv%meDr`-D`J%rrhz~xRKu!Tg1b?7Wziq
    zi6ynCd3dSaG=FgsxmS9}$8``;ed}-Z#~9^+-yj5%8TG%8DiWh?3vR+*N<+xUZvvpb
    zhaIQMl`~AYWg|C;Ir*&AiCiRDHdqo9o+JRN2BOm0PrKJo!g~k<
    z@#pEC0-RpF^a$iv6ydq+M)KJ1C{34%sD*45`-zi{gkz`z>&!W(>_$k#7;s1Zvo_FA
    zP0L@SJcaDFgRh*R#hn-Qfa^rNTgta?;<`pWKRKt&dcDmf(m&TeC@mlX?ZvduJp?tMs@@
    zLI#USM+v;UcMn7#DuyI#Vn+s5gU>O^f!v+0yvPgl6fWUp43+tfppGN`1sQ+)t{Osq
    z_xX2WGF^)Yk43YK=Vpum9K~DCo*ZwSMUuK*ukJmQxwI%N^#IOc&WeD59HB@Qz}dEI
    z0C?W>iGXd+&|jfO|08EcQdaw>d0g?s_@LWd%lhkCS^_gnvgH0kSn+W{{nqHdCW$G-
    zCk}vdU^$^_@7KA>UorcrU86n)>gD*5Oic>builYTe4e5s*>_7%&*jluO`a&9257g}
    zLvw5DYU`r3R@Om&Pi1bQ-^V8&cO)UIEH72elu4Xmm~sJzxY*ZD*+Z>75L2V-{{
    zD2}-SI%QtE7H%)6#u1__w^FP49H=UIZ)S8c;6Ct-{dFDrda=Ca5O0$wS&DQI2qLc1
    zB3Kb@eg)gPov9Ps2d_HSmIwTsHcL_pT0clwpm+18S=yG|AX{Bi;OtS4vC^eU0y%zvfv#~(HdsN=M$x@KCk61S1fWe11F|n11}{dznr-H7w8Jy
    z3P&cGE=Zb?kW}jf`V3cTxMgSBo$cBqN&ol!ufJW155i$SXTQkow=wv3sKnsRfXOF;
    zUmvEGlB;-%rE<=7vDgT8@~lXLzIJ_L?O>+x==yw~T2Oj@QC?iGPO%y?4OuvU}RlSr^e!)3a|@JZ0+8AY7r5IABzVSQkU*@7o`
    zs$M?R`c>TwAxh+G7SO~L*N6_fc}noB#OU{9zk!eO04Lfa4nL2AOba^)$nkxA0;_{k
    zK{ZDf1wZ3wiNi9PX_iW4lET(p!zM{U8j!#fCvR%ghUVbYy@BNUd)Ym)TCAXm_#37f
    zjpaAtqM(5QW0yOXf2D{8*6sj>DWZMf&0k~1m{uU`*4GBo5S&`igekO(koZni3W|+)
    zclIeQiu|JyLTA*-HlGOyg!*Xh>IZ9p&O~ODc&UAK+vQWioN`^gP9}cK=dcJ;=69IR
    z82_SoIY*L?bAV;(099H=G{Zxgd>G}cUmx3L%J~fnouyqm*&5_YdEbS9-svAdcr<9^
    zjFWTtI+=vO|5?9%FWqdwMx1JEdIG-gBC)_0cfov&uk3!Hh9
    z2bSk|9ULo|t0wXkQ}y1P9VN9ezNaOp5bp@ENXy?+^Rs*cs}3etNHL8xN-<~htKjFw
    z>=GXgxJumlZD)QPNnRkE_HFAD=bcrr=hquECB!Ct){{)pl!LRekHK-XND=M7b_7*=
    zFyW&2-CmS;oV-{`_x^fW5Qnx4-R5lGjbII9;E3?6RRe4rKl?)Y(?)Po_^8$Fz7iL3
    zbMvcwephY|d+AzKgdrIbprmDYmva4;vkq#X0+b=Y)l%Bh
    zW_PD|f_JfLOy9ueJ!=$4Sj$X+!WjPCg6M2Phj)iizpu_;Z68rzf$W^@_2Pb_eSh}n
    z_0gw$&y^7kGnBMWAMBFMYbOs9+E-jPu{N?&q;ZM51gmRE66Y2~l0~SY;*`XiOzi-o
    zIu<*F6iOIsXqULeDfn-k*b{it_0ow1K;R}#9CZf&%m0S&ctNp(`OEaxWTwy8`CvBDQz`n
    zRn>2tG9_8n`zoiDxJS$cR}RIa&Hq-E?ja)Jm+76DIXr`-=8}FESL{6+?
    zUsgsQN%0(wUxGDxQH)mE1~0^zXwo;=X7kN_M)uU)objw<+yHClqFgLjCnXCeM_~0r
    zQeDSg?K>!)kyBUq4jiVg1RMOFnXbM*E{rvJ
    zlC^wXbGddhc=|kN+>F+IM%Xq*At+F$hGGuU6j;s@@&Ii#R4&?SD<0ff-+
    z;epo4S*Y-xoAm6OW5+TD4bu_P(#5!;%o?Iv7Wk>=isp?sur8V&x25PeZG>-cOjMm8
    zUu(RKPP1Jj<}72eBvfbxi3+-=TdoMB6#P%~6@T`B|66kyhIwf;DRcxC)lq9ZISF4v
    zlOzk~fsTtze=O+_gM5Q)Q>q-6vh)Twwnd_#+6fK+teEgKn5F5b?fW&Ih6_7{MiW8*sKG8eN~h
    z>QJAbNzZ79y|qZUkS?c%w~-EUt4I|?N^AQcC+C_7Yph45Z3D-YqwgSR;61mI!v0Y}
    zS_rZOq{q?09a-Z*!o_62b$eBIJxY2=^EwRi&)1-33y{HUI1=>XeCXsOWa5gyDLtZb
    zNd66sZ_*jQfdt|?(Bmsx1l}32W&_~7d=nB&um9m1(uP?XPyVJV)3%_w4M@X-fwb5;
    zC~HN2vh=^+bvXv!LQ>pGkMJ8(UXM!oZHhn7qWCcqz7)Q_de4U5mH<{pspizdhh!`$
    z6Ib>ctL1!4-&6FDNdv9GKNj?lNuL0dWwr8Y=u`!3?M@$l8Kj
    zp{N~X|2kwdOzrYJD2%=`o&aEb1q2cGSAy`BAo4E!LlBog1aa$ULEQL55I9p^;r%4u
    z@AD9(0Kw>Y(9C~I$^6GW5dSfcttWuzJU2rCANf9&E3Bp#73seQke@qh-~EU5PJa|b
    zWUVN1mzK#i*D%Boa=)_lagis<1mPCbj>xI8E`T;LH5M{^mBB{QmKW54UGCuA-M-2Nf`>rKKXZ0MfT6X
    zyx*#In4JF0!Sd^OsZK?!eKjhl%RTKEj){OI0}2GeDfZLPybWRhp3c9e^Dm0}|54r1
    z7X66e(}H|^2`}kki+Oho`U#e+DUdY7W(RvO
    zK`Yp^2Ai4FS`sDfQo=Envu3zH+r*UUki1+;-r-U88${Ru?tB<=t>>
    zM_~7+_|u%B43p7Etj}XbhX#X{EZc%|J!^t)H2}VsAiAQ%yKf%)?x%#h_jsJds9#tv
    zoCdey4ksou^V187Dtoe3ag<_hi^I;<7ITzYRhS-%@*0mnY^v3Hk&Jg(>)(QL5jcRt
    zEr&zwWOyaDUp%*-`JlC-@%5+92PrVDBp3U0aapq3^4=?T!(O9sCwO;cbQ
    z{lVx(*|Sr75vd}Ba?|!s#Nf+h(5glJoA>~7FByi>C1ig__Lyke;@KJAX)uifWhFZ|
    zg^j1NnmGHNP!g2>*>jvWPaory4{B!2t-0d9n20Bz44z3oeRX#qlY+WTwDe3)jQgqM
    z@s{|Gqs8IUqn9{jED6d&0^Qau3Azc2ED4H*f87cDw--A9TMt3HKBBR?z3;vqD&|c!
    zz^b11eYwq&M9H#T!~4^1&l7j>1^My97`Sx+nGMM~4(Se8SF+f!O=a(8K@_;^~vl
    zi;bh)UxcVEVa__!d;i*2G
    z5TkN;yDop@LG10CT_{IX=DOaOcVA7AVP3ad@gyqTDa5|xnQi@p0`QbJa{_o}PKw6o
    zG5lv=W)O0%_Z{R9KW2XN{F>Lu;eNwN@d-p
    z$SEBV+TAOpzrs}8&+E^doSK|hbg*(peNC$@OI*NAD~Jj6#)w}rA@n-asopo(BCCIz
    z+_#R<9@!OOy=L(h(Nzjm4>W$xVnZca0Bt*f1yBs3FWf^0K6`E9w6f)lS@$H&#etbaJ*UCT4(jjr0|&strYs~HkVvC0IDJMh
    zNEW45X%9KtvjJMQcz)bwB1AuY2i-k|oD(kq_oy}u>-UEgPaV~e{@Xyn%L+fAqqiRY
    z4%(O>{0_PS$S8JbdzGe3|MssRo&C$OchW;rab(%2VBm|hN+1{n(snEE{%MbanA8`1
    zh3$+KldpW~#%P=K>)5}}>+~7EB@ao~Z-f6bGr9qpzR-h^iK@7tj%3}H1c+_pd~kId1Cm=J$@
    z!c01R{fi&@Rc%LY$lYnW`o6eR8(|D6EM2c23093b;-uqpa?pE-Y}l`^uqP<8YyOp!
    z%>CisEa^7~5j()Mo+`WaYq?kS{f1#)UZ>)vdi4ZF`z4l{mkMaX{P$WZR*5+;r|p&a
    zdA3`+!3T%Hb8(Sm?_b@R8`TFOpGvUlLmHNlyk|j|-g7E61x^vEyn)TJ!Ojws;FdTz
    z4~helk}@@rlh5!Zm0#T4W4J@UX(rBVGZVpS9ql;H1y9fhC%8$TB_x%O;QzR8aLD?P
    zo08>s2XLK>m&WIbpG7ar%R)Y#3U;&T=#X_?mdhuLTRxm}(~0lJ9deByoF=)^Wk^ka{xJ7|
    zXVU8vbJu=FFiyDieYa4sxBo%^!ngX;Y3T>9m|?uDnOjC9yB6^*)p&QB>H-rJIm9ur
    zv9w#SH}?f+{Fuvjna8T8V2V{hpSS!dqsrklcaN3qO7f#sf>dwj+LIz6hpAZn?to_=
    z>c?C`#9BJFQJXi$=W_SExPl#
    zQ*@eTg!Vqx=X6n>lvq#n9!Y^<%jj;y#Z<-T=&B%d5;6&9u;K8@f$PTydEW%)u4{D5
    zM-#kxlR1)@L|b3(n*^A$hccUWv4*t`LJ77?bLQ--kt7Y35#Qdd72ULk>3*4e#2N%r
    zRK*yZ_G$roT0wN>X!~;ppIx1~-DEg1{{a&b|MCY+ghbK#^J}r~Q)H`4xbI81Bgl
    zwsFsUS}esH^AR`@W?>HE=ejN_`!li~@rWr)GIs!lU@1}xwsES08=P69=8QC&yxr7i?WiRCU`Lnb?8@3$Lp%^f
    z8h>h8y$xF6;#FfDJu6J1+J)NL(5?*>THqCxdmr?(e&Uq&)@T$E=Sq>u%#yr}THUGI
    zc{at9>qsZBB4pIqq_9#O(fgdH-vi~IE(6F=F2M6~+dhB8%Fvb6bB7f?W{vuNq@MX`
    zj_=5-K(#|!mL!WsgU8wfri^#5C;>mx5h&SO`mHR@YwtOa=)7-Qq-iyD$KG#U@us8U
    zV#)w22c`pU;|j~Lh{qT&%!_V7+2Vuob>hZz3y#C=m*C!)D8w#8=@#NF`9~60Qp+ai
    zvd@hKJKN5t-90soWzd^aCQ+;s>{cIUWW+Jz2%;0c?D5;3!QPYR6+z8E4_ihkG>i-%
    zo=Qcax4$g6LP%>6A?oPSgdZMFrBJSd@GvKiXOwknM}eu0k*-n4PH*2#xUfuqY8qy#
    zP5-IChCTSHvHi4DmaBuaZ@#{Png@a>`;C=cY6S-2tz-#P{yXx;-V5QvQcYqeBYP$-
    zM>EAS`fnpgr`FIW=-jc=tX8lrRa+muu(7ky7B-?bs0nFH-g!IdEYh51=IqOIWT5PX
    zd{C_|J3By$@r}uLkdJAv#Sn!5ey{^c-8eL(g`6r6{_M0`dGw(^R=q2x4W-6n9jD2=
    zTN7X6<7HO#+6b&LRtiDqO-AW{4&07N+(@cVeZLU1VV~4_7EKov;M1l|a7#Z-x2m_6
    zDe6q!s&-_4XpiNVVO3$xV4njDP&WTCbSyxfB)PL<_)5j`gPsBW#R=2Co^A5B?B_fj
    zy;b-MsOiYdbARXr>#<*Tv|y@+*IJ?k>bkMQ?j764v8uVd
    z%j5HB>Q&X5JEsQn!acDLg}ViXG09MouKg{q=6Q!Zf^w0=6NB~fOTKnw5*er6)By*^{K_3eC!R*L
    zJfNqB0M2DaZCy>n`0*q=?A{qsuY1&&0!|bc)hEPXQNZ(b?<201-}W7`=+D2|!-G%f
    zYSrJ@qcsO6qxO`S&FHfMGGk@e-*w~5(R?ibI>EN|5YYIn?T_2f&B-@sa
    z(4P`t!V(zLY44Db1T2WG;WPT3Zw9hPG-on8nFo2J&hG^9eEqn7i@;F&6
    zP#Ug+!EB<{Zi788*c8(9(M#oyE4{QveypBP!{%3&{e8V@N4J=|HsZ4X}bZJL%=bg0nnMunTq6oQRXQz^4ZUB^TCs*0dNyo)*
    z^p#9H8B1YMXMfqEi-S2fl>>mLZy7X)Dy&KRUq~9qY>j*E`VVU|c@9)c(z0bl#tW9t
    zdFXbOm_H4}dN6^a=>6zgz)#uU5Ze#*4A&mfzUHP@uOg4zj&!m%5lB^+0@Zah>gmR{
    z27PtlX>?wKgC9lVS$Aw8BDU5s?I}fFk~-*ZkM$0gU^`2Z
    zqt%wAjROlVpI-8jPk8WdR>t41Snu3dD^6LtDnZxzxs02qOE7gri^`F-{YNKM+%6%+
    zfFQXGrrGn7ucwmkRI%%Y7S0xT7uePvUMQ^2it&!KV=@p6j6QkhaOqflQQ0(FHRCJ$2TT!A{ogJPrtsem4Q~+
    zSt7bSPm@5~;3e+;g;UQ{=oJf<&ZOT0^A6Y%+Iu9>V7joPgY;!pE
    zu<6}*SS;Nausca(4H
    zkn3EIYTEI6#rJaS1+i5_ao73vP)*IECEBE{JJNEDzs@t9Ti6b5iS64(22{)|e^3&Y
    z=f90{1f!g4ZeuBCrIQXFx?wzWP*nFFYO1Jbmbvxm;-rpe}YaOt+dwO)EK1
    zkPJSSu}W)K0ce?2ab&@lR*C8r+}vhw6iLaJC1}H6;qVes>{6`a(!}3GpNO%p2v+26
    zVcbljx9yQeVvHcPq2pdp&=P~U`M
    zw>?Vx{)>QJRWYXv0-6$Ue^nJpFlJtK-sE|vugQ)$FKg;HA6h=ui4ElS+gBOQcKCJ7
    zroB#9b94m`q9IFr6t-?NoApWS@9ZSX8l#3c4|1a(zLa%3%o4(*CZk~CozO<~9izs4%KxmW?Elu^bd3Q7GhOgj&&oxo0W5Tx;3NduSOQLWcfTc#`hR-&?#cg8oGW%#
    zg4j!V-=@7dd)VeYSG2dq8*FvyXL7AcqcOo)i@_58-pJUG_MUqVWW|O0_VM!$>E4q@*sL<8Uec~jp`
    z$;))1)k@OUg7P@TLl*{f-Dx+;Y+D&IBzHl39Hn9-Cj^9s=e})c#9MEQ=d(Y4`{pw~
    zZIzqu^s#_$T|50LPO6Rr>2Q
    zFd4j^Cg)Wt4;65#P{%k*oIkCY1TUYC7&lkdx+~;HYOno2)V*a;o9(;q9g15E6n6YX3TuSH0M1=lduqMrT$TP!fNWxyR0?FMJ_k+HFUfZ>zyfGfnf>_*6~fz
    z(~J1cUz*DOur8)M+lkf0fYAVQM1rWhyP;em%&>*65YAVEo2pNv+|EdDBl4)7~#mA0M#VdZ&0CgsCo4QA*MYT(t{U5Wx{>k_g
    z__}4f_6W@5wN7YgKE}HGt&fTq@@#F73SS9B>ewL`v&%)!e7j%vg7&QNAqo`~HN#c;
    zm$K?=HjmI$>QkCM-GLQs{W39~!f>1d+)2%bmd&U8Ut}|e%eTIy$*dy${h(w5mcdU_
    zyIqqN(~dUDmzZ$jEprM?Be3abN#C_ynH;0kMk;CZ>jQq_C5vx<+EXb@TBBIzta_r;
    z65SU-S6zE_9HVTcx#IAARA(|
    z{wG2W+MYtQS#b4o)dP)6*FzAcPkWr!9SR~rXQqw@3+FfOk%B7+3r_CdTqY~A)@)3)
    zgn}^3DKFvCEwU6#&s@4{dO1%
    zLZwM?H``(HTWf}U;qRW&rq$bevoMCgWK8zdHOT*YeVt>rI#7^OGlJQPx}Y7-j0apS
    zp>681#~($lfsFp|bp`vMNruX!0T(~;rki&r59u|;4{5?-^@4{aMMg$jQ3)ODIDAY(
    z@8#7=vJj%bSI~Zt8l)XkC$|Nj?M9bWtGeBGN7gn|shJE=#+4*9WTGG%)#D7}`xzIv
    zPfK*?PFd!E{jpr!xx?TC6U-uOI>s+PjcdTTLPvqN7jyksi+|A<01ot{Z$frs~#U
    zw00PD)!rUj`kq|n^VBFmna1>e8x<{qH|<*4IgR-Y-|r;mEgn(TUk_SZ&FSxmqX$K7e4my$6jMK`X_^QF6ye}-<6+`G}?@l
    zbu0{AW`{Vfq
    zvH(}3ToXeH9q+&Twa}4#n^J>9PWuk3N`22Y=ojRBHFV!c{{zTny#K0nw2^^$L{-hC
    z`WCSwFQ7H-Q!vBv3sV!spbbW)@GMYn7=s+o!e=FMn~G`}F!#9)j(i9hq>~sl@|yi>
    zv6gFCM~;0F9&3{usL(C`fMlCyI;4^95j^fdK}WRS)z4OM&lFu+bw4*7Zt6(167I^ga_xqpCg+@+AAW#zAs70pGSQA
    zvRWE+v#KxBX`$D&SPce0j)3jCzEKBO`2$tQRGYU+nDFtVkkGEzNz7k&r~wBYwK9Ap
    zP9)}X!tP5WPJv&|4q6tf>u5?-anDXg4auyX{fNW6EO%S(=YF{o`&H?~zRyP|5!_CG
    z^u}-}t!=3c=UF!E88sbmrAo1v75=z`-toEP;U2Wbqkbp-ixB&m-X+tiV&bWF(9PY|
    zz@Aitzu(1@D?YpFF^wC7*e}MgwIi$~khHmbj`!D?17dY~141mr>T?N5Q-#SgzGLyD
    z=`yXyey`~NA-sJRm1@-ye~T+3Sx2a0*ABn5QPf|w53I&T0B*0u3RRU
    zF9#jAjIzmgj=nw`;}Yk}G|em0HgWM~JFcn-45>5hD>oeD&GE*+n{^`F>Uq@GAxL+1
    z@ZFb%+aQ3_3if{h*s6+dS8Kp?w(?3t(1QDcwts^~T&~!4dSydhk*LCD_|py^>!8Q(^l_`r-qal)fSGCOjQSuoaawrzF&-&6uuzK
    z<~x6?dV7;1Bao)ttWj-$W&2CHcrBq`>99t&ydXu}PTrkqt
    zCM>D12H>n?x_bQBY5g?cn!6n|$9Jk(ZIFO|BllWRv$J?T@9{X@A@w(5;Rcn@e{+dK
    zQH93-h2LzyHfl?E*u5m<5@&t22^SbjY4VTo{j}F4x}V^(&gyeIx%Hf{4RwYb5E_l<
    zV_#OaSO=Orp=UkkoX}ZraleEHCj98l!4rd>!7a2I9aAaP?`L)-M`#Ef=&pu1w&c3|
    z{RDz03K4n>M22TiaRfb^sLXDX)n!S3&UEIExuWn?1~6k&ofm#%6Hg|C_Cj*4giPu$
    zzO`xh!dgVXV}lg^AF`8v$4W_K)m0fUja}6}o2VYbEcRO7DSch+!|wABK$xD?xtF2i
    zZr=LsIeVP2Z)?NFuNwJVDzD4EW5|LK-F%+{%*9qROsg~R{U!9MFVq)xZ3b`U`^>Cq
    z%Fr0{d3(<*<*`%~p9_Uyr+i6Kku&pM{-(WP^xi$VG@Si=;CaSkigiH0wu+b*gBawHH#
    z3y=XH-y51kLjPOVrvD-a<$t}#w{z^J8_P`ggcvdipb5`W0!0_O)(vKTVUulz9kC}!3?wx-^HF)41S(xO+|%~
    zkG5HZVS+>^J=eV8nRyp3+xTTE>(%QpC4TfL3TTT`dyS`3?)G1n*UTKL&8wVf$sy+b
    z^edOKeWayd`?#FXrO~>aFukg}|7U#QPsxuPoMJ)n6|yJt
    ziKRiC*dm*B(dKn$k96uLopa2=qGFxi{w{2@k+4*L#T3!YQ+ge|_))c%#WBx3!q^~+
    zO%r=Q>}aS%UI~*;eVnSkZuLv^C{+w!jQF}u9`if>Yzwh9E0phmUx6U&QC+^^HD5g{
    zB2Nf5iA#8$am>jv69lrZHhq=4?5M5a?k-X)Mxpix={r9
    z-g34OVe1Zd2Ym+BYdJ>o?8MKL73&(NMiP8wT}hSg2-Y-huW#zQkXZ&{4yAEUJK~`SyVZb|;&*`M}B7
    zq-Gyso8h#p;cJ1Fd}?Sq{{T+2+2S8v`QfxR|e?Jr0aZdmiEa9MZ?Ia2^RM4l(Uq82ZjCqb9*Et@d$yYB`FYnh6ceZ%;cceVp
    zq^x<4sJTfD9fg+05m9+Oz!x+mkjXUu{@A|K$YhByBx9%}sQpcDiAi%;b~(bZXVR>s
    zIm$|R2_49R{t{rnq+?%t&>lQ6Kaf=j0!t%L+aQ#B)OI7{9$1FEaU;KFppH2i5}FaH
    zLhI$zv{Ls_V^z9u%mk@|lxP4&vwkF&B}5IlgxH6ClPwF5nYetMxZ=3)7NYSz9u%`q{5|m8Ppi+D
    z!Qt{=woLu%)9cIA#-xsAtRqRApovQud*R31oZa8+bml96)Zev!KPqoT6?AYA;nv{Z
    zJfjg>My2G7@dnC_=OYBYW;#s^#)qjZf3kIFbx!V)l7YTyz*ugDaY4%xBK+qt0*`lK
    zfMrY(KJkHsvqUMP)HwLF<8!tVmjyDC_VYd&LFLho=Su-P{-~vi8mJjKDFk^+mz=gh
    z9P|+6!{YKv?{?*ef6-^AfVZmb7j0%2=+v}?-a`7uvw$j_nLJtGBDz|g3<1LEktsQoNZHwq&%EImy3
    zgrHfiNHo=Nh7q-Ra6fCbeTaY=y+s*Pv%R-5A)|S
    zTFvcddcvzpC%Y%;D?FizP$9LM4xYBWjJ4B2_e2{T63<`HsN%U2GG%qE$pH@fD2
    zznqa}#&VDvBtXYn4}&{0^?1ERi*od{9;CL9@0x32cV2)KG~Ap`LPqzLz$-Qe-oEH9`_0)VqvC?Wa0gFvWM&1xTEm_G?Qwyctqf$Oh)Ec@kJa->z
    zS6P?y>}kRV-6R6=>dOCw@ii0MvK0o~0vm*{29L=;Op|01^eT{R_@~`BVz}nHr!FPk
    zYdyOMHvSO3^(pi8#Zv%Ireemw+~F2G^(YQS4x6T@Lj?@*(5z$$9rzDCLGBJYj-X4K
    z8!-7i#+wz7k;La0bwD5b%`dBDA-0_l+I^%*JMqG4s~B4udbH
    zBuBF@!gsT*Ro^huR(hobTJ13+piQ+DiQyhS6#y#Fd$FjAj!G}5wwaYz+j=vKb2?uk
    zs$`a00vaj=)x{o5ib)|c>>ho+^fV23!re;?ViezT^!2Gf-uYjLAYs##-rl>s`8Cs#HYTqtlFt4-aF6;{0}vX_sDHrqP@gmb7T{FEUv<
    zP?c`-FEHP~$V|U3Y=1=~jRK}78aA9^M{hPI@%=L6(r%~XlUg879|1Cl;~LJrC-(69
    zT)DF?Vl_6f5Ri9HCoy?@F>qgW{k>nRHRqiwkzf{yN28J|j-JAOKN#E^&^^HS%&4ov
    zW|0EK+NedDH9L}JAt(age7`bT<|Doew31C{ZAn$ZcE}=kA8;b|Nd@|Ryc6WM#BnRb
    z>b;kJ!8K&1tXAh=>~I^k(a||m?cx%t3CMBs@+GckN_VG1DDblsuLL{M{~SzkdML@q
    z)=NKy9fBNn2Tqh~5>v;I(=9}x`AHHH0Rk+0t
    z=WE7m%4LQq60JNwC~Fl(qQ$^a8q{-B>Df-#1;LKLBB6VOC(~kSlcC`~i|6k%&PtUvq|*@Lf7$n|k;QjL&Wn{z;{*c-48EZUflj
    zwKLmW>``D5nlbzugQIJG-BN=WA{`aG6fgCy44w$8Jzky=j-+4m%H>Jk^Pk%kX!iM)
    z=m{$90o_mo`?4R4ugG1SgL8dmcZ)7MI&56lA&TDA&q6Wu-PP;XEX*9;U6W}_=k}ft
    zp_9p|n<_Dbvi*3)IFN9MgY>UKft$^+*38qLxQ*8M1$7YEPCZ5R6@dez4T*rI2Y)#u
    zi3F{q!|hsrol)mPuKT_+Z5>8fT8Urj+h}Daw6vHKfIoIIDcYN7I1WBtj0vVND1_!u
    z%|JDnuD^;}9t*>Y5&7gP+-F)GA$$lMNsHmpq*NRCBteEa5
    z0Qz^H2%l6Is@s!@)B3HIg5fk89t
    zqc=tMDLz~tM9evB5I4Ac?DrvT_nPQyq)4O@K+t2C91YHLj`Vc&(ty!&MkC}I3kKf)
    z{(1ilNQSHxjHmp8H;+nNLdT!4@im&7v&W?xtFUs(00;KAHpiGFg7+>
    zF&VM7=8(7dXVE^3NgFLu?2Lz~rALk4BXck(Cib#mVg^^)Uz8m%_R`IDhk^4r@I=WZkJ$gQLvGGqCQ9}U>!<`
    zZ-IXx8X$H1PJ418U2V2;!k4=i$kWjdZ?FY#`*F$_w`?-R9ytt)O
    zyq81qeRmumvPZ%qcDHK=+G;bq)zR739
    zDkoc6`2OG$hq`hth`dJRv3uKc^431LAr?C$aZ0Tp)}$7py8Y)q<~8LnnqQ29%XM2X
    zKF4e8g;BZnJi)=#T9Hd7Q#*8|{=NGpg5cEl%Iu9r!{FH{K^k(zopa!NkX$pdKT{VM
    z-~kV-JayIX1)IR{0<2;pB!FK5C?pcM`|Jkq~$bL`9^q)QLLd
    zkrh7U%0BC2j_+Nt$(@<8BviQCe>5I6Gu9D}_mOz#>m>z%Z0oGTP0rYKv$VCr*<7}aW}?JLcv}myZH@9C9+TkXMs-$^7X*(T8p*3JAX{Kt_|@i8
    zS}=10Z1pSdgzBc5ac)q&;~sbwd@x3b6hn_DMPt8bzSX+&UF!IBb<-76c-4mL^IE&0
    zGFW^+!Cgo4mzOUd);M5iUFl9=m)Cm<4&3dZ_YqTg93%EUv&@iYpStYqFh7L?A!szD
    z+F0UeEs2ZirX%)yH}Ekz?%J~_8!@&~aY;rIGJANqYd7qkHZk9BHAH-T2RPx5!7?L&XzIxbiA=uOh?7FoOdP@ze{QT)0^q0
    z{nepSEg>rteTq03~L6MjF#
    zPwWSO(~y@xez5sr{b%EyeIj)?9LBB>fvB0m15SgsKiH42NKiA4V>M+?pn!c+tl+U;-1bT2y?X`%l!sF>qixg88{``JV^8&pi6xUADf7|2d
    zx17w!GJk*XD&yzUosiE1R%4A$MjFHWf_cShg)e#$uLy9s14dEAHUimaKMVpC7izry
    zt5idH%iOY`cFDg^lX6ZTabq?wz8J+
    zO%Z$#NRw^Z8gKN;Tddb9SC@$z_sPEC_~NIl&Y
    z%5UOeK>fmYc1ftZvJ&_Y!1NWPA_b**->((X>kMsd_OE_QciQS@=|)M(Wj5U2qJdJ`
    z30~zy?|Wjyq(aFrU*hKX3xKsq4#aX6K9SXA9+5*>S18z2YZ7~Ibh+c<3g!BWBU2j5
    z^FAc3Ca11pFhUpDib&^)CfSD5b*5RCLRh@8q-u(
    zYEUmBZOO{XLs$a`jMV+tO#4R@fe?+;;PFul*_SmFB+CW^#?@C@9wwl3BV$8(>eXVi
    zv(8>yMN7djn-qc)&=khTcIoHPmvA1o{lB9WP6m)sg=+j`=~FN*){{|5J3;vY+GoFu
    zp1j-P^5_l_JtO-GN&`)8J%gG&)E*uxx7R0qQO?o)34EFxRFUqLYe9Ia^5*-KuP3PI
    zUa+K6Yr|r*)8$v!=I%^86TL{@p^MLnSstn`Oq7EwF3u-6YMWD=bpFlD-dw@Hnu&B8
    zhXMm^S*Oii6IYg{af8a)Q*v4RVHb-aMSxp?MPD0qmC8$T?wDm}ZtdC3zkH2_*ru~MJTfT2QKx!qy;p3;VIk*rPG>3NLqQx_S?R6sCxWk4
    z4T>|LWP{{4lD_cMVsW|^(bJxpmlYlA3yD^J>CFFZ&TNbXC1H_o>3s?>6c3NG(Jpaa
    z9sW6d%u)2zrXm6JqAJ2Wdh=S`U{VeV3M6P6B*B$t2g?Md1c9?lI8W32|L$S*WF
    z`ob(=5Ntm4f+uS1Adv;~Lh3WJ#3<%eOupRBvK8q3Ls>@=;CY3>DzUB@6KQFFOz`IR
    zr3g3C1MQ}F(bmP-8?bE-_sAtW>k(yn1syGYuHlZs*(6IG!vP^F(t273ERc2(OTkIS3V3Z
    zTirl%^orVzk
    zo%@kNGE&mzW+hUieYBYuid4pjaHaLzv7b^h4x_A06eY&usX4Ftxlij
    zUQI~8g_;ktdMvZRC29!>%5}5_~+01=oR}f*0sQd9l8_1Y#*T>xV3ju4{wAgwyjwS
    zPit7>BC2wu?It*y?Yj~cy%q~`iaL_Ifjn;E?2+%0*cnWmvqRCE%BDdsZ_~L5>K1LSUd_
    z^}_FQ6Dxn3K=qw)+{@fu;=)$(n=T`sdtvrwIQR`{=J58&{0%oBTbQ*wNk6d}UK7V_
    zZO`jmo@PJ2xd^?6_IWo0uE;-yFT2f*@XdR2MPun2hSQlC${VyqRuS=aLT8iqYwepVG|Lo^w^~
    zZrFKHF_q<3P`yDVc+!rfj1}CDQ`k{eAs~J@`$u1eJ3E
    z8GT7J7&}!A9TaFSBeu5HW`CjyP4rtDpm#i_3)2H2uWNeyoO1yy=s?u;?vV_s@4cE%Ke7#vTi*A#^?oy-M_TnazO
    z@HI|aYV)&99Zs|2*utZ&%o>gr^+|LYdO5O$YH$7Psr!HP_&?(auz!p4yhZx_^}3Or
    z)*byC6X)YQ*?=~u(Cih+QS+*xbNf*NpA9zMOK;WS5BS*qRG8c7O#1LgUSSCGY9)rC
    z4dI?Dl$gxLuw@_VDh1wX`;~w{)nrCxohde|`$DupU*iR#Y8yok8BNwBPO^7n^&*<}}=>CaarLa9Hwoc3(Ma1P{Zdm-XoqP>DF9P=OjI>2A8;C#lN&+X-ILH6fB8
    zDbGb!PiUX_hAJb&DXaoDHE^CeIYIUNOzSLJ1oyqPfLG_gEX8`wYwU7l!djxZZ$C*JZ^U`Jn
    z2vI}Y?V^ISUv3mO$
    ztuIDTcZfJOh5981ODav4T^mv+p>xkemRGj67IrN!1@=O!z{rlS63VrJ?|+SI1=+PL
    zapjAdEO#GjN`7ecenN1RwdOd$ILU_)
    zwp&x8v5&8(U5S(MbjY==JG
    zitqb=(tNi{y?>`WDM=`22BCn6aBe$rF~zY30s3p#`O}-k&6ZH^=NNCZfbBkW;@Pb(
    zs6^CN%GH6ZOU;_49tI0YOGMRkzk=5S60>{LrHyi$@1AyO`J-x-K`k;vqaNPm3=s@i
    z!P^E;%GB^4+j^lvtRri#y!e2@<}EmW0-eO#!pu+Y4%L&CWpIB2hR(xRrrX7fP9P>X{F8XG%O@#*>2+run%r}s7~A8^Zj#;brHJy
    z)||-XphRo>*KjklDSXVWd~%f@>wDx45bLI8gRZU{mvt&mBuV=8sE(z&~q2Rb@}!$ZjULq4U~P(V>Md7aQgIoCOBil*DW;ri+{LzK)QaQ3ErP_pGG#Bd}
    zC`+09qu{yTVvN*5%^G&{%=gtXmzK9HBOElz3l5Jawvsp`G8=DB1gIv1Yjz)F>im)e
    z-O&$fw(t$hR0~wu(oUG6DZ5tg)Wxa%45G@T81Lm6>BAJ=QIjYC9lK=c1kUKAI2^F6CwM6p}#zI_ggD_$2#(n=P=uWDB*oA{s>V;&GSx}{JZaz+bFzw4qd;d`D^U<4q;*$
    zcw9$CTM?x11lK;3oVbwc=6AW2Sw?mKuUmqae!>be*%Lb6ibQ3naP!=o_)Iz9+AgFq
    z&c%o(
    zRn-_-=dSBQ4#xzy9XRK@Jb)IroyIr&rBqFYU)i^Smzf#
    zrUh@C1qXQpiL+;Tqk89<{eglj{P|&Sue7*EQ$M3oQcB7TVg1G0kKe0f4kUNv1etTB
    zD?!6Y#p=a8OjpL--DcD~l%#%(J#CG-c41`@1QZDnX1i|X4xjSX{OVK?yOv=6b%q$J
    zq!}CRNK~4x&KfTU@6nWw3xu~32*eHq{_UcCVCV|<>o!a2^VM|%9As%aU;FBIVBprG
    ze{Emd4dqrD@q`D2KOxGcXP#qfS&$;lNxaH}c{(}=6-p5qBHlzYS(ZiL5X<$9*lv(u
    zdS__=mkFo;Hz)G`r>5{6KF6OW_xzRD|9%t!B=9zWcaxffx_IETZ0CG2!U^x7;d?8G
    z`a2!D2u0hG)>m#;ldm56C2daFKmM`fj)>jCg9*RXSBZw=?6U0+ubh9NXeLnI0)%ya29O1aGUpgg_
    zhCw&9*Jvtwl;08!TF<}4IbBVOoW?Aj%!~%NgU7(19=8&eeC@fy1!cVU_f4}OMbA#M
    zud=%4WTpsP&aO%Nn7@s;tx~JQY#>i4o#jn9`>5WA;#1p4LBS|&i%wJ1!2L9iEj-5{
    z2Sh~j3PhVFt^9Uc+e`1sz+_C>nj=q$=X;DrO^2&DC!f~QQ;kLGs5~TSx7q35c%B3~
    z6(K+qAv~zL4O^Ne38V45?N|6}#oAesSQcxE<>N9gil*mm&@Q^Og|ccXk~iEnYpyTQ
    zNp_xMkK&?Bn^5XN{IEi?&#pe+ihO}ELL}9NU$rK-5E>xKQ#tWu
    zSA2)rWu)uqnM@Mx^^&)+9u{3;g9T=e=HLsvLDvHQ?T5A
    zDU4=5)?-dH3sE^b0!E9$l9vXv-#WijT8T3FKsMjFIY=oaWbaAhC7kjUM2){X^2Kln
    z1D0Ip$*V3kPT{~iu4+98(PI6StS%t%$Ely#FI^++ipzh)@MOPbSy+oo#xyak{;)h1
    zjfLR_s}`rjf|MM2O2v;BU6Uy;$85W0^OyONeo5=@oTc8{{3;twUP?V!Cih}zg*JkyT=mzyk`7*B!ex?X#jtZ9<=5LH1(Yk^#miC}Ie7P&;`?YElq
    zJR(j$Inz5#w54&}TBK<$XniFp%D5aLEVbts@MjPrI)*Jl1hog*BBEsUiNqPi>d_9TK&PZ79(uzmIrZ$|
    zdf}>m;;J6}*5>U%ps;6D4+fQ9U%lkJRKpWa+!4TnY|Onq=&QrD`Pw=HcUGgZ9o_HN{y1)sf3!-pB6{MJa-o3$?0U!SK=}Y@U>i
    z3P2120H}rOz`tg^f<#P#uT)c%<#D}(n((E6YUG_rv|iz
    zY|=5jZJo1+Cm*ltz)VbvV6&e`Nb({PwNH{e0h9ZWcQ!J_(}=CD&24y=(eYMGT3J{A
    zqsp*ATHEBJK21a-zm*{^MAKg?aI=-3vetE{rR~#|BFNK8Sd4_OG^xHF+tMc!gO{pH
    zCyP<9cPk0Frr>CoZ4%<7{e)6MmaTc?2p!~kaMmUb82hNZ
    z<aC>d_ZXBJrt7OW$7K3JE$Jd#~mM7*1XY
    z35J$lX>Z2`c4^x%_OUSt5)2>9}^2s$34hxHq=f(Xh*wn79VakF~Hv+o&tGo1p8r3NJ+Qa!T60hU$e^chO
    z2^*`O*P(_ShxJhmmUg_WcXia~C@@GA3eEDfsP+i<=N|wIC!FQkChR_Sm#3
    zKg*uFaQ(03z8g8=YKwtoG9uai*8
    zYnyh%I7uU4!bXOSJg*Zpy8M6pL(i3`l{!(ixGL1?4$cTE>w(NEw?aKmU-_00VClIO
    ze#6!X|6BZzcc^dES?m50FVEGKztfuk^)K3OY)js)xZQ1^8J%uV0)Bk_4m`a9JDtd0%w6aC^k84ri)e
    zQIx)ca&*~e$>^b_hKkvapu1anxDS}l1U<(}@|Rj@pR8nRhu?WmH28&UxyhfTeX@Qk
    zCK%0GO>`l8%<4cjfw(uyIeon-5_>Pnf;@O3mhYU+e(W|}OGfUe_KaIF%VX4(BdK?U
    zvIg_~;qr&5acRJtTp$GuOENHWz6k>rsYMgwy)RsSS3=CK2xGCQwHqk!3*?eSCMk+^
    z+BSn~Hd`KN1YffoZhO1o8up~N^b^crvnmNC&iPp23u_8;kSKzlYa@;e^e6sa*m&}3n0PEB_~+;ePdE*lwgIU44=-xAxTU-<
    zCoNf|o%qCX>}>CaR3o}SZ;_}^0lGG}yU_=xh3vjtAR<8yxJ&;M0whqEN^U6nhVpN^
    z=T{C8_5M=52mJU
    z(--zs_T0vQ-rxsg1+$qc-5%J$o#tC}M@bX~vL^}P#0GI6+^AGWdNDs31Ez8ZjS~$-
    z5q{sLj@2~fpf|4#5_V9T%3a^f$8Gg(IShboN{c;Kq*5VgxsLAA=WS=>arA|Ogo%%4
    zM=lrYoCCYDasYlF!JW1gJiV@~9W%_cAo;`5qr=;DQ{-CifvwCNmofnyPsWQgK*G*9
    zjE()Qn@Y(#%$mikWbb2rS(qcy;j?;^#}k#7Bm9pkqf)J{;_PFz7sybSw)4aVWANDO
    zvay`MQvi1@0j$h<)0$+QZvRE5d~H0g*6&0LN~TI_lY!eW`Q@hLIiy%WwPw=a&Vl#4
    zmv^E`7bABOTIB~<+9n6*hCCTH4(CF<-Lq&2wU41T;xZN!(+=nz%kJ*w
    z&Y6!R-atb;*n9Sj9S`mH&H4axbNAt6)8J}}HQ3ouAMI-DXTxHp1|ob(mHR6n1lb=0Xl~9@Jyyx)cuV-4In-dFC8pbX7o?u5~sa
    z9cNv0sDEISKFx7g!N4CQ!MxdE?!Bw!-*FqA
    zAe~PH^5BU*u&XdwkTc8h><(MnE?v58A<5ePJ$Jg%m@7>$F!5-LO8XrI1pozF?za8j
    ztC-mQCF--FZya@12qHff7`DUBdqDrzdBbYAZAqA
    zPLi+Wpah`x0NmpNkof<@&Y=I!>;2EThyFeB9_29kW3_L**jxyU-I_UduCa^`G#OI=
    zx*M*XX@hQwr=XhZOONW9xIZZ<-dwddeH`yz6qbGJD7N6P>9XMY=GghsK0{-43ZKl<
    ziji%$@8OX@5Y>Cho`Hg`Uw7ru2+t%Xt<+BlSJLyb*a*l^4*)R0%*4=7SgQ{-_7hWw
    z=4c&((k^R#%4geV7QxUjRWkZ0YoyI+-fJ~yk~FyI3Gp!keo>HyauZ$nxm=v~`{d-!
    z$Prfgi&3=bGuK$`kNHDkf0
    zBbhH_GnQCceD+sZkj=ik(#$AB%)LUHQ$XF7bC&xOViouX*lyCMudZrhM=e;1aUM0;Wr7P*#kDeZ60#IPdZK5ddtMUipN?4Yk|lGb
    z?zm1ha_D8#H
    zJDQ^D$IccM%&#4C^u$kj;=WiAd#?j?CLa0uqHSO
    zDA(TJtwBVGDrTb3V%h;JSYK8h7FFDlcE8MRCs?~-WtPCE0(5zixOo{rca9y?Tu9ni
    ziacz|0YTLlvo3H%aJRW|qc)csInkM9tQ)ojLW#n09Z}X5f?$S65*(!O?~f^|M$8FgqIRqOE_fxd7VM);?VRM}`B=r&F@UgP2O*=6IErvKghV*~PV5qc^2
    zxJH4`&1%R+dadq38cM;qr!95fKf;$9<;6Xxy
    zYw!XJ2~xNP4^D7*2=4Cg79hAoaCb@X_l)j)-gE9aw@=@`-S@lS=s#-g+PiA+f(3ik
    zTysA2`K{KQ;mN){G@|)Nsty7@i-}fr?%1WzJ;;7^v4ULgH6G4xjWp`Do%F$*tv;GG
    zlUlCHPkkZ}is2q)SOYbIL
    zIQLG|4~9j4Oz{N}*)M236mrWG7I~i
    z-8QB*d0iz3_(=83I=GNM6Fd7sPfQ1{4Ce(2?9qSs=O)aIb=TSNVSw3eAKrnBU%Z#p
    z9K`>tl?k_NLDw`8+5;*1Us5q7%(Tw45kS1o=ml7vAiBL)4|4{V0pbAr;c{HvN&CSo
    zDpoft@MPghY<~99Cl|=$`@8i5Cs4^_-(3M)F?^sG5VLKQyu|A#iT)#sdb2se$v`Lv
    zVt3%l1+KOketWXAMK^6YLnk&po3+IMlsejC%O*QUBt-t_;6EXRaqfx4eBvi$YUN#B
    zZ55YovxT^%LuJKqcy^94mTS}km|VYKCb;#L&Z4ttpVs7sn|zUc7{$iNn2|Q;Bu;Bp
    z(;#f{5p@b^5vk)Bo5Bz)#WIr~dGk!QIaBqL*HHN6_WZ>n(RQqaBw3J=I4@?`=Oa+K
    zEtVx^cN%<4-K?PWck@UkN35DGJ?)xM8!`y~Vym2u?r`=FdP9W%QcSd5368Uy-b{5m
    zym`D9*PYHAgxYu*48|$GE?pN&AI=^2GqpQCvGx$254`S^N?Z4}tOokw<5%&C?3VJ$
    zQq0_u?z%Mjfj8%1+g{~>*JzfiFM&R5#igW>EcTvMFkb~WCjD3JRR%cNlhHzTqz;~4AL8!9vBXB
    z((6(Fol
    z9~E`hjU}eNJIt2GU+MD)N&dyX7~)P@awXJ{`}AAz`FgO8Ofbkwd%sa=<>%AL_n#wI
    zfNj3<*%5B*MAh*@$8GI(uibLPqfOs9WL(}pUjt|}m}iN#FO;^obi@tUr=B2wv3ao)
    zC*<83Xyv0&%{$89*w^G}2B`AzOMW6QsmnLXZI
    z&FEtcfUD*#oqo;4m%l-3uGgdi_fMo?mZUJOX6|V!!_U$etVZS4g{TL}kdJdpQmgdK
    z+~-4RXz~#v#4Y4N|D*EspS5NDtC)J<=}&P|xUZS_zZ-vi^e_11&A*uX$MkK4A!*FW
    zY&SdD5^Fl_`=SV;2sf4y?U4Ajy#9LL`SU}B)(?Ig)OeFXrAc0k7fT1@ue
    zzeyA*OFz6yqPsqBJJAN--U~P@`Axljdc1x@xAwYOasWi1Kphb^FZl8P_<>;YH|Vrc
    zWQ}V=q|M_u$af+AiB}h>3IUhygk*Vn-U9|2bs_+9=0<@_>3GF!wRQ)9%gl-avaA31
    zll=dEOprViOEfJhY<|w$ZyCXop(0|!r3jly^d?uWmNfyOd_l~LB6)&-RcO0VrYGD{q2NtNOIcDzc(
    zuotgW3-pLRKpArCqpZd?5bN|uj{=4Vmzh|H3dwXrdu|B%jJ^9xB{al=?@Zyh&
    z7Kq_M{}GS>%3IVp{g-u$Sj-14%e-7c*}^c~8d;i9sq0M6^6!zibYY!riMu`{@Vrd!bZadfX97dm
    z*t=@+?{|#HHKj>Q#gH+Oq{L`Wi%3lUvwx-8Tq(vHecCY^zNc-JY$NV<@<}niyyV{Y
    zq`e6&)^*12Y3z-T2l_TC^2u{p!M6PN36mO&&#Azi4TGyjrl`06j(86W6QA6QU^PGd
    zA9!nL7>vge;>_xG$72^eK5_)`ea>}?>`;XJL%>DeO0ye(D*4F-`W=Y5mX?+v`(|k3
    zbiU?<9I2DMF=xIxNs=#DMY-CkH+soHAw_mUS+utb&~g#}YbGJ23LXjK`I
    z)%|aRXa6J5|2Je9!d`z1Bivo3yafRT4t+qspHcE}!w8rD1w}mY7ZmZEBtW%9Q~rip34
    zuQtf;ELAgQP?jTRYB-a7dhveZ!2s&S&%8K%1DkfCkwB^DWn9%s^zz+Uk1gab{b$=6
    zxG7+L#~tYtQRp$X)Cr8sKOx!{ZvKT4w~_3Pagud|a4yrG>XgnN<-Cf*tH_ei(W%8l
    zFNzN?LKt-EF+LigI{lY7`kPI?0N0-C+w&!Y)panGWO?+x%!f4TjLBh*?hrv!KM4C8mus@0m1hWNg%2
    z)XFwi!)>;13tRDOAg!i?#G1!;_PRie-Q_R5JuZeQBiVaA3;{$
    zFM@Q?j3F=bGi`x{JZ*c_`C)ww-de?NYbm}yGUJQ?Wc}0M-^BmMjrbqwO1{Z*8G*a&
    z8WH>;1Y5Vd7cHJ}165DMfhI;SyHtK!*|jrxj}k=^
    zwvnjr&-77Z$e8^d+m(mH6kcXG`rVDpX_*LK3ml^_Bj+A!oz7zJ{gpRfH*GQcf*`01
    z1IR$D=_B2GYrN%}v)OFxVtl!I+}*d)nFY@ovY@$a_&gH5QFfiDJy0$BO4NLe`GcT7(4bW{13R1PkSQBrqj&O!y|VIBAE;N3w3sl
    zNKM1|k#Mm@EUc|iwjC-So+CsDZlwU`LT9B96Vy!;)l&t{FU_W^RegBg_Vf*c7jGn)2(gUl<&h36jAQEKPt
    z?!@@d^0VarkSu!u$IN%7p3Y+
    z$K+d+DMHm+p18gB?WKxydM32AWJSWvX_V@MFlYmRyr)(6&n~zxN*KMd@$f
    z1F@L5;a+&a-cLbG4$HCvRqv&*92fh21=^_A6*AZzSMhkiZ({4c-fr4pgu-`|n1%rk
    zcRD&25bA16jfv?cBst0yd=c0-75yTr0X%-+Nnn?}4XTdTEeE7Z()6tQc^EUn<(Ih5
    z0b7kDIGu=C<rF0R#dgk%AA+Qgliur$DXjMlrg8#IGD7$&s4BUM$uV%Z?mj{aT60>`<(J^^t
    zjReO7Nj2@+Z@UaCdU?LI?`x-HKCs)Yd12{vSt4AWEL#u~+I8^QlfAn)B(h2La)^p1
    z-9|`RJpnN+xy#p1Ii}-F7W~v**nOg`^T~@hNlKJ$ywBbImD&gokM~jsxS=y9I+FT_>
    zBO20r;}TLWp?@HYW6lC@w<
    zUu}!P6(1r*I8s?!jU!TToqK)%{H`>L*1E}fx#l!d`3l41oUW?|y|Kf>ii(Xjwj}410
    zsX2_Ra&u~Yq1C06TP(*y{S$q_KL$6wRmKXV5KWezG~#60XPvRHWnwfrZ$T0m-n^FI
    zpgC^wE46#YXC77N45JeyZ2TrxIDYEyu{#fCbrK&W&3Au;P&S+$5T-PhVyX|_6C*}R
    z5w56keNw!!ChxoBoYL@Oy36~74t?j*$ElRb*Itv_VyS06`~*|HF$-B;>AhQ?Lbi4?k^9JAl~}M$;WR7qE}h4y`0y$F&a9-@WgLxKHng5nOa^)Y0jEB
    zVE26y*9Gn4rx9GmVoa~Rar>^d=ZV)8)2;ljl`J?jgeKoWCXA%J9hY_JjEY8}d@JI$
    zI6cCb_0cav{w+)XdAXk8DcWh1aH0vV7lS=J1)#vmw<
    zVZZ#7IiuwnBHS`wW*unDm372dY$MOPOk~m%9gw-Qq>U9qw7$hTMQeVy(Be%;4a?<3
    zn%lvUA>Jgd@-0S!L#WGA%GB1mQPam3=w}93@-Ur#r$Jz-qI&K3A-qGBJb({qsgu9)
    zGp#vk=DlM+`B8HyRGNX~BCOpgx&0<|D7L>tcPaI=7-nrteh&(_+Zak-Y|aW71y!6!
    z8Amr-A5IkD{U4XYQJGDFLa)fNi2Cxz!@~yKfBUO`SPd&SO&1hA!|#)2u7;P#?P#@z
    zUui7DZq25umKJeRxgj&v%#Gnm{Tn1VPTP1d)a@i{9kPl`^?I~x7$LfBFq|W75&pxw
    zoA_LdYl8P$8W!)8qIG!^8Nr`yLXmeq-k$lbMr|WdtT#Nu){E7b;bOEVN(9C77y6Uq
    zRY}}AN*Xj{iRA{UuoPF3IE0P9e6wvNq3a^976>EGoY{!RL}Zov7GVlw)OkL90Pgk?
    z6Qqw2&H{=${`!CP^<+Qch#dYBOy?D`yoUpFM`_ketv1Um51PHpJUiPNm_uVhB-ZKc
    z=(?}3`c!HOVQmJrjY;@2+sW`p3^v>`OoYRzRbcm@{J=sG%h5wgweFNmEB7J3EZ?$@
    zhiwRKm+kW2Zyu{hSqZ#DzE5$y=9FvaX+zkpmgZ)Ov(L&jZz)ToKmygcc4@x_#m%RF
    zB(oM$7~$-spglQG;(ByKO@4n0`f-fmgiaEa{>pj4h0LG&BZIOA4;&xuH~5@Wn(p18g^ouCOsAp`BE?NA)#MCyB
    zX`*y`t1_J!eTmJ(CKRHsw#)4aBzJ?^E$f8aPowa7E!`#Qv(r>Zkb-=9{s0tsWD8)=rRSDg>
    zO8M;4Qv0}eUp;a^UX5p>GZNhTPA=cgp5%}iRCk>!ZObUorA5)QR8DZdzbF6pWJid
    zyjMn?<8uxkmZJ3A0s|Wr_HR~`RW@aMGwO#^!|HK?WfPiet~G}vlM=jvjsh|Z{An)C
    zA*{rk;NiuKRf?J-eE~i`0g;aUThdqmC|y)#B$@MPkzkq0-zW%=hP)!qIEpIS{!Lk6
    zGvz-P6k2UO-sKOSv3Gi*0{I$_Lm&zE>Bs*p0cHeL5Be>V&
    z{)*=yHk&9Vbe!4Lz+>x2HIQe&b?z*uu{81q;sTGdot>_v(zR9n3Z6rjb?zADFh2D`
    z(7`j7$pfl8Cb|vt?KrC#DfFMNCAClV
    z1C9=Nrj8uzSyYauZQ@nE&ClYRWYKrV>Y3CwjTux$H;>40(2;`%3wq>oEHqi-np%=;
    zpJa8f)p7FrsTda)|;Ow0%O!{Z9Xh2XxD=Hs`1;fwxx{p{`|HG@>{
    zJXC8b?Yc?ps5vBb!HxV9AE;;Ha9uZ^s`~+}z1>S}Z0#W@M-;s2(ik_1Ak9qWo^sfy
    z+SGGasX3rZmRb7A_~zHnR{1S{q_^pFB?k#2mX9W?eno5
    z4U1awtH~FTYfULz)$Fa@_h%-yeW4qnvm%8MSL@_;5xA~TYb~mRLPiAHS3#tT^$n;m
    zeyPH|OFixD4{Q=8Fb7-c;eT)`sNdU2e|dk8co~@5^hokV`P#S(|2CeExL3LYUrFXv
    zvbJI!(?(KWzR9hHd|mTlHCaanorYSCA5mR!H8eDI6C39w(0{Api)7`get=_g2@5mD
    z`ZP1is0o9sjr&C1(XC`Qpfqrm%OqA=VT7wI>L`o|qF`;c!CtY@!l-j~Thd77Fr4?Z
    zEsJx{W2~u_dq3z9_3>dr!WwjqwmlZ+FjaEnr4WMN@Ik-M?JH@GBreBy7e6*8a>b?m
    z*eB}aFWpJ+-pqET%F9n(+|03X^~noJ`@O|)Zd<|(N9rVEfrE#@=P?c+I#jrLoV50O
    zVeXax+`WpC^vqXGq*(#e=X*}ym(V-f-YoJGAd+!{-26XG*U&paN$x+^Ym%Tdy0CyX
    z+L=^eRKSBVR$W7GH)Kz)8VVuvlBI2Cg_33z{`UFDZR1BaVb$BKkw(F`6ZQUC3v^4J
    zP~z9(kI0$Yi(1ZZ?`oUlT&%OIL-=#*srrv_kXQpg)u-%WEM5zl!((9wxiZb-zTJgA
    z6ZYf2ij(R1SWA~VFT4C^^_dWA5ear^NzMLOB0_~9#mjdCWrrg_AT_HSJ!@q}n~!(h8)La%lrup!JB&^@4lz&MTniZPh8v@1o_+
    zoejoVt~_^YUZG9-oPLFXK?q>dsNCLq$&_(OT`A9pT&|(7z31v!^O%xmQu0HVi?uqe
    zza5`XFx22HpQk7S6H>eg8B)pmrx|CVkZg}6|TPjgO^Engwb16tDYx!>Z
    z$gSQW#yu`N$c$9x=N5q||NdEHnvjRRPRmZj%#cpiBxRQtpuv;3!%rhvlI)90J!slS
    zU_lZy;C+TNYRS5m7P?F^EvRX5M;0dqHFOKgmv@v2tC%-Xwd=y*TvMlJ>!^)}i|P3)
    z;I4i`+wG)2xiI%wb@;r?j47&TM+#49^!rB>pD{r!MPx3xMGak#CdJz3d%>$GcUjgL
    z+hlNrEwW{qDRBpR7^;WOt88xHf#d?iaL9AW?fW5r{@sDF-yl{yJ;GD?E?x$^Q!Erg
    zAsFZ0Sl$xEbV|u3b_w-4pRo$=ZHzz=o!x#@qTq+M!}n#v)FWBWuJ@y}%uIO|Y0I;N
    zugI($5mIwCL)Nl@qTyCxzmyE)aE*O3vgH!MPeFSa!HBYQXCiON!JJvbE`+L~jAYHEVF
    z6R%=wUf}h?$9QAQQQR#HNs%JO5PpyZPvlLVzkGpVKlSCMr)O_7Ww$3~x*jk(iI4GX
    zLmOAe<$Alz*6~afMv_l0F|Mq~!my2F;q7*-q{Ue-#1cP$C;%bdmqsVh!Hi;tQaFnAT1i`Pi5__5yR24Z|KE@}d?OzVFu
    zprXipECL#%v9F|mvbJqZ9qL2Rye3+oR#-i~W?&29DKq}gZ4q1(yb;Z^ugwW(*_Lip
    zPh_;@pke@Vn~@AfzrmC0YT
    z!PC5H>WWL+^0V)=bZj$J%;1|p2n39X3y*a?^Ygq+9xT6hM`SA5L0$zJ67s~QS)%)Y
    zvo@+WX7h`R8KS3eN=9>5LN>o9;coLWZ5gkL4g2u1W)`=4A<_PMXb)*#=exJ%)S?Xa
    z7558aAh)z&U`Yl2bz&i6&{}?8=asGBwe>E+u#IDLgRlSUWi{h=m`K-M;>m14mJOCg
    z-SrH+teIoho|euKl*@imMmEGS!PfwdJ?1rN?%cgNf7ccCU$#&*A_zm^^c?-%Tp@Lg
    z;=gXHEXO;K|G72LlCA$h=2$Nt2)d{N+u{9X)<-nC?nyzRJm>7Sne;qM99f}c%tO2}
    z0N`cXdl-sJyn`I-?dl_~eul?aM)vEy`3m;squx%(6Ipo@s!^Q=Gkn4kRJUYcsM`?Q
    z`6(rq2t}00u(xF;D7_;c_rcs@NQOW`T6L0{^U5j8kfV#HIqjn}glH{%T#RXMK#)>n
    z2IyYfzauek%;8-8$uitK``P#2^XLkL_?|K$B@%Vhv~sM=2A#X7XJ}4$$WEXK95Ym~
    z*qppU)w?z?t~yJEfkK4`*Fp7#$(dDq+Hr*COxH*$deY5p4!Yq~6a7=CyPkoghi=$A
    zpchr}%h;z$RUuya>PhH4>Dx%;&u4;_&6P4g;aQI4+1o*QiqCw;;r_ds`ah6Q{-q22
    z|MqKtLIst~|JgF=4Qd)(iPwPml-K_J3eb+F(lXXAat4ZjY6V*Qv|XO9+@Z}jC3rPX0@e&(7ctR+y^s3ay1+_{wX^Ml>DS5)9N}-!
    zbLj_aPXH*KX(sg>)Q-}2lXT{WX{K@t3wxrtNu5%tNq?`P$*jt(nS>Zdt}J)okpMpm
    ziYPK7UOm|f=f$|^HkZl)h_xD@JQxK@+B!z%CaerXc-I?cN01D@
    z^UTi&Y!Xl?1e~cG6nZsjIPjj~)(IORG+y+g#l5VK&E=UbLZ_JqaH%I}dhRk+yh#@)
    z9`RDA$jN~Dai^htSyePbQ)&)2DFF?7C{%>~(5U^1YerCVom^UBda_Tcsp4F+H+sBr
    zvFp6-+y1MwDko!sjB;IdQ_l)-H_0ZT)X}E$`x~yGCZxo5
    zv5O>vfeW2YELbo#^5dRVH_1tpw5utF<}`gQZA-OYqGkNxyhOvZMZ(Xk#PG)Wqmz82
    zqR5r+^(as2w40~h2{%U2H3NFr_eJBCqS5=Q*aOZ(C~y-8%MoX7ttE`$Q_}Eejs>Y*
    z3ZzXigC|+t9eJXyW}Zb5oIGpfgJ!B*JR}QHNI3(sJLAwrTaeZgu(IJQVIqI+rfYOK
    zp{+aL!4QCIfDl$GP}rah!ce7AQ5x(+z>El_0H4x*ttJ=I{gFMHSk?VKKb%^T|avD
    zM*R8tfd}W4&y3ggnpbDUpPo0bIQ+W)a&PnwkUxZ_KLSFC)9k<7qx|DF$MnY={gdqb
    zKkqDIJB!qEjoqQl{RXXE{sxi!-Co7T*d4Ma@R~ocm=^h)J)!ac_o4rNu>U-w|AE6B
    zdez{&uU7BovXO{@`)s2AQ|hE$4{wLa86BkUi1*14G6F>`EwPO|kwznWNoypUEs(Pl
    zvTbtub{XSF5?Utt36K~d;&sjAkgPWgSdZ=Ouu`mH(dW14cU>-O;wkZTkA9+Sj4PsMjmMivwLae
    z`q}gBNGCj-M#!B0XI8}@boi4Mz`hFh047miXkMW?Sb;_ipL5okF77xv_vuVW94=Ab
    z8{N~~tM%P0J-N4zr@@w%t~r~I&ZqLZ;4&pYrIR?TLMPXn<+D-9=kO%F2xd$`<;YH`
    zaNnYUnn>|IEBTzo>=S9AJV8uH@xp-Z*73UR;ScK9f+=y4aq1FvN8hY2GO#KO_vXL7
    z;R*BjuEP|D7~33=$7De8Iz+=K8p&2jQoZVwLga0$u
    zi%+rx7s9dW#fuBhMIBn5&YoveAEHXO!YQkCz(G^~iv@i^#oJo7RRxO(AB=+@-M`p|md@k3>~ipVTT-&FYdXD<&pGz#sg~z_-njI;{Xd^L21Gh5oUuX7EoZgHm3y
    zO$Xdvl7iEe`H;ux`S#Xra~3eGLz=Q~Wv6r;nJ{(=)?r1K5yCj4hsZiXAS`$H`Qi|5
    z%T=y1E6vm-u}Ml9Ty0j~H7LfHa9h=sSQTu6{o>b%3uZMe%_g~=>GbU}hy_j(@{MRZ
    zfdi`2p1SJ|V{vIg7ClvqzC%qTCo!J9aB(=nJNif)(p49O+s|x`Drg`lHFI|UO2-rJ
    zR7XoV%98FU00n&N+5)&&+uKA&+NPlgXK^p1ZP*ExH$ErY^@quV_Nh;={g0FfY>K40
    zwCA}2>Ta~GYRIijhwWL4iIIw~4@QPBY6EWwSAx}H>D#H{I@0F)l0(`gn{R99cnps7
    zKh*}qip5j#5bdwtUJRBen(=Z87E|S4-g?rl9CIH^W
    zf@*and0*Ea<=ouD#Nr0`*3vNRJ`~?~RU-t7qZye|2QLaAf*eV<>$uZm^7lye=U6ft
    zTB?F`A*lMVAW^(|%S3Cv{O~E88;}a@Acvta<=u%f>U1}$QiDiIno`(HId!A@`8icX
    zslNVOZL+6q%QC&6Ji(uGA%zslcKOX8s>>`9mOtc-77~SpfQ%%GSn9o68i*}=(gPjo
    z9p(A9c+%&t-lWdtzSw6ZHi10+1}#;)iHf$F+aw5>4N=lBoq3x}uRmgaOq@9qjmo<)
    ztBaNFj6=g9)?e`*_9nVEZiGwSPlBZ}q-m#;J7`d)2@Exqn8}avENkRwLtee5A86pU
    zQjy2-r}8&w54qB!3ubm_CGd^W=)eriQ7c!#ICF`&Bo>9Sy}$D456vk{7&Kli`9@lC
    z;Lg6@BBC6=PKwE}q404}jBb|2)IOOLTHb#`AOthMxUcWyf*W_%?@e-QSlbs^NUncb
    z|Hf5Mm%N0G@r>bHcHQ7$s8cO*Eg2HkjGr+5q-j+{1E&(&!r}SL`sz61RwKV|#mohJ
    z6LmBg+iMOn{DD5;HrSAwbog44*M&eq)-Yks^0L8&SW7bOZBPI=2FM>3G5$E}fvPrl
    zCb(p!w8+EGBo}?ZzJz&lcv)@&AwWH{Ermv1mYos$x{c;#t&%9*=c(Q#&&)E&JTyi9
    zGwor^a2Bj4iJes9Wp95+Bvhd8OMO`GN8IyL2QFPX%QZKsQ^nU2;f;ejY@C<;q(ids
    z8Q@5?e!s%esi-&*dtdGN<-Ui!coVN$bh5Tvky~DpbX0b@=BKFlSODFwXY2TL&dKKU
    zSRO8V^$+pggtsvVTCtra#pC@GF6B(PfcuXOKkK%kQu82A06h)Wv);tAlD>fKQ^a#=
    z#MDXJo@$HY(F#6&W(|z^*kH=n;l()CH1_a4^8y;$%i#FWImfT1U#M|5--Zp!Ca7YB
    z;0H{~d82|ZiH9lz&Q)$4A$fgJqgO?i_%$s{IhzYPoYGr~FNgvR4Um4#At4z#4z4EB
    zOw{btk7vEe%X}NBRAsPYQ25XJa@0Lx*!de
    z!Hz$ZWlT&*<7I1D5rp82LK5l&KQwD$QU3F36_@49L~;bH7r2~}@VtxgH^JITbphOA
    zPQO7a(N|+~_sr9IX$Z`p&w|0VsrlxMMBZnMO|On*Ks;Tk8SuqZj`9jxOL^5UDAEjo
    zCv*=O>TUaLl_Ld5l**V*2!(rWj}phhO+TS5rvTEG{A?akS7@{m#mIW$0P0&2`88%my#Go$&`%JDcxS
    zn&tyS+ZAR7S(s8P-^+t|8Ek0yU(MO|JyeS<-Fm-471Yh{`!11B%(CoKDm+BmV08TV+{J1hM$f1;yelQW~L{U0`Fg
    zv5OM1l4d=s7B^{}eZp4@vR{?;t2@sWUV3C`6Z!eQh}|@tj72%v%Rp59#R_efSl7m6
    zxne|DU^zBk9h|jiy7FthRe6Q${^NDiJgO=@j!*f=abz)GU^?|shD<6^rMvcyQbqQV
    z*79Tz5*qR^)~gvPUbNrF^Pk+@cV5#Q*G*?9F&~l)y|5ktfA4Y6F{pP@)SO#}ps^kDy-P{$>3OTg2@>7V)1sD{r-
    z?jd={<23sc0$@^>b=0n+0ZfYRZSV^Klfq~sHAAh4`Yh*%yF?x&Nw+m$@J!as_B4lM
    zzJs>ko^G)(uGqHQ8(Un4TxN_ykg!k*zofS?>&8nZZFxi4q_VNz>p+e9y8eHWx*WS?&#KuO--4UvD#qM)SIy_jO%T4
    zW7UfLwOVC@NdPm?)`~4C`g=w6AUriw!~5-5N}~;>tt=s|IExFqT$FPW_+K=17Le0N
    zE#qTfG^oypXmNucm&KURK@5w|W}5d1w6x(aTlMt~Ek4}D2XzB9zJZ6h3{l-Of*CoW
    zq3Xycd?~%y)nhy{Bl4O}R~3(BrOCrJa~rT1k34Z`Q9V(-;XpJhX^0V@JK*z$d@2<~
    zrmkq3Qd2Tl8BJULZEy+^yM_k6Q7JNT(3fYc%3I;Xo2}70SF2_LdkAjG5{qd=bFB*q
    z>x?S&EjbaNx$#oHufO;qI5h!AfjPsC%F0q>?jR&FJpDl>LLo|jz~(}!>RYsw+UPP7
    zF6Ar1HQ2h4yb!X=_@Le{iDzgP;46B*d)lO}-CYE(qz;SY;YTvV{6;!}A=r#>fQjy5
    zvEB7nz6?){ykuih9&cd|xq$_~Esh2az5ksB(VAGhp{gjAI)(5_6OgaAm}owI*?gK~
    zJz|{``L3PC5ba|iYu!-)N}cVf$OGfer<3WhZ(3?$0tZL3I^ZAw?D^WEu+{56Z$eJp?!Y$n>D
    zt85S)H9!}ZYx|i@=f?#lo&~F2fk(Vt_#MRI^vb4A#t3(Qk?X#Bj7}h-cBF|7v{e5%
    z4@8u$yz`pP^5G!&N8JLoDqJY>VD-A5MV_lhfOkdcQE(Ho3$-O-m>>iI)w
    zx2`chsAdgfYEoBMgQGQk4UgOGFGGu)xRgJS!@v)Z5Z4Z>pbP$FgF0t9Q+p;8KVSvT
    z{N^W6N{q+0X=c9k@`%O>$(A%T9BO*5c#0Vtkafjq=umjf!pdRvxT%C4LcA$6hQ;
    z(|(%~nIm+i-3o5j9BR9h2`vutacYcU@Cr3^*^NkmH>7+4;nZAQOw9L(Ufo9NXvt%&
    zuy-2LDIYde7WoS#;1g4YQjQwj}UF
    z2|9>IDTA46{3dIl)@Sp*qzztGYciRQuyDkHUjtVG-+G&zZi{#52eX*U9ce8@(0Av}
    zf+@Bw3v-&%^bl0Hki#}|ium&atkh#Q0vgFB3s#l>UpuBCeINYX@QR
    za*JTzL?0hon!Sp(xjGad`;fQ|d3BZ(c(9hG3I}67f=8y69bGC)U4_p$)ysFux{+6#
    zwxag6ECTGvap?>ToC=LnFj7E@d}HrQKQr8vX}3)3D+P>X*UB!Jv7M(@EI19
    z)UbkQ!&<)2X+eqvgTKZnZ4EBeBGYHFnSyqFjYg4a1VKjoX|La?_SA-5Ey!F-Sl1D%
    zt7!F~X!k^81n}QHiz|-M_wS|B)Bioh?_dF~Kvd%-=?_QUZoPP8G7>PMv}39E@1
    z5C*Fqbdv1Qm}prMhgW*d|IBQmUKOxTdi)&nUe_bw>P)?HYR9=dtRge`UAD+Rk9<9p
    zZcCrp^CNr6`eloN^2sKlYd|JXa$bjvU9JR1oz_Utt?Z|kbB=d=etEN|ugMIgls=0h
    zyYPlJ3)tXS=~z&_i|44u)gHnK7LX~b&yQ9g#t_qa)&Tv5BwuQOsZSzl;t=Ce+B+*1
    zBlm|1S!a`=eGk+71Lsy1Hj|Eb$INGIGPf0%{>_t)9t3X5sjnB*rv*i=v#X<5tM!?`
    zbd>X>^*Q|@t#vPX9aiQ|H0@5lE_+~HTNNP(Ai3^xn@6}egSTWo*kWsap4(`gfaoCZ
    zJE)<`$dG>`DsqhvzepCs{`dphe4kfY?N+dHFId2$>J{>eA(&=Br$0GXg7LX8YIJXx
    zUgdP@woLT|Qm!5T(p2@)p>-!ww(|rJ9Mww}vPvUQIr4gIz5Nbh+D5mYIC2_~8^ugR={J5B0
    z>WtcHQ@qWXAk)Z(@jB32KQiT^`Ed`l&ty|_Ny>LrVth{R?kyKfql32+b$*6sWZ#GQF$uzZ!^Ppd7%A5M9+Aw^6l2phejwBPI|WDV(qgaXA4Bu
    zJCV)3e428FetmWJFB1~KcuR0XLAMTY!e|-1#
    zd`;`uwfo&8YnrC;vj<$ECTTKr8Xc)Vgr3OzfGKJLQfo?K5v2WD5}ueG-7p>^s*|nJ
    zuXc9$L;Zu3Ocvm`>;(o0^fF9s?h$KK38um8!=qnQZnb((Jr?OH_J~7q+J`Rc53;vkfb<%wEZ;oyOpuwLjc}st)
    z@nvTuu9D0?d}HQ)YAFGHUSb&+AK(F37*wzQt+osNGK|0NtK9jUzDl=-!21%`lRlst
    z$WQNXGyPt>FTO
    z^ci^#zd>Js^25#dlkhH)Cw!P6HXfvExXt(;NAviI_C2zBI|Ky{i&*-k9D_~tWqMF6
    znV5Z^PsSL~F5ywbO4~>hT4cwskw%rb6EJwRbeN`IOK=x9EN^WLZu?e9g&Q!?uZ*Y>0T@ny?X-8+wF19kDr+gx+A{?m
    zVV_la4D!aqa>;-5}0A0e}FUC2QW=mj(I>T@K4J!3*s$AK42>pH#DiW}AhBec6fXVvg
    z$GFVpb^A=iYqr|!4y6qF?<%w#(twbGHt^96*k*(*@cjmP7M?wX+NO8viwrjbw4(&a
    zzaTgMz;6752hrb{f;{ggk;-4k_OZ!rf;F0WsA`Tn$%!b4Uwr$Ws;q=N0b>gEcC-c{vHF2P2E6rj7cm@AH*^Wm0&G*gA2qEL|P!5>Qn<>@I_>W)|JRI;P~;Z)vo@)f>>!
    zV|Jg0Rdk!;#$gM9zCVixTj^ApHp!KFc$wvC4!C&15Oa&2SGdklCO(T28?_Hmd2#_H
    zdz{^Pf>Xt+{$SennwRF_;OuXq-(^ZOdbJtDR;`y4MlVMO%1RE8nM+J!jAsS>s0zDc
    ziC>fE9T@wM%BWG{l!RlF%1yKBMjw*QX>JZ4%A!>X8nBEb$fZC_
    zzw`u{p42prkwIWr3rM&$aY_P*%CQQY@a3&=9t}W~j?BF18@d0JAhCb;+W&WAjz0m%
    z{?YCCzjXXhmfHWt$T@%J;c)-ic>6Ur0?<;En)e%2zjBA0U37~|dhuQo{;$-zVlUi1
    zk-0dYXj0iD0;u@pQYh!Gp4x4cLjT@Hxcox49bu2klugQWFe6bUwY`N>pzvWIrWP3Y(wl#@T%rEVUtGU)JgdExJAl@{jo
    zJ;p!?(!bBi7HE%MZ9~-X&rVxK=s`Q95mfx}+qdCJf8fMMFMn}Y(t;OA<)e)k%Bgs6g8j-IG+
    zQWP1uhDYgjoh$wMDzUYu{ULeE>WnyW?B{VCEZuo_w7!Hz6Jw|QY}0jBQK4rce*kCp
    z%NJyApm}1Jh0?Hm{&4Mb>A52o_Zo~&o@e6kV||a%NIy44h13fwaOhbO)Hdp*+jtn=
    z3lkk3ql8Nl6p19rU~f@}DdKk
    ztwJtTx{2Eb2<0z(G+cOXY4nMR(khL
    zl#9O9>j{rBSWy2l7%>!y?>2R-33s$`>*zU{*2@KJz2X={_;VML3g9qCxu|Xa*<#W>
    z&6pFSvUi2s;e4n5UHC9(*bF?lk1P+(FVZKJTftOYz(i4(H>3);gfh-&Gh
    z&z+xKHrkxO?lUIJ!0My9pj3Sa8=6+}#PGvBQ54^}U_tGcRo?cKHSdtdkUQ!xP6eG9H(!9R4YaWe+q
    zv^-A`YV+@Fp+tDs1OuvvS9{}LOh@coRS~RxKPb}8#F3pnnYOfoOIDW-Ptpnre61H~
    zCRvcTLy=)>tmutNwz}3TOG7saInxXl_1G*`h$1o
    zaQ7;#9vpiVG|%j==vr}zU&2$rezJw_oByE+7JL&O_pAUbUf|R8
    zHwNz5T4{_C;a>_WCTW>8YY&V=Exd>l=0tizmJ#Pr1G+QxdHQSTuRyJ=LC-t^APb)n
    z?sZI{M<2$gg2F?8(uUkB_`AN;M7G&#y7U9wHXx#fReDM#D>||)t6xrA-s~ke4pRy7QQf%(LYj3=z}l!4gq`mv2Fn1
    zyzMJYQYD)$p=j0_@s7@zd9C9;Z>vI9GZ$GBfM0g}?9EVuI?Wz`m;T)L*?8U>`OH;W
    zCY!S=R2Vg2+P(Eq!o!s?7b?FlZU^tMaKU#sqdy6lY;l#ci
    z<&@2i7y)v7`JP|;YCc)xRMym!nlsUw?+dlC|M0j!ZWOs1(Kdo>@9Cg7#94PH(ohPW
    z94rCxc3F5g=pGA2C0YrN%V&tnP8nJe=foB#lg1kw*`|*Lsx1~JF}PPp&!r)Dt~`7s
    z^StpoR!NvixQsZ2`21$WfpYqoNbBn#I-XDQV7%?OXSK~s*N_=>8h-J!B?kwE7S3ND
    z6vrvf_y5)d=|67&U-n$%0^k%0!N7xTp}zAeq0l?~|398>DtG-E-RS-(903uGa$
    zNiNlhf#x&IkfUF|W#5R^Nz6SkGrWnn-t=GYJnpVElgY?2XJ6|#GnE$)7Bq0W$!fee6!+87Sm(^unlRE-T9f;g5d7WnLbr5n+9jDt
    z&~&v)MULygrI5tQKJOKFidzy2Hwt2%v-3J8o%aom-t@!r$X1-oht5z=X07n-qk_5()@xBl&Y&t|Rvq
    z9wrkw02l@dW4r6*2Bn?Uynu#}KdISwFj<9h`Z^>MoSY;!DtJc}Bc^-2TjeR62(a|}
    z52qzZ2;y>(HB=EOr7vD@nC(7&nALZe^%WG6cGbnNN%2c@V#Vsehvzb``{W;^l%sLU
    zWAFoLp_+5iB|xFMJ`rviI^G^FJh*()vU6U9jNoAPOoXYo)*2sIN2=mbHJp4)iSzv@
    zry;JNtQ=TG==%PYv0nmFo)eH$gz{du=n1-3h4G}aYINa~Br|NhxPK=|4C<{v)qw#|UQ>fPv-=mhynv>m^Cy7%K3xp+DH=@)2o&y}
    zKx@oCjSZjZK^7RHp>_tePb7VLK0SaE~2ZLp`HPb
    zREGLWzFcR?8~v(oAYe8wew&gY6st2bFRX8DocqK5&L{3eBeAd&-B@A8sP{J0m(cy4
    z{`ql$E)7S60BSw`HuEDzr@k?)UiWpSNd!R*LW3D9`Bsi+T+I)ftj@mgpqD2;sCb*r
    zHqn0C@q3L}Os$e*a2NPev~Nx5`B-yy9N1eWZyk@m<7&*9HMTY>N>1g}x`Rvb&6(gS
    zM?wX9l1SqmV=kpimJJRpm1k&URs8e0Wv0~~IrO4Smjm}HW8{bqr9qZ`o4FXjL9i5!
    zS^xO$5GIlHfK)NusV(NVDnl4R6{95fLF2G00`fh1Rujeev;hH497^(46tmN$_L
    zx(G$TkC``ak#(v(%BL;eRmOl1{`N9V4st?F1`{J=j0Lm)iEA#Sc}HC%x^1n>bX
    zj$>N0ZQz{m3uyMGfGRfXC}3WwtROsMC(8dDKvKyz6(_RUBxK_r^7%2QK~k1o+mvi=
    z;(45mD!gbiKCiL3TRYaC;W)yFfOSKULcAw;m8m(NaBNSRw)UDFCLK9AoE-IY)R5|e
    zFEM&)HJOj*jG61EuT2D_Ey}bpS-VmmPUFovW-_v>+X@YC7ZC`@9dWk0`Q9QE;@X0A
    zktfe(&z3ZTjv>=)*bX$qrIyGHk%`dKizR}Nt=W?YeIxD>??-w$
    z9&b-qG;bohy5{IS->D@PvU}c^Hx#_W8Qh`T=XB)w1v`b!-?ngi
    ze$=G}9I?k~g`k(MKhlElz`5f7;%NAOs=73wf3*YVuD
    z93#0H;Zn}r<-jIpjBg7ro@^|(+jF)ChbL4bP$q}qy{JH`ynW^-gdNB3(o;Yb?oMHO
    zE-X<9zD|3KW!oOzwuH2jxA8D`Q3ao!>J@p)7e;gNJX(+-NQaQPSh>kQ+y2GR
    zflZB7jG5LRrpguSFfX==8E&xmX6}kM{-@5}VpU?~Yi)hKZyg3JoP!&o7zuqHx6E$b
    ztGbHw5ZE?&mW3@xlVMtCw6@q5K2SaW3zp*v6NZmssh)&o@sgF8%`}^N0AxR6|JRy&
    zOxb>$uBg^^!UGpzqNYA#3u+b%2`aHT`v6O7zbcgrywwq)bB#|bK&O>?%SBC!NaE(-
    zs<~S(Leq0TQf0$w&|A6;_?TPiP9Qkz7u2jVb4b>-`iyTT%en6}j6Szt4J@0NFSD*b
    zj5}~T#1Aiio3RD8{;cq0f-!A~g2@Tl^guef;_IOjwblpx6eVJrlj^sX@AciO_=S-S
    zBu)eX0tH2&QK(8oTcq}!=FweH_DE_=A8BuJt-Io&7KUubRXELwq|V8{
    z@`4i!pQak&GEWTWJD2bfe&g5HUi<5k_jYlgL#^yNnm2iC0Wdh0_auUwAZqQxtGVp=
    z9WCkJausGV#we0BLmIaA
    zIUH@Ej3!GUJUh>^uwl;1&4=D^IEQY@>Ar`rBfuro?1X`CxUD4pgjlHEY6m(5f(;p#
    zj%4lgxz-5h!dCGkoMl`BM*h#7z%Lz;eT&F2K$eZc$DOsu5USSJKyTg9)`+X;L~nj}
    zjwYfPqT2K7MYqaaKv@Zhevu5)cZJ3`
    z-*SEF(*@*b)OPzHXA+xDTm7S@qE)HpL^wIv=Qars-$K+t%9v)j1Uoa8LBeQi`9_pU
    zgiQeoox5UqHGK@5Uc2&1P8k$(CP9kIrD%=KZ0(SkV97)}qmN*&vd2}2rlXNKx;jlN
    z&~dy`ZfQnK49s`fj-TOq$KtFmN;ShhbQwk&b3W}|IcK7>nfhfp2@(
    zE#dIo%@6Z(S=XgL{a&@Tp4jBT9-)qrxw<$>%`drB9*wJbp9~f8Gke01ZW~X8Y^#NO
    z&DI26Px4>*TawiR3AA027IX2DkE`Fl;AlqFm~ZK=+o*gPF)h+P_~mC2W6?g58TMv3
    z%uKl{`V$tKsm--s8toYm)N8E11RHp8PkdD@!FW5KB{K+PcW|Du4TvN~H$~Vv1}$ds
    zrmtxwSW~)7mN6THsc3#;bVbFq1&TyJBTr|!go5De%hE#$~q>=ol#$#C$&1=KQb=E`m7V3`fL+58v%<^OoFi4z`g+;rBn
    z*lhy$fU>^b`+Irf5C^KEU#ino3RT;Z6Q5(-@p5o~XegB5M<8F~tAwk&Gbu`Ot-c&l
    zLus%w2u}QYDSM73!j~Eo(@%#R>@gS@*0$b0sg9;6Swv&vb_
    zrz^=2k1WdR^f|5;V{anqZgHoj0VKKZ-ymOKX^^do`V~Zhj6|kmjul@faCi+Ij?a#U
    zC(SHA1kX>NS9iptXnmD>`KTlnvr4`u|FmS|V(E`(H7g?@jpE!Mg987YU3U)!u36f=
    z8yMM#YfO>8_JCa34zb)x)+MTng9tnD1zP<0T0PZ*i))1SyD}4+5Y0eMKGd)sY1Z!p
    z!kndbSe_spkC#Agjpf(Y{2@;pOY$<4Uz(1n$GN&eY}{rzWCQ}{U9V_jFl3!8by@nx
    zf`jH$TIy?2&1Mn~@O{(tG7A8^hW?{x3W38fHsDI6HLE)sXD@%)+zSYg=oTkf8CsLX
    z`!hOt5+S&jd#{t+*iFdlYu;P*d*ippOpFH}@=DOuM&Ylv*1
    zZ}&fxR(=iH#w0O#keh!Xv3CTPDa78@5~!>U8FQA8YEWYZ2rzK5^7*U^k|$02u%CTf
    z6Fn_EOu^@XDIs>($D790wldNX5D_VZA6LGZmQ=CN`G~o1#YSW?H-QbYw3ZHAOkj%!
    zktD4yp4Z~Jbl*I&aVkkXmZP$oc&54u!i1$xomEbwytwc9!YRYIJQ9W~Sc=dXSat{V
    zheb^iP!N!q2jB#%P>w_ZUMzIgVzrXHU2^&k(J7j)e1tKii=R%Os2iDlD}RP(l|uKz
    zuhvzU#oe{?NE%Crqdl~>{j#
    zsh?#!sZUr)?Mj_`ZLq0S9}X!nC${`TOx6{qTy-(=q&II|n(5nPbR~BCzw2N(1>1Ak
    zZ1~H(ApI&%Nj4DSV}n=}cyi^3@gbe;czQTaH|=L0mT*vs8LOE}6a8NQhDTYtY!r9N
    z5wwX%#6~7mr@1kpurA`7(`N}=_XEaG92leN6=f9emxT!Z8{>&yp=4;V
    zyM9&Ldw-62cZjfjr;s`^=ql_1oHJH9Rw`X_P*v1(PuHqjz(M2KE9!tb+J?L0HTgt0
    zY1#yB1csRQPZjcc-WKthvM*E;U#d;JXatT8EYC=KypAi=Hc2u$epcm9U18QAnsmcu
    zS!YSRHO1g2v9t|Ko)e7r^X`*=ZQmqhX7j-{E;ulFHG3&U_70qpSZrN8jF0TW2MT1D
    z#3k*dQvPW>zp@8J$j3*=RrF^_Nn{oCKkG(+)dZzj_d-k@7KKS&Dk1*suTfL7Z_q&zOgH_V5{
    z>E$GTMP2b1gRz`brH62s{e3i0d`>Lb85h5|ej0X@{Y13?gpGOh`ZuV-XPs^M{tb!S
    zWB&Mh>uCRqPv_d|GU=Qj?v2nl_jr%B1@I~Kz`jztFcMGxScMY*Fk>n-op&2iW>S`v
    z)M%keMSSAb8Cwt!Ri)u!`m2!Nps6dR=imb0qUt(|QZzQ|qX7Ylw9RR^E^-kpF8#>|l@%?1^5a~IklBrPc|0d)@eyaL^rZR8F!zz-
    z>)5Xwt(o)it?kgBPNQy%6X1yKu*eA!OYbsg&u${W(SwC*Ht!YR!G5VUNAQ0s>qUfi
    zeD{AkE|`?he!u$mF2z+-OpKb#c2(yQzYl7
    zC;)+w-b4;2#t_}(*PuIfO?oRXA*c<-$-9TJaQ!2_+@7N0f#6F82KezSMNH+{$}1Ge
    zC0Z*Jym=wY`&S`sH`h(pS%eSGoU!%SuWvP-vQyDHzH_6wP1{z&$dFb2SA;++XQ!`F#bNY{#t8tUY%bN#u9lTRtw`{2}t0X15w5LfZJ45Pt!0HUvfE
    zEi!J=Lf_&8Z0lduN@Rz+oXts_bcVJH6P+)P254)YKAI3t9og|zeR50ZY5S;`@{u@%
    zuqeqtsx5ifv0uwH@S{N#M`D~1+7C2BT;ELs$)mUQX9}e8F_zVc5rk=-w4#vL-zrHxGtiBt
    z5D|x1Xw21p`oCNoP%B~E5G3EdE3`*wEI(UWBEfHoN5?;l4zV!T3U9P95;yVr;^H8J
    z69GE&@L?+DO@r9DZwTz0L#OgGytUaA!15&HrfJQqxV8xAvcnEc#jUk-%gS>_`ta}3
    zVX##lJ(wO0RRuBCe>jrnv+ZYd#tol3Bnr+AcLKiaKZ>{A5lBotCo(AYWK!3FO3vpe
    zdRd=nL~KL{fQjzxPnx=F-~r_BO7A9xc;qBxgyWF2v+>ODIcV!jgyP#|VL8WvDyOVt
    z(TYezSVO#aXTl^A{B584n($XtXz*h7r>WAt{G6NQb(M|`g$U&OnUmij=w+ERXH_@k_)FuB_OPWj2$&G%S}>O?{d}3_4!MF8W^uUw!EE6o?H3(!oVUIKSPgmd|?)=FRHt?ixB6cboFJ=_KR
    z3E1V>NxyKCnpMjS6K$qlQegQNe4oni%hl4#d?&_GKHWno2RD%xh%UvPFRCd*AY#^X
    z5{tR$v#QZAc8u;D>Dq${-6uT1y}fAmviymu(@cBXb6QZ_AIo(VuIFAH`Fwij?1F+nALV&Lz3ei0SKq7x_yrJ%+3;w$T4z@oGtNj
    z5~NtN0woOagX6*FT2=-x!-curpIhCT)Nl0|*{=;aLxf68<-o0v$&&0Zbkv84AnkiO
    zwL`@RS+q0MPctD*^0`>Lash=grnuoW7DmyZa89+JmCFezS4^rqbYs-M3}o1nJla)}
    z3>@uCJzJ@v&Du#6CnZ}5wW}1CDERP8l;Zwv!VgR3&lFVAL4IahFS)qT8+IZjaUBp}
    zpuJRG+?O~*%6ELGn0wfu-1k_<^mIP{CVQeqH!L?^_y}r?Yg)|o<#^>~O_f%jzc3)}
    z1-Y8T}1X|Y3)*E6LMoDHHC-U2F@;9%@elXTP^lj&ef_Y&mlB7;=&?Op
    zuS=#j;c2pDTODa~CI_E1XQY4s3j2Rs9j8MQIUl-5w=l5Ra
    z(wJxEAyci>KiN#N~F?l!ZpGaxdP#%ifr
    z@u@s1V5jxTxeI;?M~Y<87+y&eBQOk4EwekPOX~manT+>_<)r%OzpqOCzsjPFJw81e
    z0nksT*nKj)d4e#pdCa@>rYFa#$+xE%|H$Gge}f9Xd=}*cC=FaC
    zc@a!KLeKs)o7#W&^M7ru()cfoRsIryWc>r#XY?IIUO@1_OH7S#O3&|l-_>RHZ1Ky_
    z9_41Z=#KQ!eRHg>;#ZZr>fYuD#q~PXUPUuPw3d48Oe4mb!cJZ(F+dZzRcYgceHT@l
    zk&epDNHL1iL0iYJ_SlE#?a7%XhBC0MB$2C-TvxU91Sq?Ak*
    z16MIpnRVQ5dJbQ8EOWqvXlQ6?LV(A__myHxb#l+P5;T2WlZ~z|u1x00(34KCo36w5
    z?qc4b^MS*awR2PLvBG|j3+!qstjQ46GQb^gBHk?7r?$6zp70KdohkJ6sl5d7PVH4P
    zXSuwtmM&Nv565VMy|Dm0^hgejTl0<*a(hU$uuH&hFTwU0R=jTKy0Gu*wpelrGy{00
    zjI~Y58~*H42;#E7`67s#iQOOZ(x~Kpc=81$GpIGH!-Dktsyo@>ojJNrSfmQT+dgGu9=a@&Pg_*e%zM&g5ZY>Dy`AE_Tu8|TfbBw~mP$KMp
    zeh|09tP;MiHa)fToR72ONLoTf4ly-g+3~9UQC9|e;7)vcFIFKL!uc@a41o|OrA##X
    zJnJf^TTM;YxS!}^X>uh_PW<|V_lJF{^>xZ5Q>fNSuC_Wa${;$*I4aRE9z@2gv~Cg8jKV*S`|_o^ORlYnZs+JNe|TwVjz36*Nq
    zBz@gr{M7u3LVU)D2Uw59a4h_u4y;E86N7ctf%QmIoE%a!_*i2p4;u-yc9|*e>68=l
    zGsRMq%}@A9??jyl6BD!ES;5DK>df*~2#${^x5f0(H_nltg9nWrMr<6a5t~T+Rg#7h
    zjrHQsYo90dsy8*^id*qUYa7A~Ou?h6Pkmy#Mm)NX8nqOn`
    z_Qh2UL8(NXbsYE*QNm7$144oi=s&5aZNZNf$_
    zbW8vk)WN&tlr6&JdQ9AR5IdK$k+dBv$X3kUwg)Id`0IOhg$KEbE}~ZmSq8m*qSPIy
    zS8LGp2OKHW%`!!GS;TV7v8E-l)C4}U*B)Bz%0WK43V0?@sdw)(=-LZg53ZvT6Z2vH
    zlOM
    zVLu2Or(}iJ4OVqV6Bx|SjgvOyx&&@{b4`k9ToSOO7mF`5&_tv(&-64K;`I7?-uEaH
    zI`C=f<~#VlPg5#35hR|Sxs-FsxGk7@X!RDD@)?niLd2n_wHlONCD&n0>ZV|fhlZ@v
    z>fpy>F1J-M{xMs8Y=pD`vqgameqgrPvj3Ap2XrCCqGmYxM0&6{qY*XqDyVRl>VieR
    zu%X7H^CNm>lDlag1nYp&HVm(Q2K8$``gK+|8&qCCuwaT5S+Jx`b%h*FE%a
    z#GNLs+-i^vf?oFdVXQ}15#Ly<&hiM!yJDF3Caid(#~0N61Xf)>Xd>nj#^o4kLE@6_
    z+qs%OCV~BjXa@8CnYJi^+_WF{Jl=(c?Bi6ULJfuWh0lX-(NCY%
    z4vP~}$i1eU*D(>W=?aNY$3>DTjPv8k>#_yPSSOeBgEa@v{;@Lzr-S8bP5?Wu8s?ipJA$4
    zkFfWdhNM@tjVz~cwz{vEw*dEqs7tbWaE|iIo;0JVy0V(nXWyvpk6P)?B|vM<+u?7k
    zPjN3F%spdH(I{a;9O6d|;2(NLzE_YTIdwwUkPKn$muE4zK3+YZOf9fj8!w1WiuCyw
    zBfnn(a{fr?S=9lEEmgH;O_^aPD<9kv-@L6|E{D*-2yPW{n`b-`D)*=)1cIL%fgtPZAQ9@(5hQY|JXHJ@;FH
    zEh_JHv!PUds+k+Ddk(tDt49F(xR*wNUxC+=Q?f*x_Er8_On|(K(%-xKMw$_wm0=3{p+Qbhwtt%
    zLVwBr>`CUmn+!#-{VlSM;WbhUfSkblNi6mdz%2FyCiaM+`RRcd*xL=LJT$WQyQDHW
    z1N^H8aeANHf!9fC$QQp(_1lj!{7Rc_*?aoHly+1w@IRTdqI>^|nW#>V`WqB4r1%@;
    z*m+5#_K!2uodAfB{l8*s`LEvRf2hk?eE7%~vM>;C2k=g&r?)V8F89Bn?%Vhm4A-38
    z2G%WuR#T3JDUxd+yj{0sW_`r3aXhiU!_){=Cb&vw6Ajq*7)#e{;T=PG0XkonY9w~sv9G!^#BuJJB*MPXsdg-Fkxn0_{UOE5&sK=g_v
    z^rUG2mmg2inc~huSoJ|1iEdeI2HI=#qfqa#H?2VtG*mS7sO;Te9%mX8Ug~q|>ke=n
    zF6gLVD<3!tyPXd)`hAt_`z%W1eBK`--rDasZ5T|sx7!(fTv7j~mB8H|fe&Z3+pJHx
    z*fP;CjXExONYu8C3y)+R)N>4~%J;~F=xj@ARL2nVKu8bewl?Zyy82o;TR}9qtR%u4
    z4|%m$iq0yNKDt|I@ua_CkcK21Uru>|5Y%7cyod6cRYwK|1^E*+@bKC5*%==K)2|s!^^P-~xjPS(;-JBk?4^mTlbBdq-Pn13EFdi*1aw_euLAmmqMSWCV4_V9uwNsi9pCrEzhF-;s&qywT^$w!mMUWPCD*fq?on
    zIiC2#S*lqAi#EAXDoiSt1tw#r$}Y~vJ@#dv6AJ}S(qDEn7F*w@^8Z#M_bTacF*%QNVEO!Trs@(y!pAF4aI}c2K%DHkL9y7ze{M|+p{v?vyo*qEhgc>hf2Yd6_M
    zm+MdgFnvb&dvdbmmLo)G71K9S*2q#>hV)vHD!K;kU2HHl4OuzW`RE5)RqZw2F4MY`
    zkeYJqgdb}R(_7gJSxjWShV>cONzVXD-|OeWzV|+331nTYKU@iI1G!0h4<2ji9t4B0
    z+MI_IS9Bx~YbF>=OY6uwj5cWy-}l6&QU)&jGu@be(mr^de$qbmNK~)S{`S)sf)EcoY`7Nmk`+_q6vq-c@1I-ctN{@0Cm<>U
    zxBk%0%PF5B3gwPjyDWwcKF#q8stA$gmr3uD5m!zqYnYvs2&=?`Y){yDgi_i%F#MR^
    zN${0%Q1h`N@dS2g@CdT|Ye>@|xKwt;F@pCQssz=m%d+;KrjFO%K@n=q-ci<+47=*p
    z%hZ;P0)smsB?A1qE!{9E+EB=S{uYMh$dSf^0#zoSU6SwsM+q8HY_-7q)%q{NWc`T+
    zUz1+`1|4v%>gkQ_>*)a@XH~s24)%K)Z0wKkDcoPtCOB@NzQsD^U5K|4EPc#YPJX0X
    z$BuOgksN~dJ9KuWni+?E)H+todHJ)=lcl}FzhRm->uL8Sev{lKoT%Zm6e}^InG;_;
    z^s}<;E9;)jk#_H+HPXhp;LktkCYGj|bmMmghlKK|hZZb|r7`^Fy1QtN_F*?Hwi~fW
    zch{vUjw6oL23sqG`0h9gsT{VjX$HU6CTxGnGhKofk@l0A7Mr#oq#v~-47uCF&T66d
    z%@@r{NxFNh38F?4l>U}0HtB_h6$M-eSoCG?ZV;o$&x@8K3x-Z|K#rkgZ*Cd^#F8=SQAj>O{K&aI5$$ZTS-qz!{9AotC>
    zCW(di6?4g$%kvVRm(>l!k67sEatztp3zfDRU`D{M=T8EY@Q=QtI6>peLA3q}P4J?#UJ*<5wp4hG9
    zSdI42NT-P6A(LU!g$VUJ4-s2yXdYc0GJ<6}8waD7EaPk`31EaF%!9lslQpM02kT3I
    zmJ9XopGIePW{%HUCQjB#vsayZ&9p?s+?tVDnkFCcTaeSPA>Qv31%14HJ~}jtzIC)a
    zkJzG0*8dr}gzP^00txi`Ad746O4pYq_jJc`qD^vpvs@
    zl=OTbLD$tq%@HSW(uMs!i+YY#tQJ?RW|e2Yu~?^Ie!;IbO!_*ybo&Fr7O(j8I7wt$
    zUi|PjKSxOJP?>z5XWUpJxNK1tagmJ{bvJSE74^L9
    z`+Lz`mOH5q8uA15;6&@FO+R1u!CtI~8d!#DN*Ax{f%Cyw$)V(GdG@;oP+taEbGd_I
    zB4vmLCsW!w>e2heI2T;e7KWZ-|0v6vNe1)
    z?hdVwsp}I2f~Zhp>2!CZ-yO9DUBrGl^Ut+DTtlmwXMN>a<;pGx1!}G6%^3o38far>r)zLjKx95$A&+7
    zG1ib)j6h88-_2gNzOm+EYRz=fS)yBc(sTS|{&E+Mkt__)tp8<#V-}bPd2_6Dk?j~c
    zj31eqqMmBz!Vr5g@`m2#T{Cy9nxN;-asZRd_muP$Gh$jndt#BsN;dGSx
    z9L#`?AP~7jl@#g#?<|h+@pW6fE|ag&+dxGHzk1JjJ^j>Nr8)&Fz!2J2ci*^ihe$6G
    z`cS0S>s1ch4}q@gcv~GCT(7bsyng+ex@jff@%<1?#$#j0dG`F{t5cgXq$GQEzJ)vA
    zPMEDqB4el!u3n)75&Rb{2r
    zzZRt@6xK(S))4$04dn7tMH=+?Fnx){EOZ_VKs>X<1lStrBYHDxMtl4QJxMnH23<{R
    zy6Han#V6^~5U1JOrSC*&YE@&Js-%)Z^RFMJO2t~QOw
    zSOxxVx*?iQF`6{-S@i}NI@NV;_(+GSJbdAWpOmz>wf8}|=S=M5ZjGH}9|HiUQhMRBG@Fd7f6T++W9sT@pEo`q`MTNZ
    zT(`}gnI#BVje8TnVri>oLbF)u+*}NA+M7jP2jq@yT+yppW|QOeR&;24WE(C_Uz9HH
    zn31Ex^N-0R1BGUP2r#bNd9CQ0@N0(1ra9ZbnaQB=v&ss2EoA@GtMe=EGdvKJZIwBh
    zB$0fIqY2jWEv>c#(Gi!6j^{#@E0uUoy?e+)GKBtidLHRZt`N@tQCY7P_u9n?VXj@erZkoB
    z)(p_ZaQGs&I+{+8;$h&*$m6Ls$>WzYy+=#&V05g}f*`hEX7H3$2}&4NUgO!79u8x9
    z66k^!VRwpi7kc!!5w~;-jDb3wDiJ4)A1&#W{Yl}WZGZ?=bZdU?mol^=>-bt%mU}pw
    z%M6|J6|+;9kyoq^%^Y;8ULM*6aMxz36whJI!{*Z4$!~Ws(>!UKt}6Yss%PoXeB0)|
    z%%X7%tFm2bdakFLorR7Qcptagj8dZW4^LW~boNi$aGgEv%MJzSS&Ug2p6WLiKeU4~8%J+9?r4SXJ-IxVl0!vz;Q+Kav3WT>q>CtCd5htwXH#SL
    zuEic5J?AVhyzy(3rL$GiawtADp6{sOe0FpCDl7l2N#)#Z(;ore={E?dQY%<5KEzM9
    z!s_@Dp3DK|ED_@%wR0i5GAHXJNN>m}TG3fv13sTw?HIAzOH=u38xVxB8>5Aesq#bb
    zsiJ7;HwX>+?Y!yfQA*&<+m@&`*&QSt4k_YiClz04%f1+St~%(&7)=p$
    zm_fPxS&t&E!*#>?0#ikU#dVeZ{#~|8-JGo*v(f6lUavzeskhADO4o)F);q7~+gD`B
    z-x}_sFJbD+B9+JF-Q*l&-`B>Jh4r>lCjBk>c5*tn2RIf-_OL`G4)r*SZS$w
    zE3|}awMKCdWE3M+8%wTD9r_*aF;a#Q?V8vpemqt(_)G>Pqyj53NW2c
    zk!x*8f-+ooC37x86I$L3O3#3&S;o#$Qsan*D63T_74r^p4^xg>nBzq&N)GNK*SLDa
    zs6QR;^uB(f*Tg>LA27p-nQ9&eI{L@GI8RYmF;qPioT3a>lr&q%%YU1vY2c|oE_bUN
    zCq$vJ{~%^uEU_gtWHv)vSFPD{{xp3$av{&}JAahTFV8+LSLj-}To!lqs!^I=Y0HVEg9m!srxhori3gsX$j^<{
    zkrL2P^7RX@Lg8jA6p6ypl@)Cbv7b8kRRRlzp%lCyC6s#C$Y)(UK?li`)|1v}zd=2(
    z9Zg9?q|b{I4yerIAS9tHru4hW&OWXEI{qT?PdF1mv7n`&6|kX1p>OEex#-OG;zK7F
    zNrT-upXnFZKE38S=(14Q@ku?J+^hKQH!<2t+G!&QAlwA4e1D;1{_i%Qp8941{NAx5
    zm(&8Y_SU^{T|=(DdkH(TQ)xyTZ8*!ViMa34{YPa2dZkbp-dyMo^5m|
    zoBoQtji06O{$tDuS}e6jpgq0#lV0Sn_?oE@8HpWD$DKxv(2sf3UZ)Sd1hBrOO=>F+W|fM{tHl#I!oc@J
    zVLM;pkxYW0!b{cSn6v43uB-mJX>rm16UOK3m~F{U9KKp-ouMje@l+T2&&$cy%F
    z3T)jgh2+gJv(K09)?B#1;b0riABz?1@k#D?$nX~eOzwCgst{Hd$*C(8HJ^q^&NLN|
    z-9*68#6a#u|L|Id$_9)
    zS}-7+t+b_S&)S0UvK^h-?1Iq`{LwhS;YYM>0ZGA1&~KkfsDSpa!;ESS#FxYi-k636B|j6$iiGN
    z0W>ZTPhWd{WsgNBdqnV&B2a*M+IqV=7weZ=SaTE0N<<#s%|7Mc$jRu|!l4u)=
    zXzJLbUy`~u^&y*~m@iA%qnG&L5;DN7N0yYl?9Rtjv#y5tu)~?f4=wr?6$LdS?PG^W
    zSu*B}Jq+e9LYiX;)yVsAEv;a1L}vyCPbkyE5-$?1W)9gthz|c6EhAnLEU+BK#*yQs
    zmzj#qK-jQUlbx&LAyd++Z>|ko6A?Vpm8Es3m*O>*=fh)Y{iux_)hHAyj@k>I<`Fwm
    zeAQE{B~MChx|BRS8lU-lBuGc|yUHOQC^#Q-7F`PbIt~Ev|^WAHf
    z#Ua!S({tmXrf)(1=x=v;Ure*3nTsRK1B(W5>c)WN=4uKsc%;!RjS?|@Y7qliK^%G0
    ze~Bb&3;!HuxSMwl+!DQCBJ}$Qk%Iy5DHIiBwYC2zS$~#seA1i`)Ea4@E>@iD$7PkZ
    zBGZWU8$QMe(0kox5d5UiT&2_W0I*&nH-eH~3%IAj{-6Za8Q%Z$yCHf7P$gxrZ2)(*
    zpT9xyKqhvpY_#P<(3O{=-0x`N>2duDN&YvePvtQkKu@&-khmeSn^M-cUNw`5fu}LQ
    zp8!B?!z}yZJ;hSh<9+7?dLrQBnD=9p=YQG$>U_NR_7K|E%GBap&Esj-y`yHfsKkJq
    zsZrokydt)!+h#4p&0=L{(*Uj5brz@C&z5|?2&%@}kPJ?4_uVAKvLD5C%!@EyBIm^T
    zfEXu+J&BU}zrSoW8nLe)zPix+%k~7sLU%6EHI6(wF#F_cFvf#M!e3!LS&tV(_ne~y
    z@xg)gh1cn8XQmqM%sITi+qg@1p4(m@`;v?=o9%JA;l2g4ig-=O2qo_{))K->qn&zc1L
    zhn<%Qvz@2bzd_3kf7#fXa`u>^l5Jwn?>lOV-^L73pP}-Xt%3G{sp!2;@%jvIzJ$o3
    z2TxoVIXQ^!7L^o4T&QHxC5Vuyni-*p!8`_kgF3zgn=elpxc;LiW|IBO(MCV1LGzkA
    z#ohyUfb>AD{YmL*Nj4jxfllJ8{swgy{RY|Qry&(tOFMr2OUuOmbq`LA|8)(iX4X2J
    zr$3SZLEMbhuU;rI;5UdxMDdSX_JJwv|I&B|Pk*_<|0TEH@UQoxxNw$j!(5x&S03#0
    z8x)?lA1Bs%*n5$mhNjk>*A!k=b$qxwLirRL|kS&gN1!Pzf?KYQs+b?7DiFYn{@;C2PVEZM1g%CN%J-=GgJ@J}$+$09YL
    z+pz+(fxmS-ZYj0;yrwGXq2DFqtlz&4m-}}>7Zlf*{kQR$A}l$2Y*op0ESUWW=SuOn
    z0WCUH0`yh_m4EN8SyUEoP))q+Oru__%=abeml<3*nq$zoqgJ{JVVNq
    zAANuFqq;zUw}r<%AU&W%0|Ww9HhzzE3cr*o(Q5=tjAhSM8bW%#$jXb5YmnQW-5c;B+rFHmFmZ^*
    zbUhm{F5wdWZ3XzmAk@*~m57t`eDyY;7i;4d(=uA>29%tpF1$RyQ9Pl(N4uc%IBNe_
    zMvC2f23_Q*fK9T{94TQw1_J=i3SWyagAUJxXFTB06)1!yjjM!Fi=3skC3zT-85lU)
    zt?s;11A4I&VBqdrX*19ZX1-frDu~cmI@ScdvC?R?Sc!R3hCXM`f6w24uJiWR2nUQi
    z@A03iW4qv;@^O0>FzsslE#GK*^kNK`%c;sLqiTSD!F-ugrhZ=n_xIdI+4
    z>5prNMv@L@^hOcxI
    ztwxLv?gN%(hwwdaf_)2NX7@5x<_HHCEV-63@;a3Gi#|;xUs2FoyV!_K{kyw_hM6WV
    zGwpQ~HD`|PD%tY1>YKT5bKAhC%u^ZgPG8lq7zssrQ-`CQ&{2oVug;_&e+Iv~&SF?6
    zYikK>o@K$Gx1OR(4cqe=L^&;&*8XPGb`oii?gV!Tc$x9$Z)ramdd)Am@!rW~7waww
    z>gh2u2W$r~zuu|i4jqT3CLtaBmvpb2>NN%`g?R}X8XVW8D6|KHwS#1c+(&FPNStu!2;iaME2H!0l(T@UBp
    zCs
    zaSH?u4#9&HoZ!LIxP$;ff@^331a}MWE(z|?xH|-CqzNv$J?C6&t~t+Hdp-N!eg53%
    zIY0W}*JF&TQKM?eTW_Hn^36q;ebXQwUP?kXBQ$mgaQWjL9DaRQBscx$Omc}al*@2r
    zuw~7v)yXWDt{2~TtP;WcQY*WU)s~a{AR(wNsp1wN-UNkXf;#Q1l+#W?(w&x)s=;;=I+A
    z%z?DwR=)Dd$^f_{4QE+H7STZFiUH@~ZhmY$qMJ>&&M_L_v*SGu%`bpPTJIJ9s=X_}
    zTJmeTGCQm##p;oW77@~`$g?0qxrEYI(1tBi@qf8y*_GGtl}fK;=ZvR8bq{I~^vRze
    z0pQ`0`PvmF?120AY9^h%xX)%NPMP`1nzNAAUjWrGjm%94)mLwO1~0AJo1z!*}J`2+pOsyZwUuDho
    z>YU{NQeHq(mD7@Bz=E|S|IKq?$>g&Ld!alxCMy<@hq?aizToZ3=L8k&icvG%JR%%X
    zS>_aAMUA&XbSO6}Dd20Nyfi<;KE686Oq(7Fte>AS``vcTM~)J5WP)$VZmIvJG3X`k
    zzmJPh535rFQ5^R{=2TB-LXK)omN|LB`*aV-=AY`!WXER11B`aJiJQf*o6c-P>Qz;=
    z>-7A*G-?|g5*c-4ERDXPeZH3LdQS%%UGp5`M>2*7WzCd+5Hbf&pD&1}$XOkP&A
    zy?qj(ADE8la%A6g-tFMT)!S3ujjZ@u3262;5>*L!3ZU98IhYk9O>)h6zKO-9K4e>d
    zlHc%z42hU41ZX2F-RF|1CEdrtqf}dchS#k^Nz@1)R-bl%x1n#D>?2L|DX>ly{)*A3
    zxJS+qAjl&C5>jufZ)~6D;wozOOPUioUa{Ca`~ZWOJR+2
    z1*t^1s|!H!KYXr?I_-RTodbteHcS3wzeQ|A+OSV1J;(#@g8||n?5_yQ^q(TDe|k?{
    z{z!B_^s{8^z(M!qga}bM#vDL>M
    zJLc=XBFN%xSaHqIM&WG=9heY&CZ2Kp$r=*!8N9kI>%))Z!ruPv^VWbBx?svYp-ChA
    zCmknI^$PROz3mS_Y5Iy_olOhVzHT}C`$#%LFmd@Q-vLwgcxHsWAf9E^%5774ri1wdOfO}mj;vLk3|gn`+d
    zDvn1Kj^?V?huM?NTXqH4S&^I<6^DN&-&*u<3Jdr#mFbGImTS$9UVRT6R%sdn7cUWU
    zLE=N4nxg@33Ug1_&S8@8@hr7(OqV^t4lQDm=I0(pWbhpnlh_}FY$T4Fk`Y}`E8wEIf^w8c8&@6!LeJR_CvC)sIe9iDIRXax-n-)*7
    zwaycGg&oTNs)A*ymjlE-R=&Lk*eR+p4CEjS-qA88+xP=LFZj4k94(SO6JK;#0ZS+&
    zKZUJ%F{1r#WN!`L1qxsdKyV~($_mF9F7PAGz67WbhjJ4I%zJ9Y1lGrHuUJrfDKsVR
    zvU(Vi0~->}G6**?BIQAm(FiyCjYA0Ana}4~9Ewy(FD1S>-N!srfc3V|)bD&(b)f()
    zQB{Qyq=#sXs01N_bk<|VMFB%%~TzouSxy@C=feBYyc-(+twA*@I
    z40a(_(=Y$9K8t`VwoFnrq(
    zxPZOy9vzs7RrM#CSf%L4@5ygWlvt*@kSQ|SFWM?>nle>9nu2DCKC*JL={B0V4u6uS
    z{IEXn_gvMeXZHDS8UOqUDgHCVKA179zGch&Mk>?I{cxi2qTr1;wo;cwGn^?SEB-V#dW9odf
    zKbBOnpp351agIIq
    zciLDHed#Boa@eH1$dV~%HdVvt=#~z1RvMJlmg(JCjm*89crGBB_|QxJ+AjN4OlDO#
    zR3!mqx0^@&t_PyJZYbNJ7SZhmJ2@2(B8oqaDOQC(*7Qrsc+6b>&ks
    z)y|TypUR&0<>z#qP;znsZL8C4@)da2Y`coaid5J;h3Uaw4s`$%j*d6x2SF)HWZ#Bb
    zdgDX-k6W=nnmB{?np5Xn*Hg&$lV>emg8FXO8@U$w;s=QQYYJr|McD%vOQpATRD2p+
    zYBEi$hh68uM(n}$jj@}yUnN39$&q+gUe9EN7(xGy@TWXH&YRH3u-pkW(AgVjN<@l*;X{i{BU
    zHwHRv&em3}H~KHacE-@HxQdFewU#udm$XUsbmzV?=oba&JpFRNP7bfy#pKAO-9!-d
    z6oLFJ>>c|8)S|&eMKc!gX#JftTy8k!Wx*1=ZzJC`!5?ik7-WnVAWno0(Cb4JNMUPR
    zwT}qlceVI-s1l4ceI+CjA%V318Etu
    zYC@6afNagWPV6Q52Oo8GJ7@eke5Sj89|36Xsw`!F=`hQe?~HZCls9MzCtcsrLb$S<
    zq8`}ye_m55ITbdm*LHR7Ckz?yTm9zd0F{nVO*e1o&1%8h}Y*A9}Fyn^;q`y
    zVGS$7zQiEnGQlvdX{*|XcQ^&Lih*3SuwMKyPO$AbbSeeZG-H*8-!vR7J|54mUOK3-!VMoE8WSAf
    z&tU!~+S(d9As|q{S?-%iQYXPtWxeo-;4y!3S;a9Ayg~+RqpfdY-;ZsxE?_`LT5~*L
    zTljU_BLN4!wcp!X6N}?b$}HZ3)iV{s7u7YjR@JEJOM5E`>DyGg?|sFmI%dSq*X)HP
    z?Nx$X4GOflb>HR2O7*a^OFBm*5-+-Ft(_Ti26;?w3SIpZB517c{kW#N_L|qFuoaz_v=_>01pG(TCpC
    zW4}-ADDWs=Gd2CjKG68&Mp?PcjUk61w_@@#LLJG|2rPwIH0S$#ac@C#)6UPT0dn&V
    z6wGAha-|Z%=Z1Xq7`*-$)x4hzJY1hH}F90|@DK%+}{r+%*M
    zS;;@~j)vZeLzZc4aq@GlRNg}(ACcyQ4(^Qde|C3o
    z;&Y8`Q>{En0`KcMkB(g-qJ$&RXzV2TVPg*f0F-u!yD!=y*KprFqvBgud!jaNIL4C1>qEt$xT+Y1CRO}01%=vG
    z15potR%{XRMYA|`jqvd!(#y18laC=M)g0uk`7-~RNr!v~kfYn}+7lobdg_s%ytq$hB
    zNZK&5vi4Yp-%^BHMqoaL4X|TqShQWcSr)_Tsc#EQJzU&K6FDI&G>Wha1~QF6y`AO{
    zLqa4;Ze6)ccfsDW@L8dXKhMmeO1(Kkry3
    zexgmBw?g^0cfw)0^9`7Z+2EsJo~$)(86cVB9K}H3x~t9RIh4gU52GLM7?3#9#oN49d9kVP2rUcXGqb|
    zL516QFgi6A4N*hTCeP2(qN#NkrjFDdiE$*PM0UhudUf`)UY#xbn23fp3CxDbSxVUw
    zdp?6DF;vJxzEsj7b_oMRh=%?fpmFn?E@3l+2u{>DIcI3fkWIPvAP1i*j-E@mQKu(;
    zuQbO@b_i&b^kaz!Z*G0d8+s&!rnt*1kD;KGH+3};Og{0r^YcnnuFT}&eYzS-!sx_N
    zpN*e<*!qq?SYm9i+Y)mTa}TSFaY6gs!=Zr5hrqxGm9zZcu_Oz
    z5!D**=-Zd<)61zu*f%r^?jd7z%JNim`{W`QunYRYxL|7U@&&YPr)glaY-)lQsp&Xz
    zqZ%_g@GU?IK~%_%0b#(o#r1j!%Wku-W%5GN1H)P|uV#S?Eci1qz9x2nIGT`K1t;IS
    zp>kARJ*>rRu_)6AD!&I+a!z*O|0*{$PNX?N7J{O149CH@s!4s{kQ??#m!&CiDlxGa
    znwvXSuHou=)B=}M4HUnyEv@s*)$UqJf>UwX_$DJP%~`5(W9aUkwY|jt(MRaJpEfL~|3ZGzY}2QT=MC
    z%7tDT8?x{1+U0d!beBkG^XrpGUY#4*QOMPQ&1st^2bC{symV>&3?VT?2cpEpq6$%A
    z7c+$zT(sLL&2sWDE%8qmG&eTK``4PYLcT2G6cI|y2M{Xa?$JSwpK=m5m_sb4>nMfu
    zy<+v@HE1^Jl#p{=nw5|d`QUXprP;em=*p8rA#)lZHPSRX+S(%7a`~29GB#xiB-x8!
    z^@9UYFeT3Ds+mLU3FmvAXn$C0PaXBd)oLgju6nWt-XD4Uz}X3_L_a&~uw&50*I)MM
    zUGGk5HZ*wFx3hm3rn>UCA@~k9R(R6ecPYu6qK9c*a@WI6w)Ao1I0NKl2g13`O==i-
    z;Q3TjY+&6;@Ky2JxS9i#&G=}GUe-J$3J+<2(KD8Rz^26(rMIAO&zh@c!AysW`>9-u
    zO)NCpC8(QSddmm{Du7jO{l4MSDDYF66|WW&hxs_T+Z9~vZ7t0dfVpE?bM_eKZRLa=
    zN8Dy7lB%Vp6O$tspWyp)=-3jpPVY!?OH5}9UoLK<>LvCKLP`wf#{zlFUDBTNrS}z1@{5)0wD1I8G1>i(cy0^A%
    zI7@Rd*lA9o^|%vpaa&U+
    zP(F5*8kScp3@WeA@eStGcMa@QjfWF`D-m_~M~;q5A=
    zB_^+-c}mJ4X*YHihGw=*_bZM%BFYGo0=
    zvuVB?m!uJsaHTejqHw1rkShs*rs@@;nZlGm1zCNG4*~vs6cI-pO$P9M#$-N_$yjU}(1G93*4O
    zJEn6MjJf6i>ipUFV@65s*2dP*&7o8NMp8$)j560%
    zmts3o63@99JK))kzil+(*~e}ox@f^?^{rHJ4#e)waxqHb2CjEA^*90TdkDXFTPf=S6WnOf*Cjza6g}$b`;)e$@5SghgEm&~2QJIv
    zc|~M`vDw0r3DSLo_>qnyqp)|~DKCE%ayl~3txYC9I@iBb;@{AV8#fMCc!Zl$m(R6l%uObz@pVYDe<8%C0UmJzd8<#h=p;<(|
    zjq~y2)cv3}-v=clsqW|03ZD)}`TT_ex%tia(=PB!@HMU47y4%_Xc5O&5#8KcN)=jr
    z?{1uxl_-eO7?H3k`SsD^r*HiEcWK>*Av+(fEez-reFwJZH;^pd-wv#Cu-)iieEWus
    z^FHL~?o=Je{7y$pTdI!hlnGywCr2HCh`qQA2{YSE1ehT3;!@TK&SGQm`L~>h|2MyP
    z>M@<$)gRb?0dh&&6S^c}faJ#xBY1X$;aMl8|DeS^{Av6Jmk-Nd9zTEnt3s{t?-gp_
    z9HpwI36|iNaA(=x2D8DL`$Jw9x1Cl-2c8Q7t|aQ!oG`8(x1cosVL#z`T-Hp#OHDW)
    zcO~p?TuO)M_W3!jw(;wjiUX%&Iop=YTK}&&YVRcaU5ezBAVzYY7GQM&Gbv@c(18TX
    z%L-gi8t_&BB2!!>sZ^@53Att9(rEbGB&h<@VQ!|kC+aDhpB=Yj${W9n;-LGoY_$5<
    z-q6rOa_{&H-w7JXcj$yUnm9}7-jK$R4~e4~PuFD#88jOCX{*uhaSTnSXu$`NHJ&JF;*NEg2@A-`HJ|Dk=ctDJ8alXIiIzIo9
    zbhaUh!}qG31Hs|#?0MP8!Ni%@I$jZ8-k^|k;ww5J@*o|xb!I~0{uQYniJ@OX-IY_v
    zuA;e)T^ev_fZQ^Pg=PA7(mQ{@C8W2!_c+VWO+4?U0c`tfkz_zbMqXz}df+Eb;`q0%
    zLpC_Xdv8jB!$=gKXR2d7#K1w^W=3Lz!6@i__KE1p-M8hZhMrkOKUMZO>Kp1in%YxM
    z*|?y{dSaiwj0dsf2#;aQ=II1MBZ!DyNM#91Q*UPIXPBm-v>G9Ta-I_KJP_atm+CA@@;AGQv4*3Vd*W^$*dl%{Lj
    zk9a1K`JQmgP^CjT&RMO7i&s)BH)%=quRSkiJq4IaZmq7yiQ6lFx+}yetwblIv>+me
    zzVXE=4B(c9Q>iR1EH8A!`Fcc+$~$dCIP);LrxKU5&8xi0_jQ>k>U<(V1!>CFU=;&H
    zA1@zwW;XK1+7iYci#1+Gu=j5`@+~`1nZZ$=!(OXOD^Tz}m$AORXVq{BNwL)n#e)nA7ul%Q(~20cnzhZ^L(1rX;pE4E!d&O_6+FW|c!a
    z&CYTFM^hQ{5#0JWIVy5=_oMa-xJ&Q3h3q@K}*{Rid!Wu0<^^m5xoA

    f@#jyzSNehxvTsS^m@;P4Q(r|b zt_;~Uhm=p`LkKavjLp;Ns50LX(?Q%PU7Vcx@6;t$cHRMDdhV+9%rZsfC=pEIhna2$ zS2U~*4Kp+oizaRO%W`(&2f?tMOw~-|w^(Svn`+muI!@$_I1L%&F;I{b1H5ERk6qxQl1qRKZ8{TTIMKvZV&tIb|#))&oZ;>TaPq5O9ye3Y&F zAdr`_ObpWy2D;e?PyP7Q14Kk5g!=i5)YV#>jRzV(wTDZi?z$(R_~7UX>u}8^Grk_y zF(m*YfbH9QC+6a^oQu;&IR*Kq^VuMEu<}6HHonX@zW1nc+XTF1>vd`?^9xGRy(0 z0xhE9^Z0{J(NOv?1QW*+^`rB?Dv)}Ia47#Uj`HmVL>|VaB|@xB1}k)aRP!7t?+L~Z z0gAj562PO@H?-?}gbdwj*Q<(qh-6M$nzAo+6S*?Evp6ekxXMp`;^RYbRY$qjwF+T6 zosHhdd>di-oq@oMA*=;pItGo?os=cqr8j67Fj?=8r3(-Lyo_omxlNF_yb9HN~*m(eU zHMuYV?|VcW+)KyRc|X!Z3hrL!dS5NbufF~0NnIoH=4L5je8f-HR^Qa<;JruvLwcrl z`Lq&0PhHGF7qPHdbkOseNI;Q9Lg9+Bii=CpqN-TK?yM3p#2}N<)e;!}nI)s0gXa-n z9Sx4lDuF+Wt+&uVGPhu|B5}cKuf7^E{7AJ`LF0LoJHzYP`|$}aEj=f~KtH2^ncZ{y zwf5Wn%b>FrlVfC#-Dm7XTJUEM4!)1`ywo_xxdG2E#IY1+?<=8jVw_)q!SUqFR`=vL zF6oYF<~qS!A0-ab5|O;hadC=Z^|){478`^* zurhSI53r8|$RBuu#-I850SO_gF~0hKqy#n=uE zAwx?DOvlYfVxk$N{^X-{_002s=?A*gkzwxU=f#o?0zFaXSkEZV20M$0Awi1r7P@Qj z>?C#_SFonk@4+#D^kk>0P#b1N1Myo(Yn1s3hY14n97Fbt9+eDVp|tO`PtR#|Gw*X* z03!-kVGe+vxp=EbRYK7VA>ZdpKqoteZ&WBkU;+Wm!pS{X-vM zHvV_CzFG$ItHl}=?Q#O>Tv})%;*_kSKVZ$?G=uXOTvZ8hkX-~zdDwPho}9@7iM-dn zlK5LmVBRAzvw;?@8$;ywwB}jorqZGL4HNAd@S^G-TxXk?5)z;B3qYuDgg40gum4kx za7Le8gWu18P*V7#nQ{u&U2`iN|DJ@|ZkV#1QeXwDM$K0Zhh<@)F@>50bgFYf#h^&(t01 za)fW2JqtEdlYE|3DtRBA4JWGN^XJdKLKyY4ihfnGp^Ju03ix;f@wbJSnHt}wy*l&n z1NT3QFFm%x0rq(mWe{@2H3Lx;qb7rhE`)EuNB4cl@@%u3Wd%xtbWwoI&9v9r*>UIZ zH*0k)_rY)|a0Tx#fKWEd;{-g{B5OeMWb+pwhIWxe^85zv;okJDlt=@`ABshLbN})2 zk>`3!TeFVccevGBM2xfREK^+6a{pwuTvLjmy|>MUv+_A7=*r*=;6s=I?PW;Z{iF0R zfIsQIeI4!DKAgR`%m1ggZVVy^yh7H$h9CE@#%Cf~$xZKM`XBx2egQh89{K+&W(rM7 z(Qt`MVZXoq)oH~Im+o%}jKSZNRQp{HU!)dhkra@mF+F@W9ckUF|Glaf{WGwH?jChq z0V3@~jwSpy2PQ5nh-dWc^FUlYdi0^{aZk8`Ks5Inqb@05O%mHJEhQa0U)djvacT(6bh573>0w%=QcUQm+EmJ48~}#Y+K@^ofkV#v=y$WtCtR+$We%mu}(vn&hZ&Bo1id zT-z-fIkOhvmCJx~B3ChpATF+v-$;{i-^xeik~d5fV$xnE`+AM37f}yECs0(fy1p0Y zJ8f3nZ#c_z^#+;3Fha;c4{~tUPIyA4s0&LJJmF-oBcPuaAE+B7G9%VrNcu(Sgnrpj zHAG=dXAcua8xF7&;2|&;H9VM2a#kud-X8y-RSHTM+4OEHtJY#!kp^`(fU#J5|tuqim0t1ze!7Mu+ zwI@GF79cfLwOM_1&r)XOZ|$8r6P;x~D8@7IaPvu+WWiAIW zzxI*qnB-coPSB3^lNeh8mD8&@aRsp=ysR*2Y@fsY zO&?=#q$%0aAngEE>QcUgNd&|yFb4Z@(G1{h;3pfTq_Lk4DBTAupp`bE`ilmO`pD9P zBjZ=<@g&fpkq`b~94WnhR3&aDpBO9nSzm4m<~SFrC%{%~#qBar>MMs=N?0P+m;)MF1sObsO0D!Us| zHUBc^o40u@*^PZ~T<}GVxOr2QVKqpZ%?Wep*6qtnFTOGeTin>#Ivh=SN*a`ZKQpf> zMSQf;6vRl~JGbZw#bA^t9>7H4iThk_*3bS`1c}OOJ~tBZpNKWs|CtA9f1weRC`9V6 zVdd*+CK(Q~UpG=dtE7dy09`oCNDJmAN=xGat!)@fv=i|*jU?GjCEV+Xqj>EMe!acq zE3MYsV7U)+>Rf|gM^9FobaZa)%?TW$**SrrxmB&<%L^-YgbIvxluvbn-YE#vRp?l` zS0HUbw+&HKylL_}*r=91ONB(e_2in04fd$GdVJDO3psqePn{CZ(=8Nq3pO&ePX_aT ze^o@GB*NY9yD)M;2qt2RaT0liQrL;4z?a#scH`GMZhQSj*YO zBtO9GrdCTA+&qUD#su*muG#9tYP>U*k7cYuftw~}IeNoGV9jUnY#5ByxP1?J?x8B} zX~vJoWYeqdxwH#=xC$P3-F@s$M>@_krtXQLOl^3DtK9{I?sB8`Q;WU9f{nbb=unyL zmEFG9KyGI~fYi&|xR8q&S(PUTTmm}_EsDomfm~P1MlxXFJEdn>j)|jvRKBfeU`ypC zc*(63g`X|(K*$_-t@hJjrScADdt2|n?eB&MQn^W9wYm2B&Oj}rtg(;51}e zBt_@B3toFfu9GFo7WBD@&9MXDhD%gdd-Is@phhFQ}2Fz8q8U=kh)S8E+OlS!Z<3=N7<#y zh2!tFiX#xz`QFIHcg`aVtLw{!Rl^cEi|GG8hjtH!oiNGfu!e&B;S;`}aoDSi*AP|ZP0=Zy#R?{$_RC@Hs%C#~ z@oyg{nI|S=Vr39hkb|XszV7;Oh)zCmcb*L9{kaCzvHnmO1g@?O0b;ln|5LJmskEc? zw{QA?pTn`#$bZ+2#P6SUFa4)x{B(aGb>nZNes0f^^6x~my)FOUJe__sPxooPXMZ)N zKke(n@b`5?vzmO))3#q+Ve_Xrl7C8g0MBarb6%!2jmQ7@xl@>d16mmGzWBWVZTS`E zHfR00O8z>wuXB$IS5Gg0cBc64smi(idozFaFEjtYD*C@F`oq`$|Hg`D4B*^fOlS`- z2{#4ifBH66b#hzCngXK=zhZm~__Pt2*e~UWL;Dv~AHAc!zH+*S@;pY{*BY162terc zqSHbjwyLay*MoXuJNn>fwtqRWzpSKP=+(VX<%1`Dw=2(u@e4rD_6u+r?LT^$nbp_w z;voK`b7z}8=R`Vy?8(%;c2=JuzaE@HWt3gaHanl|8%pgoo~HWWmiY9)UE(T#`{uvn z26XYRe?t7%C2!eE<(mc0-oz0XW{TZVZ!EQwkPh5nUI9D=;Otoc2sVGXw5b1v+l%}C zn=gk>%y%kq!~}| z=j&F;e&762l(dZ;zcdz&tjm?OjZ+?Kx9FIcf6yYA4>@ohr_#t@l^NZxg`(O82i)M6 zJ-*rCi-@qXetVKOFYZ;SYU3^cNF_-;4*>Dm;$&XR)O0 z-E^3OZ~D_(r^x%;d49KD-n-vJMcLQIu=|gWoriGiWz;wQXIz@rdo2iIsY_+LQ?!Zs z`~;&TXTL)9chuAB zV&hSMcpr#!K<*hg%PCbLz#tej_tTg$PduYb2=(V%id$?C5fvOYUOhVnm~ioQP+F@| z=g3cXj`ZK8>GuDL?{xng*?0sz)OW)9dM2bhPbo|vncJL7XW`-OS?TW^qzr1}F}U$; zbl##1JtC?60`&a0cUyzw;(ySsUE}cl0z6TeIrRT6M*hAqB)eDHC))JhIM#`)Va?B-1Ovsqfj9%s!x=^7NWue~P3jTJEs`;9 zq!RJw6$15>Ng~?5Za^)NSlO3oa1$^vuI;Oj9_^`CA0DbovAyAL@hr@wrmLFvyw2MMQ^`xLm~U3RpGTee7LN zPXzZVdhAkWx4PCg|OB;Cjiv@!xwxc)ZB3qLBKc3el529^z5KYT)| zZJNpki-tP%!shI_LI^%Btbc4h-T@HSCHTIWwz!k;pJIaLlCsrc^rx>0-7@TvIilUl zf=s`BIIO_?-PE35PXD%ZDws4zi@djX@XGI|`B;X|-3zU470)025Cx1#v0-F ztO?tSQ2np^aFX+8F5MiCv6PE7Dmhx*;Qo1cXvC_uiG-EEu@mV*V=(acL=Qr?OX0_#iwAlb3s=fHmwCSd6TO+kCZxL1PZS0seP?_X!Pt8 zcFKf+Do5_F5?uJp?W!iqXGKg}z4G6WawYJi+_+J0+r|e5I36Yj&smu-9$cQn&8ooVtgdgx*0?7=94} zPdIj?KUQu3P3hvqd#Q0zoX7V@R+EP>QwgSy&0Au)jtNGhC!zF-fj9x4RmK%_sCzUJ|5jfbQ86w#;2NXVQ&{G2w%8GQuCf+!uCN&rG&@=VA<^G@=9hJnhqA_f zPG_~$+@a3a=;$jBEO z`diz$kuVjW@WsT3i!!}gK^Fz8vMr6~8up1N*g48l;K6jk38N7$U6~xI;iyl(a?@Ll zRZUHB*0iw{&a0$&0~JcYGJs_uko%kTO3=LdUCp~y#H_#0sd{c3cxv-QyV&VceMY)w zT~pHK@yaG_A`eC%tKNQDkN2WGI}|L(Pt%;5QxECU-tBW?>VkQZ=h1!o zI7%@Re>>9sIQ)Eu zTD+)Qm&~weFp0rkZOPtYY2Eyjb{jk1^6&Ai`q)=HSDiOr06*K2%*WgNCIZ=9z1%?o z@0GfKXLG{y=|zaj35WD1rJst{9T&L0M}~(_Y3^7ds|D95^BweN>&w{^$@B%H|6YS6 zqX|w!!N!tsv~FXSG^L0u;iCDVSXT4nJK~}1ua`J#uwx^c;*~$q8OCskW@-PETAc&bE%)pR_Xq)|=enhJ^k^ljMVKh%2 zrkd{4r%%uMpZ^n1n7@pMB`iTEf0^qFge5G25(Z^hf= zP=+PwBn-;11f7II8J3`vFet+kbP@(-Sb|Q%pbSgUNf?x22|5XOP}VuTH&U(PG+~Y4r+0SUd^`TeTXEOk+*9|C}|tN-%qo--L8guM_p}=sjBjRaZz4wPI_8uZccW!smkSY(zJ73)8`iY+tAQZ zS67$Q*<5WhmE12Tm6qJEtF3KuySX&i6`ZaJDCP6HSToo`IXpZJA|Et0)mSVQWo1Q$ z1v%MSsrT+~+OTfPqE{CD>%YujP}1M}`ubX1TWr?4;-bQ|lzXWu_ww^{E#_+8C+ztk%gah(ef^C> z29&yp5*OB-3^aoslrUvSM@PNGPRp%W7LgbqYeeKc1tp4`&W7QL2B@m6fcuv%UKo0y z3}8x0ld&>`9hB&}-rin(ZHL{Cvu(H8PMSm1kg!WuAV_t)j7eR6R ze7?rUhN_B+%#8G7j2hOD?Tg+y+%jNIuo3#ii>^QX> z=K&~n@%cI%8tTi-%H}U9g}tywfC!3v^TzeO!s!z~%{VAQ|HkB>|1CL3(mzih&CSlT z*46qtJ7*1)Asak5$`n8;EUSis1_%9qe_wB}N_~Cg$JBy-C)q+$2tYyea=Vm6fy!1J z8R6<=%26@bzP|Q0rMQcW3XdHf>(GqUAyZOO`rp87RKCjE=YHMpnje-);IZiv#x?})?ot+)HCeG$&ZkKX6=1hmz z+p7%>V*8HhX=Ee-@e%_fb3=W7MR{3TYKkaso3(CsK$)YMvaWL$nbN4fVa?ESbc`~2 zP|_qcDp&!IPN&mux7AoI;8T+pm2F~U2Uzo z+QjWr4h7cM)-=>R+-{erz1^6+UT;rNH^mA9l)E-G)ZN|fayre`)%kh3o3v=_<%{Q^ zw327grUZ+U&ZQ*t+*!6Mr#x#U1VO2siGhKxE?xoR$5wEkPqMF=49t)t1v#t*oCDfCBTSsjLBxR zQmZbXPrO||=^=Cgth%DYf@5DDrsiu_L^U@zzaUVKj@hqpd1FI8iGx}8zF|t^1nCp4CX^4d%YfTsYmi8aO3f`qpF45 z(o<889{FN@xC_U^csn?Q`G6g`#NLuQ zWBODHPNJ?s8Vjs^^vFZS%^98rSVI_;pistg^fbvELkg7WO5q;tJV7L>th5A& z1{RbE4w|&HqXUetUcO8(*XZG?X+0TBzRPrsvRAahTj8xONuEfMY2&J%uO}?Jwu?BI744=Z`YWBcPvO= zc6ipcwl4Z`&dY04qH}2#=n#7Q@w?-4bw|t={N{D`3T2ryD@Ge4@B3D=YA> z#FV^p`4Z3vE|fD|IIwrZAZWW*vp&-t^z(lNjsQ0VRH0Vp*VfSZe7#npYg6EGme3#L9Z0?P7c>%zmE z^yrVIe?Ncuf6pGrilqYdjThA<b!*nd;k}+CN`kzxr=w=Rw9R>1Y z8|E4E)TtPuFm=r+8)#og3MZFR+s_Q$`$a?lgr(o;c636jC<^#JY( zgNrKW(9?7H?pY%!<4=5=o1Nvb+x>IIl+RjtIUz1X2b8_NJ-F2s<&Ul!K^Z_c0E^N9 zS^UoJdj6=0#UKovfmgI1;Ke;=W(i0MPhm=&Znq1(Y9V)XPImTJhn3<^ zjE}_ue=?EBXm7|H=~wF=4(OKtHsO~8aMxWuWgJ($as4_aW8KcxQcuC(lWE@1JU7bt zpagl~Z&&P&$$%1`<0Pc`^Qn`@(nQ^Nc)j={Hfvo$ejc`_e)Yn+vrwH-7rrxuiouH8 zz9o8tp6ANtiyn^$4is}!5Q!m?pPM^QGS=bI`Mlh!$_g|-w&{dl4&Q)LeaHUzaYkBd zU2P5a@m$Toc-hCk`_%}wQl>^wqE&_YbVE=V+KHBKYHSQBO$Vi{RVXhj-EJ7df$g|O z&A{mC>F(+Rpw-nTJoHT)*6Dd5NZ<}X;RP4u=ZoTAx_BXZ#!1FH=qDlINrIBM`!46Y zj!3+muh0ENZ)t9RFf=&$BHLs<(e<^yaBNgV>PyX(5ExvA;fS03qzZc~C#^IE$!N?_RaFUUsYbn8@2hAsh-Hvc$VfxJp`rk-YF#PT2MZrr-Dtn;o4~( zlyCg><-I$<@y&E}c;_leIr@b9*26X*>Gzyfe!mOV)rPX(noIvyF7U86nG%+za9pK53Govq zJ%*(l3Hl|dS|aV^d@WRU!}XtyF3znR$rv6u@4wIKZZ`U=F$tc(bT*|iPHDV~v0qxE zh8cZ6A8^r&65kmvF=}VP0sde+HDgzs{s>Fq0%HTDr>4p%QNSACH7g>M_9QkpH{ zFoZ8((h(h85KO&QQI7_-H*Z{z2aO-C2DQh?QYHZbBb&_%;PlL}CiDiFfUm4u0Hd;Z zMP$UH)ypGg!nqifd~)b=I>`p1J{)Ks9+IUIYX76*;lYVSEroj;C?Adq4Gs=Xv}S`# zMi)m#f|4Ibf{dMTPDJcTedm@C1SQ}8_@D$0YFN+Z+?%+|m;qHwo(B(_eA*lcS#2Zx zrPNr=JGX7sjYW&uOj|-QY8+DYzROBWGt<+=gFb)u7knUrqe5gu14$NFkYv2ut2yS< zLndS??TviT0wwsK%-6!Z7-{mqPaIBHk)T>=ehyt65#t^Ng3d|aI1fNc0|O>t^wimh z$`x=rF%bRQaxl0DtQg61(}s1BCHQOBW+!xYfj1xYCZpu~V9c*)PCwN0YH)8@;*|M$ zd7H=LHF>!?_}cf2i}anSNR&W*NR<`kK;K$d3qZLSt8`dX<>S29jDYfoyc>^4f=);z zXmIW#LApFOHW>=TjIV|p;$V2VgZPu#F${)ri6UFb`fhuorZ|m1oJW5laC1fmTOY{aj8&b@sXwXdB zwmBLqCBesJM%U9xz?sL>4lc*H1*Z?nfOWJ`riuhr&2c11mw*j#LuZ(gmh0~B5{CmS zf{<{ijZIiskk46jwFwNhxLp#~#?-rX;k=$_$)ZkwatC+q9YIy=_W^Ta9ZTCZEpzdIl@@$&n`!FOJ991P{O`g2%h%#aW>=?CD7E= zSXEVNyqBIpl_vC^$?%wqbMkOzMmlydsv=0X8<6>wI#Y%YDEWTxO%66FA8U|VGedqRV37f;I62JUilMxaA z*EWAt!0PMk)HZj;w3TgnllCNn+N*ag)2aNk=F}87Jm%sgocf&F(vgD1#SsbRNxsjD zEX;Tsm5qbFUeq*xcWTPLh=pn$BdXc$a)CJrZETgou)tCf3Dd!&*a;T1IWIRSLz}OD z{puBX72cY1U!o(u6?e^4qsC^8{HH~N&OEkx)o-_|Dl4Gwp!!XTbc72x3BXtKK zyFCU+(60CjFk(e{+4tXm6ALw!xCvRRbRaL6ru+oeNBTdHr z^htJRCR8oc?Pm7dn5G!leTP(>a+XEkj0&fr+EjJo$M2sjJh^t|@>@5OJEw=p(I=-_ zoIH$GfbWIb@OApdM~i4r9?_g`6MY~^0_H|pXV@V_VndU>F$~H;kvT*veE6WL#$rBm z`jl}Q?l>uF&u(l?wcBNX|1{$=0TCa_^4R$kSs59ZGH&S%`p?rx(^BqXIbe4N=WjWR z`W_u~RYPi)&@78=-RAfEp&u>q?!a=S?RUlQTp77E0En`g+vSTFa7VD}db+!fBSX`v z0~J_*?X*#e%f1(KeCX0~tX{Lp1S0!paUawvh|CoVou9$u>vlPvAVbD%XaMYe+WyL= zi>WDhU+AM{cWRK))#dZFE7mM7D#D<&S*`WzXFcup^$z8XH#cMI;U>#Z&rW_5^$A6G zkjpaP|MKpyZ(jI8-;d?P>pxx2Qj5YIc00sut*gC$^$K?Fj68IvM8d1jwbPnWf*O>q ztt|_*JA2u~LIe?+f${)vVt!l%ge!u^hpHD|dEc)WpPiFSf(-$!!r}hI8 zK@Cdi=cD)E!{tnf+ezZg#~;2AAi&3={YetRmYmXlPmaz#JU=%5NA?~c8XDC9l@S`* z?+$C0>{7gE|koeSok)l_90MhPmNK{I&R9A1?936z9oQ?!FC`F8*9MwX{fD&UaAucvD zVlgZQ4({B(_1dZx*nGEc-q1%i1_uYw{s)ux#%_=K``XnsKkENL(q62<*VnAf&ddPW z!o(|7Kw?M~np{Grv$ zm%&wd!GPwsTQ@nmGI9wnh~SIj1Qvjj#(U7z6tg+{(19dWDlO!6HWz4HMe3`hF+o>FEd@gsi+S(v1dIVtE1U3s zd+aE{vfFG6)E1@<723L=hWdJJH4Z!;k4*2yeJQEihV`}U9- zG`xEtDQWNS9a}e}NgK2^YjlIW95r8ESR82LDsA4l{{2G-%+=MKHmrN^&;bm=t(!J} z{^`fuLQc2KiD%6L=hITv#;V%3mufGUit;jukent{6)*el!Tlz!hGnHCW!kckFev9n zo(f7x4lg8b$2ORzuCA8m;mpCLeb}1%ru=4eHRrXNIAF$avno`n-P!v4^R(&f4Gr~t zcKLiz6bD|f7f8v0sj`9tnPLnYKKbwi0VSA*=U`Jh1I!8|LcOuuVklEqv{3=7@&3C9 zb;5SJT%uvyT3ceY1Iia9`LsvF$};KrK~rO4zUo)xl$97%LvjlEuwHPjoK7dC%R_@4 zl*Sm)b8Sp8UqMOR_xC>pWsSu`^I&O#11Lu~G)>y%SND zY8$9F3g7@x04RHUdT4$WsDKiT?%Wmw+ll3uot1e|10`6OCFJr$W>iDB8Wkut+_bf| z$^j4J;FFIO(BbmiH*e-L5egSyy zUXOk=QT#eEK=W&u?zwpW>;i31 zUd+Vwv=k^4?R+!&y4708q8k6t-gS62wQT)A#0!SxxkdjbCsEO22r1#K^5IO`%fHYEp6sj~)l&0^#Nun_ZP`seveRr=}FgZEr zWX_!5?7e?8duFa*y)2(&E))uYV+vpm+zD9*+#h7ZP{FdcQCeJxjhF1MTvl2lQ{muD z;PQeDYnbU^3kSFd*4*%f0YETLx|BaYEhQ0$mGwmcEepJhy{c^~U6Z7@ZzX9rx7scM z>W81B1Ej5m2oL}gP)p!rM_U`PcK`|iAHbgjFRYc=Ji?bOZRO|fwYd0kn>WC+d0eh1 z!VO$2n+GitiAstJ0YDq;>w%sFejd0LvFTZTT`kA}TijS*2Tl$TLCHW_Sy2v7o}Zrs z$`AY^(8@r)f!{66&jVD0P*w`m_QJvfU@Cyk0BX!;4TIzUKHhIWEaC$S1MUf0MMNkH zxT>-YxFPtt@DOALq5NrP1|Tj4dAXpORS?R+69F~@2opeCL}&;|z^w!~1YRs4Jq>lW z)WO00+#K)`oDdd*1Xl(6`+-scfBFyCundSY6e=cga5pbb$zIDwcXndOe*jSKP`2B( zQ|Y*@nQFg73GiTp=FK6Aq6kGt#^RaA%DrCowjK1b(wg~itX zBtgF4UjPdAmzU;WzIeXyd~8ZUo)!&`k93WXlK6~rA+L32oFV45 z&xq--79|ULzLj1J?y$?k$fq*OGdsNSFHrvQqU0SaYDCFA;}`SOVw#9YvJt}=I7F!`!$GKcc7$n*ad*^aDi ztiPR`;>=F*ggoM;fHKOe9b-Qm9>``;G8uhITzZ*+(=aLMA5h?{?2}e*XYU8QuP>X*z#_^2e6Vdr^jhPN4|dbVts9WPpJ3rQYTWTAmxl_hZp_@${$#i z)a1&Wm4#UWFu|;$LMAzTgw-%5q6ztJoWVTcJ921ctbyDyc0Fq#hfOWvP>Z?LV)jr0 zhgKxwcf47CDd*radcONeJedl@=V z_7WpU*!AL(F40I2ms!ncR1gJ)t`v{Wc|0Z1SNg?HZ z<_DVSd@Tf(93}wAmkVM^<6c`^m>pYQnp=6j3@TK*{O;S&T>d8mrMzKFoya%SA~LP- z36+Ec_yf#(up8Ii9Mo9m$f1|;hwGkCFlQ!cQ=*}{8UCxK*^Tv$4`%w^c9}h?AK8eG zVz1B+>CX29T>r zAEQY6GS)t-Mkz+OhNkR?4)SEHFN)%0PKjwuO6E{c;wY=0%OG&*<&6Xvi9yJB_ z#px#a=*y*<=9Rhdil+|>Q_V{=@3z+XP&(pUt3w+I-W|k9QcF~8EvBjJ@fe4={BnNn z1B=}5=YCwzQdXJZDPF%^oSzZ&w?__k#q$^ha#uoogKuwZ6le5@aMjmxhVcVaX) zzlc4l9GRw+e>_<1`|}mCu7Dn?Fq!(Harb;7LPfHMIKK;9*qk;9{c#$M>kbH zEMbXZhQan4*q{@SZDDDVr&GcV($JR*Gwx+!jmmT3ZB5Zbq@?NbA<5(%$qd7f)%_{@ z56Y5xUn{c0gL)H>bnqD!o%Oy09Wi`HWm~N;U^z@m_PBrywBy?9ni3+VAC>Dt{*|KF zzP~N@+k$e3oJLk1OADgqrFs5v4V9FV_vB%Kqn?X7B;4~<7(&PPma3OE)c&@rk2Mrw z2JwMI{cO~6K}R0js0TU1LJ?Xh7cEaqNEkvZ&`}-brkRYsl8wDqQ{*tv_2lKk___k) zQAFpDXu&@ORlHl670`QAXuT2ay=aPUQGP^5P(Y)9F+bVa7+;ZPl^uUM$VK1940=lQXQ%rbH%}fizo@O#5C8xm z07*naRCM_M6$so|)y)EGc0t9*PS4jy194w+#Qi?R&(6TXL=EYx8{wsw7;-Ae9)@(& z#P}X5#G4f+8@JZ_lDn`xMzxd-t#2rkp&w6K$_oGL#oX{ew6b} zJkqr|Ck8btXXT$ja0{*Zi4*ysZ-B*vHO2PxtrOrw!eAzu!;}IhrLgB2y0J8e1sR5WXlErDb+^QJHH82lYeLYsl`Z?hG^Jckj*s=y zNJ%|SLA3r10jGI%xPFAyI5$1Ey0W?j9Jc}DUipsO$pPA%aVIQ$b!FxG1gEbpj*w}Z z9(_JL;X+32Z}%^&A*{4L9;jPiS2gQ59i>aEE zDa6APg7Mal^w5g-)wyx{kh=v005sa~2*Lv9Wv!7BbB>T_m7jbyE$UP@?rLp`(}0AT zHUXoiP=>vUIrz@<-V0xU+t-3_tMO?&j&Nh8u9ANo0)M2xhqm;=Ts_hN{gqRVNdO(>)l_g}2Te`t7vJ zt<#5*uG-G#nt^uE2oDW!8+BhBbx$i;jK4ur*h%;MP>}b9tA`?vMtUFdg2N)cj^Z&F z@)8Vj$m5BqV>!4RPf))Wr<+&iJrs|TUo1>*)*}1vKkZzk0cn!9^k#XfyE(9<-n+HR zjozC)Gft=Xr2y_P*XBMEG~E zk1pEpL|)RZ+$Y8>@eDp-BNQkgMbXi?+D6O*V|6h-$5(V=hpz& z<7jU^Z@6}llO`eC5{EqBQ0_-3KW(fEiVHqpnP-u8k3}XWHQEuvJAKlmhJ;2BFQ?Az(*sz95l|cEUSa8M4${)QM1^OFlLl@at-~&#GKM_lwzO6)!7Tu#=9DjcyA1W_r}w#!9aMXG7mdXY0%T z2T0ldoteeiF2ow&x>Aq)G&8_yf?YN3ZbQ?s<|Wy7X$d!i5W0bmI{x;W0FJ>f+RkRM zFb^#kbM?{;3+4b}T|slpig)lkh7<=C0hQ@*i^@y5&|Klt^DJnX@|4G@0=!4|TuSD9 ze_Ng6yzlR-DP;y_OO_}5yC%_*;?BmfthkGD0Y}WwtGJr!1~?si?5G)!G|IqSM!Fm^ zzocq;UCsKAx`nZ-=@k{UpMkTP&SQJM_<&0Zp=XWGYX9>ee?P7FZ%bpOAYRG>e4ryGgO85#9z*%Ft%&NLQVlZZ$Tt%OT2n;sw9kdA@9 z4^{aTo%>a6xWayn@`+!(HE%EcKahMx4Xf_YkN zrbb@@7bz1{=2Fteg4)-$NjX(6TZ>0Ls`&90^ZDk+II zn8zN>of7tLH?F;pOimGnN<)sHmp=%~ElswP?U1tUfiZ3it-oY;fiY;9=%gMO zbS%_EE8I&jF5qZfu%U+);P2Xn$tJD!C^o&~&GJh*Z#dv?rDDZ`%!Ht?I`2Vso>fzs zqa-Yd)c`;_H$Ac)DEG1CO6L39vhVG*Bd{RAGA_TE8)Y}LsU_^8{An>`X?}vwsG^gz z*|hReRy~JW+EU?KUuxgp7+6SCn}c=WRhH?;p5 z2kVQcbbf~4(e$1Zn)de~$q|Odsn-eF zrlnbCiD9SGG3Qb-moa`vA3H!@%%Ffa))2-e6B6y)Si)OXM;LB7XbECZF;kfbxr5r)?=;2TCPVBF`)@%`nMDJbL+17na(K zZ?6vSC8CRx9;Be%rp0tBDPw72Qp9T+resq|DZ_(#3`!QCS=(6VT%Ku$d3+|^=VFAX z4$AF_*F#vS=W&~xYADxZ_~;A8cw3~iPLSJ4Gb2q8D}$<1_r8uyv7oo330#v9Q)(&*kj0@6tF;&N+4ANq* zHkNrV&WV-A;=aDlzlUtLMT@f≥T(HVmab8fZ!eIem=%Y(g-!B_j8?u_^YPf2%dm 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≀2w5Q4j|nv?F(# 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 No$YORyVe5&06PNOKve($ diff --git a/docs/lf5/images/lf5_compactview.gif b/docs/lf5/images/lf5_compactview.gif deleted file mode 100644 index fd84c9219c5cd7588fb7c422aac37d14362e1822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53415 zcmX7vc|6o#)W^TGkF_CtmO%8v2=iJvh_x<_Y>jrvi>i4X`Tc8a9U@#aze*9n@9{xO{ul@eb zVC3xY|2uoUzrX)uZ<)bR`t{5F`1sDo#>UFZFUIWb($doA{QTRujQxGg$9FSt-@aXX zJ2*G@W^QU|e4Mc}ILPSioE#q*A0J;{K0h$271P$X z|LWDN@o}ZbS8rdwT;D4$X5{4Lc5l3R@v{2)SlWx_`D(Z7>czUc*Y)-F^pq4*{Y-oN zxw5jd;^LR#mGhY;l!GTva&pEev#vcMzd7{r$;rv7tQ38m)x&UdN>1)cNqO#*-k+G5 z$gr`=$`bZW>>?7In?sc&BO{+YDgANdh7++dBqW5PqvPk7MI;LN`1n}*)iaco0t5M+ zoN`=UBN@`tH{6PyoSaM@(w&{T83F=WyBuq4>zg-|&CLEYGcz+Vh*vUAGBmtvXlQ6= zhLX4%rK6*R#jeICJjLfX;oZP(pg2Ezl zaY<=}pgR|Ugw)p6H#}=>dfwdf;$>@Fdq-#2tM1p7p5DIxfx)5SkE-R9e;AACLhcJ%$n@z0ZAzyEv{1R%_U`ia-OdJeLpiP#s`?P@#tG@K@TX=%M*OC#kc5n z`GRDbS09`Dps&6}^;w3$vFgZ2e~o+EX@R#a?vw{xIsLQ?we{Qn?+O0Pbqgz4rfUU} zt)jXjoZm@G8)#l5K>-MW-z)&2L?X&I9jKH;hHyk6 g2onTJ2*<>OgT7dQmzS$f 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

    mU(l4R~!u!^7|2Q&IHv&AzR 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 diff --git a/docs/lf5/images/lf5_configure.gif b/docs/lf5/images/lf5_configure.gif deleted file mode 100644 index 5855c265d6bf3dd5233e30fc954a27d484ef6c31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62471 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 diff --git a/docs/lf5/images/lf5_deselectall.gif b/docs/lf5/images/lf5_deselectall.gif deleted file mode 100644 index 943c460b28a7df89ef698b89e8d36df70742d66e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65637 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 MtRW7mS%USycdu^ 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 d`N>d@vXrMx{_mbc91F8??X06W&$K70TG diff --git a/docs/lf5/images/lf5_expandall.gif b/docs/lf5/images/lf5_expandall.gif deleted file mode 100644 index 69f450c48d58825bf43b96b69a869f5c2b65c046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64917 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·?;a@Ed{@3Ua^d4nl;aOK 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
    q(gnF4UHfzI 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

    }S~$4z-_ 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 diff --git a/docs/lf5/images/lf5_logo_small.gif b/docs/lf5/images/lf5_logo_small.gif deleted file mode 100644 index c6fa96d234fbf152bb80c3b0c9e3bce9a3f0ebf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 970 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

    <$mPR5v{Mp%yRl3 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 OMm)0YAQBP@==>k{B!u|@ diff --git a/docs/lf5/images/lf5_ndc_filtering.gif b/docs/lf5/images/lf5_ndc_filtering.gif deleted file mode 100644 index e44fc2f955aba19e163b331a1ac4199e8addc929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42345 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

    q@l>gdRIK#>^xsFUb|;*- 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 F06VK0Qw#tA diff --git a/docs/lf5/images/lf5_openfile.gif b/docs/lf5/images/lf5_openfile.gif deleted file mode 100644 index 4ca07c554d4d759120849d86adb21b6c00cfdf4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51140 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

    Zwy!v@it?y<|tA-AAQe|dhg~?l? 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 diff --git a/docs/lf5/images/lf5_properties.gif b/docs/lf5/images/lf5_properties.gif deleted file mode 100644 index 1758d1f86ad431da93164f98c44d74834a146281..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52169 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 diff --git a/docs/lf5/images/lf5_recorddetail.gif b/docs/lf5/images/lf5_recorddetail.gif deleted file mode 100644 index cd7c942f7800edd2f4a13a30596206bb69ab20cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55142 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 diff --git a/docs/lf5/images/lf5_remove_categories.gif b/docs/lf5/images/lf5_remove_categories.gif deleted file mode 100644 index 0c45926fa3366fc904e3d49330a6d79b5739b0c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66759 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� 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[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 V&UoXFKMr~1l21-~-4_G|06SqN`p5tP diff --git a/docs/lf5/images/lf5_search.gif b/docs/lf5/images/lf5_search.gif deleted file mode 100644 index bd218ab970325072e986cd43df57366f21210886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59820 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 diff --git a/docs/lf5/images/lf5_small.gif b/docs/lf5/images/lf5_small.gif deleted file mode 100644 index 0c6fc10313447f9bc1bb17c50104bad41ef1fb32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19171 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Ƅub(MS~Q}ZV0nIDummuZET#0%L=q(Onr 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

    3>(W~4jEYN<+-dB^&iL&< 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 K5(k3;{r>@Sh?so< diff --git a/docs/lf5/images/small_right_arrow.gif b/docs/lf5/images/small_right_arrow.gif deleted file mode 100644 index deca2b4b865d965932fb12067ac8a49aa4a9e4bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 zcmZ?wbhEHbS2(POes-L56w;O!wY0DE?#tiZd|ifC!LU b1}4Fl{>+7E=f<(DIi#Few*B{f5e91jL;)6B diff --git a/docs/manual.html b/docs/manual.html deleted file mode 100644 index 8da3873f52..0000000000 --- a/docs/manual.html +++ /dev/null @@ -1,1222 +0,0 @@ - - -log4j manual - - - - -

    -

    Short introduction to log4j

    - - Ceki Gülcü -

    - March 2002 -
    -
    - -

    - Copyright © 2000-2002 The Apache Software Foundation. All - rights reserved. This software is published under the terms of - the Apache Software License version 2.0, a copy of which has - been included in the LICENSE file shipped with the log4j - distribution. This document is based on the article "Log4j - delivers control over logging" published in November 2000 - edition of JavaWorld. However, the present article contains more - detailed and up to date information. The present short manual - also borrows some text from "The - complete log4j manual" by the same author (yours - truly). - -

    Abstract

    - -

    This document describes the log4j API, its unique features and -design rationale. Log4j is an open source project based on the work of -many authors. It allows the developer to control which log statements -are output with arbitrary granularity. It is fully configurable at -runtime using external configuration files. Best of all, log4j has a -gentle learning curve. Beware: judging from user feedback, it is also -quite addictive. - -

    Introduction

    - -

    Almost every large application includes its own logging or tracing -API. In conformance with this rule, the E.U. SEMPER project decided to write its -own tracing API. This was in early 1996. After countless enhancements, -several incarnations and much work that API has evolved to become -log4j, a popular logging package for Java. The package is distributed -under the Apache Software License, a -fully-fledged open source license certified by the open source initiative. The -latest log4j version, including full-source code, class files and -documentation can be found at http://logging.apache.org/log4j/. -By the way, log4j has been ported to the C, C++, C#, Perl, Python, -Ruby, and Eiffel languages. - -

    Inserting log statements into code is a low-tech method for -debugging it. It may also be the only way because debuggers are not -always available or applicable. This is usually the case for -multithreaded applications and distributed applications at large. - -

    Experience indicates that logging was an important component of the -development cycle. It offeres several advantages. It provides precise -context about a run of the application. Once inserted into -the code, the generation of logging output requires no human -intervention. Moreover, log output can be saved in persistent medium -to be studied at a later time. In addition to its use in the -development cycle, a sufficiently rich logging package can also be -viewed as an auditing tool. - -

    As Brian W. Kernighan and Rob Pike put it in their truly excellent -book "The Practice of Programming" -

    -  As personal choice, we tend not to use debuggers beyond getting a
    -  stack trace or the value of a variable or two. One reason is that it
    -  is easy to get lost in details of complicated data structures and
    -  control flow; we find stepping through a program less productive
    -  than thinking harder and adding output statements and self-checking
    -  code at critical places. Clicking over statements takes longer than
    -  scanning the output of judiciously-placed displays. It takes less
    -  time to decide where to put print statements than to single-step to
    -  the critical section of code, even assuming we know where that
    -  is. More important, debugging statements stay with the program;
    -  debugging sessions are transient.
    -
    - -

    Logging does have its drawbacks. It can slow down an -application. If too verbose, it can cause scrolling blindness. To -alleviate these concerns, log4j is designed to be reliable, fast and -extensible. Since logging is rarely the main focus of an application, -the log4j API strives to be simple to understand and to use. - -

    Loggers, Appenders and Layouts

    - -

    Log4j has three main components: loggers, -appenders and layouts. These three types of -components work together to enable developers to log messages according -to message type and level, and to control at runtime how these -messages are formatted and where they are reported. - -

    Logger hierarchy

    - -

    The first and foremost advantage of any logging API over plain -System.out.println resides in its ability to disable -certain log statements while allowing others to print unhindered. This -capability assumes that the logging space, that is, the space of all -possible logging statements, is categorized according to some -developer-chosen criteria. This observation had previously led us to -choose category as the central concept of the -package. However, since log4j version 1.2, Logger class -has replaced the Category class. For those familiar with -earlier versions of log4j, the Logger class can be -considered as a mere alias to the Category class. - -

    Loggers are named entities. Logger names are case-sensitive and -they follow the hierarchical naming rule: - -

    - - -
    -
    -
    Named Hierarchy - -

    A logger is said to be an ancestor of another - logger if its name followed by a dot is a prefix of the - descendant logger name. A logger is said to be a - parent of a child logger if there are no - ancestors between itself and the descendant logger. - - -

    -
    - - -

    For example, the logger named "com.foo" is a parent -of the logger named "com.foo.Bar". Similarly, -"java" is a parent of "java.util" and an -ancestor of "java.util.Vector". This naming scheme -should be familiar to most developers. - -

    The root logger resides at the top of the logger hierarchy. It -is exceptional in two ways: - -

      -
    1. it always exists, -
    2. it cannot be retrieved by name. -
    -

    Invoking the class static Logger.getRootLogger -method retrieves it. All other loggers are instantiated and -retrieved with the class static Logger.getLogger -method. This method takes the name of the desired logger as a -parameter. Some of the basic methods in the Logger class are listed -below. - -

    - - -
    -
    -  package org.apache.log4j;
    -
    -  public class Logger {
    -
    -    // Creation & retrieval methods:
    -    public static Logger getRootLogger();
    -    public static Logger getLogger(String name);
    -
    -    // printing methods:
    -    public void trace(Object message);
    -    public void debug(Object message);
    -    public void info(Object message);
    -    public void warn(Object message);
    -    public void error(Object message);
    -    public void fatal(Object message);
    -
    -    // generic printing method:
    -    public void log(Level l, Object message);
    -}
    -
    -
    - -

    Loggers may be assigned levels. The set of possible -levels, that is - -TRACE, -DEBUG, -INFO, -WARN, -ERROR and -FATAL - -are defined in the org.apache.log4j.Level -class. Although we do not encourage you to do so, you may define -your own levels by sub-classing the Level class. A -perhaps better approach will be explained later on. - -

    If a given logger is not assigned a level, then it inherits -one from its closest ancestor with an assigned level. More -formally: - - -

    - - -
    -
    -
    Level Inheritance - -

    The inherited level for a given logger -C, is equal to the first non-null level in the logger -hierarchy, starting at C and proceeding upwards in the -hierarchy towards the root logger. - -

    -
    - -

    To ensure that all loggers can eventually inherit a level, -the root logger always has an assigned level. - -

    Below are four tables with various assigned level values and the -resulting inherited levels according to the above rule. - -

    - - - - - - - - -
    Logger
    name
    Assigned
    level
    Inherited
    level
    root Proot Proot
    X none Proot
    X.Y none Proot
    X.Y.Z none Proot
    Example 1
    - -

    In example 1 above, only the root logger is assigned a -level. This level value, Proot, is inherited by the -other loggers X, X.Y and -X.Y.Z. - - -

    - - - - - - - - -
    Logger
    name
    Assigned
    level
    Inherited
    level
    root Proot Proot
    X Px Px
    X.Y Pxy Pxy
    X.Y.Z Pxyz Pxyz
    Example 2
    - -

    In example 2, all loggers have an assigned level value. There -is no need for level inheritence. - -

    - - - - - - - -
    Logger
    name
    Assigned
    level
    Inherited
    level
    root Proot Proot
    X Px Px
    X.Y none Px
    X.Y.Z Pxyz Pxyz
    Example 3
    - -

    In example 3, the loggers root, X and -X.Y.Z are assigned the levels Proot, -Px and Pxyz respectively. The logger -X.Y inherits its level value from its parent -X. - - - - - - - - - -
    Logger
    name
    Assigned
    level
    Inherited
    level
    root Proot Proot
    X Px Px
    X.Y none Px
    X.Y.Z none Px
    Example 4
    - -

    In example 4, the loggers root and X -and are assigned the levels Proot and Px -respectively. The loggers X.Y and X.Y.Z -inherits their level value from their nearest parent X -having an assigned level.. - - -

    Logging requests are made by invoking one of the printing methods -of a logger instance. These printing methods are - - -debug, - -info, - -warn, -error, -fatal - and log. - - -

    By definition, the printing method determines the level of a -logging request. For example, if c is a logger -instance, then the statement c.info("..") is a logging -request of level INFO. - -

    A logging request is said to be enabled if its level is -higher than or equal to the level of its logger. Otherwise, the -request is said to be disabled. A logger without an -assigned level will inherit one from the hierarchy. This rule is -summarized below. - - -

    - - -
    -
    -
    Basic Selection Rule - -

    A log request of level p in a logger with - (either assigned or inherited, whichever is appropriate) level q, is enabled if p >= - q. -

    -
    - -

    This rule is at the heart of log4j. It assumes that levels are -ordered. For the standard levels, we have DEBUG < INFO -< WARN < ERROR < FATAL. - -

    Here is an example of this rule. - -

    -
    -
    -
    -   // get a logger instance named "com.foo"
    -   Logger  logger = Logger.getLogger("com.foo");
    -
    -   // Now set its level. Normally you do not need to set the
    -   // level of a logger programmatically. This is usually done
    -   // in configuration files.
    -   logger.setLevel(Level.INFO);
    -
    -   Logger barlogger = Logger.getLogger("com.foo.Bar");
    -
    -   // This request is enabled, because WARN >= INFO.
    -   logger.warn("Low fuel level.");
    -
    -   // This request is disabled, because DEBUG < INFO.
    -   logger.debug("Starting search for nearest gas station.");
    -
    -   // The logger instance barlogger, named "com.foo.Bar",
    -   // will inherit its level from the logger named
    -   // "com.foo" Thus, the following request is enabled
    -   // because INFO >= INFO.
    -   barlogger.info("Located nearest gas station.");
    -
    -   // This request is disabled, because DEBUG < INFO.
    -   barlogger.debug("Exiting gas station search");
    -
    -
    - -

    Calling the getLogger method with the same name will -always return a reference to the exact same logger object. - -

    For example, in - - - -
    -
    -   Logger x = Logger.getLogger("wombat");
    -   Logger y = Logger.getLogger("wombat");
    -
    -x and y refer to exactly the same -logger object. - -

    Thus, it is possible to configure a logger and then to retrieve -the same instance somewhere else in the code without passing around -references. In fundamental contradiction to biological parenthood, -where parents always preceed their children, log4j loggers can be -created and configured in any order. In particular, a "parent" -logger will find and link to its descendants even if it is -instantiated after them. - -

    Configuration of the log4j environment is typically done at -application initialization. The preferred way is by reading a -configuration file. This approach will be discussed shortly. - -

    Log4j makes it easy to name loggers by software -component. This can be accomplished by statically instantiating -a logger in each class, with the logger name equal to the fully -qualified name of the class. This is a useful and straightforward -method of defining loggers. As the log output bears the name of the -generating logger, this naming strategy makes it easy to identify -the origin of a log message. However, this is only one possible, -albeit common, strategy for naming loggers. Log4j does not restrict -the possible set of loggers. The developer is free to name the -loggers as desired. - -

    Nevertheless, naming loggers after the class where they are -located seems to be the best strategy known so far. - -

    Appenders and Layouts

    - -

    The ability to selectively enable or disable logging requests based -on their logger is only part of the picture. Log4j allows logging -requests to print to multiple destinations. In log4j speak, an output -destination is called an appender. Currently, appenders exist -for the console, files, GUI -components, remote socket -servers, JMS, - - NT -Event Loggers, and remote UNIX Syslog -daemons. It is also possible to log asynchronously. - -

    More than one appender can be attached to a logger. - -

    The addAppender -method adds an appender to a given logger. - -Each enabled logging -request for a given logger will be forwarded to all the appenders in -that logger as well as the appenders higher in the hierarchy. In -other words, appenders are inherited additively from the logger -hierarchy. For example, if a console appender is added to the root -logger, then all enabled logging requests will at least print on the -console. If in addition a file appender is added to a logger, say -C, then enabled logging requests for C and -C's children will print on a file and on the -console. It is possible to override this default behavior so that -appender accumulation is no longer additive by setting -the additivity flag to false. - -

    The rules governing appender additivity are summarized below. - -

    - - -
    -
    -
    Appender Additivity - -

    The output of a log statement of logger C will - go to all the appenders in C and its ancestors. This is - the meaning of the term "appender additivity". - -

    However, if an ancestor of logger C, say P, - has the additivity flag set to false, then - C's output will be directed to all the appenders in - C and it's ancestors upto and including P but - not the appenders in any of the ancestors of P. - -

    Loggers have their additivity flag set to - true by default. -

    -
    - - -

    The table below shows an example: - -

    - -
    Logger
    Name
    Added
    Appenders
    Additivity
    Flag
    Output Targets Comment - -
    root A1 not applicable A1 - - The root logger is anonymous but can be accessed with the - Logger.getRootLogger() method. There is no default appender - attached to root. - -
    x A-x1, A-x2 true A1, A-x1, A-x2 - Appenders of "x" and root. - -
    x.y none true A1, A-x1, A-x2 - Appenders of "x" and root. - -
    x.y.z A-xyz1 true A1, A-x1, A-x2, A-xyz1 - Appenders in "x.y.z", "x" and root. - -
    security A-sec false - A-sec - - No appender accumulation since the additivity flag is set to - false. - -
    security.access none true A-sec Only - appenders of "security" because the additivity flag in "security" is - set to false. - -
    - - -

    More often than not, users wish to customize not only the output -destination but also the output format. This is accomplished by -associating a layout with an appender. The layout is -responsible for formatting the logging request according to the user's -wishes, whereas an appender takes care of sending the formatted output -to its destination. - -The PatternLayout, part -of the standard log4j distribution, lets the user specify the output -format according to conversion patterns similar to the C language -printf function. - -

    For example, the PatternLayout with the conversion pattern "%r [%t] -%-5p %c - %m%n" will output something akin to: - -

    -176 [main] INFO  org.foo.Bar - Located nearest gas station.
    -
    - -

    The first field is the number of milliseconds elapsed since the -start of the program. The second field is the thread making the log -request. The third field is the level of the log statement. The -fourth field is the name of the logger associated with the log -request. The text after the '-' is the message of the statement. - -

    Just as importantly, log4j will render the content of the log -message according to user specified criteria. For example, if you -frequently need to log Oranges, an object type used in -your current project, then you can register an -OrangeRenderer that will be invoked whenever an orange -needs to be logged. - -

    Object rendering follows the class hierarchy. For example, assuming -oranges are fruits, if you register an FruitRenderer, all -fruits including oranges will be rendered by the -FruitRenderer, unless of course you registered an orange -specific OrangeRenderer. - -

    Object renderers have to implement the -ObjectRenderer -interface. - - -

    Configuration

    - -

    Inserting log requests into the application code requires a fair -amount of planning and effort. Observation shows that approximately 4 -percent of code is dedicated to logging. Consequently, even moderately -sized applications will have thousands of logging statements embedded -within their code. Given their number, it becomes imperative to -manage these log statements without the need to modify them manually. - -

    The log4j environment is fully configurable programmatically. -However, it is far more flexible to configure log4j using -configuration files. Currently, configuration files can be written in -XML or in Java properties (key=value) format. - -

    Let us give a taste of how this is done with the help of an -imaginary application MyApp that uses log4j. - -

    -
    - import com.foo.Bar;
    -
    - // Import log4j classes.
    - import org.apache.log4j.Logger;
    - import org.apache.log4j.BasicConfigurator;
    -
    - public class MyApp {
    -
    -   // Define a static logger variable so that it references the
    -   // Logger instance named "MyApp".
    -   static Logger logger = Logger.getLogger(MyApp.class);
    -
    -   public static void main(String[] args) {
    -
    -     // Set up a simple configuration that logs on the console.
    -     BasicConfigurator.configure();
    -
    -     logger.info("Entering application.");
    -     Bar bar = new Bar();
    -     bar.doIt();
    -     logger.info("Exiting application.");
    -   }
    - }
    -
    -
    - -

    MyApp begins by importing log4j related classes. It -then defines a static logger variable with the name -MyApp which happens to be the fully qualified name of the -class. - -

    MyApp uses the Bar class defined in the -package com.foo. - -

    -
    - package com.foo;
    - import org.apache.log4j.Logger;
    -
    - public class Bar {
    -   static Logger logger = Logger.getLogger(Bar.class);
    -
    -   public void doIt() {
    -     logger.debug("Did it again!");
    -   }
    - }
    -
    -
    - -

    The invocation of the BasicConfigurator.configure -method creates a rather simple log4j setup. This method is hardwired -to add to the root logger a -ConsoleAppender. The output will be formatted using a PatternLayout set -to the pattern "%-4r [%t] %-5p %c %x - %m%n". - -

    Note that by default, the root logger is assigned to -Level.DEBUG. - -

    The output of MyApp is: -

    -0    [main] INFO  MyApp  - Entering application.
    -36   [main] DEBUG com.foo.Bar  - Did it again!
    -51   [main] INFO  MyApp  - Exiting application.
    -
    - -

    The figure below depicts the object diagram of MyApp -after just having called the BasicConfigurator.configure -method. - -

    -

    - -
    - -

    As a side note, let me mention that in log4j child loggers link -only to their existing ancestors. In particular, the logger named -com.foo.Bar is linked directly to the root -logger, thereby circumventing the unused com or -com.foo loggers. This significantly increases -performance and reduces log4j's memory footprint. - - -

    The MyApp class configures log4j by invoking -BasicConfigurator.configure method. Other classes only -need to import the org.apache.log4j.Logger class, -retrieve the loggers they wish to use, and log away. - -

    The previous example always outputs the same log information. -Fortunately, it is easy to modify MyApp so that the log -output can be controlled at run-time. Here is a slightly modified -version. - -

    -
    - import com.foo.Bar;
    -
    - import org.apache.log4j.Logger;
    - import org.apache.log4j.PropertyConfigurator;
    -
    - public class MyApp {
    -
    -   static Logger logger = Logger.getLogger(MyApp.class.getName());
    -
    -   public static void main(String[] args) {
    -
    -
    -     // BasicConfigurator replaced with PropertyConfigurator.
    -     PropertyConfigurator.configure(args[0]);
    -
    -     logger.info("Entering application.");
    -     Bar bar = new Bar();
    -     bar.doIt();
    -     logger.info("Exiting application.");
    -   }
    - }
    -
    -
    - -

    This version of MyApp instructs -PropertyConfigurator to parse a configuration file and -set up logging accordingly. - -

    Here is a sample configuration file that results in exactly same -output as the previous BasicConfigurator based example. - -

    -
    -# Set root logger level to DEBUG and its only appender to A1.
    -log4j.rootLogger=DEBUG, A1
    -
    -# A1 is set to be a ConsoleAppender.
    -log4j.appender.A1=org.apache.log4j.ConsoleAppender
    -
    -# A1 uses PatternLayout.
    -log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    -log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
    -
    -
    - - -

    Suppose we are no longer interested in seeing the output of any -component belonging to the com.foo package. The following -configuration file shows one possible way of achieving this. - -

    -
    -log4j.rootLogger=DEBUG, A1
    -log4j.appender.A1=org.apache.log4j.ConsoleAppender
    -log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    -
    -# Print the date in ISO 8601 format
    -log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
    -
    -# Print only messages of level WARN or above in the package com.foo.
    -log4j.logger.com.foo=WARN
    -
    -
    - -

    The output of MyApp configured with this file is shown below. - -

    -2000-09-07 14:07:41,508 [main] INFO  MyApp - Entering application.
    -2000-09-07 14:07:41,529 [main] INFO  MyApp - Exiting application.
    -
    - -

    As the logger com.foo.Bar does not have an assigned -level, it inherits its level from com.foo, which -was set to WARN in the configuration file. The log statement from the -Bar.doIt method has the level DEBUG, lower than the -logger level WARN. Consequently, doIt() method's log -request is suppressed. - -

    Here is another configuration file that uses multiple appenders. - -

    -
    -log4j.rootLogger=debug, stdout, R
    -
    -log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    -
    -# Pattern to output the caller's file name and line number.
    -log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
    -
    -log4j.appender.R=org.apache.log4j.RollingFileAppender
    -log4j.appender.R.File=example.log
    -
    -log4j.appender.R.MaxFileSize=100KB
    -# Keep one backup file
    -log4j.appender.R.MaxBackupIndex=1
    -
    -log4j.appender.R.layout=org.apache.log4j.PatternLayout
    -log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
    -
    -
    - -

    Calling the enhanced MyApp with the this configuration file will -output the following on the console. - -

    - INFO [main] (MyApp2.java:12) - Entering application.
    -DEBUG [main] (Bar.java:8) - Doing it again!
    - INFO [main] (MyApp2.java:15) - Exiting application.
    -
    - -

    In addition, as the root logger has been allocated a second -appender, output will also be directed to the example.log -file. This file will be rolled over when it reaches 100KB. When -roll-over occurs, the old version of example.log is -automatically moved to example.log.1. - -

    Note that to obtain these different logging behaviors we did not -need to recompile code. We could just as easily have logged to a UNIX -Syslog daemon, redirected all com.foo output to an NT -Event logger, or forwarded logging events to a remote log4j server, -which would log according to local server policy, for example by -forwarding the log event to a second log4j server. - -

    Default Initialization Procedure

    - -

    The log4j library does not make any assumptions about its -environment. In particular, there are no default log4j -appenders. Under certain well-defined circumstances however, the -static inializer of the Logger class will attempt to -automatically configure log4j. The Java language guarantees that the -static initializer of a class is called once and only once during the -loading of a class into memory. It is important to remember that -different classloaders may load distinct copies of the same -class. These copies of the same class are considered as totally -unrelated by the JVM. - -

    The default initialization is very useful in environments where the -exact entry point to the application depends on the runtime -environment. For example, the same application can be used as a -stand-alone application, as an applet, or as a servlet under the -control of a web-server. - -

    The exact default initialization algorithm is defined as follows: - -

      - -
    1. Setting the log4j.defaultInitOverride system property to - any other value then "false" will cause log4j to skip the default - initialization procedure (this procedure). - -

    2. Set the resource string variable to the value of - the log4j.configuration system property. The preferred - way to specify the default initialization file is through the - log4j.configuration system property. In case the system - property log4j.configuration is not defined, then set the - string variable resource to its default value - "log4j.properties". - -

    3. Attempt to convert the resource variable to a - URL. - -

    4. If the resource variable cannot be converted to a URL, for - example due to a MalformedURLException, then search for - the resource from the classpath by calling - org.apache.log4j.helpers.Loader.getResource(resource, - Logger.class) which returns a URL. Note that the string - "log4j.properties" constitutes a malformed URL. - -

      See Loader.getResource(java.lang.String) - for the list of searched locations. - -

    5. If no URL could not be found, abort default - initialization. Otherwise, configure log4j from the URL. - -

      The PropertyConfigurator - will be used to parse the URL to configure log4j unless the URL ends - with the ".xml" extension, in which case the DOMConfigurator - will be used. You can optionaly specify a custom configurator. The - value of the log4j.configuratorClass system property is taken - as the fully qualified class name of your custom configurator. The - custom configurator you specify must implement the Configurator - interface. - -

    - -

    Example Configurations

    - - - -

    Default Initialization under Tomcat

    - -

    The default log4j initialization is particularly useful in -web-server environments. Under Tomcat 3.x and 4.x, you should place -the log4j.properties under the -WEB-INF/classes directory of your web-applications. Log4j -will find the properties file and initialize itself. This is easy to -do and it works. - -

    You can also choose to set the system property -log4j.configuration before starting Tomcat. For Tomcat 3.x The -TOMCAT_OPTS environment variable is used to set command -line options. For Tomcat 4.0, set the CATALINA_OPTS -environment variable instead of TOMCAT_OPTS. - -

    Example 1 - -

    The Unix shell command -

    -   export TOMCAT_OPTS="-Dlog4j.configuration=foobar.txt"
    -
    - -tells log4j to use the file foobar.txt as the default -configuration file. This file should be place under the -WEB-INF/classes directory of your web-application. The -file will be read using the PropertyConfigurator. Each -web-application will use a different default configuration file because -each file is relative to a web-application. - - -

    Example 2 - -

    The Unix shell command -

    -   export TOMCAT_OPTS="-Dlog4j.debug -Dlog4j.configuration=foobar.xml"
    -
    - -tells log4j to output log4j-internal debugging information and to use -the file foobar.xml as the default configuration -file. This file should be place under the WEB-INF/classes -directory of your web-application. Since the file ends with a -.xml extension, it will read using the DOMConfigurator. Each -web-application will use a different default configuration file because -each file is relative to a web-application. - -

    Example 3 - -

    The Windows shell command -

    -   set TOMCAT_OPTS=-Dlog4j.configuration=foobar.lcf -Dlog4j.configuratorClass=com.foo.BarConfigurator
    -
    - -tells log4j to use the file foobar.lcf as the default -configuration file. This file should be place under the -WEB-INF/classes directory of your web-application. Due to -the definition of the log4j.configuratorClass system property, -the file will be read using the com.foo.BarConfigurator -custom configurator. Each web-application will use a different -default configuration file because each file is relative to a -web-application. - -

    Example 4 - -

    The Windows shell command -

    -   set TOMCAT_OPTS=-Dlog4j.configuration=file:/c:/foobar.lcf
    - -tells log4j to use the file c:\foobar.lcf as the default -configuration file. The configuration file is fully specified by the -URL file:/c:/foobar.lcf. Thus, the same configuration -file will be used for all web-applications. - - -

    Different web-applications will load the log4j classes through -their respective classloaderss. Thus, each image of the log4j -environment will act independetly and without any mutual -synchronization. For example, FileAppenders defined -exactly the same way in multiple web-application configurations will -all attempt to write the same file. The results are likely to be less -than satisfactory. You must make sure that log4j configurations of -different web-applications do not use the same underlying system -resource. - - -

    Initialization servlet - -

    It is also possible to use a special servlet for log4j -initialization. Here is an example, - -

    -
    -package com.foo;
    -
    -import org.apache.log4j.PropertyConfigurator;
    -import javax.servlet.http.HttpServlet;
    -import javax.servlet.http.HttpServletRequest;
    -import javax.servlet.http.HttpServletResponse;
    -import java.io.PrintWriter;
    -import java.io.IOException;
    -
    -public class Log4jInit extends HttpServlet {
    -
    -  public
    -  void init() {
    -    String prefix =  getServletContext().getRealPath("/");
    -    String file = getInitParameter("log4j-init-file");
    -    // if the log4j-init-file is not set, then no point in trying
    -    if(file != null) {
    -      PropertyConfigurator.configure(prefix+file);
    -    }
    -  }
    -
    -  public
    -  void doGet(HttpServletRequest req, HttpServletResponse res) {
    -  }
    -}
    -
    -
    - -

    Define the following servlet in the web.xml file for your web-application. - -

    -
    -  <servlet>
    -    <servlet-name>log4j-init</servlet-name>
    -    <servlet-class>com.foo.Log4jInit</servlet-class>
    -
    -    <init-param>
    -      <param-name>log4j-init-file</param-name>
    -      <param-value>WEB-INF/classes/log4j.lcf</param-value>
    -    </init-param>
    -
    -    <load-on-startup>1</load-on-startup>
    -  </servlet>
    -
    -
    - -

    Writing an initialization servlet is the most flexible way for -initializing log4j. There are no constraints on the code you can place -in the init() method of the servlet. - - - -

    Nested Diagnostic Contexts

    - -

    Most real-world systems have to deal with multiple clients -simultaneously. In a typical multithreaded implementation of such a -system, different threads will handle different clients. Logging is -especially well suited to trace and debug complex distributed -applications. A common approach to differentiate the logging output of -one client from another is to instantiate a new separate logger for -each client. This promotes the proliferation of loggers and -increases the management overhead of logging. - -

    A lighter technique is to uniquely stamp each log request initiated -from the same client interaction. Neil Harrison described this method -in the book "Patterns for Logging Diagnostic Messages," in Pattern -Languages of Program Design 3, edited by R. Martin, D. Riehle, -and F. Buschmann (Addison-Wesley, 1997). - - - -

    To uniquely stamp each request, the -user pushes contextual information into the NDC, the abbreviation of -Nested Diagnostic Context. The NDC class is shown below. - -

    -  public class NDC {
    -    // Used when printing the diagnostic
    -    public static String get();
    -
    -    // Remove the top of the context from the NDC.
    -    public static String pop();
    -
    -    // Add diagnostic context for the current thread.
    -    public static void push(String message);
    -
    -    // Remove the diagnostic context for this thread.
    -    public static void remove();
    -  }
    -
    - -

    The NDC is managed per thread as a stack of contextual -information. Note that all methods of the org.apache.log4j.NDC -class are static. Assuming that NDC printing is turned on, every time -a log request is made, the appropriate log4j component will include -the entire NDC stack for the current thread in the log -output. This is done without the intervention of the user, who is -responsible only for placing the correct information in the NDC by -using the push and pop methods at a few -well-defined points in the code. In contrast, the per-client logger -approach commands extensive changes in the code. - -

    To illustrate this point, let us take the example of a servlet -delivering content to numerous clients. The servlet can build the NDC -at the very beginning of the request before executing other code. The -contextual information can be the client's host name and other -information inherent to the request, typically information contained -in cookies. Hence, even if the servlet is serving multiple clients -simultaneously, the logs initiated by the same code, i.e. belonging to -the same logger, can still be distinguished because each client -request will have a different NDC stack. Contrast this with the -complexity of passing a freshly instantiated logger to all code -exercised during the client's request. - -

    Nevertheless, some sophisticated applications, such as virtual -hosting web servers, must log differently depending on the virtual -host context and also depending on the software component issuing the -request. Recent log4j releases support multiple hierarchy trees. This -enhancement allows each virtual host to possess its own copy of the -logger hierarchy. - - -

    Performance

    - -

    One of the often-cited arguments against logging is its -computational cost. This is a legitimate concern as even moderately -sized applications can generate thousands of log requests. Much -effort was spent measuring and tweaking logging performance. Log4j -claims to be fast and flexible: speed first, flexibility second. - -

    The user should be aware of the following performance issues. - -

      -
    1. Logging performance when logging is turned off. - -

      When logging is turned - off entirely or just for a set - of levels, the cost of a log request consists of a method - invocation plus an integer comparison. On a 233 MHz Pentium II - machine this cost is typically in the 5 to 50 nanosecond range. - -

      However, The method invocation involves the "hidden" cost of - parameter construction. - -

      For example, for some logger cat, writing, -

      -     logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
      -    
      - - incurs the cost of constructing the message parameter, i.e. - converting both integer i and entry[i] - to a String, and concatenating intermediate strings, - regardless of whether the message will be logged or not. - - This cost of parameter construction can be quite high and it - depends on the size of the parameters involved. - - -

      To avoid the parameter construction cost write: -

      -      if(logger.isDebugEnabled() {
      -        logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
      -      }
      -   
      - -

      This will not incur the cost of parameter - construction if debugging is disabled. On the other hand, if - the logger is debug-enabled, it will incur twice the cost of - evaluating whether the logger is enabled or not: once - in debugEnabled and once in - debug. This is an insignificant - overhead because evaluating a logger takes about 1% - of the time it takes to actually log. - -

      In log4j, logging requests are made to instances of the Logger - class. Logger is a class and not an interface. This measurably - reduces the cost of method invocation at the cost of some - flexibility. - - -

      Certain users resort to preprocessing or compile-time - techniques to compile out all log statements. This leads to perfect - performance efficiency with respect to logging. However, since the - resulting application binary does not contain any log statements, - logging cannot be turned on for that binary. In my opinion this is - a disproportionate price to pay in exchange for a small performance - gain. - - -

    2. The performance of deciding whether to log or not to log when - logging is turned on. -

      - -

      This is essentially the performance of walking the logger - hierarchy. When logging is turned on, log4j still needs to compare - the level of the log request with the level of the request - logger. However, loggers may not have an assigned - level; they can inherit them from the logger hierarchy. Thus, - before inheriting a level, the logger may need to search its - ancestors. - -

      There has been a serious effort to make this hierarchy walk to -be as fast as possible. For example, child loggers link only to -their existing ancestors. In the BasicConfigurator -example shown earlier, the logger named com.foo.Bar is -linked directly to the root logger, thereby circumventing the -nonexistent com or com.foo loggers. This -significantly improves the speed of the walk, especially in "sparse" -hierarchies. - -

      The typical cost of walking the hierarchy is typically 3 - times slower than when logging is turned off entirely. - -

    3. Actually outputting log messages - -

      This is the cost of formatting the log output and sending it to - its target destination. Here again, a serious effort was made to - make layouts (formatters) perform as quickly as possible. The same - is true for appenders. The typical cost of actually logging is - about 100 to 300 microseconds. - - See org.apache.log4.performance.Logging - for actual figures. - -

    - -

    Although log4j has many features, its first design goal was speed. -Some log4j components have been rewritten many times to improve -performance. Nevertheless, contributors frequently come up with new -optimizations. You should be pleased to know that when configured with -the SimpleLayout -performance tests have shown log4j to log as quickly as -System.out.println. - -

    Conclusions

    - -

    Log4j is a popular logging package written in Java. One of its -distinctive features is the notion of inheritance in loggers. Using -a logger hierarchy it is possible to control which log statements -are output at arbitrary granularity. This helps reduce the volume of -logged output and minimize the cost of logging. - -

    One of the advantages of the log4j API is its manageability. Once -the log statements have been inserted into the code, they can be -controlled with configuration files. They can be selectively enabled -or disabled, and sent to different and multiple output targets in -user-chosen formats. The log4j package is designed so that log -statements can remain in shipped code without incurring a heavy -performance cost. - -

    Acknowledgments

    - -Many thanks to N. Asokan for reviewing the article. He is also one of -the originators of the logger concept. I am indebted to Nelson Minar -for encouraging me to write this article. He has also made many useful -suggestions and corrections to this article. Log4j is the result of a -collective effort. My special thanks go to all the authors who have -contributed to the project. Without exception, the best features in -the package have all originated in the user community. - - diff --git a/docs/od.gif b/docs/od.gif deleted file mode 100644 index 3f2326c84d5d60c25c8795185cc8a9433a1d8549..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5741 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 diff --git a/docs/overview.html b/docs/overview.html deleted file mode 100644 index 1dbe3ee17e..0000000000 --- a/docs/overview.html +++ /dev/null @@ -1,12 +0,0 @@ - - - -Short log4j introduction - - - -

    Make sure to read the user manual -in addition to this javadoc documentation. -

    - - diff --git a/examples/xml/org/apache/log4j/xml/examples/ReportParserError.java b/examples/xml/org/apache/log4j/xml/examples/ReportParserError.java new file mode 100644 index 0000000000..007d4cbd77 --- /dev/null +++ b/examples/xml/org/apache/log4j/xml/examples/ReportParserError.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.xml.examples; + +import org.apache.log4j.helpers.LogLog; + +/** + + This class is needed for validating a log4j.dtd derived XML file. + + @author Joe Kesselman + + @since 0.8.3 + + */ +public class ReportParserError implements org.xml.sax.ErrorHandler { + + void report(String msg, org.xml.sax.SAXParseException e) { + LogLog.error(msg+e.getMessage()+ "\n\tat line="+ e.getLineNumber()+ + " col="+e.getColumnNumber()+ " of "+ + "SystemId=\""+e.getSystemId()+ + "\" PublicID = \""+e.getPublicId()+'\"'); + } + + public void warning(org.xml.sax.SAXParseException e) { + report("WARNING: ", e); + } + + public void error(org.xml.sax.SAXParseException e) { + report("ERROR: ", e); + } + + public void fatalError(org.xml.sax.SAXParseException e) { + report("FATAL: ", e); + } +} diff --git a/examples/xml/org/apache/log4j/xml/examples/XMLSample.java b/examples/xml/org/apache/log4j/xml/examples/XMLSample.java new file mode 100644 index 0000000000..8ea09f2844 --- /dev/null +++ b/examples/xml/org/apache/log4j/xml/examples/XMLSample.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.xml.examples; + +import org.apache.log4j.xml.DOMConfigurator; +import org.apache.log4j.Logger; + +/** + + This example code shows how to + read an XML based configuration file using a DOM parser. + +

    Sample XML files sample1.xml + and sample2.xml are provided. + + +

    Note that the log4j.dtd is not in the local directory. + It is found by the class loader. + + @author Ceki Gülcü + +*/ +public class XMLSample { + + static Logger cat = Logger.getLogger(XMLSample.class); + + public + static + void main(String argv[]) { + + if(argv.length == 1) + init(argv[0]); + else + Usage("Wrong number of arguments."); + sample(); + } + + static + void Usage(String msg) { + System.err.println(msg); + System.err.println( "Usage: java " + XMLSample.class.getName() + + "configFile"); + System.exit(1); + } + + static + void init(String configFile) { + DOMConfigurator.configure(configFile); + } + + static + void sample() { + int i = -1; + cat.debug("Message " + ++i); + cat.warn ("Message " + ++i); + cat.error("Message " + ++i); + Exception e = new Exception("Just testing"); + cat.debug("Message " + ++i, e); + } +} diff --git a/examples/xml/org/apache/log4j/xml/examples/extension1.xml b/examples/xml/org/apache/log4j/xml/examples/extension1.xml new file mode 100644 index 0000000000..af78d1ea2b --- /dev/null +++ b/examples/xml/org/apache/log4j/xml/examples/extension1.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/xml/org/apache/log4j/xml/examples/extension2.xml b/examples/xml/org/apache/log4j/xml/examples/extension2.xml new file mode 100644 index 0000000000..b4b3518ce9 --- /dev/null +++ b/examples/xml/org/apache/log4j/xml/examples/extension2.xml @@ -0,0 +1,35 @@ + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/xml/org/apache/log4j/xml/examples/package.html b/examples/xml/org/apache/log4j/xml/examples/package.html new file mode 100644 index 0000000000..db195a1bb2 --- /dev/null +++ b/examples/xml/org/apache/log4j/xml/examples/package.html @@ -0,0 +1,26 @@ + + + + + + +

    Example usage of log4j with XML (including source code). + +

    This package's shows how log4j can be used with an XML +configuration file. + +

    See source code of XMLSample.java showing how to +configure with an XML file. Sample XML files +sample1.xml, +sample2.xml, +sample3.xml, +sample4.xml, +sample5.xml are provided. + +


    +
    + +Last modified: Wed Apr 12 22:27:25 MDT 2000 + + diff --git a/examples/xml/org/apache/log4j/xml/examples/sample1.xml b/examples/xml/org/apache/log4j/xml/examples/sample1.xml new file mode 100644 index 0000000000..d13ca9e671 --- /dev/null +++ b/examples/xml/org/apache/log4j/xml/examples/sample1.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/xml/org/apache/log4j/xml/examples/sample2.xml b/examples/xml/org/apache/log4j/xml/examples/sample2.xml new file mode 100644 index 0000000000..ad48640393 --- /dev/null +++ b/examples/xml/org/apache/log4j/xml/examples/sample2.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/xml/org/apache/log4j/xml/examples/sample3.xml b/examples/xml/org/apache/log4j/xml/examples/sample3.xml new file mode 100644 index 0000000000..ad85ab7ab4 --- /dev/null +++ b/examples/xml/org/apache/log4j/xml/examples/sample3.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/xml/org/apache/log4j/xml/examples/sample4.xml b/examples/xml/org/apache/log4j/xml/examples/sample4.xml new file mode 100644 index 0000000000..b957ff1953 --- /dev/null +++ b/examples/xml/org/apache/log4j/xml/examples/sample4.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/xml/org/apache/log4j/xml/examples/sample5.xml b/examples/xml/org/apache/log4j/xml/examples/sample5.xml new file mode 100644 index 0000000000..cc16200851 --- /dev/null +++ b/examples/xml/org/apache/log4j/xml/examples/sample5.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packaging/.functions b/packaging/.functions deleted file mode 100644 index fe8eff28f0..0000000000 --- a/packaging/.functions +++ /dev/null @@ -1,40 +0,0 @@ -# +=============================================+ -# Strip the filename, retain the directory only.| -# +=============================================+ -function getShellScriptDirectory { - local dir - - dir=${0%/*} - - if [ "$dir" = "." ] - then - dir=$(pwd) - elif [ "${dir#/}" = "$dir" ] # dir does not start with a / - then - dir=$(pwd)/$dir - fi - echo $dir -} -# ============================================== -# Delete the file if exists -# ============================================== -function deleteFile { - if [ -e $1 ]; then - echo "Deleting file [$1]." - rm $1 - fi -} -# ============================================== -# Change extension of file if it exists -# ============================================== -function changeFileExtension { - filename=$1 - ext=$2 - #echo "File mame =$1, ext=$2" - if [ -e $filename ]; then - noext=${filename%.*} - echo "Renaming [$filename] to [$noext.$ext]." - mv $filename $noext.$ext - fi -} -# ============================================== diff --git a/packaging/install b/packaging/install deleted file mode 100644 index 41d1ae82f5..0000000000 --- a/packaging/install +++ /dev/null @@ -1,189 +0,0 @@ -#!/bin/bash - -# Usage: install [-j] [-h] -# -j: jar files only -# -h: do not update the history file - -# +=============================================+ -# Strip the filename, retain the directory only.| -# +=============================================+ -function getShellScriptDirectory { - local dir - - dir=${0%/*} - - if [ "$dir" = "." ] - then - dir=$(pwd) - elif [ "${dir#/}" = "$dir" ] # dir does not start with a / - then - dir=$(pwd)/$dir - fi - echo $dir -} -# ================================================== - -WWW_TARGET=~/ASF/dump -DISTRIB_TARGET=~/sf/temp -JAR_FULL=log4j.jar -JAR_CORE=log4j-core.jar - - -if [ -z "$ANT" ] -then - ANT=ant -fi - - -while getopts ":jh" opt; do - - case $opt in - j ) JAR_ONLY=true - ;; - h ) NO_HISTORY=true - ;; - \? ) echo "Usage: install [-j] [-h]" - echo " -j: jar files only" - echo " -h: do not update the history file" - exit; - esac -done - -# ================================================================= -function cleanUp { - echo "" -} -# ================================================================= - -pushd $PWD > /dev/null - -scriptDir=$(getShellScriptDirectory) -echo "Script directry is determined to be [$scriptDir]" - -echo "Sourcing ${scriptDir}/.functions" -. ${scriptDir}/.functions - -echo "Setting current dir to [${scriptDir}/..]" -cd ${scriptDir}/.. -PKG_DIR=$PWD - -# ${PKG_DIR##*/} returns the package name -PKG_NAME=${PKG_DIR##*/} - -# Package name is [$PKG_NAME] - -TGZ_FILE=${PKG_NAME}.tgz -ZIP_FILE=${PKG_NAME}.zip - -echo "Deleting \"core\" files." -find . -type f -name core -exec rm {} \; - -deleteFile $PKG_DIR/org/apache/log4j/performance/test -deleteFile $PKG_DIR/org/apache/log4j/test/temp -deleteFile $PKG_DIR/org/apache/log4j/test/temp.A1 -deleteFile $PKG_DIR/org/apache/log4j/test/temp.A2 -deleteFile $PKG_DIR/org/apache/log4j/test/temp.x -deleteFile $PKG_DIR/org/apache/log4j/test/temp.1 -deleteFile $PKG_DIR/org/apache/log4j/test/temp.2 -deleteFile $PKG_DIR/org/apache/log4j/test/temp.3 -deleteFile $PKG_DIR/org/apache/log4j/test/logging.lcf -deleteFile $PKG_DIR/org/apache/log4j/test/logging.cat -deleteFile $PKG_DIR/org/apache/log4j/test/current.reg -deleteFile $PKG_DIR/org/apache/log4j/test/current.reg.A1 -deleteFile $PKG_DIR/org/apache/log4j/test/current.reg.A2 -deleteFile $PKG_DIR/org/apache/log4j/test/log4j.properties -deleteFile $PKG_DIR/org/apache/log4j/test/socket.lcf -deleteFile $PKG_DIR/org/apache/log4j/test/file -deleteFile $PKG_DIR/org/apache/log4j/test/output.A1 - -deleteFile $PKG_DIR/org/apache/log4j/examples/test -deleteFile $PKG_DIR/org/apache/log4j/xml/test/output.A1 -deleteFile $PKG_DIR/org/apache/log4j/xml/test/output.A2 -deleteFile $PKG_DIR/org/apache/log4j/xml/test/temp.A1 -deleteFile $PKG_DIR/org/apache/log4j/xml/test/temp.A2 -deleteFile $PKG_DIR/org/apache/log4j/xml/test/current.reg -deleteFile $PKG_DIR/org/apache/log4j/nt/EventLogCategories.dbg -deleteFile $PKG_DIR/org/apache/log4j/nt/EventLogCategories.h -deleteFile $PKG_DIR/org/apache/log4j/nt/EventLogCategories.rc -deleteFile $PKG_DIR/org/apache/log4j/nt/EventLogCategories.RES -deleteFile $PKG_DIR/org/apache/log4j/nt/MSG00001.bin -deleteFile $PKG_DIR/org/apache/log4j/nt/NTEventLogAppender.lib -deleteFile $PKG_DIR/org/apache/log4j/nt/NTEventLogAppender.exp -deleteFile $PKG_DIR/org/apache/log4j/nt/vc50.idb -deleteFile $PKG_DIR/org/apache/log4j/net/test/loop.log -deleteFile $PKG_DIR/org/apache/log4j/net/test/loop.log.1 -deleteFile $PKG_DIR/classes/org/apache/log4j/UnitTestCategory.class -deleteFile $PKG_DIR/org/apache/log4j/varia/test/temp -deleteFile $PKG_DIR/org/apache/log4j/xml/test/temp - -echo "Cleaning \"classes\" directory." -find . -type d -path "./classes/exercise" -exec rm -r {} \; -find . -type d -path "./classes/make" -exec rm -r {} \; - -echo -n "Build stamp: " -date -u +"%Y-%m-%d %T %Z" - -echo "About to run ANT. Current directory is [$PWD]" -$ANT jar - -if [ "$?" != "0" ]; then - echo "jar failed! Exiting."; popd; exit 1 -fi - -if [ -n "$JAR_ONLY" ]; then - cleanUp - exit -fi - - - -# Run tramake -$scriptDir/tarmake - -if [ "$?" != "0" ]; then - echo "There was an error while running \"$scriptDir/tarmake\". Exiting." - exit 1 -fi - -if [ ! -s ../$TGZ_FILE ] -then - echo "../$TGZ_FILE does not exists in $PWD/.." - exit 1 -fi - - -echo "Moving $TGZ_FILE to $WWW_TARGET/" -mv ../$TGZ_FILE $WWW_TARGET/ -if [ "$?" != "0" ]; then - echo "There was an error moving ../$TGZ_FILE to $WWW_TARGET/" - exit 1 -fi - -echo "About to do ZIP processing in [$DISTRIB_TARGET]" - -# Clean up old copy of package in $DISTRIB_TARGET -cd $DISTRIB_TARGET -if [ -d $DISTRIB_TARGET/$PKG_NAME ]; then - echo; echo "Removing directory $DISTRIB_TARGET/$PKG_NAME" - rm -r $DISTRIB_TARGET/$PKG_NAME - if [ "$?" != "0" ]; then - echo "Could not remove $DISTRIB_TARGET/$PKG_NAME. Exiting."; exit 1 - fi -fi - -echo; echo "Untarring $WWW_TARGET/$TGZ_FILE in $PWD" -tar xzf $WWW_TARGET/$TGZ_FILE - -cd $DISTRIB_TARGET -echo; -if [ -e $WWW_TARGET/$ZIP_FILE ]; then - echo "Removing stale $WWW_TARGET/$ZIP_FILE" - rm $WWW_TARGET/$ZIP_FILE -fi -echo "Zipping $PKG_NAME in $DISTRIB_TARGET to $WWW_TARGET/$ZIP_FILE" -zip -y -9 -q -r $WWW_TARGET/$ZIP_FILE $PKG_NAME -if [ "$?" != "0" ]; then - echo "There was an error while zipping. Exiting."; exit 1 -fi - -cleanUp diff --git a/packaging/package-list b/packaging/package-list deleted file mode 100644 index 407d0d79a5..0000000000 --- a/packaging/package-list +++ /dev/null @@ -1,59 +0,0 @@ -java.applet -java.awt -java.awt.color -java.awt.datatransfer -java.awt.dnd -java.awt.event -java.awt.font -java.awt.geom -java.awt.im -java.awt.image -java.awt.image.renderable -java.awt.print -java.beans -java.beans.beancontext -java.io -java.lang -java.lang.ref -java.lang.reflect -java.math -java.net -java.rmi -java.rmi.activation -java.rmi.dgc -java.rmi.registry -java.rmi.server -java.security -java.security.acl -java.security.cert -java.security.interfaces -java.security.spec -java.sql -java.text -java.util -java.util.jar -java.util.zip -javax.accessibility -javax.swing -javax.swing.border -javax.swing.colorchooser -javax.swing.event -javax.swing.filechooser -javax.swing.plaf -javax.swing.plaf.basic -javax.swing.plaf.metal -javax.swing.plaf.multi -javax.swing.table -javax.swing.text -javax.swing.text.html -javax.swing.text.html.parser -javax.swing.text.rtf -javax.swing.tree -javax.swing.undo -org.omg.CORBA -org.omg.CORBA.DynAnyPackage -org.omg.CORBA.ORBPackage -org.omg.CORBA.portable -org.omg.CORBA.TypeCodePackage -org.omg.CosNaming -org.omg.CosNaming.NamingContextPackage diff --git a/packaging/tarmake b/packaging/tarmake deleted file mode 100644 index 39e6abf5de..0000000000 --- a/packaging/tarmake +++ /dev/null @@ -1,72 +0,0 @@ -# use v as argument for verbose tar output - -# Note: the ${pkg}.tgz file is output in $scriptDir/../.. - -#. .functions > /dev/null - -pushd $PWD > /dev/null - -scriptDir=$(getShellScriptDirectory) -echo "tarmake script directory found to be [$scriptDir]." - -tmp0=${scriptDir%/packaging} -pkg=${tmp0##/*/} -echo "Package version name found to be [$pkg]." - -cd $scriptDir/../.. - -echo "tarmake current directory is [$PWD]" - -if [ ! -s $pkg/packaging/package-list ] -then - echo "Could not find file \"package-list\" in directory $pkg/packaging." - echo "Current direcotry is [$PWD]." - exit 1 -fi - - -echo;echo "Making tar file $pkg.tgz in $PWD" -find $pkg -name "*CVS*" -o -name ".#*" -o -name "*~" -o -name \ - "*util.old*" -o -name "*misc*" -o -name TAGS -o -name "*.avaj" \ - -o -name make.loc -o -name "*pending*"\ - -o -path "*nt/Readme.txt" -o -name goEtags -o -name "JListView*" \ - -o -name "JTableAppender*" > $scriptDir/tar-exclude - -if [ $? -ne 0 ]; then - echo "Find failed with exit code $?."; exit 1; -fi -tar -cz${1}f ${pkg}.tgz -X $scriptDir/tar-exclude \ - $pkg/make/\ - $pkg/doc/\ - $pkg/xdocs/\ - $pkg/Makefile\ - $pkg/build.xml\ - $pkg/build.inc\ - $pkg/manifest.mf\ - $pkg/INSTALL\ - $pkg/LICENSE.APL\ - $pkg/*.jar\ - $pkg/org/ \ - $pkg/icons\ - $pkg/classes/ \ - $pkg/javadoc/ \ - $pkg/packaging/package-list \ - $pkg/packaging/.functions \ - $pkg/packaging/initialize \ - $pkg/packaging/install \ - $pkg/packaging/tarmake \ - - -if [ $? -ne 0 ]; then - echo "tar failed with exit code $?."; exit 1; -fi - -popd > /dev/null - -echo "tarmake successful." -exit 0 - - - - - diff --git a/pom.xml b/pom.xml index 1dadc0b367..9b507a0fd9 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ log4j jar Apache Log4j - 1.2.15 + 1.2.15-SNAPSHOT 1.2.15 @@ -80,16 +80,6 @@ - - maven-checkstyle-plugin - - - log4j - log4j - 1.2.14 - - - org.apache.maven.plugins maven-surefire-plugin @@ -206,6 +196,23 @@ run + + + + site + javadoc_xml + + + + + + + + + + run + diff --git a/src/assembly/bin.xml b/src/assembly/bin.xml index d72f087447..75fd8b12fa 100644 --- a/src/assembly/bin.xml +++ b/src/assembly/bin.xml @@ -29,7 +29,6 @@ *.txt *.sample *.xml - *.rdf INSTALL KEYS LICENSE diff --git a/src/xdocs/contactUs.xml b/src/xdocs/contactUs.xml deleted file mode 100644 index 67947bd439..0000000000 --- a/src/xdocs/contactUs.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Ceki Gülcü - Contact us - - - - - -
    - -

    Discussion on log4j and logging in general are held on the - log4j-user mailing list. To subscribe to this list - send an e-mail to log4j-user-subscribe@logging.apache.org. -

    - -

    Development related discussions are held on the - log4j-dev mailing list. To subscribe to this list - send an e-mail to log4j-dev-subscribe@logging.apache.org. All - developers are encouraged to subscribe to the - log4j-dev list which will notify the subscribers of - any commits to our CVS repository. -

    - -

    To prevent spam, we expect you to be subscribed to a list - before posting to it. Otherwise, your mail needs to be - approved by an administrator which delays your posting and - creates needless work for us. -

    - -

    Most Logging Services mailing lists, in particular the log4j mailing - lists, are archived. Some of the known archives are listed - below: -

    - - - -

    Please do your best to ensure that you are not sending HTML - or "Stylelized" email to the list. If you are using Outlook - or Outlook Express or Eudora, chances are that you are sending - HTML email by default. There is usually a setting that will - allow you to send "Plain Text" email. -

    -
    - - -
    - -

    Bugs should be reported by using the Apache Bug - Database. Before reporting a problem, please make sure to - check - the database and the project history - file to see if the problem is not already known. Before - filing a report, you should first send email to the - log4j-user mailing list describing the bug ensuring - that you are not filing an already known problem. Only after - these precautionary steps should you file a bug report with - Bugzilla. -

    - -

    Although Bugzilla allows users to file enhancement requests - as bugs, enhancement requests are not bugs and should not be - treated as such. The preferred way to request for - enhancements is by posting on the log4j-user list. This - allows other interested parties to participate in the ensuing - discussion. -

    - -

    Just reporting a bug will not fix it. A good bug report - includes a detailed description of the problem and a succinct - test case which can reproduce the problem. -

    - -
    - - -
    - diff --git a/src/xdocs/contributors.xml b/src/xdocs/contributors.xml deleted file mode 100644 index 7bb186b3fc..0000000000 --- a/src/xdocs/contributors.xml +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - Ceki Gülcü - Log4j Contributors - - - -
    - -

    Log4j is the result of contributions from several dozen - developers and hundreds of users across the globe. Some of the - more prominent contributors are listed below in alphabetical - order. -

    -
      - - - - - -
    • Curt Arnold - -

      Curt is an independent software developer and current Logging Services PMC chair. - Curt developed the test framework for the W3C DOM test suites and has contributed to the - Apache Ant, Apache Xerces, Apache Batik, JSUnit, ArgoUML and ant-contrib - projects.

      -
    • - -
    • Mathias Bogaert - -

      While not lurking on the serverside, - Mathias mends the log4j documentation.

      -
    • - -
    • James P. Cakalic -

      Jim is the original author of the PatternLayout and the - NTEventLogAppender. -

      -
    • - -
    • Paul Glezen - -

      Paul maintains the log4j extension manual while he is not - consulting for IBM. -

      -
    • - -
    • Ceki Gülcü - - - - - -

      Ceki is the founder the log4j project which - continues to occupy much of his time. He enjoys writing - software altough he is discovering that it is far more - difficult than what it may seem initially. He is also - managing his IT services - company.

      -
    • - -
    • Jacob Kjome - -

      Jacob Kjome has been developing software - since 1997 and has been playing with Java for about 4 years. - Jake joined the log4j team after being very active on the - user list and contributing servlet and repository selector - related code to the logj-sandbox. He is also a committer on - the (non-Apache related) XMLC, BarracudaMVC, and Prevayler - projects. Of late his free time has been squeezed with a - new job and his vigorous 2 year old son, Nicholas, but he - still tries to pitch in when he can. :-) -

      -
    • - - -
    • Anders Kristensen - -

      Contributor of many enhancements, Anders takes a keen - interest in log4j and all things Java, OO, and XML. He is - currently specification lead for JSR 116, the SIP Servlet - expert group. -

      -
    • - -
    • Jim Moore -

      Jim is often seen answering tough question from log4j - users. -

      -
    • - -
    • Yoav Shapira - - - - -
      -

      Yoav Shapira works for Millennium Pharmaceuticals and - is as interested in the business aspects of Open-Source - Software as he is in the technical aspects. Yoav contributes - to the Tomcat container, the Log4j logging system, and a - number of jakarta-commons and other open-source projects. -

      -
      -
    • - -
    • Jon Skeet - -

      Jon is a software developer in his mid-twenties living in - the UK. He is a Java enthusiast and very active participant - in the comp.lang.java.* newsgroups as well as a moderator - for the log4j mailing lists. He is a committer for the Ant - project, involved (when time permits!) in tidying up the - code documentation. -

      -
    • - -
    • Paul Smith - - - - -
      -

      Paul Smith has been developing software since 1990, and playing - computer games a few years longer than that. He has been thoroughly - enjoying Java since 1998 after he gave up on Visual Basic in disgust. - Paul joined the log4j team after finding how darn useful it and the - companion Chainsaw application was in '03, and has been helping out - where he can, working on Chainsaw v2, and generally making a good - nuisance of himself. -

      - - -
    • - - -
    • Chris Taylor - -

      Chris is the author NTEventLogAppender. In around 1832, - he ported our previous GNU-make build system to at the time - unknown but promising jakarta-ant. -

      -
    • - -
    • Mark Womack - - - - - -
      -

      Mark Womack has been developing software for over 13 - years. He has been developing in Java for the past 5 years, - focusing on web application development. He has been an - active committer for the log4j project since April 2002, contributing - features for the upcoming v1.3 release. He is also a member of the Logging - Services PMC.

      -
      -
    • -
    -
    - - -
    \ No newline at end of file diff --git a/src/xdocs/documentation.xml b/src/xdocs/documentation.xml deleted file mode 100644 index f6b760527b..0000000000 --- a/src/xdocs/documentation.xml +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - Ceki Gülcü - Yoav Shapira - Documentation - - - - -
    - - - -
    - -
    - -
    - - -
    - -
    - -
    - -
    - - -
    -

    The following organisations offer log4j-related consultancy - and training services. Their inclusion on this page does - not imply endorsement by the Apache Software Foundation. -

    - - - - - -

    If you would like your log4j-related article or service - to be listed here, then please send a note to the log4j-user@logging.apache.org - list. -

    -
    - - -
    - diff --git a/src/xdocs/download.xml b/src/xdocs/download.xml deleted file mode 100644 index 95ae804843..0000000000 --- a/src/xdocs/download.xml +++ /dev/null @@ -1,386 +0,0 @@ - - - - - - Ceki Gülcü - Download - - - - - -
    -

    Log4j is available - for download from a number of mirrors. Please - use these mirrors as they improve download time and save - bandwidth. -

    - -

    Changes in log4j 1.2.15: -

      -
    • SyslogAppender now supports a "header" property which if true, causes the appender to produce the HEADER part (timestamp and hostname) of the syslog - packet. Default value is false for compatibility with previous behavior. The SyslogAppender also now sends any header from the associated layout when - activateOptions is called or the first logging event is send and any footer when the appender is closed.
    • - -
    • NTEventLogAppender: Updated NTEventLogAppender.dll which corrects missing event messages - and which should work with earlier releases of log4j. - NTEventLogAppender.dll also now supports registration and unregistration - using regsvr32. If replacing an existing copy of NTEventLogAppender, - use "regsvr32 NTDllEventLogAppender.dll" or manually remove the - HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J - registry key.
    • - -
    • The following bugs were fixed: -
        -
      • 40944: PropertyConfigurator.configure(URL) does not close resource stream.
      • -
      • 40937: In Turkish locale level "info" is not equivalent to "INFO"
      • -
      • 41339: Javadoc of PatternLayout should use %n in TTCC layout examples
      • -
      • 41219: Stacktraces of exceptions disappear occassionally
      • -
      • 38680: Incorrect message when specified custom level class does not implement toLevel
      • -
      • 37282: SyslogAppender leaks descriptors
      • -
      • 41040: SyslogAppender should prefix message with TIMESTAMP and local hostname
      • -
      • 40502: SyslogAppender assumes all lines start with tab
      • -
      • 41169: NTEventLogAppender.dll :: "missing" event description
      • -
      • 41487: Warning when configuring inner-class logger
      • -
      • 41186: AsyncAppender in 1.2.14 DiscardSummary events create NullPointerExceptions in layouts
      • -
      • 37864: Add target to generate binary and source compatibility report
      • -
      • 41708: PropertyPrinter.printOptions breaking signature change in log4j 1.2.9
      • -
      • 41735: RollingFileAppender may delete files during rollover
      • -
      • 33708: XML configuration of loggerFactory does not work
      • -
      • 42087: SyslogAppender does not limit packet size to 1024 bytes
      • -
      -
    • -
    -

    - - -

    We also maintain earlier - versions of log4j for download, intended for the - curious paleontologist -- there seems to be quite a few - of them! -

    -
    - -
    - - -
    - -
    - - -
    DatedFileAppender
    - -
    DatedFileAppender works in the same manner as - the Tomcat FileLogger. Contrary to - DailyRollingFileAppender shipping with log4j, log - file names generated by DatedFileAppender always - contain today's date. While this distinction seems minor, it - means you can reliably copy, compress, remove or manipulate a - day's log file shortly after midnight. With the - DailyRollingFileAppender, a day's log file is not - renamed until the first message is logged some time after - midnight. -
    - - - -
    - JDBCAppender -
    - -
    A powerful JDBCAppender by Danko Mannhaupt - who continues the work of Thomas Fenner. You might find - this JDBCAppender more suitable then the one that ships with - log4j 1.2. -
    - - - -
    - Just4log -
    - -
    Just4Log is a library to enhance dynamically the - performance of various logging systems inside a java - application. Dynamically because the sourcecode in java is not - modified but rather the optimization occurs on the compiled - ByteCode files. -
    - - -
    log4Ant
    - -
    log4Ant includes a complete bridge to the Log4J logging systemfor a robust build monitoring system. - These Ant components let you capture, map, and send Ant log messages and stdio output through your Log4J installation. Contact contact@jware.info -
    - - -
    log4j400
    - -
    Log4J400 includes MessageQueue and DataQueue Appenders for - the AS/400 (aka IBM iSeries). -
    - - - -
    log4j2db
    - -
    This Project provides a set of EJBs to store Log4J events - (received via JMS appender) in a database. The main aim is to - provide a toolset for a centralized, data-center suitable - logging. -
    - - - -
    log4jME
    - -
    Log4jME, or log4j MiniEdition, is based on the - same code as log4j. However, as the name indicates the - mini-edition is much smaller. It offers the same client - interface such that code compiled for log4jME is - compatible with log4j standard edition. You can choose to - upgrade to log4j standard edition at any time by replacing - log4jME.jar with log4j.jar in your - classpath. At this time, log4jME is only available through - ASF Subversion repository in the Logging Services Sandbox. -
    - - - -
    log4Unit
    - -
    Log4Unit is a JUnit extension - combining JUnit with Log4J. The intention is to create test - protocols for JUnit. - -

    JUnit is asymmetrical in the sense that it focusses on the - documentation of test failures and errors. Successful - execution of a test case is not further documented. In order - to obtain a test protocol that documents the initial settings, - the test case execution and its results, a logging component - is required. Log4J as the current de facto standard is - selected for this extension. -

    -
    - - - -
    Log4Web (commercial)
    - -
    Log4Web is a J2EE web application, designed to web-enable - system log files that have been generated by log4j. -
    - - - -
    - Log Tag -
    -
    A custom log tag library from the Jakarta - Taglibs project.
    - - - -
    LogWeb
    - -
    LogWeb is a web interface for configuring log4j at runtime - within a servlet container. Every log4j feature of is - configurable through this interface. -
    - - - - -
    - SNMPTrapAppender -
    - -
    An appender to send formatted logging event strings to a - specified managment host (typically, a MLM of some sort, but - could also be an SNMP management console) in the form of an - SNMP trap. -
    - - - -
    XpoLog -
    - -
    Log view and analysis application which enables web - browsing and analysis over logs. -
    - - - -
    -
    - -
    - - - -
    - - -
    log4cxx
    -
    Log4cxx is a port to C++ of the log4j project.
    - - -
    log4net
    - -
    The .NET implementation of the popular log4j Java API - providing flexible and arbitrarily granular control over log - management and configuration.
    - - -
    log4php
    - -
    Log4Php is a PHP port of log4j framework. It supports xml configuration, - logging to files, stdout/err, syslog, socket, configurable - output layouts and logging levels.
    - -
    -
    - - -
    - -
    log4c
    - -
    ANSI C functions and macros for flexible logging to files - and other destinations. It is modeled after log4j. It follows - the log4j API within the limits of reason. Intended for use in time-space - critical environments.
    - - - -
    log4cpp
    -
    A library of C++ classes for flexible logging to files, - syslog, IDSA and other destinations modeled after log4j.
    - - - -
    log4cplus
    -
    Log4cplus is a simple to use C++ logging API providing - thread-safe, flexible, and arbitrarily granular control over - log management and configuration. It is modeled after the Java - log4j API.
    - - - -
    log4E
    - -
    The Goanna project (Eiffel Web Services) now includes - log4E, a complete port of log4j. -
    - - -
    Log::Log4perl
    - -
    Log::Log4perl is a Perl port of log4j by Kevin Goess and - Mike Schilli. The authors made sure that their port was as - close as possible to the original implementation. Even the - configuration files are similar! The project is still being - enhanced, however the current release is stable and has been - released to CPAN. -
    - - -
    log4LS
    - -
    Log4LS is a LotusScript library package and is used to get - logging statements to a Domino database, sent by mail or - written to a file. It is modeled after Jakarta log4j. -
    - - -
    log4py
    - -
    Log4Py is a python logging module similar to log4j. It - supports logging to files or to stdout/stderr, variable - log-levels, configurable output formats and configuration via - configuration files. -
    - - - -
    log4p
    -
    Another Python translation of log4j. This project no - longer seems to be maintained.
    - - - -
    log4plsql
    - -
    Log4plsql is a Oracle PL/SQL logging module similar to - log4j. It supports logging out-off transaction. It is useful - for logging, benchmarking and monitoring PL/SQL applications. -
    - - - -
    qmmslog
    - -
    Qmmslog is a port of log4j to the Qt/C++ platform. -
    - - -
    log4r
    -
    A Powerful Logger for Ruby. -

    Log4r features an extremely flexible logging library for - Ruby. Killer features include a heiarchial logging system - of any number of levels, logger inheritance, multiple - output destinations, tracing, custom formatting and more. - Log4r was inspired by log4j. Log4r provides the defining - features of log4j and some of its own features that just - might make log4j users envious.

    -
    - - -
    - -
    - -

    If you would like your software to be listed here, then send a note to the log4j-user@logging.apache.org - list.

    - -
    - - -
    \ No newline at end of file diff --git a/src/xdocs/earlier.xml b/src/xdocs/earlier.xml deleted file mode 100644 index 0ea4979da9..0000000000 --- a/src/xdocs/earlier.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - Ceki Gülcü - Older distributions - - - - -
    - -
    - -

    BEWARE:Certain Internet Explorer versions rename .tar.gz downloads - as .tar. You should rename the files back to - tar.gz after the download completes. -

    -
    - - Log4j Archives - -
    - - -
    - diff --git a/src/xdocs/history.xml b/src/xdocs/history.xml deleted file mode 100644 index 72b303d73a..0000000000 --- a/src/xdocs/history.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Ceki Gülcü - Project history - - - - -
    - -

    The project history gives a - brief summary of changes and additions. Users frequently - report bugs that are solved in newer versions of log4j. Please - have a look at the history file before asking for help. -

    - -

    The project's official URL is http://logging.apache.org/log4j. -

    - -

    Many thanks to all the log4j users who keep sending us input - and sometimes even praise for our collective effort. The first - ancestor of log4j was written for the E.U. sponsored SEMPER project. N. Asokan, - Ceki Gülcü and Michael Steiner came up with the idea - of hierarchical loggers back in 1996. Their idea is still at the - heart of log4j. The package was considerably improved over the - years at the IBM Zurich - Research Laboratory. However, log4j is no longer associated - nor supported by IBM. -

    - -

    Special thanks to M. Niksch from ZRL for his assistance on - many large and small matters. The Apache members, Pier - Fumagalli and Sam Ruby in particular, have been extremely - helpful in easing the move to Apache. -

    - -

    The log4j logo was designed and kindly donated by Cyberlab SA of Switzerland. -

    - -
    - -
    diff --git a/src/xdocs/index.xml b/src/xdocs/index.xml deleted file mode 100644 index 6a7f03b5f0..0000000000 --- a/src/xdocs/index.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Ceki Gülcü - Introduction - - - - - - - -
    - -

    Inserting log statements into your code is a low-tech method - for debugging it. It may also be the only way because - debuggers are not always available or applicable. This is - often the case for distributed applications.

    - -

    On the other hand, some people argue that log statements - pollute source code and decrease legibility. (We believe that - the contrary is true). In the Java language where a - preprocessor is not available, log statements increase the - size of the code and reduce its speed, even when logging is - turned off. Given that a reasonably sized application may - contain thousands of log statements, speed is of particular - importance.

    - - -

    With log4j it is possible to enable logging at runtime - without modifying the application binary. The log4j package is - designed so that these statements can remain in shipped code - without incurring a heavy performance cost. Logging behavior - can be controlled by editing a configuration file, without - touching the application binary.

    - -

    Logging equips the developer with detailed context for - application failures. On the other hand, testing provides - quality assurance and confidence in the application. Logging - and testing should not be confused. They are - complementary. When logging is wisely used, it can prove to be - an essential tool.

    - -

    One of the distinctive features of log4j is the notion of - inheritance in loggers. Using a logger - hierarchy it is possible to control which log - statements are output at arbitrarily fine granularity but also - great ease. This helps reduce the volume of logged output and - minimize the cost of logging.

    - -

    The target of the log output can be a file, an - OutputStream, a java.io.Writer, a - remote log4j server, a remote Unix Syslog daemon, or many other output targets.

    - -

    On an AMD Duron clocked at 800Mhz running JDK 1.3.1, it costs - about 5 nanoseconds to determine if a logging statement should - be logged or not. Actual logging is also quite fast, ranging - from 21 microseconds using the SimpleLayout, 37 - microseconds using the TTCCLayout. The performance of the - PatternLayout is almost as good as the dedicated layouts, - except that it is much more flexible.

    - -

    The package is being constantly improved thanks to input from - users and code contributed by authors in the community. -

    - -
    - -
    - diff --git a/src/xdocs/lf5/configuration.xml b/src/xdocs/lf5/configuration.xml deleted file mode 100644 index 499a869358..0000000000 --- a/src/xdocs/lf5/configuration.xml +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Brad Marlborough - LogFactor5 Users' Guide - - - -
    - - -

    There are two ways of configuring LogFactor5: using a log4j properties file, - or using the Configure menu in the LogFactor5 GUI. -

    - -

    Configuration Using a Properties File

    - -

    The LF5Appender has a single property that can - be set via a log4j properties file, the - MaxNumberOfRecords property. This property is used by - LogFactor5 to determine the maximum number of records to - display at any one time in the GUI. If this maximum number is - exceeded, LogFactor5 begins to remove the oldest records, one - at a time. Removing records in this fashion reduces the risk - that your computer will run out of memory while the GUI is - running. If the MaxNumberOfRecords property is not set, - LogFactor5 sets a default value of 5000.

    - -

    To set the MaxNumberOfRecords property using a regular - java.util.Properties file, you should use the following - line (replace A1 with the name of your appender): -

    - -
         log4j.appender.A1.MaxNumberOfRecords=2000
    -
    - -

    To set the MaxNumberOfRecords property using an XML - properties file, you should use the following lines (replace - the name LF5Appender with the name of your appender):

    -
    -    <appender name="LF5Appender" class="org.apache.log4j.lf5.LF5Appender">
    -       <param name="MaxNumberOfRecords" value="1000"/>
    -    </appender>
    -
    -    <root>
    -      <priority value ="debug" />
    -      <appender-ref ref="LF5Appender"/>
    -    </root>
    -
    - -

    Note: Setting the maximum number of records to display - via the Configure->Set Max Number Of Records menu in the - LogFactor5 GUI will override any value that you set in this - configuration file. -

    - -

    Configuration Using the GUI

    -

    Save

    - -

    LogFactor5 allows you to save the current configuration of - your logging console using the Configure menu. The - Configure->Save menu option saves your current GUI - configuration to a file called - lf5_configuration.xml. This configuration file is a - saved to the location <USER_HOME>/lf5 on your local - drive. -

    - -

    The information saved in the configuration file is as - follows:

    - -
      -
    • The current configuration of the logger explorer window including all - selected and de-selected channels
    • -
    • The current configuration of all level
    • -
    • The view settings, and
    • -
    • The last NDC filter used (if the Restore All NDC's item was not selected - prior to saving).
    • -
    - -

    Once you have saved a configuration, your configuration is loaded each time - that you start LogFactor5.

    - -

    Reset

    - -

    You can remove your currently saved configuration by using - the Configure->Reset menu option. This will delete the - lf5_configuration.xml file from your local file system.

    - -

    Set Max Number Of Records

    - -

    The Configure menu also includes a "Set Max Number Of Records" option, - which allows you to change the maximum number of records that will be displayed - in the GUI at any time. Setting the maximum number of records using this menu - item will override any value that you set in your log4j property file (see below). - Note: The value that you set using this option is not saved into - the lf5_configuration file.

    - -

    Removing Empty Categories

    - -

    When you save your configuration using the Configure->Save menu option, - and then start logging from a different application, you will likely find that - many of the categories you saved are empty. You can remove these "dead" - categories from the display by right clicking on the root of the category tree - in the category explorer, and choosing the "Remove All Empty Categories" - option. This will prune the category explorer tree to display only those channels - that contain information.

    - -

    - -
    - -
    \ No newline at end of file diff --git a/src/xdocs/lf5/examples.xml b/src/xdocs/lf5/examples.xml deleted file mode 100644 index b049937542..0000000000 --- a/src/xdocs/lf5/examples.xml +++ /dev/null @@ -1,581 +0,0 @@ - - - - - - Brad Marlborough - LogFactor5 Users' Guide - - - -
    - -

    Example 1: InitUsingDefaultConfigurator -

    -

    Example Description:

    - -

    The LogFactor5 library has a DefaultLF5Configurator class which provides a - very basic LogFactor5 configuration for you. This class can be used to programmatically - register an LF5Appender at the root of the org.apache.log4j.Category - tree. The InitUsingDefaultConfigurator.java class demonstrates how to use this - configurator.

    - -

    When using this class, all that you have to do is make a call to the static l - method DefaultLF5Configurator.configure( ), and your basic configuration will - be done for you.

    - -

    Running the Example:

    - -

    Let LOG4J_HOME be the the directory where you - installed log4j and let VERSION stand for the log4j version.

    - -
      -
    • Ensure that LOG4J_HOME/dist/lib/log4j-VERSION.jar - is in your CLASSPATH.
    • - -
    • Ensure that LOG4J_HOME/dist/classes is in your - CLASSPATH. This directory contains the binary class files for - running the lf5 examples. It is not needed under normal - operational circumstances.
    • - -
    • Ensure that a JAXP compatible XML parser is in is in your - CLASSPATH.
    • - -
    • Type the following at the command line: - -

      java examples.lf5.InitUsingDefaultConfigurator.InitUsingDefaultConfigurator

      -
    • -
    - -

    Example 2: InitUsingPropertiesFile

    -

    Example Description:

    - -

    The log4j environment is fully configurable - programmatically. However, it is far more flexible to - configure log4j using configuration files. One common method - of configuring log4j involves using a properties file, and the - org.apache.log4j.PropertyConfigurator class. The - PropertyConfigurator class allows you to load - properties from a standard properties document consisting of - key=value pairs. This example demonstrates how to load - LogFactor5 via a configuration file used by a - PropertyConfigurator.

    - -

    This example uses a very basic properties file, which is - loaded via a PropertyConfigurator. The - example.properties file has only one property, which - registers a LF5Appender with the root of the - Category tree. The InitUsingPropertiesFile class - loads this file using the PropertyConfigurator - class.

    - -

    Note: The example.properties file used in this - example is loaded as a resource via your CLASSPATH. For this - reason, the example will only work if the - LOG4J_HOME/dist/classes directory is in your - CLASSPATH

    - -

    Running the Example:

    - -

    Let LOG4J_HOME be the the directory where you - installed log4j.

    - -
      -
    • Set up your CLASSPATH as in Example 1 above.
    • - -
    • Type the following at the command line: - -

      java - examples.lf5.InitUsingPropertiesFile.InitUsingPropertiesFile

      -
    • -
    - - - - - -

    Example 3: InitUsingXMLPropertiesFile -

    - -

    Example Description:

    - -

    Log4j can also be configured using an XML properties file, - and the org.apache.log4j.xml.DOMConfigurator class. The - DOMConfigurator class allows you to load properties from an - XML based properties file. This example demonstrates how to - load LogFactor5 via an XMLconfiguration file used by a - DOMConfigurator. -

    - -

    This example uses a very basic XML properties file. The - example.xml file registers an LF5Appender with the root of the - Category tree. The InitUsingXMLPropertiesFile.java class loads - this file using the DOMConfigurator class. -

    - -

    Note: The example.xml file used in this example - is loaded as a resource via your CLASSPATH. For this reason, - the example will only work if the - LOG4J_HOME/dist/classes directory is in your - CLASSPATH. You will also need an XML parser in order to run - this example. -

    - -

    Running the Example:

    - -

    Let LOG4J_HOME be the the directory where you - installed log4j.

    - -
      -
    • Set up your CLASSPATH as in Example 1 above.
    • - -
    • Type the following at the command line: - -

      java - examples.lf5.InitUsingXMLPropertiesFile.InitUsingXMLPropertiesFile

      -
    • -
    - - - - - -

    Example 4: - InitUsingLog4JProperties

    - -

    Example Description:

    - -

    The log4j library does not make any assumptions about its - environment. In particular, there are no default log4j - appenders. Under certain well-defined circumstances however, - the static initializer of the org.apache.log4j.Category - class will attempt to automatically configure log4j. The - Java language guarantees that the static initializer of a - class is called once and only during the loading of a class - into memory. This automatic configuration is done from a file - named log4j.properties. If you have a log4j.properties - file in your CLASSPATH at the time that you instantiate a - Category, log4j will register any appenders in this file at - the root of the Category tree. -

    - -

    This example provides you with a very basic log4j.properties - file that you can add to your CLASSPATH in order to register - the LF5Appender with the Category class. If you put this file - somewhere in your CLASSPATH, all logging requests will now - automatically be redirected to the LogFactor5 logging console - in addition to any other Appenders you may have enabled. -

    - -

    If you look at the InitUsingLog4JProperties.java file you - will notice that no Configurators are used in the code. A - Category is instantiated using the getInstance() method, and - logging calls such as cat.debug( ) can be used immediately. -

    - -

    Note: Adding the - LOG4J_HOME/examples/lf5/InitUsingLog4JProperties/log4j.properties - file to your CLASSPATH will reduce the number of lines of code - you have to write (e.g. you will not need to add lines such as - PropertyConfigurator.configure(configFileResource)). However, - you should be aware that using this default static - initialization has application wide effects. All logging will - be directed to LogFactor5 if you use this approach! -

    - -

    Running the Example:

    - -
      -
    • Set up your CLASSPATH as in Example 1 above.
    • - -
    • Copy the provided - LOG4J_HOME/examples/lf5/InitUsingLog4JProperties/log4j.properties - file to a directory that is currently in your - CLASSPATH.
    • - -
    • Type the following at the command line: - -

      java - examples.lf5.InitUsingLog4JProperties.InitUsingLog4JProperties

      -
    • - -
    • After you are done running the example, make sure to - remove the log4j.properties file again, otherwise the - log4j will always be using the same configuration.
    • -
    - - - - - -

    Example 5: InitUsingMultipleAppenders -

    -

    Example Description:

    - -

    In Log4J, output destinations are called - appenders. Currently, appenders exit for the console, rolling - log files, remote socket servers, NT Event Loggers, and remote - UNIX Syslog daemons. Suppose you want to output log messages - to more than one appender...

    - -

    This example demonstrates how to use LogFactor5 along with - Log4J's RollingFileAppender to output log messages to both the - LogFactor5 console and a series of rolling log files. The - example.properties registers two appenders with the root of - the Category tree.

    - -
    log4j.rootCategory=, A1, R
    -
    -# A1 is set to be a LF5Appender which outputs to a swing
    -# logging console.
    -
    -log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
    -
    -# R is the RollingFileAppender that outputs to a rolling log
    -# file called rolling_log_file.log.
    -
    -log4j.appender.R=org.apache.log4j.RollingFileAppender
    -log4j.appender.R.File=rolling_log_file.log
    -
    - -

    Users must also define a Pattern Layout for the log - file. That is, which pieces of information you want logged to - the log file and in which order. Information on the various - conversion specifiers (i.e. d, p, t, l, m, n) are documented - in the PatternLayout class of the Log4J API.

    - -
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    -# Next line is editited to fit.
    -log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n\
    -  %p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n%c[slf5s.CATEGORY]%n\
    -  %l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n
    -
    - -

    Users also have the ability to set the size of the rolling log file(s) and - the number of backup files that should be kept. In this case the the size of - the maximum size of the log file is 100KB and the number of backup files kept - is 1.

    -
    -log4j.appender.R.MaxFileSize=100KB
    -log4j.appender.R.MaxBackupIndex=1
    -
    - -

    The InitUsingMultipleAppenders.java class loads this file - using the PropertyConfigurator class.

    - -

    Note: Another approach would be to add the - RollingFileAppender configuration to the log4j.properties - file. This would cause the InitUsingLog4JProperties example to - use both the LogFactor5 console and a rolling log file as it's - output destinations. -

    - -

    Running the Example:

    - -
      -
    • Set up your CLASSPATH as in Example 1 above.
    • - -
    • Type the following at the command line: - -

      java - examples.lf5.InitUsingMultipleAppenders.InitUsingMultipleAppenders

      -
    • -
    - - - - - -

    Example 6: UsingSocketAppenders

    -

    Example Description:

    - -

    When logging messages from an application, it is often useful - to log the messages to a remote location over a socket. Log4j - comes with a variety of classes designed for this - purpose. This example is designed to show you how to use these - log4j classes in conjunction with the LF5Appender. -

    - -

    Two specific log4j classes are instrumental for logging - messages over a socket: the - org.apache.log4j.net.SocketAppender class and the - org.apache.log4j.net.SocketServer class.

    - -

    The SocketAppender class:

    - -

    The SocketAppender class is used on the application side, - where log messages are being created. This class sends all - logging messages to a specific host and port as specified in a - properties file. The properties file can be either an - application specific properties file, or the system - log4j.properties file. In this example, the - socketclient.properties file contains the information that - registers the SocketAppender with log4j. The following lines - from the socketclient.properties file register the - SocketAppender with log4j: -

    -
    -       log4j.appender.A1=org.apache.log4j.net.SocketAppender
    -       log4j.appender.A1.RemoteHost=localhost
    -       log4j.appender.A1.Port=8887
    -
    - -

    For additional details about properties files, refer to the log4j documentation - or the other LogFactor5 examples. -

    - -

    The SocketServer class:

    - -

    The SocketServer class listens on a port specified as a - command line argument. The host and port of the machine - running the SocketServer class must correspond to the host and - port in the socketclient.properties file. The SocketServer - class uses a separate properties file to determine which - Appenders it should forward incoming messages to. In this - example, the socketserver.properties file contains the - information that registers the LF5Appender with log4j. The - following lines from the socketserver.properties file register - the LF5Appender with log4j on the server side:

    - -
    -       log4j.appender.A=org.apache.log4j.lf5.LF5Appender
    -       log4j.appender.A1.MaxNumberOfRecords=700
    -
    - -

    The first line registers the LF5Appender with log4j, and the - second line tells LogFactor5 the maximum number of records to - display in the GUI at any one time. For additional - information about how the SocketServer class loads properties - files (including default properties files) please refer to the - log4j documenation. -

    - -

    Running the Example:

    -
      -
    • Set up your CLASSPATH as in Example 1 above.
    • - -
    • Start the SocketServer using the following command:
    • - -

      java org.apache.log4j.net.SimpleSocketServer 8887 - LOG4J_HOME/examples/lf5/UsingSocketAppenders/socketserver.properties

      - -
    • At another command line, start the client using the - following command:
    • - -

      java examples.lf5.UsingSocketAppenders.UsingSocketAppenders

      -
    - - - - - -

    Example 7: OpeningLogFiles

    -

    Example Description:

    - -

    Log4J's RollingFileAppender gives you the ability to output - log messages to a series of rolling files. However, there are - no utilities available for reading in and viewing those files - once they have been written. LogFactor5 provides developers - with two easy ways to open and view log files. Log files can - be opened locally using the 'Open' menu item or log files can - be opened from a remote server using the 'Open URL' menu - item. -

    - -

    An additional feature that was added to LogFactor5 was the - ability to start the console window independent of Log4J. That - is to say, you do not need to add a LF5Appender to your - properties file to use LogFactor5. The benefit of this feature - is that developers who run utilities like Ant to test their - applications can now view their log files off-line (i.e. after - their application has completed the test and the JVM has shut - down). Moreover, the ability to open log files on a remote - server provides the ability for multiple developers working on - the same application to view log files independently. It also - gives developers the ability to view log files both internally - and from remote locations. -

    - -

    This example uses the sample.log file created by Log4J's - RollingFileAppender. 1The format of the log file can be set in - the log4j.properties or a standard properties file and - must follow the LogFactor5 layout conventions in order - for LogFactor5 to open the file. The following is an example - of a properties file with the LogFactor5 conversion pattern - added: -

    - -
    log4j.rootCategory= R
    -
    -# R is the RollingFileAppender that outputs to a rolling log
    -# file called sample.log.
    -
    -log4j.appender.R=org.apache.log4j.RollingFileAppender
    -log4j.appender.R.File=sample.log
    -
    -# Define a pattern layout for the file.
    -# For more information on conversion characters (i.e. d,p,t,c,l,m,n)
    -# please see the PatternLayout class of the Log4j API.
    -
    -log4j.appender.R.layout=org.apache.log4j.PatternLayout
    -log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n\
    -%p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n\
    -%c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n
    -
    -# Set the max size of the file
    -
    -log4j.appender.R.MaxFileSize=500KB
    - -

    You are free to use any or all of the main conversion - characters to create ml your log file (i.e. %p for - Priority). There are only two requirements for the conversion - pattern. First, the conversion pattern string must - start with the tag [slf5s.start]. Second, for each - log4j conversion character listed in the conversion pattern - string, a corresponding LogFactor5 tag must be placed - immediately after the character. The following is a - complete list of the log4j characters and LogFactor5 tags: -

    - -
    Date - %d{DATE}[slf5s.DATE]
    -Priority - %p[slf5s.PRIORITY]
    -NDC - %x[slf5s.NDC]
    -Thread - %t[slf5s.THREAD]
    -Category - %c[slf5s.CATEGORY]
    -Location - %l[slf5s.LOCATION]
    -Message - %m[slf5s.MESSAGE]
    -
    - -

    Note: The order of the characters does not matter so - you are free to layout your log file any way you like. Just - remember to include the LogFactor5 start tag at the beginning - of the string and any LogFactor5 tags after each corresponding - log4j conversion character.

    - -

    Running the Example:

    - -
      -
    • Set up your CLASSPATH as in Example 1 above.
    • - -
    • Type the following at the command line: java - org.apache.log4j.lf5.StartLogFactor5 -
    • - -
    • Under the 'File' menu, select 'Open'.
    • - -
    • Open the sample.log file located in the examples/lf5/OpeningLogFiles directory.
    • - -
    • Clear the log table using the Clear Log Table button.
    • -
    - - - - -

    Example 8

    -

    Example 8a: UsingLogMonitorAdapter

    -

    Example Description:

    - -

    Ideally LogFactor5's intended use is with Log4J, but this - does not preclude its use with other logging schemes. The - LogMonitorAdapter API allows developers to log directly to the - LogFactor5 GUI Monitor with a minimum of effort. -

    - -

    The UsingLogMonitorAdapter.java class demonstrates how to use - the LogMonitorAdapter. This example requests a new instance - of the LogMonitorAdapter, and uses the log4j Priority - levels.

    - -
         _adapter = LogMonitorAdapter.newInstance(LogMonitorAdapter.LOG4J_LOG_LEVELS);
    -

    When you log to the LogFactor5 GUI Monitor, simply call one of the many log - methods on the LogMonitorAdapter object:

    -
         _adapter.log(channel,"Doh this is a debugging");
    -
    -     _adapter.log(channel,LogLevel.INFO,"Hmmm fobidden doughnut");
    -     _adapter.log(channel,LogLevel.WARN,"Danger Danger Will Robinson",
    -         new RuntimeException("DANGER"), "32");
    -     _adapter.log(channel,LogLevel.ERROR,"Exit stage right->");
    -     _adapter.log(channel,LogLevel.FATAL,"What's up Doc?",
    -         new NullPointerException("Unfortunate exception"));
    -
    - -

    Running the Example:

    -
      -
    • Set up your CLASSPATH as in Example 1 above.
    • - -
    • Type the following at the command line: - -

      java - examples.lf5.UsingLogMonitorAdapter.UsingLogMonitorAdapter

      -
    • -
    - -

    Example 8b: CustomizedLogLevels

    -

    Example Description:

    - -

    What good is a LogMonitorAdapter if you can only use preset - LogLevels? This example illustrates how to use the - LogMonitorAdapter with a set of user-defined LogLevels.

    - -

    The CustomizedLogLevels.java class demonstrates how to customize LogLevels ml - to suit your logging needs. As with the previous example we request an instance - of the LogMonitorAdapter, but this time an array of defined LogLevels is supplied:

    - -
         _adapter = LogMonitorAdapter.newInstance(new LogLevel[] {DEFAULT, LEVEL_ONE,
    -           LEVEL_TWO,LEVEL_THREE, LEVEL_FOUR });
    -
    - -

    The LogMonitorAdapter will set the first entry in the array to be the default - LogLevel. For example, when logging a message where no LogLevel has been specified, - the DEFAULT LogLevel will be used. The default LogLevel can also be set using - the LogMonitorAdapter's setDefaultLevel method, while the severe LogLevel can - be set as follows: -

    - -
         _adapter.setSevereLevel(LEVEL_ONE);
    -

    - -

    Logging messages then follow the same rules as the example above.

    - -
         _adapter.log(channel,"Using the customized LogLevels");
    -
    -     _adapter.log(channel,LEVEL_FOUR,"This is a test");
    -     _adapter.log(channel,LEVEL_THREE,"Hmmm fobidden doughnut");
    -     _adapter.log(channel,LEVEL_ONE,"Danger Danger Will Robinson",
    -         new RuntimeException("DANGER"), "32");
    -     _adapter.log(channel,LEVEL_TWO,"Exit stage right->");
    -     _adapter.log(channel,LEVEL_FOUR,"What's up Doc?",
    -         new NullPointerException("Unfortunate exception"));
    -      
    - -

    Running the Example:

    -
      -
    • Set up your CLASSPATH as in Example 1 above.
    • - -
    • Type the following at the command line: - -

      java - examples.lf5.UsingLogMonitorAdapter.CustomizedLogLevels

      -
    • -
    -
    - -
    \ No newline at end of file diff --git a/src/xdocs/lf5/faq.xml b/src/xdocs/lf5/faq.xml deleted file mode 100644 index 25c3540bc8..0000000000 --- a/src/xdocs/lf5/faq.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - Brad Marlborough - LogFactor5 Users' Guide - - - -
    - - -

    Q. What is LogFactor5?

    - -

    A. LogFactor5 is a Swing based GUI that leverages the - power of log4j to provide developers with a sophisticated, - feature-rich, visual tool for managing log messages.

    - -
    - -

    Q. Do I need to know how to use log4j in order to use LogFactor5?

    - -

    A. Yes, the documentation for LogFactor5 assumes the - user has some understanding of how log4j works. Note however - that the LogFactor5 examples will run regardless of a user's - log4j knowledge level.


    - -

    Q. What are the memory requirements for LogFactor5?

    - -

    A. The LogFactor5 logging console window uses around - 13 MB of memory to run on a Windows OS. Our memory profiling - has shown that with a logging message of 25 words in length, - and a stack trace nested seven methods deep, every 1000 - records displayed in the logging console uses about 6.5 MB of - memory. For this reason, when you are setting the maximum - number of log records to be shown, you should be careful that - you have enough memory to display all of the records. The - default maximum number of records that will be displayed is - set to 5000 to minimize the possibility of running out of - memory. We recommend that Windows users have at least 96 MB of - RAM when using LogFactor5.

    - -
    - -
    diff --git a/src/xdocs/lf5/features.xml b/src/xdocs/lf5/features.xml deleted file mode 100644 index 0eba16fe0d..0000000000 --- a/src/xdocs/lf5/features.xml +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - Brad Marlborough - LogFactor5 Features Users' Guide - - - -
    - -

    Manage Log Messages

    - -

    The Log Table pane shows the listing of LogRecords that have - been sent to the LogFactor5 appender. The newest log messages - appear at the bottom of the table. -

    - -

    Log Table

    - -

    Log - Level Selection

    - -

    The LogFactor5 toolbar applies directly to the Log Table - area. Log levels can be toggled on and off to filter out - messages that you want to view or hide. Levels include FATAL, - ERROR, WARN, INFO and DEBUG.

    - - -

    Log Levels

    - -

    Log Level Color Configuration

    - -

    To help distiguish the various log events displayed in the - LogTable, LogFactor5 allows users to set the colors of their - log events based on level.

    - -

    Log Level Color Configuration

    - -

    Full Text Searching

    - -

    The Log Table supports full text searching. To perform a - search, choose Edit->Find from the menu bar or CTRL-F and - then enter the text you want to search for. LogFactor5 will - find any strings that are an exact match for the string you - entered. Pressing F3 will find the next occurrence of the - string. -

    - -

    Full Text Searching

    - -

    Log Table Views

    - - - - - -

    The Log Table has three views; compact, standard and - detailed. The compact view only displays the Nested Diagnostic - Context (NDC), logger and message. The standard view is the - default view, and displays the level, NDC, logger and message - of the logging event. The detailed view displays, in addition, - the date, message number, location (i.e. the method that is - logging the message), thread description and the - throwable. The view selector on the toolbar switches between - the three views. Columns in the Log Table can be re-sized and - moved by interacting with the column headers. -

    - -

    Log Table View

    - -

    Log Record Details

    - -

    The Log Record Detail area displays all of the attributes of - the LogRecord which is selected in the Log Table. When a row, - or LogRecord, is selected in the Log Table, the complete - details of that LogRecord are displayed in the LogRecord - Detail area, independent of the view in effect. -

    - -

    LogRecord Details -

    - - - - -

    Logger Explorer

    - -

    The Logger Explorer area enables the filtering of incoming - log messages based on logger. If a logger is deselected - (no checkmark is shown next to it) then new messages on that - logger will not be displayed. The Logger Explorer has no - effect on log messages already in the Log Table. -

    - -

    The Logger Explorer displays loggers in a hierarchical - tree-like fashion. Loggers are identified with - dot-separated names similar to Java package and class - names. The name components are mapped to the levels in the - hierarchy in the Logger Explorer. For example, the logger - name org.apache.applications.log4j.InitUsing Log4JProperties - is displayed below: -

    - -

    Logger Explorer

    - - -

    Selecting and Deselecting Loggers

    - -

    When a logger in a hierarchy is deselected, no messages at - that level or below will appear in the Log Table. For example, - if just the first InitUsingMultipleAppenders logger in the - examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders - logger is deselected, then messages with the logger examples - would be displayed in the Log Table, but messages with the - logger InitUsingMultipleAppenders.InitUsingMultipleAppenders - would be filtered and not displayed in the Log Table. -

    - -

    To quickly select or deselect loggers in the hierarchy, - the right-mouse button can be used to bring up the pop-up menu - displayed below.

    - -

    Deselect All Descendants

    - -

    Select All Descendants

    - - -

    Expanding and Collapsing the Logger Tree

    - -

    You can also expand and collapse the hierarchy tree using - the pop-up menu displayed below.

    - -

    Expand Tree

    - -

    Collapse Tree

    - -

    NDC Record Filtering

    - - -

    Log4j provides a lightweight technique for stamping log - requests initiated from the same client within a multithreaded - system. The Nested Diagnostic Context (NDC) provides an easy - way to differentiate logging output of one client from - another. The NDC is also useful for differentiating log - messages being output by different members of a large - development team building an application on the same - server. To improve the sorting of potentially thousands of log - records being output from multiple clients, a NDC filter has - been provided. To use the NDC filter, select the Edit menu - item and choose 'Sort by NDC'. Fill in the name of the NDC you - would like to filter on. All records containing the filter key - word will be displayed in the Log Table. To restore all of the - log records use the Edit -> Restore all NDC's. You can also - use the Edit->Find feature to locate NDC's without removing - log records from the Log Table. Furthermore, you can use the - Configure->Save feature to persist the last NDC filter key - word that was used. Note however that restoring all NDCs will - effectively erase the NDC filter key word. Refer to the Configuration section below for more - information on saving NDC filter key words.

    - -

    NDC Filtering

    - - -

    Read Log Files

    -
    - -

    Read a File

    - -

    LogFactor5 supports reading in log files that were created - using log4j's RollingFileAppender. The benefit of this - feature is that developers who run utilities like Ant to test - their applications can now view their log files off-line - (i.e. after their application has completed the test and the - JVM has shut down). Reading log files currently only works for - files written a LogFactor5's unique ConversionPattern. For - more information on setting the LogFactor5 conversion pattern, - please see the OpeningLogFiles example. To open a file and - read it into LogFactor5, you need to start the logging console - using the StartLogFactor5Console.bat file provided in the bin - directory. Once the console is open, choose File->Open from - the menu at the top of the GUI. -

    - -

    Log Table

    - -

    Read a File From a URL

    - -

    LogFactor5 supports reading log files created using log4j - from a URL. Having the ability to open log files on a remote - server provides the ability for multiple developers working on - the same application to view log files independently. It also - gives developers the ability to view log files both internally - and from remote locations. Reading log files currently only - works for files written a LogFactor5's unique - ConversionPattern. For more information on setting the - LogFactor5 conversion pattern, please see the OpeningLogFiles example. To open a - file and read it into LogFactor5, you need to start the - logging console using the StartLogFactor5Console.bat file - provided in the bin directory. Once the console is open, - choose File->Open URL from the menu at the top of the GUI. -

    - -

    Log Table

    - -

    << Return to Top of Page >>

    - -

    Configuration

    - -

    Save Configuration Information

    - -

    LogFactor5 allows you to save your current - configuration. When you choose the Configuration->Save - option from the menu at the top of the GUI, the loggers and - levels that you currently have selected, along with the last - NDC filter key word used (assuming 'Restore all NDC's' has not - been selected), are saved to your local file system. This - means that the next time you start up the console you will not - need to reselect the loggers, levels, and NDC filter that you - would like used for filtering. -

    - -

    LogFactor5 also allows you to remove your saved - configuration, and to configure the maximum number of records - that will be displayed at any time in the logging - console. Setting the maximum number of records to display - allows you to optimize LogFactor5's performance for your - system. The maximum number of records can also be configured - via a log4j properties file. -

    - -

    Log Table

    -
    - -
    \ No newline at end of file diff --git a/src/xdocs/lf5/overview.xml b/src/xdocs/lf5/overview.xml deleted file mode 100644 index 356578f2a0..0000000000 --- a/src/xdocs/lf5/overview.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - Brad Marlborough - LogFactor5 Users' Guide - - - -
    - -

    What is LogFactor5? - LogFactor5 is a Swing based GUI - that leverages the power of log4j logging framework and - provides developers with a sophisticated, feature-rich, - logging interface for managing log messages. -

    - -

    How does it work? - LogFactor5 seamlessly plugs into - log4j and provides developers with an alternate destination - for outputting messages.

    - -

    Benefits:

    -
      -
    • Quickly isolate problems in your application.
    • -
    • Enable only the categories that you are interested in without affecting - other messages.
    • -
    • Filter out priority levels you don't need.
    • -
    • Filter out records based on NDC.
    • -
    • Reduce the time required to locate specific messages.
    • -
    • Read in and view log4j log files from either a file or a URL.
    • -
    • Start the LogFactor5 GUI up independent of your application.
    • -
    -

    Features: -

      -
    • Real-time category and log level filtering.
    • -
    • Read log files from a file.
    • -
    • Read log files from a URL.
    • -
    • Customizable Log Table view.
    • -
    • Category level tree navigation.
    • -
    • NDC record filtering.
    • -
    • Full text searching on logged messages.
    • -
    • Save configuration and filtering settings for later sessions.
    • -
    • Configure the number of log records to be displayed.
    • -
    • Customizable record colors.
    • -
    • Configurable font face and size.
    • -
    • Customizable Log Table column layout.
    • -
    • Full support for all log4j levels.
    • -
    • Full support for custom levels.
    • -
    • Dynamic message counting.
    • -
    -

    - -

    LogFactor5 System Requirements:

    - -

    LogFactor5 requires Java (TM) Virtual Machine 1.2.2 and log4j - 1.2 or later. -

    - -

    Documentation and Help

    -
      -
    • All documentation is in HTML format.
    • - -
    • For additional documentation on logging, please see the Suggested Reading - section.
    • -
    -

    Platform Support

    -
      -
    • LogFactor5 is written in 100% Java and will work with any - system supporting the Java 2 platform.
    • -
    -

    - -
    - -
    \ No newline at end of file diff --git a/src/xdocs/lf5/readingfiles.xml b/src/xdocs/lf5/readingfiles.xml deleted file mode 100644 index 3f853dbb98..0000000000 --- a/src/xdocs/lf5/readingfiles.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Brad Marlborough - LogFactor5 Users' Guide - - - -
    - -

    FileAppender and derived classes give you the - ability to output log messages to a files. LogFactor5 provides - developers with two easy ways to open and view these log - files. Log files can be opened locally using the File->Open - menu item or log files can be opened from a remote server - using the File->Open URL menu item. -

    - -

    An additional feature that was added to LogFactor5 was the - ability to start the console window independently of - log4j. That is to say, you do not need to add a - LF5Appender to your properties file to use - LogFactor5. The benefit of this feature is that developers who - run utilities like Ant to test their applications can now view - their log files off-line (i.e. after their application has - completed the test and the JVM has shut down). Moreover, the - ability to open log files on a remote server provides the - ability for multiple developers working on the same - application to view log files independently. It also gives - developers the ability to view log files both internally and - from remote locations. -

    - -

    LogFactor5 can read in log files created with - RollingFileAppender. The format of the log file - can be set in the log4j.properties or a standard properties - file and must follow the LogFactor5 layout conventions - in order for LogFactor5 to read the file. The following is an - example of a properties file with the LogFactor5 conversion - pattern added: -

    - -
    
    -log4j.rootLogger=debug, R
    -
    -# R is the RollingFileAppender that outputs to a rolling log 
    -# file called sample.log.
    -
    -log4j.appender.R=org.apache.log4j.RollingFileAppender
    -log4j.appender.R.File=sample.log
    -
    -# Define a pattern layout for the file.  
    -# For more information on conversion characters (i.e. d,p,t,c,l,m,n)
    -# please see the PatternLayout class of the Log4j API.
    -
    -log4j.appender.R.layout=org.apache.log4j.PatternLayout
    -
    -# The following normally appears on one single line.
    -log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n\
    -   %p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n\
    -   %c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n
    -
    -# Set the max size of the file 
    -log4j.appender.R.MaxFileSize=500KB
    - -

    You are free to use any or all of the main conversion - characters to create your log file (i.e. %p for - Priority). There are only two requirements for the conversion - pattern. First, the conversion pattern string must - start with the tag [slf5s.start]. Second, for each - log4j conversion character listed in the conversion pattern - string, a corresponding LogFactor5 tag must be placed - immediately after the character. The following is a - complete list of the log4j characters and LogFactor5 tags: -

    - -
    Date - %d{DATE}[slf5s.DATE]
    -Priority - %p[slf5s.PRIORITY]
    -NDC - %x[slf5s.NDC]
    -Thread - %t[slf5s.THREAD]
    -Category - %c[slf5s.CATEGORY]
    -Location - %l[slf5s.LOCATION]
    -Message - %m[slf5s.MESSAGE]
    -
    - -

    Note: The order of the characters does not matter so - you are free to layout your log file any way you like. Just - remember to include the LogFactor5 start tag at the beginning - of the string and any LogFactor5 tags after each corresponding - log4j conversion character. For more information or to see a - working example, try the OpeningLogFiles example in the - examples directory. -

    -
    - -
    - - diff --git a/src/xdocs/lf5/trouble.xml b/src/xdocs/lf5/trouble.xml deleted file mode 100644 index 6c12597e36..0000000000 --- a/src/xdocs/lf5/trouble.xml +++ /dev/null @@ -1,324 +0,0 @@ - - - - - - Brad Marlborough - LogFactor5 Users' Guide - - - -
    - -

    Q. How do I send log messages to both LogFactor5 and a rolling log file? -

    - -

    A. Log4J gives you the ability to log to mulitple - appenders. The RollingFileAppender class is the - appender used to log messages to a series of files. The - following code snippet shows how to configure a - log4j.properties file or a standard properites file so that it - logs to both the LogFactor5 console and a rolling log - file.

    - -
    # Register both appenders
    -with the root of the logger tree.
    -
    -log4j.rootLogger=, A1, R
    -
    -# A1 is set to be a LF5Appender which outputs to a swing
    -# logging console.   
    -  
    -log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
    -
    -# R is the RollingFileAppender that outputs to a rolling log 
    -# file called rolling_log_file.log.
    -
    -log4j.appender.R=org.apache.log4j.RollingFileAppender
    -log4j.appender.R.File=rolling_log_file.log
    -
    -# Configure a pattern layout, the size of the file and the number
    -# of backup files.
    -
    -log4j.appender.R.layout=org.apache.log4j.PatternLayout
    -# Edited to fit.
    -log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n\
    -  %p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n\
    -  %c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n
    -log4j.appender.R.MaxFileSize=100KB
    -log4j.appender.R.MaxBackupIndex=1
    - -

    For more information on logging to multiple appenders along - with a demo, please see the IntiUsingMultipleAppenders example in the - examples folder. -

    - -
    - -

    Q. What is the maximum number of log records that will be visible at any - one time? -

    - -

    A. The logging console will only display up to 5000 LogRecords as a - default. When this limit has reached, the oldest record will be removed from - those that are displayed.

    -
    - -

    Q. Is the maximum number of records shown configurable?

    - -

    A. The maximum number of records shown is configurable - via a log4j properties file, or via the Configure menu item in - the LogFactor5 GUI. Our memory profiling has shown that with a - logging message of 25 words in length, and a stack trace - nested seven methods deep, every 1000 records displayed in the - logging console uses about 6 MB of memory. For this reason, - when you are setting the maximum number of log records to be - shown, it is possible to run out of memory if you are not - careful. The default maximum number of records is set to 5000 - records to minimize the possibility of running out of - memory.

    -
    - -

    Q. Why does the command prompt hang when I close the - console?

    - -

    A. If you close the LogFactor5 console (as opposed to - exiting) you are effectively hiding the console and turning - off any logging to console. However, closing the console does - not shut down the Java virtual machine. As a result, the - command prompt hangs until the virtual machine is properly - shut down.

    -
    - -

    Q. How do I shut down the console completely including the virtual machine? - -

    -

    A. Selecting exit (as opposed to close) will shut down the LogFactor5 - console along with the virtual machine.

    -
    - -

    Q. I have not added LogFactor5 via a configurator or the addAppender() method, - yet the console still pops up every time. What's happening?

    - -

    A. The example log4j.properties file that ships with - LogFactor5 is in your CLASSPATH, and is being loaded during - static initialization of the Category class. If you remove the - file from your CLASSPATH, or rename the file, the logging - console should stop loading.

    -
    - - -

    Q. If I close the LogFactor5 logging console, but don't shut down the virtual - machine (i.e. use close rather than exit) does the console continue to log messages? -

    - -

    A. No. Once the LogFactor5 console is closed, it stops logging messages. - This does not effect any other appenders you may be using (i.e. rolling log - files).

    -
    - -

    Q. When I call the removeAppender( ) method on the Category class, the logging - window does not disappear. What's happening?

    -

    A. The LF5Appender is being removed from the list of registered - Appenders in the Category class, and messages are no longer being sent to the - logging window. However, the logging window is being kept alive by the Swing - thread, so you will need to close the window manually in order to get rid of - it.

    -
    - -

    Q. How do I send log messages to LogFactor5 using log4j's SocketAppender - and SocketServer classes?

    - -

    A. Log4 gives you the ability to send messages to a remote location - over a socket for logging purposes. The org.apache.log4j.net.SocketAppender - and org.apache.log4j.net.SocketServer classes are the key classes used in remote - logging.

    - -

    If you want to use the LF5Appender to log messages remotely, - you can simply register the LF5Appender in the properties file - being loaded by your SocketServer. The following steps give - you a high level description of how to do this. For more - information on using the SocketAppender, along with a demo, - please see the UsingSocketAppenders example in the examples - folder.

    - -

    STEP 1: On the client side (the application producing the - logging messages), modify your configuration properties file - to write to a SocketAppender. If you add lines similar to the - following to your configuration file, it should do the trick: -

    -
    -    log4j.rootCategory=, A1
    -    log4j.appender.A1=org.apache.log4j.net.SocketAppender
    -    log4j.appender.A1.RemoteHost=localhost
    -    log4j.appender.A1.Port=8888
    -
    - -

    Once you have loaded this configuration, all messages will be written to the - machine and port that you specify.

    - -

    STEP 2: On the server side (where you are listening for - messages), you will need to run log4j's SocketServer - class. You should create a configuration file with - configuration information similar to the following:

    -
    -    log4j.rootCategory=DEBUG,A 
    -    log4j.category.org.apache.log4j.net.SocketNode=DEBUG
    -    log4j.appender.A=org.apache.log4j.lf5.LF5Appender
    -
    - -

    STEP 3: Set up your CLASSPATH on both the client and server - to run log4j and LogFactor5.

    - -

    STEP 4: Run the SocketServer at the command line. The command - line syntax for the SocketServer is as follows:

    - -
    -    java org.apache.log4j.net.SocketServer portNumber configurationFile\
    -                                           configurationDirectory 
    -
    - - -

    For example, we ran the following at the command line: java - org.apache.log4j.net.SocketServer 8888 - C:\temp\socketserver.properties C:\temp -

    - -

    STEP 5: Start your client, and start logging messages to the SocketAppender.

    - -
    - -

    Q. How do I save my current configuration?

    - -

    A. LogFactor5 has a Configure menu item in the top - menu bar. If you choose save from this menu, it will save your - current configuration. If you choose reset from this menu, it - will delete any saved configuration information. -

    -
    - -

    Q. What configuration information is saved?

    -

    A. If you choose Configure->Save from the LogFactor5 menu, LogFactor5 - saves the configuration of the category explorer window. This means that the - next time you open LogFactor5, any channels that you have selected or de-selected - will remain as they were when you last exited the GUI.

    -
    - -

    Q. When I open LogFactor5, I have a bunch of old categories from another - application. What's going on here, and how do I get rid of these dead categories? -

    - -

    A. You must have saved your configuration in the other - application. LogFactor5 is displaying your saved - configuration, as well as any new categories in the - application you are now running. To remove these empty - categories, right-click at the root of the category tree in - the category explorer window, and choose "Remove All - Empty Categories". If you want to get rid of this old - configuration information permanently, you should choose - Configure->Reset from the menu as well.

    - -
    - -

    Q. I'm using Ant to build my project and one of my tasks - is to execute a series of JUnit tests. When I attempt to use - the LF5Appender as an appender I get the following exception - thrown: -

    - -
    -    java.lang.NullPointerException 
    -    at javax.swing.ImageIcon.<init>(ImageIcon.java:134)
    -    at org.apache.log4j.lf5.viewer.channelexplorer.ChannelNodeRenderer.
    -                                       <init>(ChannelNodeRenderer.java:71) 
    -    ... etc.
    -
    - -

    What do I need to do to fix this problem?

    - -

    A. This problem is related to the way that Ant's class - loader works. The solution for this problem is to fork the - junit task into a separate Java Virtual Machine. The - appropriate code to fork the VM is a follows: -

    - -
    -    <junit fork="yes">
    -      ...
    -    </junit>
    -
    -
    - -

    Q. When I try to open a file, I get the following error: - 'Error - Invalid log file format!'. What is going - on?

    - -

    A. LogFactor5 can read in log files created with - Log4J's RollingFileAppender. The format of the log file - must follow the LogFactor5 layout conventions in order - for LogFactor5 to open the file. For more information on - LogFactor5's layout conventions and how to set the conversion - pattern in a Log4J properties file, please see the - OpeningLogFiles example.

    - -
    - -

    Q. Why can't I set my own custom date format?

    - -

    A. Log4j allows users to cutomize the date format of - their log records. Unfortunately LogFactor5 does not support - this feature. LogFactor5 uses a date manager to ensure that - only one date format is ever used. The reason for this is that - LogFactor5 can read in log files created with Log4J's - RollingFileAppender. However, the data in the log files is - text rather than objects. In order for LogFactor5 to read in - the log file, it must know the exact format of the data in - order to parse the information. This include the format of the - date. Any files containing invalid date formats would not be - able to be opened and read. As a result, users are forced to - use a default date format provided by Log4j ( %d{Date} ).

    - -
    - -

    Q. Why does the LogFactor5 GUI hang when I use Tomcat - 1.4's reload feature to reload my application?

    - -

    A. When an application using LogFactor5 is deployed - using Tomcat, the GUI binds itself to the naming context of - the application. However, when the application is reloaded - using Tomcat's reload feature, the naming context is nulled - and a new naming context is created. Since the VM is not shut - down and restarted during the reload process, and there is no - longer a naming context to bind to, the LogFactor5 console - hangs. When the application is reloaded, a new LogFactor5 - console is created while the old one is left hanging in limbo. - One way around this problem is to use Tomcat in conjunction - with JBoss to redeploy the application. JBoss also has a - reload feature that allows users to redeploy their application - without having to bounce the web/application server. The - difference is that JBoss has a naming context manager that - keeps track of an applications naming context between deploys - rather than nulling the context and creating a new one. As a - result, the LogFactor5 console will remain bound to the - application between each deploy.

    - -
    - -
    diff --git a/src/xdocs/plan.xml b/src/xdocs/plan.xml deleted file mode 100644 index 5270fe669c..0000000000 --- a/src/xdocs/plan.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - Ceki Gülcü - Mark Womack - Curt Arnold - Release roadmap for log4j - - - - -
    - -

    This page documents that roadmap and gives you an idea of what - to expect from future versions and timeframes for release. -

    - -

    Our users keep inventing better ways and adding new - requirements. The downside is that our todo list keeps - growing. The upside is that there is plenty of work to go - around. If you are interested in participating, send an email - on the log4j-dev@ mailing list stating your interest. You'll - be promptly enrolled. We're always looking for help! Don't be - put off if in the "Volunteer" column already has a person - listed. Programming is fun, especially if it is done in a - team. -

    - -
    - -
    -

    Expected timeframe: As needed

    - -

    log4j 1.2.15 was released in March 2007. log4j 1.2 is continuing to be maintained - in response to reported issues and requests for back-ported features from log4j 1.3.

    -
    - -
    -

    Expected timeframe: indeterminate

    - -

    Compatibility with earlier releases (as implied by a minor verion number change) was not enforced during the - development process and much of the recent effort has been to restore compatibility. However, it does not - seem likely that log4j 1.3 will ever been sufficiently compatible with log4j 1.2 - to recommend it as a general replacement for log4j 1.2. Additional alpha releases are expected, - however it is possible that the development focus may shift to log4j 2.0.

    - -
    - -
    -

    Expected timeframe: indeterminate

    - -

    log4j 2.0 is still conceptual but would be designed for Java 5 and later, - would use be designed for fine-grain concurrency to maximize performance on - multi-processor systems, would minimize exposure of implementation details and - adhere to current Java coding practices. The design of log4j 2.0 may attempt to - support javax.util.logging by allowing, for example, a log4j 2.0 Appender to serve - as a javax.util.logging.Handler. log4j 2.0 would likely be modularized, possibly using - OSGi and would include a facade that emulates the log4j 1.3 API but would not be compatible - with user written appenders and other components.

    -
    - - - -
    diff --git a/src/xdocs/stylesheets/compatibility.xslt b/src/xdocs/stylesheets/compatibility.xslt deleted file mode 100644 index 606aa2d523..0000000000 --- a/src/xdocs/stylesheets/compatibility.xslt +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - Apache log4j compatibility report - - -

    Apache log4j compatibility report

    - - - -
    - - - - -
    -
    - - - - - - o.a.l. - - - - . - - - - - - - - - - - - - - - - - - - - - - - - - - o.a.l. - - - -
    \ No newline at end of file diff --git a/src/xdocs/stylesheets/lf5.xml b/src/xdocs/stylesheets/lf5.xml deleted file mode 100644 index a18b8eb918..0000000000 --- a/src/xdocs/stylesheets/lf5.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - Log4j project - LogFactor5 - - - - - - - - - - - - - - - - - - - - - diff --git a/src/xdocs/stylesheets/project.xml b/src/xdocs/stylesheets/project.xml deleted file mode 100644 index c5be9a9bbb..0000000000 --- a/src/xdocs/stylesheets/project.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - Log4j project - The log4j project - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/xdocs/stylesheets/site.vsl b/src/xdocs/stylesheets/site.vsl deleted file mode 100755 index 6fb18ea57d..0000000000 --- a/src/xdocs/stylesheets/site.vsl +++ /dev/null @@ -1,335 +0,0 @@ - - - - - ## Defined variables - #set ($bodybg = "#ffffff") - #set ($bodyfg = "#000000") - #set ($bodylink = "#525D76") - - #set ($titlebg = "#FFFFFF") - #set ($titlefg = "#2222AA") - - #set ($bannerbg = "#FFFFFF") - #set ($bannerfg = "#2222AA") - - #set ($subbannerbg = "#828DA6") - #set ($subbannerfg = "#ffffff") - - -#document() - - -## This is where the macro's live - -#macro ( projectanchor $name $value ) - #if ($value.startsWith("http://")) - $name - #else - $name - #end -#end - -#macro ( metaauthor $author $email ) - - -#end - -#macro ( image $value ) -#if ($value.getAttributeValue("width")) -#set ($width=$value.getAttributeValue("width")) -#end -#if ($value.getAttributeValue("height")) -#set ($height=$value.getAttributeValue("height")) -#end -#if ($value.getAttributeValue("align")) -#set ($align=$value.getAttributeValue("align")) -#end - -#end - -## ============================================ -## subsection macro -## ============================================ -#macro ( subsection $subsection) -

    $subsection.getAttributeValue("name")

    - #foreach ( $items in $subsection.getChildren() ) - #if ($items.getName().equals("img")) - #image ($items) - #elseif ($items.getName().equals("source")) - #source ($items) - ## #elseif ($items.getName().equals("table")) - ## #table ($items) - #else - $items - #end - #end -#end - -## =================================== -## titleSection macro -## =================================== -#macro ( titleSection $titleSection) - $titleSection.getAttributeValue("name") -#end - -## ================================ -## section macro -## ================================ -#macro ( section $section) -

    $section.getAttributeValue("name")

    - #foreach ( $items in $section.getChildren() ) - #if ($items.getName().equals("img")) - #image ($items) - #elseif ($items.getName().equals("source")) - #source ($items) - ##elseif ($items.getName().equals("table")) - ## #table ($items) - #elseif ($items.getName().equals("subsection")) - #subsection ($items) - #else - $items - #end - #end -#end - -## =================================== -## make navigation bar -## =================================== - -#macro ( makeNavigationBar ) - -
    - #set ($menus = $project.getChild("body").getChildren("menu")) - #foreach ( $menu in $menus ) - - #foreach ($item in $menu.getChildren() ) - #set ($name = $item.getAttributeValue("name")) - - #end - #end -
    - -#end - -## ==================================== -## getProjectImage -## ==================================== -#macro (getProjectImage) - ## -#end - -#macro (printMeta $metaElement) - -#end - -#macro (faqIndex $root) - - #set( $section = 1 ) - - #foreach ( $s in $root.getChild("body").getChildren() ) - #if ($s.getName().equals("faqSection")) - #set( $counter = 1 ) -
    -
    - Section $section. $s.getChild("title").getContent() -
    - - #foreach ( $q in $s.getChildren() ) - #if ($q.getName().equals("question")) - - - -
    Question $section.$counter$q.getChild("title").getContent()
    - #set( $counter = $counter + 1 ) - #end - #end - #set( $section = $section + 1 ) - #end - #end -#end - -#macro (faqContents $root) -
    - - #set( $section = 1 ) - - #foreach ( $s in $root.getChild("body").getChildren() ) - #if ($s.getName().equals("faqSection")) - #set( $counter = 1 ) -
    - Section $section. $s.getChild("title").getContent() -
    - #foreach ( $i in $s.getChildren() ) - #if ($i.getName().equals("question")) - - #set( $counter = $counter + 1 ) - $i.getChild("answer").getContent() - #elseif ($i.getName().equals("text")) - $i.getContent() - #end - #end - #set( $section = $section + 1 ) - #end - #end -#end - - -#macro (messages $root) - #foreach ( $m in $root.getChild("body").getChildren() ) - #if ($m.getName().equals("message")) - -
    - $m.getChild("explanation").getContent() -
    - #end - #end -#end - -#macro (document) - #set ($properties = $root.getChild("properties") ) - - - - - - - - - - #set ($authors = $properties.getChildren("author")) - #foreach ( $au in $authors ) - #metaauthor ( $au.getText() $au.getAttributeValue("email") ) - #end - - #set ($metas = $root.getChildren("meta")) - - ## Parse meta directives such as - ## - #foreach ($meta in $metas) #printMeta($meta) #end - - ## Support for tags. - #if ($properties.getChild("base")) - #set ($url = $properties.getChild("base").getAttributeValue("href")) - - #end - - - #set ($links = $properties.getChildren("link")) - #foreach ( $l in $links ) - - #end - - - $project.getChild("title").getText() - $properties.getChild("title").getText() - - - - - #getProjectImage() - - -
    -
    - - #foreach ( $item in $root.getChild("body").getChildren() ) - #if ($item.getName().equals("img")) - #image ($item) - #elseif ($item.getName().equals("section")) - #section ($item) - #elseif ($item.getName().equals("faqSection")) - ## do nothing, we'll handle the faq later - #elseif ($item.getName().equals("message")) - ## do nothing, we'll handle the faq later - #else - $item - #end - #end - - #faqIndex ($root) - #faqContents ($root) - #messages ($root) - -## #if ($root.getChild("body").getChild("titleSection")) -## #set ($titleSection = $root.getChild("body").getChild("titleSection")) -## #titleSection($titleSection) -## #end -## -## #set ($allSections = $root.getChild("body").getChildren("section")) -## #foreach ( $section in $allSections ) -## #section ($section) -## #end - - - -
    - Copyright © 1999-2007, Apache Software Foundation.
    -Licensed under the Apache License, Version 2.0. -
    - - - - - #makeNavigationBar() - - - -#end - - - - - From 8afaa26fe5c1452e883e24e756d9c5aa70944c9e Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 15 May 2007 21:20:11 +0000 Subject: [PATCH 296/342] Bug 40951: Update changes.xml for log4j 1.2.15 release git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538323 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index db467ee454..b6d64479c6 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -21,11 +21,21 @@ - + + Migrate to Maven based build and documentation. + Prepare Maven release bundles. + Eclipse compiler warning cleanup. + JRockit VM and java-gcj fail unit tests. + SocketAppender does not use FallbackErrorHandler + Enhance DOMConfigurator to delegate unrecognized elements to configured object. + Add LoggingEvent accessors. + InstanceAlreadyExistsException using MBean. + Reduce first connection failure severity in SocketAppender + SyslogAppender does not limit packets to 1024 bytes. SyslogAppender: Added "header" property which if set to true will cause the appender to produce the HEADER part (timestamp and hostname) of the syslog packet. Default value is false for compatibility with previous behavior. - SyslogAppender also now sends any header from the associated + SyslogAppender also now sends any header from the associated layout when activateOptions is called or first logging event is sent and any footer when the appender is closed. SyslogAppender leaks descriptors @@ -39,6 +49,7 @@ use "regsvr32 NTDllEventLogAppender.dll" or manually remove the HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/Log4J registry key. + NTEventLogAppender.dll performs unnecessary code page conversion using code copied from book. PropertyConfigurator.configure(URL) does not close resource stream. In Turkish locale level "info" is not equivalent to "INFO" Javadoc of PatternLayout should use %n in TTCC layout examples @@ -51,6 +62,10 @@ RollingFileAppender may delete files during rollover XMLConfiguration of loggerFactory does not work SyslogAppender does not limit packet size to 1024 bytes + Update source per new ASF Header Policy. + DateLayoutTest fails if default Locale is not en_US. + Stacktrace may choke on null fields. + Add projects.apache.org project descriptor. From be0e4aaf417c06b595852269955478ab2b416670 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 15 May 2007 21:31:40 +0000 Subject: [PATCH 297/342] Bug 40951: Lock plugin version used in log4j 1.2.15 release git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538326 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 9b507a0fd9..28554f5254 100644 --- a/pom.xml +++ b/pom.xml @@ -81,8 +81,8 @@ - org.apache.maven.plugins maven-surefire-plugin + 2.3 tests plain @@ -136,14 +136,15 @@ maven-compiler-plugin + 2.0.2 1.2 1.1 - org.apache.maven.plugins maven-jar-plugin + 2.1 @@ -154,6 +155,7 @@ maven-antrun-plugin + 1.1 @@ -218,6 +220,7 @@ maven-assembly-plugin + 2.2-beta-1 src/assembly/bin.xml @@ -267,8 +270,8 @@ true - org.apache.maven.plugins maven-project-info-reports-plugin + 2.0.1 @@ -284,14 +287,16 @@ maven-javadoc-plugin + 2.2 org.codehaus.mojo jxr-maven-plugin + 2.0-beta-1 - org.apache.maven.plugins maven-changes-plugin + 2.0-beta-2 From 8cc7f6eb0473e12ac34da45327eba28ed2a22f0d Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 15 May 2007 21:40:51 +0000 Subject: [PATCH 298/342] Bug 37939: Fix bugzilla URL git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538333 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 28554f5254..50b857526d 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ http://logging.apache.org/log4j/1.2/ Bugzilla - http://issues.apache.org/bugzilla + http://issues.apache.org/bugzilla/ Gump From 4c0326dd7214e0fef6cc8d7df4ba6b3a7dbf02d4 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 15 May 2007 21:44:36 +0000 Subject: [PATCH 299/342] Bug 37939: Add action to log4j 1.2.10 to explain status already explained in summary located at top of document git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538335 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index b6d64479c6..25ba8d44f4 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -180,7 +180,11 @@ + Please do not use version 1.2.10, it is not an official log4j release."> + Version 1.2.10 was not released following the accepted rules and process of + the log4j project and Logging Services Project and was recalled and removed. + Please do not use version 1.2.10, it is not an official log4j release. + Log4j version 1.2.9, is identical to version 1.2.8, except that From 460ab29a6d5aa4dce05546873f50926436f81f02 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 15 May 2007 22:17:54 +0000 Subject: [PATCH 300/342] Bug 37930: URL kludge to prevent relative references to parent pages git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538340 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 4 ++-- src/site/site.xml | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 50b857526d..fbac8ebf5a 100644 --- a/pom.xml +++ b/pom.xml @@ -27,8 +27,8 @@ 1.2.15 - Apache Log4j - http://logging.apache.org/log4j/1.2/ + Apache Log4j 1.2 + http://logging.apache.org:80/log4j/1.2/ Bugzilla http://issues.apache.org/bugzilla/ diff --git a/src/site/site.xml b/src/site/site.xml index 90c34effad..abaae26f26 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -17,19 +17,21 @@ --> - Apache log4j 1.2 + Apache Logging Services Project images/ls-logo.jpg - http://logging.apache.org/log4j/1.2 + http://logging.apache.org/ + Apache log4j images/logo.jpg + http://logging.apache.org/log4j - + From f56c046c752e155c097e3caa16582f7b69027e88 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 16 May 2007 05:19:19 +0000 Subject: [PATCH 301/342] Bug 37930: JDK 1.4.2 fixes git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538434 13f79535-47bb-0310-9956-ffa450edef68 --- BUILD-INFO.txt | 22 +++++++- pom.xml | 62 ++++++++++++++++++++-- src/assembly/bin.xml | 7 ++- src/changes/changes.xml | 2 +- src/ntdll/build.xml | 2 +- tests/build.xml | 111 +++++++++++++++++++++++++--------------- 6 files changed, 157 insertions(+), 49 deletions(-) diff --git a/BUILD-INFO.txt b/BUILD-INFO.txt index 5facc46afb..7481f19a4b 100644 --- a/BUILD-INFO.txt +++ b/BUILD-INFO.txt @@ -3,6 +3,26 @@ versions of tools and jars used to build this version of the log4j library. Maven - 2.0.6; Available from http://maven.apache.org MinGW - MinGW-3.1.0-1.exe; Available from http://mingw.sourceforge.net/downloads.html (used to build NTEventLogAppender.dll) -JDK - jdk1.3.1_18; Available from http://java.sun.com/products/archive/ +JDK - jdk1.4.2_13; Available from http://java.sun.com/products/archive/ Windows 2000 SP4 +JMX 1.2.1 Reference Implementation must be downloaded +from http://java.sun.com/products/JavaManagement/download.html +and lib/jmxtools.jar and lib/jmxri.jar installed with the +following commands: + + mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools \ + -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/jmxtools.jar + + mvn install:install-file -DgroupId=com.sun.jmx -DartifactId=jmxri \ + -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/jmxri.jar + +JMS 1.1 must be downloaded from http://java.sun.com/products/jms/docs.html + + mvn install:install-file -DgroupId=javax.jms -DartifactId=jms \ + -Dversion=1.1 -Dpackaging=jar -Dfile=/path/to/jms.jar + +To build the release: + +mvn site assembly:assembly + diff --git a/pom.xml b/pom.xml index fbac8ebf5a..edc91e7f74 100644 --- a/pom.xml +++ b/pom.xml @@ -87,6 +87,7 @@ tests plain pertest + true org/apache/log4j/LevelTest.java org/apache/log4j/PriorityTest.java @@ -167,6 +168,7 @@ + @@ -216,7 +218,51 @@ run + + test + runAll + + + + + + + + + + + + run + + + + + + ant + ant-nodeps + 1.6.5 + + + ant + ant-junit + 1.6.5 + + + junit + junit + 3.8.1 + test + + + + com.sun + tools + 1.4.2 + system + ${java.home}/../lib/tools.jar + + maven-assembly-plugin @@ -244,15 +290,25 @@ - javaee - javaee-api - 5 + javax.mail + mail + 1.4 + + + javax.jms + jms + 1.1 com.sun.jdmk jmxtools 1.2.1 + + com.sun.jmx + jmxri + 1.2.1 + oro oro diff --git a/src/assembly/bin.xml b/src/assembly/bin.xml index 75fd8b12fa..969ea25828 100644 --- a/src/assembly/bin.xml +++ b/src/assembly/bin.xml @@ -33,7 +33,7 @@ KEYS LICENSE NOTICE - contrib/** + contribs/** examples/** src/assembly/** src/changes/** @@ -41,7 +41,10 @@ src/ntdll/** src/performance/** src/site/** - tests/* + tests/README + tests/*.xml + tests/*.sample + tests/*.bat tests/input/** tests/resources/** tests/src/** diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 25ba8d44f4..2ab14789e4 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -21,7 +21,7 @@ - + Migrate to Maven based build and documentation. Prepare Maven release bundles. Eclipse compiler warning cleanup. diff --git a/src/ntdll/build.xml b/src/ntdll/build.xml index 5a21b2c5de..4fa3a73b20 100755 --- a/src/ntdll/build.xml +++ b/src/ntdll/build.xml @@ -21,7 +21,6 @@ - @@ -46,6 +45,7 @@ + -Dclasses.dir=/path/to/log4j/classes must be specified diff --git a/tests/build.xml b/tests/build.xml index a2300bb965..e1efacdfdf 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -175,7 +175,8 @@ - + @@ -184,7 +185,8 @@ - + @@ -192,7 +194,8 @@ - + @@ -200,7 +203,8 @@ - + @@ -209,7 +213,8 @@ - + @@ -217,7 +222,8 @@ - + @@ -225,7 +231,8 @@ - + @@ -233,7 +240,8 @@ - + @@ -242,64 +250,71 @@ - - + + - + - - + + - + - - + + - + - - + + - + - - - + + + - - + + - + - + @@ -310,7 +325,8 @@ - + @@ -318,7 +334,8 @@ - + @@ -326,7 +343,8 @@ - + @@ -334,7 +352,8 @@ - + @@ -342,7 +361,8 @@ - + @@ -350,7 +370,8 @@ - + @@ -358,7 +379,8 @@ - + @@ -366,7 +388,8 @@ - + @@ -375,7 +398,8 @@ - + @@ -383,7 +407,8 @@ - + @@ -391,7 +416,8 @@ - + @@ -399,7 +425,8 @@ - + @@ -407,7 +434,8 @@ - + @@ -426,7 +454,8 @@ - + From cb75c460566fa79f63f93ac5b78dd3685c2fb538 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 16 May 2007 06:35:54 +0000 Subject: [PATCH 302/342] Bug 37930: Remove plugin versions, add people.apache.org as distribution repo git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538447 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index edc91e7f74..d8a31ca3ae 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,6 @@ maven-surefire-plugin - 2.3 tests plain @@ -137,7 +136,6 @@ maven-compiler-plugin - 2.0.2 1.2 1.1 @@ -145,7 +143,6 @@ maven-jar-plugin - 2.1 @@ -156,7 +153,6 @@ maven-antrun-plugin - 1.1 @@ -266,7 +262,6 @@ maven-assembly-plugin - 2.2-beta-1 src/assembly/bin.xml @@ -367,6 +362,10 @@ + + log4j12.builds + scp://people.apache.org/www/people.apache.org/builds/logging/log4j/${project.version}/ + log4j12.website scp://people.apache.org/www/logging.apache.org/log4j/1.2/ From da7996ce5544840ecb32e0a70c11c3e6b878cfa9 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 16 May 2007 15:42:55 +0000 Subject: [PATCH 303/342] Bug 37930: Added src/main/javadoc, post release site fixup git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538632 13f79535-47bb-0310-9956-ffa450edef68 --- BUILD-INFO.txt | 2 - build.xml | 12 +- .../log4j/xml/examples/ReportParserError.java | 51 ----- .../apache/log4j/xml/examples/extension1.xml | 28 --- .../apache/log4j/xml/examples/extension2.xml | 35 ---- .../apache/log4j/xml/examples/package.html | 26 --- pom.xml | 115 +++++++---- .../apache/log4j/xml/examples/XMLSample.java | 0 .../org/apache/log4j/xml/examples/sample1.xml | 0 .../org/apache/log4j/xml/examples/sample2.xml | 0 .../org/apache/log4j/xml/examples/sample3.xml | 0 .../org/apache/log4j/xml/examples/sample4.xml | 0 .../org/apache/log4j/xml/examples/sample5.xml | 0 .../javadoc/org/apache/log4j/xml/log4j.dtd | 191 ++++++++++++++++++ 14 files changed, 274 insertions(+), 186 deletions(-) delete mode 100644 examples/xml/org/apache/log4j/xml/examples/ReportParserError.java delete mode 100644 examples/xml/org/apache/log4j/xml/examples/extension1.xml delete mode 100644 examples/xml/org/apache/log4j/xml/examples/extension2.xml delete mode 100644 examples/xml/org/apache/log4j/xml/examples/package.html rename {examples/xml => src/main/javadoc}/org/apache/log4j/xml/examples/XMLSample.java (100%) rename {examples/xml => src/main/javadoc}/org/apache/log4j/xml/examples/sample1.xml (100%) rename {examples/xml => src/main/javadoc}/org/apache/log4j/xml/examples/sample2.xml (100%) rename {examples/xml => src/main/javadoc}/org/apache/log4j/xml/examples/sample3.xml (100%) rename {examples/xml => src/main/javadoc}/org/apache/log4j/xml/examples/sample4.xml (100%) rename {examples/xml => src/main/javadoc}/org/apache/log4j/xml/examples/sample5.xml (100%) create mode 100644 src/main/javadoc/org/apache/log4j/xml/log4j.dtd diff --git a/BUILD-INFO.txt b/BUILD-INFO.txt index 7481f19a4b..94e4518365 100644 --- a/BUILD-INFO.txt +++ b/BUILD-INFO.txt @@ -22,7 +22,5 @@ JMS 1.1 must be downloaded from http://java.sun.com/products/jms/docs.html mvn install:install-file -DgroupId=javax.jms -DartifactId=jms \ -Dversion=1.1 -Dpackaging=jar -Dfile=/path/to/jms.jar -To build the release: -mvn site assembly:assembly diff --git a/build.xml b/build.xml index dadb8ae40e..870798fcfb 100644 --- a/build.xml +++ b/build.xml @@ -51,6 +51,9 @@ + + + @@ -571,13 +574,8 @@ - - - - - - + + diff --git a/examples/xml/org/apache/log4j/xml/examples/ReportParserError.java b/examples/xml/org/apache/log4j/xml/examples/ReportParserError.java deleted file mode 100644 index 007d4cbd77..0000000000 --- a/examples/xml/org/apache/log4j/xml/examples/ReportParserError.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.log4j.xml.examples; - -import org.apache.log4j.helpers.LogLog; - -/** - - This class is needed for validating a log4j.dtd derived XML file. - - @author Joe Kesselman - - @since 0.8.3 - - */ -public class ReportParserError implements org.xml.sax.ErrorHandler { - - void report(String msg, org.xml.sax.SAXParseException e) { - LogLog.error(msg+e.getMessage()+ "\n\tat line="+ e.getLineNumber()+ - " col="+e.getColumnNumber()+ " of "+ - "SystemId=\""+e.getSystemId()+ - "\" PublicID = \""+e.getPublicId()+'\"'); - } - - public void warning(org.xml.sax.SAXParseException e) { - report("WARNING: ", e); - } - - public void error(org.xml.sax.SAXParseException e) { - report("ERROR: ", e); - } - - public void fatalError(org.xml.sax.SAXParseException e) { - report("FATAL: ", e); - } -} diff --git a/examples/xml/org/apache/log4j/xml/examples/extension1.xml b/examples/xml/org/apache/log4j/xml/examples/extension1.xml deleted file mode 100644 index af78d1ea2b..0000000000 --- a/examples/xml/org/apache/log4j/xml/examples/extension1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/xml/org/apache/log4j/xml/examples/extension2.xml b/examples/xml/org/apache/log4j/xml/examples/extension2.xml deleted file mode 100644 index b4b3518ce9..0000000000 --- a/examples/xml/org/apache/log4j/xml/examples/extension2.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/xml/org/apache/log4j/xml/examples/package.html b/examples/xml/org/apache/log4j/xml/examples/package.html deleted file mode 100644 index db195a1bb2..0000000000 --- a/examples/xml/org/apache/log4j/xml/examples/package.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - -

    Example usage of log4j with XML (including source code). - -

    This package's shows how log4j can be used with an XML -configuration file. - -

    See source code of XMLSample.java showing how to -configure with an XML file. Sample XML files -sample1.xml, -sample2.xml, -sample3.xml, -sample4.xml, -sample5.xml are provided. - -


    -
    - -Last modified: Wed Apr 12 22:27:25 MDT 2000 - - diff --git a/pom.xml b/pom.xml index d8a31ca3ae..9a0cb61352 100644 --- a/pom.xml +++ b/pom.xml @@ -196,23 +196,6 @@ run - - - - site - javadoc_xml - - - - - - - - - - run - test @@ -231,7 +214,24 @@ run - + + + site + untag-site + + + + + + + + run + + @@ -250,14 +250,6 @@ 3.8.1 test - - - com.sun - tools - 1.4.2 - system - ${java.home}/../lib/tools.jar -
    @@ -267,7 +259,35 @@ src/assembly/bin.xml + + + + assembly + + + + + maven-javadoc-plugin + + + + jar + javadoc + + + + + + maven-source-plugin + + + + jar + + + + tests/src/java @@ -276,6 +296,28 @@ + + + + default-tools.jar + + + java.vendor + Sun Microsystems Inc. + + + + + sun.jdk + tools + 1.4.2 + system + ${java.home}/../lib/tools.jar + + + + java.net @@ -322,7 +364,6 @@ maven-project-info-reports-plugin - 2.0.1 @@ -336,18 +377,18 @@ - - maven-javadoc-plugin - 2.2 - org.codehaus.mojo jxr-maven-plugin - 2.0-beta-1 + + + maven-release-plugin + + site-deploy + maven-changes-plugin - 2.0-beta-2 @@ -362,10 +403,10 @@ - - log4j12.builds - scp://people.apache.org/www/people.apache.org/builds/logging/log4j/${project.version}/ - + + log4j12.builds + scp://people.apache.org/www/people.apache.org/builds/logging/log4j/${project.version}/ + log4j12.website scp://people.apache.org/www/logging.apache.org/log4j/1.2/ diff --git a/examples/xml/org/apache/log4j/xml/examples/XMLSample.java b/src/main/javadoc/org/apache/log4j/xml/examples/XMLSample.java similarity index 100% rename from examples/xml/org/apache/log4j/xml/examples/XMLSample.java rename to src/main/javadoc/org/apache/log4j/xml/examples/XMLSample.java diff --git a/examples/xml/org/apache/log4j/xml/examples/sample1.xml b/src/main/javadoc/org/apache/log4j/xml/examples/sample1.xml similarity index 100% rename from examples/xml/org/apache/log4j/xml/examples/sample1.xml rename to src/main/javadoc/org/apache/log4j/xml/examples/sample1.xml diff --git a/examples/xml/org/apache/log4j/xml/examples/sample2.xml b/src/main/javadoc/org/apache/log4j/xml/examples/sample2.xml similarity index 100% rename from examples/xml/org/apache/log4j/xml/examples/sample2.xml rename to src/main/javadoc/org/apache/log4j/xml/examples/sample2.xml diff --git a/examples/xml/org/apache/log4j/xml/examples/sample3.xml b/src/main/javadoc/org/apache/log4j/xml/examples/sample3.xml similarity index 100% rename from examples/xml/org/apache/log4j/xml/examples/sample3.xml rename to src/main/javadoc/org/apache/log4j/xml/examples/sample3.xml diff --git a/examples/xml/org/apache/log4j/xml/examples/sample4.xml b/src/main/javadoc/org/apache/log4j/xml/examples/sample4.xml similarity index 100% rename from examples/xml/org/apache/log4j/xml/examples/sample4.xml rename to src/main/javadoc/org/apache/log4j/xml/examples/sample4.xml diff --git a/examples/xml/org/apache/log4j/xml/examples/sample5.xml b/src/main/javadoc/org/apache/log4j/xml/examples/sample5.xml similarity index 100% rename from examples/xml/org/apache/log4j/xml/examples/sample5.xml rename to src/main/javadoc/org/apache/log4j/xml/examples/sample5.xml diff --git a/src/main/javadoc/org/apache/log4j/xml/log4j.dtd b/src/main/javadoc/org/apache/log4j/xml/log4j.dtd new file mode 100644 index 0000000000..9527734f7d --- /dev/null +++ b/src/main/javadoc/org/apache/log4j/xml/log4j.dtd @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 5d9dde73e4c0b28cde427f8841664872bdf75052 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 16 May 2007 21:23:03 +0000 Subject: [PATCH 304/342] Bug 37930: Update build.xml, Mac tools.jar fix, mvn manifest fix git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538742 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 41 +++++++++++++++++++++------------------- pom.xml | 56 +++++++++++++++++++++++++++++++++---------------------- 2 files changed, 56 insertions(+), 41 deletions(-) diff --git a/build.xml b/build.xml index 870798fcfb..060ab73692 100644 --- a/build.xml +++ b/build.xml @@ -29,7 +29,9 @@ - + + + @@ -89,9 +91,6 @@ - - - @@ -455,20 +454,12 @@ - - - - - - - - + @@ -495,8 +486,14 @@ ${stem}/or/sax/*.class, ${stem}/or/jms/*.class, ${stem}/config/*.class" - excludes="**/UnitTest**" - manifest="${jar.dest}/manifest.mf"> + excludes="**/UnitTest**"> + +
    + + + +
    +
    @@ -505,15 +502,21 @@ - + - + includes="**/*.java"> + +
    + + + +
    +
    +
    diff --git a/pom.xml b/pom.xml index 9a0cb61352..a5e2505ccc 100644 --- a/pom.xml +++ b/pom.xml @@ -145,9 +145,16 @@ maven-jar-plugin - - true - + + + org.apache.log4j + + log4j + ${project.version} + "Apache Software Foundation" + + + @@ -250,6 +257,13 @@ 3.8.1 test + + sun.jdk + tools + 1.4.2 + system + ${tools.jar} + @@ -298,25 +312,23 @@ - - default-tools.jar + mac - - java.vendor - Sun Microsystems Inc. - + mac - - - sun.jdk - tools - 1.4.2 - system - ${java.home}/../lib/tools.jar - - + + ${java.home}/../Classes/classes.jar + + + default + + true + + + ${java.home}/../lib/tools.jar + + @@ -404,11 +416,11 @@ already has the tools in it. --> - log4j12.builds - scp://people.apache.org/www/people.apache.org/builds/logging/log4j/${project.version}/ + logging.repo + scp://people.apache.org/www/people.apache.org/builds/logging/repo/ - log4j12.website + logging.site scp://people.apache.org/www/logging.apache.org/log4j/1.2/ From 5e365e435f5c10d7a4efbe3873afd5217f888b5a Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 16 May 2007 22:09:22 +0000 Subject: [PATCH 305/342] [maven-release-plugin] prepare release v1_2_15_rc2 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538756 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 59 ++++++++++++++++++--------------------------------------- 1 file changed, 18 insertions(+), 41 deletions(-) diff --git a/pom.xml b/pom.xml index a5e2505ccc..0bbe02c2f6 100644 --- a/pom.xml +++ b/pom.xml @@ -1,29 +1,10 @@ - - + 4.0.0 log4j log4j jar Apache Log4j - 1.2.15-SNAPSHOT + 1.2.15 1.2.15 @@ -70,9 +51,9 @@ - scm:svn:http://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch - scm:svn:https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch - http://svn.apache.org/viewcvs.cgi/logging/log4j/branches/v1_2-branch + scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc2 + scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc2 + http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_15_rc2 Apache Software Foundation @@ -168,10 +149,10 @@ - - - - + + + + @@ -185,7 +166,7 @@ mkdir_tests_output - + @@ -197,7 +178,7 @@ rmdir_tests_output - + @@ -210,10 +191,10 @@ - - - - + + + + @@ -227,12 +208,8 @@ untag-site - - + + @@ -424,4 +401,4 @@ scp://people.apache.org/www/logging.apache.org/log4j/1.2/
    - + \ No newline at end of file From 9f91354ba4c8217a1d0fe2986c49efdc600336c4 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 16 May 2007 22:09:36 +0000 Subject: [PATCH 306/342] [maven-release-plugin] prepare for next development iteration git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@538758 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 0bbe02c2f6..0bb6bc8d2a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ log4j jar Apache Log4j - 1.2.15 + 1.2.15-SNAPSHOT 1.2.15 @@ -51,9 +51,9 @@ - scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc2 - scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc2 - http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_15_rc2 + scm:svn:http://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch + scm:svn:https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch + http://svn.apache.org/viewcvs.cgi/logging/log4j/branches/v1_2-branch Apache Software Foundation From 23989243477ca1194bfec091d64fc944b4b54caa Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 19 May 2007 04:49:55 +0000 Subject: [PATCH 307/342] Bug 37930: Inadvertently removed required mkdir on jar creation git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@539686 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.xml b/build.xml index 060ab73692..528fa14ab7 100644 --- a/build.xml +++ b/build.xml @@ -460,6 +460,7 @@ + @@ -503,6 +504,7 @@ + From 0320569c551391ebec58227fcf7735b8e72844b2 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 5 Jun 2007 21:53:51 +0000 Subject: [PATCH 308/342] Bug 37930: Update INSTALL to reflect Maven build git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@544649 13f79535-47bb-0310-9956-ffa450edef68 --- INSTALL | 88 +++++++++++++++------------------------------------------ 1 file changed, 23 insertions(+), 65 deletions(-) diff --git a/INSTALL b/INSTALL index a6f2c883c4..64e593b591 100644 --- a/INSTALL +++ b/INSTALL @@ -1,3 +1,18 @@ + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + =========== Using log4j @@ -9,10 +24,9 @@ Using log4j PATH_OF_YOUR_CHOICE, untarring the distribution file should create a logging-log4j-VERSION directory, where VERSION is the log4j version number, under PATH_OF_YOUR_CHOICE. We will refer to the - directory PATH_OF_YOUR_CHOICE/logging-log4j-VERSION/ as $LOG4J_HOME/. + directory PATH_OF_YOUR_CHOICE/apache-log4j-VERSION/ as $LOG4J_HOME/. -3) Assuming you are using log4j version 1.2, add - $LOG4J_HOME/dist/lib/log4j-1.2.jar to your CLASSPATH, +3) Add $LOG4J_HOME/log4j-VERSION.jar to your CLASSPATH, 4) You can now test your installation by first compiling the following simple program. @@ -22,7 +36,7 @@ Using log4j public class Hello { - static Logger logger = Logger.getLogger(Hello.class); + private static final Logger logger = Logger.getLogger(Hello.class); public static @@ -48,76 +62,20 @@ JAR files ========= The log4j distribution comes with one jar file: log4j-VERSION.jar -under the LOG4J_HOME/dist/lib/ directory. +under the LOG4J_HOME directory. This jar file contains all the class files of the log4j project, except test cases and classes from the "examples" and "org.apache.log4j.performance" packages. -================== -log4j dependencies -================== - -Log4j targets JDK 1.2 or later with the following additional requirements: - - ---------------------------- - Package org.apache.log4j.xml - ---------------------------- - - The DOMConfigurator is based on the DOM Level 1 API. The - DOMConfigurator.configure(Element) method will work with any - XML parser that will pass it a DOM tree. - - The DOMConfigurator.configure(String filename) method and its variants - require a JAXP compatible XMLparser, for example the Apache Xerces - parser. Compiling the DOMConfigurator requires the presence of a - JAXP parser in the classpath. - - - ------------ - SMTPAppender - ------------ - - The SMTPAppender relies on the JavaMail API. It has been tested with - JavaMail API version 1.2. The JavaMail API requires the - JavaBeans Activation Framework package. You can download the - JavaMail API at: - - http://java.sun.com/products/javamail/ - - and the JavaBeans Activation Framework at: - - http://java.sun.com/beans/glasgow/jaf.html - - ----------- - JMSAppender - ----------- - - The JMSAppender requires the JMS API as well as JNDI. The JMS API - is usually bundled with the products of the vendors listed under - - http://java.sun.com/products/jms/vendors.html - - ----------------------- - JUnit testing framework - ----------------------- - - Log4j uses the JUnit framework version 3.8.1 for internal unit - testing. If you want to compile the source code in the tests/ - directory, then you will need JUnit. JUnit is available from: - - http://www.junit.org ============== Building log4j ============== - -Like most Java applications today, log4j relies on ANT as its build -tool. ANT is available from "http://ant.apache.org/". ANT -requires a build file called build.xml which is part of this -distribution. Required components from other projects are specified in -the build.properties and example of which is supplied in the -build.properties.sample file. + +log4j (as of 1.2.15) is built with Maven 2. To rebuild log4j-VERSION.jar, +place Maven 2 on the PATH and execute "mvn package". + In case of problems send an e-mail note to log4j-user@logging.apache.org. Please do not directly e-mail any From e061512ae90467620044363f41a0ecb51d1c35b6 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 5 Jun 2007 21:55:08 +0000 Subject: [PATCH 309/342] Bug 42257: Add DBAppender related elements to log4j.dtd and change sig of DOMConfigurator.parseElement git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@544650 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 17 +++++++++++++++++ .../org/apache/log4j/xml/DOMConfigurator.java | 11 +++++------ src/main/javadoc/org/apache/log4j/xml/log4j.dtd | 15 +++++++++++++-- .../resources/org/apache/log4j/xml/log4j.dtd | 15 +++++++++++++-- 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 0bb6bc8d2a..dcaf040555 100644 --- a/pom.xml +++ b/pom.xml @@ -1,3 +1,20 @@ + 4.0.0 log4j diff --git a/src/main/java/org/apache/log4j/xml/DOMConfigurator.java b/src/main/java/org/apache/log4j/xml/DOMConfigurator.java index 9bf49e4834..0683dc4897 100644 --- a/src/main/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/main/java/org/apache/log4j/xml/DOMConfigurator.java @@ -959,7 +959,7 @@ public static void setParameter(final Element elem, } /** - * Creates an OptionHandler and processes any nested param elements + * Creates an object and processes any nested param elements * but does not call activateOptions. If the class also supports * UnrecognizedElementParser, the parseUnrecognizedElement method * will be call for any child elements other than param. @@ -972,16 +972,15 @@ public static void setParameter(final Element elem, * @throws Exception thrown if the contain object should be abandoned. * @since 1.2.15 */ - public static OptionHandler parseElement(final Element element, + public static Object parseElement(final Element element, final Properties props, final Class expectedClass) throws Exception { String clazz = subst(element.getAttribute("class"), props); Object instance = OptionConverter.instantiateByClassName(clazz, expectedClass, null); - if (instance instanceof OptionHandler) { - OptionHandler optionHandler = (OptionHandler) instance; - PropertySetter propSetter = new PropertySetter(optionHandler); + if (instance != null) { + PropertySetter propSetter = new PropertySetter(instance); NodeList children = element.getChildNodes(); final int length = children.getLength(); @@ -997,7 +996,7 @@ public static OptionHandler parseElement(final Element element, } } } - return optionHandler; + return instance; } return null; } diff --git a/src/main/javadoc/org/apache/log4j/xml/log4j.dtd b/src/main/javadoc/org/apache/log4j/xml/log4j.dtd index 9527734f7d..78bcafcd7d 100644 --- a/src/main/javadoc/org/apache/log4j/xml/log4j.dtd +++ b/src/main/javadoc/org/apache/log4j/xml/log4j.dtd @@ -44,7 +44,8 @@ element. --> + rollingPolicy?, triggeringPolicy?, connectionSource?, + layout?, filter*, appender-ref*)> > - + + + + + + + + rollingPolicy?, triggeringPolicy?, connectionSource?, + layout?, filter*, appender-ref*)> > - + + + + + + + Date: Tue, 5 Jun 2007 23:26:34 +0000 Subject: [PATCH 310/342] bug 42585: SocketNode can leak Sockets git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@544675 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 3 +- .../java/org/apache/log4j/net/SocketNode.java | 44 ++++++++++++------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 2ab14789e4..03aaa7d5e0 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -21,7 +21,8 @@ - + + SocketNode can leak Sockets. Migrate to Maven based build and documentation. Prepare Maven release bundles. Eclipse compiler warning cleanup. diff --git a/src/main/java/org/apache/log4j/net/SocketNode.java b/src/main/java/org/apache/log4j/net/SocketNode.java index 94d56ca1a8..59edb38a1b 100644 --- a/src/main/java/org/apache/log4j/net/SocketNode.java +++ b/src/main/java/org/apache/log4j/net/SocketNode.java @@ -71,17 +71,19 @@ public void run() { Logger remoteLogger; try { - while(true) { - // read an event from the wire - event = (LoggingEvent) ois.readObject(); - // get a logger from the hierarchy. The name of the logger is taken to be the name contained in the event. - remoteLogger = hierarchy.getLogger(event.getLoggerName()); - //event.logger = remoteLogger; - // apply the logger-level filter - if(event.getLevel().isGreaterOrEqual(remoteLogger.getEffectiveLevel())) { - // finally log the event as if was generated locally - remoteLogger.callAppenders(event); - } + if (ois != null) { + while(true) { + // read an event from the wire + event = (LoggingEvent) ois.readObject(); + // get a logger from the hierarchy. The name of the logger is taken to be the name contained in the event. + remoteLogger = hierarchy.getLogger(event.getLoggerName()); + //event.logger = remoteLogger; + // apply the logger-level filter + if(event.getLevel().isGreaterOrEqual(remoteLogger.getEffectiveLevel())) { + // finally log the event as if was generated locally + remoteLogger.callAppenders(event); + } + } } } catch(java.io.EOFException e) { logger.info("Caught java.io.EOFException closing conneciton."); @@ -92,12 +94,20 @@ public void run() { logger.info("Closing connection."); } catch(Exception e) { logger.error("Unexpected exception. Closing conneciton.", e); - } - - try { - ois.close(); - } catch(Exception e) { - logger.info("Could not close connection.", e); + } finally { + if (ois != null) { + try { + ois.close(); + } catch(Exception e) { + logger.info("Could not close connection.", e); + } + } + if (socket != null) { + try { + socket.close(); + } catch(IOException ex) { + } + } } } } From c7845ac116a5b11189d5a1b1d568110648db1354 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Wed, 6 Jun 2007 13:25:58 +0000 Subject: [PATCH 311/342] Bug 37930: Support cross compilation of NTEventLogAppender.dll git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@544836 13f79535-47bb-0310-9956-ffa450edef68 --- src/ntdll/build.xml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/ntdll/build.xml b/src/ntdll/build.xml index 4fa3a73b20..a4d00a21e9 100755 --- a/src/ntdll/build.xml +++ b/src/ntdll/build.xml @@ -23,14 +23,18 @@ - + + + + + - - - + + + + + ${jni.win32.include.dir}/jni_md.h not found + + - @@ -74,4 +82,4 @@ MinGW toolkit must be on path to build NTEventLogAppender.dll - \ No newline at end of file + From c06aefdf745077e6e9029c14658bd0a024bfd2d6 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 7 Jun 2007 01:44:51 +0000 Subject: [PATCH 312/342] Improved cross-compilation git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@545018 13f79535-47bb-0310-9956-ffa450edef68 --- src/ntdll/build.xml | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/ntdll/build.xml b/src/ntdll/build.xml index a4d00a21e9..414319bc01 100755 --- a/src/ntdll/build.xml +++ b/src/ntdll/build.xml @@ -23,6 +23,13 @@ + + + + + + + @@ -46,19 +53,20 @@ + + + + + + - + -Dclasses.dir=/path/to/log4j/classes must be specified - - - - - ${jni.win32.include.dir}/jni_md.h not found @@ -74,12 +82,15 @@ - - windres could not be found or failed. -MinGW toolkit must be on path to build NTEventLogAppender.dll + + ${mingw-prefix}windres could not be found or failed, NTEventLogAppender.dll build skipped. + + + + ${jni.win32.include.dir}/jni_md.h not found, NTEventLogAppender.dll build skipped. - + From 327683562cde60cdc2f703ae579cb7b642a787c4 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 7 Jun 2007 02:12:16 +0000 Subject: [PATCH 313/342] Bug 37930: Drop -bin from distribution filename git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@545023 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dcaf040555..0b309a43f9 100644 --- a/pom.xml +++ b/pom.xml @@ -266,6 +266,7 @@ src/assembly/bin.xml + false @@ -418,4 +419,4 @@ scp://people.apache.org/www/logging.apache.org/log4j/1.2/ - \ No newline at end of file + From ca99ae1069ab93f4c3f2bde5a89e770bfd5b3850 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 7 Jun 2007 02:54:43 +0000 Subject: [PATCH 314/342] Bug 42611: ERFATestCase fails on some JDK's git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@545028 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 3 ++- tests/src/java/org/apache/log4j/varia/ERFATestCase.java | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 03aaa7d5e0..bdd51a99bb 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -22,6 +22,7 @@ + ERFATestCase fails on some JDK's. SocketNode can leak Sockets. Migrate to Maven based build and documentation. Prepare Maven release bundles. @@ -1754,4 +1755,4 @@ Initial availability on alphaWorks. Refer to the FAQ for the lineage of the package. - \ No newline at end of file + diff --git a/tests/src/java/org/apache/log4j/varia/ERFATestCase.java b/tests/src/java/org/apache/log4j/varia/ERFATestCase.java index e122631b2d..8995fd3c27 100644 --- a/tests/src/java/org/apache/log4j/varia/ERFATestCase.java +++ b/tests/src/java/org/apache/log4j/varia/ERFATestCase.java @@ -27,6 +27,7 @@ import java.io.File; import java.io.IOException; import java.net.Socket; +import java.net.InetAddress; /** * Test of ExternallyRolledFileAppender. @@ -101,6 +102,10 @@ public void testRollover() throws IOException { } catch(SecurityException ex) { return; } + try { + Thread.sleep(100); + } catch(InterruptedException ex) { + } root.addAppender(erfa); From 71c5af767fe064adae0ac4a2482bff3b00c6ffb6 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Tue, 19 Jun 2007 03:57:09 +0000 Subject: [PATCH 315/342] Bug 42694: Typo in log4j.dtd concerning threshold git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@548572 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + src/main/javadoc/org/apache/log4j/xml/log4j.dtd | 5 ++--- src/main/resources/org/apache/log4j/xml/log4j.dtd | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index bdd51a99bb..02380fba58 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -22,6 +22,7 @@ + Typo in log4j.dtd concerning threshold. ERFATestCase fails on some JDK's. SocketNode can leak Sockets. Migrate to Maven based build and documentation. diff --git a/src/main/javadoc/org/apache/log4j/xml/log4j.dtd b/src/main/javadoc/org/apache/log4j/xml/log4j.dtd index 78bcafcd7d..66f8fcb36a 100644 --- a/src/main/javadoc/org/apache/log4j/xml/log4j.dtd +++ b/src/main/javadoc/org/apache/log4j/xml/log4j.dtd @@ -11,9 +11,8 @@ element. --> - - - + + diff --git a/src/main/resources/org/apache/log4j/xml/log4j.dtd b/src/main/resources/org/apache/log4j/xml/log4j.dtd index 78bcafcd7d..66f8fcb36a 100644 --- a/src/main/resources/org/apache/log4j/xml/log4j.dtd +++ b/src/main/resources/org/apache/log4j/xml/log4j.dtd @@ -11,9 +11,8 @@ element. --> - - - + + From c3cab4825000893fe0ac6b7a417bce832643acb8 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 00:24:05 +0000 Subject: [PATCH 316/342] Bug 37930: Reduce size of cross-compiled DLL git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549302 13f79535-47bb-0310-9956-ffa450edef68 --- src/ntdll/build.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ntdll/build.xml b/src/ntdll/build.xml index 414319bc01..b63fa3935d 100755 --- a/src/ntdll/build.xml +++ b/src/ntdll/build.xml @@ -71,6 +71,9 @@ + + + From f4c810c34df67eab9a39ea6ad37c29c55d5a6dea Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 00:25:02 +0000 Subject: [PATCH 317/342] Bug 37930: Omit javadoc and sources jar from distribution and set execute priv for NTEventLogAppender.dll git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549303 13f79535-47bb-0310-9956-ffa450edef68 --- src/assembly/bin.xml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/assembly/bin.xml b/src/assembly/bin.xml index 969ea25828..4090576ec1 100644 --- a/src/assembly/bin.xml +++ b/src/assembly/bin.xml @@ -51,13 +51,14 @@ tests/witness/**
    - - target - . - - log4j*.jar - NTEventLogAppender.dll - - - \ No newline at end of file + + + target/log4j-${project.version}.jar + + + target/NTEventLogAppender.dll + 0755 + + + From fc8cc9500c01041eef298bf021525b5e11def2a6 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 00:48:55 +0000 Subject: [PATCH 318/342] Bug 37930: Update tests/build.xml for Maven and run-tests.bat for new tests git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549310 13f79535-47bb-0310-9956-ffa450edef68 --- tests/build.xml | 5 +- tests/run-tests.bat | 131 ++++++++++++++++++++++++-------------------- 2 files changed, 77 insertions(+), 59 deletions(-) diff --git a/tests/build.xml b/tests/build.xml index e1efacdfdf..527282f372 100644 --- a/tests/build.xml +++ b/tests/build.xml @@ -46,7 +46,6 @@ - @@ -97,6 +96,10 @@ + + + diff --git a/tests/run-tests.bat b/tests/run-tests.bat index 437d1c99c2..504a10593d 100755 --- a/tests/run-tests.bat +++ b/tests/run-tests.bat @@ -1,50 +1,65 @@ -' Batch file for running tests on JDK 1.1 -' -SET CLASSPATH=\java\junit3.8.1\junit.jar;\java\crimson-1.1.3\crimson.jar;\java\jakarta-oro-2.0.8\jakarta-oro-2.0.8.jar;..\dist\classes;classes;..\..\classes;resources;%log4j.jar% -mkdir classes +rem Batch file for running tests on JDK 1.1 +rem +SET CLASSPATH=\java\junit3.8.1\junit.jar;\java\crimson-1.1.3\crimson.jar;\java\jakarta-oro-2.0.8\jakarta-oro-2.0.8.jar;target\classes;..\..\target\classes;resources;%log4j.jar% +mkdir target +mkdir target\classes cd src\java -javac -d ..\..\classes org\apache\log4j\util\SerializationTestHelper.java -javac -d ..\..\classes org\apache\log4j\spi\LoggingEventTest.java -javac -d ..\..\classes org\apache\log4j\LevelTest.java -javac -d ..\..\classes org\apache\log4j\FileAppenderTest.java -javac -d ..\..\classes org\apache\log4j\CoreTestSuite.java -javac -d ..\..\classes org\apache\log4j\util\UnexpectedFormatException.java -javac -d ..\..\classes org\apache\log4j\util\Filter.java -javac -d ..\..\classes org\apache\log4j\util\Compare.java -javac -d ..\..\classes org\apache\log4j\util\ControlFilter.java -javac -d ..\..\classes org\apache\log4j\util\Transformer.java -javac -d ..\..\classes org\apache\log4j\util\LineNumberFilter.java -javac -d ..\..\classes org\apache\log4j\util\AbsoluteDateAndTimeFilter.java -javac -d ..\..\classes org\apache\log4j\MinimumTestCase.java -javac -d ..\..\classes org\apache\log4j\VectorAppender.java -javac -d ..\..\classes org\apache\log4j\LoggerTestCase.java -javac -d ..\..\classes org\apache\log4j\util\ISO8601Filter.java -javac -d ..\..\classes org\apache\log4j\util\SunReflectFilter.java -javac -d ..\..\classes org\apache\log4j\util\JunitTestRunnerFilter.java -javac -d ..\..\classes org\apache\log4j\xml\DOMTestCase.java -javac -d ..\..\classes org\apache\log4j\xml\XLevel.java -javac -d ..\..\classes org\apache\log4j\xml\CustomLevelTestCase.java -javac -d ..\..\classes org\apache\log4j\customLogger\XLogger.java -javac -d ..\..\classes org\apache\log4j\customLogger\XLoggerTestCase.java -javac -d ..\..\classes org\apache\log4j\defaultInit\TestCase1.java -javac -d ..\..\classes org\apache\log4j\defaultInit\TestCase3.java -javac -d ..\..\classes org\apache\log4j\defaultInit\TestCase4.java -javac -d ..\..\classes org\apache\log4j\util\XMLTimestampFilter.java -javac -d ..\..\classes org\apache\log4j\util\XMLLineAttributeFilter.java -javac -d ..\..\classes org\apache\log4j\xml\XMLLayoutTestCase.java -javac -d ..\..\classes org\apache\log4j\AsyncAppenderTestCase.java -javac -d ..\..\classes org\apache\log4j\helpers\OptionConverterTestCase.java -javac -d ..\..\classes org\apache\log4j\helpers\BoundedFIFOTestCase.java -javac -d ..\..\classes org\apache\log4j\helpers\CyclicBufferTestCase.java -javac -d ..\..\classes org\apache\log4j\or\ORTestCase.java -javac -d ..\..\classes org\apache\log4j\varia\LevelMatchFilterTestCase.java -javac -d ..\..\classes org\apache\log4j\helpers\PatternParserTestCase.java -javac -d ..\..\classes org\apache\log4j\util\AbsoluteTimeFilter.java -javac -d ..\..\classes org\apache\log4j\util\RelativeTimeFilter.java -javac -d ..\..\classes org\apache\log4j\PatternLayoutTestCase.java -javac -d ..\..\classes org\apache\log4j\MyPatternParser.java -javac -d ..\..\classes org\apache\log4j\MyPatternLayout.java -javac -d ..\..\classes org\apache\log4j\DRFATestCase.java +javac -d ..\..\target\classes org\apache\log4j\util\SerializationTestHelper.java +javac -d ..\..\target\classes org\apache\log4j\spi\LoggingEventTest.java +javac -d ..\..\target\classes org\apache\log4j\LevelTest.java +javac -d ..\..\target\classes org\apache\log4j\FileAppenderTest.java +javac -d ..\..\target\classes org\apache\log4j\PriorityTest.java +javac -d ..\..\target\classes org\apache\log4j\CategoryTest.java +javac -d ..\..\target\classes org\apache\log4j\LogManagerTest.java +javac -d ..\..\target\classes org\apache\log4j\helpers\LogLogTest.java +javac -d ..\..\target\classes org\apache\log4j\LayoutTest.java +javac -d ..\..\target\classes org\apache\log4j\helpers\DateLayoutTest.java +javac -d ..\..\target\classes org\apache\log4j\TTCCLayoutTest.java +javac -d ..\..\target\classes org\apache\log4j\xml\XMLLayoutTest.java +javac -d ..\..\target\classes org\apache\log4j\HTMLLayoutTest.java +javac -d ..\..\target\classes org\apache\log4j\PatternLayoutTest.java +javac -d ..\..\target\classes org\apache\log4j\spi\ThrowableInformationTest.java +javac -d ..\..\target\classes org\apache\log4j\spi\LocationInfoTest.java +javac -d ..\..\target\classes org\apache\log4j\PropertyConfiguratorTest.java +javac -d ..\..\target\classes org\apache\log4j\CoreTestSuite.java +javac -d ..\..\target\classes org\apache\log4j\util\UnexpectedFormatException.java +javac -d ..\..\target\classes org\apache\log4j\util\Filter.java +javac -d ..\..\target\classes org\apache\log4j\util\Compare.java +javac -d ..\..\target\classes org\apache\log4j\util\ControlFilter.java +javac -d ..\..\target\classes org\apache\log4j\util\Transformer.java +javac -d ..\..\target\classes org\apache\log4j\util\LineNumberFilter.java +javac -d ..\..\target\classes org\apache\log4j\util\AbsoluteDateAndTimeFilter.java +javac -d ..\..\target\classes org\apache\log4j\MinimumTestCase.java +javac -d ..\..\target\classes org\apache\log4j\VectorAppender.java +javac -d ..\..\target\classes org\apache\log4j\LoggerTestCase.java +javac -d ..\..\target\classes org\apache\log4j\util\ISO8601Filter.java +javac -d ..\..\target\classes org\apache\log4j\util\SunReflectFilter.java +javac -d ..\..\target\classes org\apache\log4j\util\JunitTestRunnerFilter.java +javac -d ..\..\target\classes org\apache\log4j\xml\DOMTestCase.java +javac -d ..\..\target\classes org\apache\log4j\xml\XLevel.java +javac -d ..\..\target\classes org\apache\log4j\xml\CustomLevelTestCase.java +javac -d ..\..\target\classes org\apache\log4j\customLogger\XLogger.java +javac -d ..\..\target\classes org\apache\log4j\customLogger\XLoggerTestCase.java +javac -d ..\..\target\classes org\apache\log4j\defaultInit\TestCase1.java +javac -d ..\..\target\classes org\apache\log4j\defaultInit\TestCase3.java +javac -d ..\..\target\classes org\apache\log4j\defaultInit\TestCase4.java +javac -d ..\..\target\classes org\apache\log4j\util\XMLTimestampFilter.java +javac -d ..\..\target\classes org\apache\log4j\util\XMLLineAttributeFilter.java +javac -d ..\..\target\classes org\apache\log4j\xml\XMLLayoutTestCase.java +javac -d ..\..\target\classes org\apache\log4j\AsyncAppenderTestCase.java +javac -d ..\..\target\classes org\apache\log4j\helpers\OptionConverterTestCase.java +javac -d ..\..\target\classes org\apache\log4j\helpers\BoundedFIFOTestCase.java +javac -d ..\..\target\classes org\apache\log4j\helpers\CyclicBufferTestCase.java +javac -d ..\..\target\classes org\apache\log4j\or\ORTestCase.java +javac -d ..\..\target\classes org\apache\log4j\varia\LevelMatchFilterTestCase.java +javac -d ..\..\target\classes org\apache\log4j\helpers\PatternParserTestCase.java +javac -d ..\..\target\classes org\apache\log4j\util\AbsoluteTimeFilter.java +javac -d ..\..\target\classes org\apache\log4j\util\RelativeTimeFilter.java +javac -d ..\..\target\classes org\apache\log4j\PatternLayoutTestCase.java +javac -d ..\..\target\classes org\apache\log4j\MyPatternParser.java +javac -d ..\..\target\classes org\apache\log4j\MyPatternLayout.java +javac -d ..\..\target\classes org\apache\log4j\VectorErrorHandler.java +javac -d ..\..\target\classes org\apache\log4j\DRFATestCase.java cd ..\.. mkdir output java junit.textui.TestRunner org.apache.log4j.CoreTestSuite @@ -53,23 +68,23 @@ java junit.textui.TestRunner org.apache.log4j.LoggerTestCase java junit.textui.TestRunner org.apache.log4j.xml.DOMTestCase java junit.textui.TestRunner org.apache.log4j.xml.CustomLevelTestCase java junit.textui.TestRunner org.apache.log4j.customLogger.XLoggerTestCase -del classes\log4j.xml -del classes\log4j.properties +del target\classes\log4j.xml +del target\classes\log4j.properties java junit.textui.TestRunner org.apache.log4j.defaultInit.TestCase1 -copy input\xml\defaultInit.xml classes\log4j.xml +copy input\xml\defaultInit.xml target\classes\log4j.xml java junit.textui.TestRunner org.apache.log4j.defaultInit.TestCase2 -del classes\log4j.xml -copy input\xml\defaultInit.xml classes\log4j.xml +del target\classes\log4j.xml +copy input\xml\defaultInit.xml target\classes\log4j.xml java -Dlog4j.defaultInitOverride=true junit.textui.TestRunner org.apache.log4j.defaultInit.TestCase1 -del classes\log4j.xml -copy input\defaultInit3.properties classes\log4j.properties +del target\classes\log4j.xml +copy input\defaultInit3.properties target\classes\log4j.properties java junit.textui.TestRunner org.apache.log4j.defaultInit.TestCase3 -del classes\log4j.properties -copy input\xml\defaultInit.xml classes\log4j.xml -copy input\defaultInit3.properties classes\log4j.properties +del target\classes\log4j.properties +copy input\xml\defaultInit.xml target\classes\log4j.xml +copy input\defaultInit3.properties target\classes\log4j.properties java junit.textui.TestRunner org.apache.log4j.defaultInit.TestCase4 -del classes\log4j.xml -del classes\log4j.properties +del target\classes\log4j.xml +del target\classes\log4j.properties java junit.textui.TestRunner org.apache.log4j.xml.XMLLayoutTestCase java junit.textui.TestRunner org.apache.log4j.AsyncAppenderTestCase java junit.textui.TestRunner org.apache.log4j.helpers.OptionConverterTestCase From 13251c6ab2721a779a583c09a9bde7efe7d1fba2 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 01:11:03 +0000 Subject: [PATCH 319/342] Bug 37930: Update BUILD-INFO.txt git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549313 13f79535-47bb-0310-9956-ffa450edef68 --- BUILD-INFO.txt | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/BUILD-INFO.txt b/BUILD-INFO.txt index 94e4518365..253c8fab70 100644 --- a/BUILD-INFO.txt +++ b/BUILD-INFO.txt @@ -1,26 +1,34 @@ -This is the build information for the current log4j release. It contains the -versions of tools and jars used to build this version of the log4j library. +This is a detailed instruction to reproduce the log4j distribution +either to verify that the release is reproducable or to prepare +a hot-fix. -Maven - 2.0.6; Available from http://maven.apache.org -MinGW - MinGW-3.1.0-1.exe; Available from http://mingw.sourceforge.net/downloads.html (used to build NTEventLogAppender.dll) -JDK - jdk1.4.2_13; Available from http://java.sun.com/products/archive/ -Windows 2000 SP4 +Install VMWare Player or Workstation appropriate for machine. -JMX 1.2.1 Reference Implementation must be downloaded -from http://java.sun.com/products/JavaManagement/download.html -and lib/jmxtools.jar and lib/jmxri.jar installed with the -following commands: +Download Ubuntu-6.06-1 desktop from http://www.vmware.com/vmtn/appliances/directory/ubuntu.html - mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools \ - -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/jmxtools.jar - - mvn install:install-file -DgroupId=com.sun.jmx -DartifactId=jmxri \ - -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/jmxri.jar +Launch Ubuntu 6.06-1 in VMWare Player (user name and password are ubuntu) -JMS 1.1 must be downloaded from http://java.sun.com/products/jms/docs.html +Launch Synaptics Package Manager (System > Administration > Synaptic Package Manager), select all available repositories (Settings > Repositories), press Reload button to update list of available packages. Select the following packages for installation: Subversion, mingw32, sun-java6-jdk. Press Apply to install. Exit Synaptics. - mvn install:install-file -DgroupId=javax.jms -DartifactId=jms \ - -Dversion=1.1 -Dpackaging=jar -Dfile=/path/to/jms.jar +Download Maven-2.0.6 from http://maven.apache.org +Download JMX 1.2.1 Reference Implementation from + http://java.sun.com/products/JavaManagement/download.html +Download JMS 1.1 from http://java.sun.com/products/jms/docs.html +Unzip all in ~ +Copy include/win32/jni_md.h from a Windows JDK to ~ +From a command prompt: +$ export JAVA_HOME=/usr/lib/jvm/java-6-sun +$ export PATH=$JAVA_HOME/bin:/home/ubuntu/maven-2.0.6/bin:$PATH +$ export JNI_WIN32_INCLUDE_DIR=/home/ubuntu +$ svn co https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15 log4j +$ mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools \ + -Dversion=1.2.1 -Dpackaging=jar -Dfile=~/jmx-1_2_1-bin/lib/jmxtools.jar +$ mvn install:install-file -DgroupId=com.sun.jmx -DartifactId=jmxri \ + -Dversion=1.2.1 -Dpackaging=jar -Dfile=~/jmx-1_2_1-bin/lib/jmxri.jar +$ mvn install:install-file -DgroupId=javax.jms -DartifactId=jms \ + -Dversion=1.1 -Dpackaging=jar -Dfile=~/jms1.1/lib/jms.jar +$ cd log4j +$ mvn site assembly:assembly From b31e7d811c57607bce55450af303b141f74436e9 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 01:34:24 +0000 Subject: [PATCH 320/342] Bug 37930: Stab at full release automation git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549319 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 0b309a43f9..87cff541d0 100644 --- a/pom.xml +++ b/pom.xml @@ -392,6 +392,8 @@ maven-release-plugin site-deploy + assembly:assembly + deploy From bf68ccb7cc781f2d8931eda73507b0339e3dc5b0 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 01:36:54 +0000 Subject: [PATCH 321/342] [maven-release-plugin] prepare release v1_2_15_rc3 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549320 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 87cff541d0..0d21c22a35 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ log4j jar Apache Log4j - 1.2.15-SNAPSHOT + 1.2.15 1.2.15 @@ -68,9 +68,9 @@ - scm:svn:http://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch - scm:svn:https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch - http://svn.apache.org/viewcvs.cgi/logging/log4j/branches/v1_2-branch + scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc3 + scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc3 + http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_15_rc3 Apache Software Foundation From 8349f3022f447eb90e19f8c8686bf000c8f6bd1d Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 01:37:02 +0000 Subject: [PATCH 322/342] [maven-release-plugin] prepare for next development iteration git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549322 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 0d21c22a35..866cff0c19 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ log4j jar Apache Log4j - 1.2.15 + 1.2.16-SNAPSHOT 1.2.15 @@ -68,9 +68,9 @@ - scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc3 - scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc3 - http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_15_rc3 + scm:svn:http://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch + scm:svn:https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch + http://svn.apache.org/viewcvs.cgi/logging/log4j/branches/v1_2-branch Apache Software Foundation From bb1124530c41ed8e5625dd7cde4bbbfe65a75e17 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 20:54:11 +0000 Subject: [PATCH 323/342] Bug 37930: Remove C artifacts from log4j.jar git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549608 13f79535-47bb-0310-9956-ffa450edef68 --- src/ntdll/build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ntdll/build.xml b/src/ntdll/build.xml index b63fa3935d..3a26b86c20 100755 --- a/src/ntdll/build.xml +++ b/src/ntdll/build.xml @@ -19,7 +19,7 @@ - + From db27e7596dfaf85ac16757f68f570e267713930e Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 20:54:51 +0000 Subject: [PATCH 324/342] Bug 37930: Update build date (speculative) git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549609 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 02380fba58..a78b9f7dcb 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -21,7 +21,7 @@ - + Typo in log4j.dtd concerning threshold. ERFATestCase fails on some JDK's. SocketNode can leak Sockets. From adb6d9dd1408c2167f97d23589e650ac8d4617da Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 20:55:23 +0000 Subject: [PATCH 325/342] Bug 37930: Add Maven settings.xml info git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549610 13f79535-47bb-0310-9956-ffa450edef68 --- BUILD-INFO.txt | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/BUILD-INFO.txt b/BUILD-INFO.txt index 253c8fab70..01310b7371 100644 --- a/BUILD-INFO.txt +++ b/BUILD-INFO.txt @@ -32,3 +32,27 @@ $ mvn install:install-file -DgroupId=javax.jms -DartifactId=jms \ -Dversion=1.1 -Dpackaging=jar -Dfile=~/jms1.1/lib/jms.jar $ cd log4j $ mvn site assembly:assembly + + +If you intended to deploy jars to the repo or update the site, +you need to copy your private keys for people.apache.org +over to ~/.ssh and update ~/maven-2.0.6/conf/settings.xml +to specify user name and key location. + + + logging.repo + USERNAME for people.apache.org + /home/ubuntu/.ssh/id_rsa + + + + logging.site + USERNAME for people.apache.org + /home/ubuntu/.ssh/id_rsa + + + +You should test your ssh connection to people.apache.org before +attempting a deployment like: + +$ ssh -l USERNAME people.apache.org From 3872fb4390e8429c4640c3b45d420379986ff36b Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 20:56:12 +0000 Subject: [PATCH 326/342] Bug 37930: Revert back to 1.2.15 snapshot and simplify release goals git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549611 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 866cff0c19..0b309a43f9 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ log4j jar Apache Log4j - 1.2.16-SNAPSHOT + 1.2.15-SNAPSHOT 1.2.15 @@ -392,8 +392,6 @@ maven-release-plugin site-deploy - assembly:assembly - deploy From 4740703d823fbb1510a9fce36ea7ac6dbe899c99 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 22:12:45 +0000 Subject: [PATCH 327/342] Bug 37930: Update clirr task for Maven build git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549629 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 34 ++++++++++++++++++++-------------- pom.xml | 14 ++++++++++++++ 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/build.xml b/build.xml index 528fa14ab7..7417354b9b 100644 --- a/build.xml +++ b/build.xml @@ -613,32 +613,38 @@ - -Dclirr-core.jar=PATH must be specified. - -Dbcel.jar=PATH must be specified. - -Dreference.jar=PATH must be specified. + + + + clirr-core-${clirr.version}.jar not in maven repo. Run mvn clirr:check to download. + + + + bcel-${bcel.version}.jar not in maven repo. Run mvn clirr:check to download. + + + + reference-${reference.version}.jar not in maven repo. Run mvn clirr:check to download. - - - - + + + + - + - - - + + + - diff --git a/pom.xml b/pom.xml index 0b309a43f9..15a2dc8604 100644 --- a/pom.xml +++ b/pom.xml @@ -297,6 +297,20 @@ + + + org.codehaus.mojo + clirr-maven-plugin + + 1.2.14 + + tests/src/java From 85beae5406d218411db94cb4823347a2f0513360 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 21 Jun 2007 22:23:21 +0000 Subject: [PATCH 328/342] Bug 37930: Update clirr task for Maven build git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@549634 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 7417354b9b..dc1467eca2 100644 --- a/build.xml +++ b/build.xml @@ -624,7 +624,7 @@ - reference-${reference.version}.jar not in maven repo. Run mvn clirr:check to download. + log4j-${reference.version}.jar not in maven repo. Run mvn clirr:check to download. From 2f1b12d4c01005f951e42196bce31d9f52659ce4 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 28 Jun 2007 01:29:56 +0000 Subject: [PATCH 329/342] Bug 40951: Update release date in changes.xml git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@551420 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index a78b9f7dcb..46dd0de525 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -21,7 +21,7 @@ - + Typo in log4j.dtd concerning threshold. ERFATestCase fails on some JDK's. SocketNode can leak Sockets. From 6e7c711d7d06a469ccb00f96a17f683312ecf8b9 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 28 Jun 2007 01:34:17 +0000 Subject: [PATCH 330/342] [maven-release-plugin] prepare release v1_2_15_rc4 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@551421 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 15a2dc8604..e289f11059 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ log4j jar Apache Log4j - 1.2.15-SNAPSHOT + 1.2.15 1.2.15 @@ -68,9 +68,9 @@ - scm:svn:http://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch - scm:svn:https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch - http://svn.apache.org/viewcvs.cgi/logging/log4j/branches/v1_2-branch + scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc4 + scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc4 + http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_15_rc4 Apache Software Foundation From aecb89d83dcb52708a3d9d5d8be9c31600d573e4 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 28 Jun 2007 01:34:24 +0000 Subject: [PATCH 331/342] [maven-release-plugin] prepare for next development iteration git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@551423 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index e289f11059..8b6b8eeaa3 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ log4j jar Apache Log4j - 1.2.15 + 1.2.16-SNAPSHOT 1.2.15 @@ -68,9 +68,9 @@ - scm:svn:http://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc4 - scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc4 - http://svn.apache.org/viewcvs.cgi/logging/log4j/tags/v1_2_15_rc4 + scm:svn:http://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch + scm:svn:https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch + http://svn.apache.org/viewcvs.cgi/logging/log4j/branches/v1_2-branch Apache Software Foundation From 73425454832de2c2d3408504afac2458a32c8ffb Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 21 Jul 2007 00:56:22 +0000 Subject: [PATCH 332/342] Bug 37930: web site staging to SVN repo git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@558207 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 34 ++++++++++++++++++++++++++++++++++ pom.xml | 29 ++++++++++++++++++++++++++++- src/site/apt/publications.apt | 2 -- src/site/apt/roadmap.apt | 2 -- src/site/site.xml | 11 +++++++---- 5 files changed, 69 insertions(+), 9 deletions(-) diff --git a/build.xml b/build.xml index dc1467eca2..c6820ca81e 100644 --- a/build.xml +++ b/build.xml @@ -104,6 +104,12 @@ + + + + + + @@ -796,5 +802,33 @@ tablength="3"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml index 8b6b8eeaa3..6026b8c30a 100644 --- a/pom.xml +++ b/pom.xml @@ -227,6 +227,33 @@ + + + + + + + run + + + + post-site + post-site + + + + + + + run + + + + site-deploy + site-deploy + + + @@ -430,7 +457,7 @@ logging.site - scp://people.apache.org/www/logging.apache.org/log4j/1.2/ + scp://localhost/${user.dir}/target/site-deploy diff --git a/src/site/apt/publications.apt b/src/site/apt/publications.apt index 46b1bfddbe..2a7b7989f6 100644 --- a/src/site/apt/publications.apt +++ b/src/site/apt/publications.apt @@ -15,9 +15,7 @@ ------ log4j 1.2 Publications ------ - Curt Arnold ------ - 8 May 2007 ------ diff --git a/src/site/apt/roadmap.apt b/src/site/apt/roadmap.apt index 247c7cc155..84f712d6c3 100644 --- a/src/site/apt/roadmap.apt +++ b/src/site/apt/roadmap.apt @@ -15,9 +15,7 @@ ------ log4j 1.2 Roadmap ------ - Curt Arnold ------ - 8 May 2007 ------ log4j 1.2 Roadmap diff --git a/src/site/site.xml b/src/site/site.xml index abaae26f26..69a565a5b3 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -62,12 +62,15 @@ +
    -
    - - - + + + + + + From bf5cd9cc3193157ef6b270b5ce5d88b090db2923 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 21 Jul 2007 00:58:55 +0000 Subject: [PATCH 333/342] Bug 37930: web site staging to SVN repo git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@558212 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index c6820ca81e..937bfeff86 100644 --- a/build.xml +++ b/build.xml @@ -106,7 +106,7 @@ - + From bb03a751bd851fb258dfef921b0ea06c28a3d825 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 21 Jul 2007 17:13:42 +0000 Subject: [PATCH 334/342] Bug 37930: Set mime-type on staged content git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@558354 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 35 +++++++++++++++++++++++++++++++++-- pom.xml | 5 +++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/build.xml b/build.xml index 937bfeff86..7856a6940f 100644 --- a/build.xml +++ b/build.xml @@ -818,17 +818,48 @@ + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + - diff --git a/pom.xml b/pom.xml index 6026b8c30a..50e8b61eb7 100644 --- a/pom.xml +++ b/pom.xml @@ -267,6 +267,11 @@ ant-nodeps 1.6.5 + + ant-contrib + ant-contrib + 1.0b2 + ant ant-junit From 8deee164104ff92d472b0b7b4688adf28be340f7 Mon Sep 17 00:00:00 2001 From: Scott Deboy Date: Tue, 7 Aug 2007 06:49:24 +0000 Subject: [PATCH 335/342] - added logger.dtd to support processing of java.util.logging dtd-formatted events - added locationInfo support to multicastappender (note: no support for MDC or event properties in XMLLayout/1.2 log4j.dtd, so application/hostname properties won't be sent for udp/multicastappender) - updated logfilepatternreceiver to support tailing over VFS (VFSlogfilepatternreceiver commit will follow shortly) tested udpappender/receiver, socketappender/receiver, logfilepatternreceiver, xmlsocketreceiver receiving events from java.util.logging sockethandler git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@563405 13f79535-47bb-0310-9956-ffa450edef68 --- .../resources/org/apache/log4j/xml/logger.dtd | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/main/resources/org/apache/log4j/xml/logger.dtd diff --git a/src/main/resources/org/apache/log4j/xml/logger.dtd b/src/main/resources/org/apache/log4j/xml/logger.dtd new file mode 100644 index 0000000000..d5f40b78e7 --- /dev/null +++ b/src/main/resources/org/apache/log4j/xml/logger.dtd @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 5777e4c72d17d3c01842e72b93102040f2d7cf86 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 9 Aug 2007 21:51:50 +0000 Subject: [PATCH 336/342] Bug 42257: Pass unrecognized element not parent to parseUnrecognizedElement git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@564397 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/log4j/xml/DOMConfigurator.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/log4j/xml/DOMConfigurator.java b/src/main/java/org/apache/log4j/xml/DOMConfigurator.java index 0683dc4897..15b04661da 100644 --- a/src/main/java/org/apache/log4j/xml/DOMConfigurator.java +++ b/src/main/java/org/apache/log4j/xml/DOMConfigurator.java @@ -328,7 +328,7 @@ void parseErrorHandler(Element element, Appender appender) { Logger root = repository.getRootLogger(); eh.setLogger(root); } else { - quietParseUnrecognizedElement(eh, element, props); + quietParseUnrecognizedElement(eh, currentElement, props); } } } @@ -359,7 +359,7 @@ void parseFilters(Element element, Appender appender) { if(tagName.equals(PARAM_TAG)) { setParameter(currentElement, propSetter); } else { - quietParseUnrecognizedElement(filter, element, props); + quietParseUnrecognizedElement(filter, currentElement, props); } } } @@ -451,7 +451,7 @@ void parseCategoryFactory(Element factoryElement) { if (currentElement.getTagName().equals(PARAM_TAG)) { setParameter(currentElement, propSetter); } else { - quietParseUnrecognizedElement(factory, factoryElement, props); + quietParseUnrecognizedElement(factory, currentElement, props); } } } @@ -515,7 +515,7 @@ void parseChildrenOfLoggerElement(Element catElement, } else if(tagName.equals(PARAM_TAG)) { setParameter(currentElement, propSetter); } else { - quietParseUnrecognizedElement(cat, catElement, props); + quietParseUnrecognizedElement(cat, currentElement, props); } } } @@ -545,7 +545,7 @@ Layout parseLayout (Element layout_element) { if(tagName.equals(PARAM_TAG)) { setParameter(currentElement, propSetter); } else { - parseUnrecognizedElement(instance, layout_element, props); + parseUnrecognizedElement(instance, currentElement, props); } } } From 87b2904ebfab03c2a2f2901adbef1c8f2befb8da Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Thu, 9 Aug 2007 22:02:51 +0000 Subject: [PATCH 337/342] Bug 43078: Optionally render MDC content in XMLLayout git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@564399 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../java/org/apache/log4j/xml/XMLLayout.java | 43 ++++++++++++++- .../resources/org/apache/log4j/xml/log4j.dtd | 31 +++++++++-- .../log4j/util/JunitTestRunnerFilter.java | 5 ++ .../apache/log4j/xml/XMLLayoutTestCase.java | 53 +++++++++++++++++++ tests/witness/xmlLayout.mdc.1 | 8 +++ tests/witness/xmlLayout.mdc.2 | 8 +++ 7 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 tests/witness/xmlLayout.mdc.1 create mode 100644 tests/witness/xmlLayout.mdc.2 diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 46dd0de525..4883805e9c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -22,6 +22,7 @@ + Optionally render MDC content in XMLLayout Typo in log4j.dtd concerning threshold. ERFATestCase fails on some JDK's. SocketNode can leak Sockets. diff --git a/src/main/java/org/apache/log4j/xml/XMLLayout.java b/src/main/java/org/apache/log4j/xml/XMLLayout.java index b83f5dcb10..476ffc4518 100644 --- a/src/main/java/org/apache/log4j/xml/XMLLayout.java +++ b/src/main/java/org/apache/log4j/xml/XMLLayout.java @@ -24,6 +24,9 @@ import org.apache.log4j.spi.LocationInfo; import org.apache.log4j.spi.LoggingEvent; +import java.util.Set; +import java.util.Arrays; + /** * The output of the XMLLayout consists of a series of log4j:event * elements as defined in the LocationInfo option takes a boolean value. By default, @@ -86,7 +90,23 @@ public void setLocationInfo(boolean flag) { public boolean getLocationInfo() { return locationInfo; } - + + /** + * Sets whether MDC key-value pairs should be output, default false. + * @param flag new value. + */ + public void setProperties(final boolean flag) { + properties = flag; + } + + /** + * Gets whether MDC key-value pairs should be output. + * @return true if MDC key-value pairs are output. + */ + public boolean getProperties() { + return properties; + } + /** No options to activate. */ public void activateOptions() { } @@ -152,6 +172,27 @@ public String format(LoggingEvent event) { buf.append(locationInfo.getLineNumber()); buf.append("\"/>\r\n"); } + + if (properties) { + Set keySet = event.getPropertyKeySet(); + if (keySet.size() > 0) { + buf.append("\r\n"); + Object[] keys = keySet.toArray(); + Arrays.sort(keys); + for (int i = 0; i < keys.length; i++) { + String key = keys[i].toString(); + Object val = event.getMDC(key); + if (val != null) { + buf.append("\r\n"); + } + } + buf.append("\r\n"); + } + } buf.append("\r\n\r\n"); diff --git a/src/main/resources/org/apache/log4j/xml/log4j.dtd b/src/main/resources/org/apache/log4j/xml/log4j.dtd index 66f8fcb36a..63d28c990f 100644 --- a/src/main/resources/org/apache/log4j/xml/log4j.dtd +++ b/src/main/resources/org/apache/log4j/xml/log4j.dtd @@ -1,4 +1,20 @@ + @@ -137,12 +153,12 @@ element. --> @@ -177,7 +193,7 @@ element. --> + log4j:locationInfo?, log4j:properties?) > level CDATA #REQUIRED thread CDATA #REQUIRED timestamp CDATA #REQUIRED + time CDATA #IMPLIED > @@ -199,3 +216,11 @@ element. --> file CDATA #REQUIRED line CDATA #REQUIRED > + + + + + diff --git a/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java b/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java index 43214d7791..dbdd3dcdf2 100644 --- a/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java +++ b/tests/src/java/org/apache/log4j/util/JunitTestRunnerFilter.java @@ -40,6 +40,11 @@ public String filter(String in) { "/at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner/", in)) { return null; + } else if ( + util.match( + "/at com.intellij/", + in)) { + return null; } else if (in.indexOf("at junit.") >= 0 && in.indexOf("ui.TestRunner") >= 0) { return null; } else if (in.indexOf("org.apache.maven") >= 0) { diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java index a68b2267a3..e76acd6b19 100644 --- a/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTestCase.java @@ -23,6 +23,7 @@ import org.apache.log4j.FileAppender; import org.apache.log4j.Level; import org.apache.log4j.Logger; +import org.apache.log4j.MDC; import org.apache.log4j.util.Compare; import org.apache.log4j.util.Filter; import org.apache.log4j.util.JunitTestRunnerFilter; @@ -32,6 +33,8 @@ import org.apache.log4j.util.XMLLineAttributeFilter; import org.apache.log4j.util.XMLTimestampFilter; +import java.util.Hashtable; + public class XMLLayoutTestCase extends TestCase { static String TEMP = "output/temp"; @@ -138,6 +141,54 @@ public void testNull() throws Exception { new SunReflectFilter()}); assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.null")); } + + /** + * Tests the format of the MDC portion of the layout to ensure + * the key-value pairs we put in turn up in the output file. + * @throws Exception + */ + public void testMDC() throws Exception { + XMLLayout xmlLayout = new XMLLayout(); + xmlLayout.setProperties(true); + root.addAppender(new FileAppender(xmlLayout, TEMP, false)); + + Hashtable context = MDC.getContext(); + if (context != null) { + context.clear(); + } + MDC.put("key1", "val1"); + MDC.put("key2", "val2"); + + logger.debug("Hello"); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { new LineNumberFilter(), + new JunitTestRunnerFilter(), + new XMLTimestampFilter()}); + assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.mdc.1")); + } + + public void testMDCEscaped() throws Exception { + XMLLayout xmlLayout = new XMLLayout(); + xmlLayout.setProperties(true); + root.addAppender(new FileAppender(xmlLayout, TEMP, false)); + + Hashtable context = MDC.getContext(); + if (context != null) { + context.clear(); + } + MDC.put("blahAttribute", ""); + MDC.put("", "blahValue"); + + logger.debug("Hello"); + Transformer.transform( + TEMP, FILTERED, + new Filter[] { new LineNumberFilter(), + new JunitTestRunnerFilter(), + new XMLTimestampFilter() }); + assertTrue(Compare.compare(FILTERED, "witness/xmlLayout.mdc.2")); + } + void common() { String oldThreadName = Thread.currentThread().getName(); @@ -182,6 +233,8 @@ public static Test suite() { suite.addTest(new XMLLayoutTestCase("locationInfo")); suite.addTest(new XMLLayoutTestCase("testCDATA")); suite.addTest(new XMLLayoutTestCase("testNull")); + suite.addTest(new XMLLayoutTestCase("testMDC")); + suite.addTest(new XMLLayoutTestCase("testMDCEscaped")); return suite; } diff --git a/tests/witness/xmlLayout.mdc.1 b/tests/witness/xmlLayout.mdc.1 new file mode 100644 index 0000000000..2dfe4ef8f7 --- /dev/null +++ b/tests/witness/xmlLayout.mdc.1 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/witness/xmlLayout.mdc.2 b/tests/witness/xmlLayout.mdc.2 new file mode 100644 index 0000000000..d382c4c43f --- /dev/null +++ b/tests/witness/xmlLayout.mdc.2 @@ -0,0 +1,8 @@ + + + + + + + + From cb2d874d82a5ffb5435778d2869d827e7fca9b7c Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 10 Aug 2007 22:05:16 +0000 Subject: [PATCH 338/342] Bug 34875: XML and HTMLLayout do not always escape special characters git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@564779 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../java/org/apache/log4j/HTMLLayout.java | 16 ++- .../org/apache/log4j/helpers/Transform.java | 77 ++++++----- .../java/org/apache/log4j/xml/XMLLayout.java | 12 +- .../java/org/apache/log4j/HTMLLayoutTest.java | 70 +++++++++- .../org/apache/log4j/xml/XMLLayoutTest.java | 125 +++++++++++++++++- 6 files changed, 246 insertions(+), 55 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 4883805e9c..40a489f4ab 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -22,6 +22,7 @@ + XML and HTMLLayout do not always escape special characters. Optionally render MDC content in XMLLayout Typo in log4j.dtd concerning threshold. ERFATestCase fails on some JDK's. diff --git a/src/main/java/org/apache/log4j/HTMLLayout.java b/src/main/java/org/apache/log4j/HTMLLayout.java index 238dd41d9c..1f3f4fdb98 100644 --- a/src/main/java/org/apache/log4j/HTMLLayout.java +++ b/src/main/java/org/apache/log4j/HTMLLayout.java @@ -135,27 +135,29 @@ String format(LoggingEvent event) { sbuf.append(event.timeStamp - LoggingEvent.getStartTime()); sbuf.append("" + Layout.LINE_SEP); - sbuf.append(""); - sbuf.append(Transform.escapeTags(event.getThreadName())); + String escapedThread = Transform.escapeTags(event.getThreadName()); + sbuf.append(""); + sbuf.append(escapedThread); sbuf.append("" + Layout.LINE_SEP); sbuf.append(""); if (event.getLevel().equals(Level.DEBUG)) { sbuf.append(""); - sbuf.append(event.getLevel()); + sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel()))); sbuf.append(""); } else if(event.getLevel().isGreaterOrEqual(Level.WARN)) { sbuf.append(""); - sbuf.append(event.getLevel()); + sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel()))); sbuf.append(""); } else { - sbuf.append(event.getLevel()); + sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel()))); } sbuf.append("" + Layout.LINE_SEP); - sbuf.append(""); - sbuf.append(Transform.escapeTags(event.getLoggerName())); + String escapedLogger = Transform.escapeTags(event.getLoggerName()); + sbuf.append(""); + sbuf.append(escapedLogger); sbuf.append("" + Layout.LINE_SEP); if(locationInfo) { diff --git a/src/main/java/org/apache/log4j/helpers/Transform.java b/src/main/java/org/apache/log4j/helpers/Transform.java index 9299bd0504..7626e71fb9 100644 --- a/src/main/java/org/apache/log4j/helpers/Transform.java +++ b/src/main/java/org/apache/log4j/helpers/Transform.java @@ -33,18 +33,23 @@ public class Transform { /** * This method takes a string which may contain HTML tags (ie, - * <b>, <table>, etc) and replaces any '<' and '>' + * <b>, <table>, etc) and replaces any + * '<', '>' , '&' or '"' * characters with respective predefined entity references. * * @param input The text to be converted. - * @return The input string with the characters '<' and '>' replaced with - * &lt; and &gt; respectively. + * @return The input string with the special characters replaced. * */ - static public String escapeTags(String input) { - //Check if the string is null or zero length -- if so, return - //what was sent in. + static public String escapeTags(final String input) { + //Check if the string is null, zero length or devoid of special characters + // if so, return what was sent in. - if( input == null || input.length() == 0 ) { + if(input == null + || input.length() == 0 + || (input.indexOf('"') == -1 && + input.indexOf('&') == -1 && + input.indexOf('<') == -1 && + input.indexOf('>') == -1)) { return input; } @@ -57,12 +62,18 @@ static public String escapeTags(String input) { int len = input.length(); for(int i=0; i < len; i++) { ch = input.charAt(i); - if(ch == '<') { - buf.append("<"); + if (ch > '>') { + buf.append(ch); + } else if(ch == '<') { + buf.append("<"); } else if(ch == '>') { - buf.append(">"); + buf.append(">"); + } else if(ch == '&') { + buf.append("&"); + } else if(ch == '"') { + buf.append("""); } else { - buf.append(ch); + buf.append(ch); } } return buf.toString(); @@ -77,30 +88,26 @@ static public String escapeTags(String input) { * section are the responsibility of the calling method. * @param str The String that is inserted into an existing CDATA Section within buf. * */ - static public void appendEscapingCDATA(StringBuffer buf, String str) { - if(str == null) { - buf.append(""); - return; - } - - int end = str.indexOf(CDATA_END); - if (end < 0) { - buf.append(str); - return; - } - - int start = 0; - while (end > -1) { - buf.append(str.substring(start,end)); - buf.append(CDATA_EMBEDED_END); - start = end + CDATA_END_LEN; - if (start < str.length()) { - end = str.indexOf(CDATA_END, start); - } else { - return; + static public void appendEscapingCDATA(final StringBuffer buf, + final String str) { + if (str != null) { + int end = str.indexOf(CDATA_END); + if (end < 0) { + buf.append(str); + } else { + int start = 0; + while (end > -1) { + buf.append(str.substring(start, end)); + buf.append(CDATA_EMBEDED_END); + start = end + CDATA_END_LEN; + if (start < str.length()) { + end = str.indexOf(CDATA_END, start); + } else { + return; + } + } + buf.append(str.substring(start)); + } } - } - - buf.append(str.substring(start)); } } diff --git a/src/main/java/org/apache/log4j/xml/XMLLayout.java b/src/main/java/org/apache/log4j/xml/XMLLayout.java index 476ffc4518..547cc84e36 100644 --- a/src/main/java/org/apache/log4j/xml/XMLLayout.java +++ b/src/main/java/org/apache/log4j/xml/XMLLayout.java @@ -115,7 +115,7 @@ public void activateOptions() { /** * Formats a {@link org.apache.log4j.spi.LoggingEvent} in conformance with the log4j.dtd. * */ - public String format(LoggingEvent event) { + public String format(final LoggingEvent event) { // Reset working buffer. If the buffer is too large, then we need a new // one in order to avoid the penalty of creating a large array. @@ -128,13 +128,13 @@ public String format(LoggingEvent event) { // We yield to the \r\n heresy. buf.append("\r\n"); buf.append("\r\n"); @@ -186,7 +186,7 @@ public String format(LoggingEvent event) { buf.append("\r\n"); } } diff --git a/tests/src/java/org/apache/log4j/HTMLLayoutTest.java b/tests/src/java/org/apache/log4j/HTMLLayoutTest.java index 396235257a..81aab1e28e 100644 --- a/tests/src/java/org/apache/log4j/HTMLLayoutTest.java +++ b/tests/src/java/org/apache/log4j/HTMLLayoutTest.java @@ -18,16 +18,14 @@ package org.apache.log4j; import org.apache.log4j.spi.LoggingEvent; - import org.w3c.dom.Document; - import org.xml.sax.InputSource; -import java.io.Reader; -import java.io.StringReader; - import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import java.io.Reader; +import java.io.StringReader; +import java.util.Hashtable; /** @@ -177,4 +175,66 @@ public void testFormatResize() { Layout.LINE_SEP + "", result.substring(0, Layout.LINE_SEP.length() + 4)); } + + + /** + * Level with arbitrary toString value. + */ + private static final class ProblemLevel extends Level { + /** + * Construct new instance. + * @param levelName level name, may not be null. + */ + public ProblemLevel(final String levelName) { + super(6000, levelName, 6); + } + } + + /** + * Tests problematic characters in multiple fields. + * @throws Exception if parser can not be constructed + * or source is not a valid XML document. + */ + public void testProblemCharacters() throws Exception { + String problemName = "com.example.bar<>&\"'"; + Logger logger = Logger.getLogger(problemName); + Level level = new ProblemLevel(problemName); + Exception ex = new IllegalArgumentException(problemName); + String threadName = Thread.currentThread().getName(); + Thread.currentThread().setName(problemName); + NDC.push(problemName); + Hashtable mdcMap = MDC.getContext(); + if (mdcMap != null) { + mdcMap.clear(); + } + MDC.put(problemName, problemName); + LoggingEvent event = + new LoggingEvent( + problemName, logger, level, problemName, ex); + HTMLLayout layout = (HTMLLayout) createLayout(); + String result = layout.format(event); + mdcMap = MDC.getContext(); + if (mdcMap != null) { + mdcMap.clear(); + } + + Thread.currentThread().setName(threadName); + + // + // do a little fixup to make output XHTML + // + StringBuffer buf = new StringBuffer( + "]>"); + buf.append(result); + buf.append("
    "); + String doc = buf.toString(); + for(int i = doc.lastIndexOf("
    "); + i != -1; + i = doc.lastIndexOf("
    ", i - 1)) { + buf.replace(i, i + 4, "
    "); + } + + parse(buf.toString()); + } + } diff --git a/tests/src/java/org/apache/log4j/xml/XMLLayoutTest.java b/tests/src/java/org/apache/log4j/xml/XMLLayoutTest.java index 81aebe4e0e..8642b393f1 100644 --- a/tests/src/java/org/apache/log4j/xml/XMLLayoutTest.java +++ b/tests/src/java/org/apache/log4j/xml/XMLLayoutTest.java @@ -22,6 +22,7 @@ import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.NDC; +import org.apache.log4j.MDC; import org.apache.log4j.spi.LoggingEvent; import org.w3c.dom.Document; @@ -32,6 +33,7 @@ import java.io.Reader; import java.io.StringReader; +import java.util.Hashtable; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -86,10 +88,10 @@ private void checkEventElement( final Element element, final LoggingEvent event) { assertEquals("log4j:event", element.getTagName()); assertEquals( - "org.apache.log4j.xml.XMLLayoutTest", element.getAttribute("logger")); + event.getLoggerName(), element.getAttribute("logger")); assertEquals( Long.toString(event.timeStamp), element.getAttribute("timestamp")); - assertEquals("INFO", element.getAttribute("level")); + assertEquals(event.getLevel().toString(), element.getAttribute("level")); assertEquals(event.getThreadName(), element.getAttribute("thread")); } @@ -142,6 +144,31 @@ private void checkThrowableElement( assertNull(messageNode.getNextSibling()); } + /** + * Checks a log4j:properties element against expectations. + * @param element element, may not be null. + * @param key key. + * @param value value. + */ + private void checkPropertiesElement( + final Element element, final String key, final String value) { + assertEquals("log4j:properties", element.getTagName()); + + int childNodeCount = 0; + for(Node child = element.getFirstChild(); + child != null; + child = child.getNextSibling()) { + if (child.getNodeType() == Node.ELEMENT_NODE) { + assertEquals("log4j:data", child.getNodeName()); + Element childElement = (Element) child; + assertEquals(key, childElement.getAttribute("name")); + assertEquals(value, childElement.getAttribute("value")); + childNodeCount++; + } + } + assertEquals(1, childNodeCount); + } + /** * Tests formatted results. * @throws Exception if parser can not be constructed or source is not a valid XML document. @@ -308,4 +335,98 @@ public void testActivateOptions() { XMLLayout layout = new XMLLayout(); layout.activateOptions(); } + + /** + * Level with arbitrary toString value. + */ + private static final class ProblemLevel extends Level { + /** + * Construct new instance. + * @param levelName level name, may not be null. + */ + public ProblemLevel(final String levelName) { + super(6000, levelName, 6); + } + } + + /** + * Tests problematic characters in multiple fields. + * @throws Exception if parser can not be constructed or source is not a valid XML document. + */ + public void testProblemCharacters() throws Exception { + String problemName = "com.example.bar<>&\"'"; + Logger logger = Logger.getLogger(problemName); + Level level = new ProblemLevel(problemName); + Exception ex = new IllegalArgumentException(problemName); + String threadName = Thread.currentThread().getName(); + Thread.currentThread().setName(problemName); + NDC.push(problemName); + Hashtable mdcMap = MDC.getContext(); + if (mdcMap != null) { + mdcMap.clear(); + } + MDC.put(problemName, problemName); + LoggingEvent event = + new LoggingEvent( + problemName, logger, level, problemName, ex); + XMLLayout layout = (XMLLayout) createLayout(); + layout.setProperties(true); + String result = layout.format(event); + mdcMap = MDC.getContext(); + if (mdcMap != null) { + mdcMap.clear(); + } + Thread.currentThread().setName(threadName); + + Element parsedResult = parse(result); + checkEventElement(parsedResult, event); + + int childElementCount = 0; + + for ( + Node node = parsedResult.getFirstChild(); node != null; + node = node.getNextSibling()) { + switch (node.getNodeType()) { + case Node.ELEMENT_NODE: + childElementCount++; + switch(childElementCount) { + case 1: + checkMessageElement((Element) node, problemName); + break; + + case 2: + checkNDCElement((Element) node, problemName); + break; + + case 3: + checkThrowableElement((Element) node, ex); + break; + + case 4: + checkPropertiesElement((Element) node, problemName, problemName); + break; + + default: + fail("Unexpected element"); + break; + } + + break; + + case Node.COMMENT_NODE: + break; + + case Node.TEXT_NODE: + + // should only be whitespace + break; + + default: + fail("Unexpected node type"); + + break; + } + } + } + } From 5887684e1436698a046c3f2740ceabb8ab16f2fe Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Fri, 10 Aug 2007 22:20:44 +0000 Subject: [PATCH 339/342] Bug 34874: Added notice to use UTF-8 or UTF-16 with HTML and XMLLayout's git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@564786 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + src/main/java/org/apache/log4j/HTMLLayout.java | 11 ++++++++--- src/main/java/org/apache/log4j/xml/XMLLayout.java | 5 +++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 40a489f4ab..8cb9d278e9 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -22,6 +22,7 @@ + Notice to use UTF-8 or UTF-16 encoding added to XML and HTMLLayout javadoc. XML and HTMLLayout do not always escape special characters. Optionally render MDC content in XMLLayout Typo in log4j.dtd concerning threshold. diff --git a/src/main/java/org/apache/log4j/HTMLLayout.java b/src/main/java/org/apache/log4j/HTMLLayout.java index 1f3f4fdb98..f7020cf25d 100644 --- a/src/main/java/org/apache/log4j/HTMLLayout.java +++ b/src/main/java/org/apache/log4j/HTMLLayout.java @@ -22,9 +22,14 @@ import org.apache.log4j.helpers.Transform; /** - This layout outputs events in a HTML table. - - @author Ceki Gülcü + * This layout outputs events in a HTML table. + * + * Appenders using this layout should have their encoding + * set to UTF-8 or UTF-16, otherwise events containing + * non ASCII characters could result in corrupted + * log files. + * + * @author Ceki Gülcü */ public class HTMLLayout extends Layout { diff --git a/src/main/java/org/apache/log4j/xml/XMLLayout.java b/src/main/java/org/apache/log4j/xml/XMLLayout.java index 547cc84e36..62cc5d8f29 100644 --- a/src/main/java/org/apache/log4j/xml/XMLLayout.java +++ b/src/main/java/org/apache/log4j/xml/XMLLayout.java @@ -57,6 +57,11 @@ * prior to log4j 1.2 (final release) and "1.2" for relase 1.2 and * later. * + * Appenders using this layout should have their encoding + * set to UTF-8 or UTF-16, otherwise events containing + * non ASCII characters could result in corrupted + * log files. + * * @author Ceki Gülcü * @since 0.9.0 * */ From 612f6287fda8178626ba6625b257c790f65de5f8 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Sat, 11 Aug 2007 04:10:11 +0000 Subject: [PATCH 340/342] Bug 42108: Add event.getLogger to allow cloning events git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@564830 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- src/main/java/org/apache/log4j/spi/LoggingEvent.java | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 50e8b61eb7..f9f82e4246 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ log4j jar Apache Log4j - 1.2.16-SNAPSHOT + 1.2.15-SNAPSHOT 1.2.15 diff --git a/src/main/java/org/apache/log4j/spi/LoggingEvent.java b/src/main/java/org/apache/log4j/spi/LoggingEvent.java index 6fa29b7d59..57c8a53c82 100644 --- a/src/main/java/org/apache/log4j/spi/LoggingEvent.java +++ b/src/main/java/org/apache/log4j/spi/LoggingEvent.java @@ -203,7 +203,7 @@ public LoggingEvent(String fqnOfCategoryClass, Category logger, @param properties MDC properties */ public LoggingEvent(final String fqnOfCategoryClass, - final Logger logger, + final Category logger, final long timeStamp, final Level level, final Object message, @@ -237,6 +237,7 @@ public LoggingEvent(final String fqnOfCategoryClass, } } + /** Set the location information for this logging event. The collected information is cached for future use. @@ -263,6 +264,15 @@ public String getLoggerName() { return categoryName; } + /** + * Gets the logger of the event. + * Use should be restricted to cloning events. + * @since 1.2.15 + */ + public Category getLogger() { + return logger; + } + /** Return the message for this logging event. From ba224b5c066342ef4f6b28c8ccea664d74d642f4 Mon Sep 17 00:00:00 2001 From: Scott Deboy Date: Mon, 13 Aug 2007 05:17:57 +0000 Subject: [PATCH 341/342] Remove all Javadoc @since 1.3 references (1.3 is obsoleted) - see http://issues.apache.org/bugzilla/show_bug.cgi?id=43101 git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@565244 13f79535-47bb-0310-9956-ffa450edef68 --- tests/src/java/org/apache/log4j/spi/LoggingEventTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java index f8a78a349c..74281768bc 100644 --- a/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java +++ b/tests/src/java/org/apache/log4j/spi/LoggingEventTest.java @@ -33,7 +33,6 @@ * Tests LoggingEvent. * * @author Curt Arnold - * @since 1.3 */ public class LoggingEventTest extends TestCase { /** From 71f99d5a7951190de4434bb4f0aef97d998308a7 Mon Sep 17 00:00:00 2001 From: Curtis William Arnold Date: Mon, 13 Aug 2007 21:04:03 +0000 Subject: [PATCH 342/342] Bug 43113: Move log4j 1.2 to trunk git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch@565518 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index f9f82e4246..78f6038e9d 100644 --- a/pom.xml +++ b/pom.xml @@ -68,9 +68,9 @@ - scm:svn:http://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch - scm:svn:https://svn.apache.org/repos/asf/logging/log4j/branches/v1_2-branch - http://svn.apache.org/viewcvs.cgi/logging/log4j/branches/v1_2-branch + scm:svn:http://svn.apache.org/repos/asf/logging/log4j/trunk + scm:svn:https://svn.apache.org/repos/asf/logging/log4j/trunk + http://svn.apache.org/viewcvs.cgi/logging/log4j/trunk Apache Software Foundation @@ -226,7 +226,7 @@ - +

    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 X^}1KS_SLU{1#DmiJJ_)zARqucTDrQN diff --git a/docs/lf5/images/lf5_openurl.gif b/docs/lf5/images/lf5_openurl.gif deleted file mode 100644 index 91a4765597081a62f54f84820ff5348e602316a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61066 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

    6&pkdbMH^pUT@&oeh1quUS>4p&mmg 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 diff --git a/docs/lf5/images/lf5_loglevels.gif b/docs/lf5/images/lf5_loglevels.gif deleted file mode 100644 index 204a029068104899e0f0e3f20e127232652aaf56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62411 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

    7RqZ_Qe9c(KP<-f3NncWcf1ngO}@=0 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 diff --git a/docs/images/cyberlab15.gif b/docs/images/cyberlab15.gif deleted file mode 100644 index 1856324ba025387b231d161116a6ebd4ca289644..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 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 diff --git a/docs/images/psmith.jpg b/docs/images/psmith.jpg deleted file mode 100644 index edde7adfe44adeaf4943df56ffdf97f302e865df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8052 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 diff --git a/docs/images/yshapira.bmp b/docs/images/yshapira.bmp deleted file mode 100644 index c2f2bddde3b49466fdbd562e10f3686a9952104c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31514 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�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 diff --git a/docs/lf5/images/blue_on_white.gif b/docs/lf5/images/blue_on_white.gif deleted file mode 100644 index caeb5fadd3714a4a44fff8ac8e50dc5d53262053..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 908 zcmZ?wbhEHb%x5rSIKsg2|NsB@@4wu?|Kj}lyZiTFT)+O<{Q0{kPTbJnzrLYiNqzm| zf`SQz13h@F0!HkTa{}`DVhyaQ|Sy)9Fgc)=|YC(1~u>Mz2=u63* z)?^@Z_~pJ0-U7`6_bcX!`z#hQn>(T5g<{j8B}ON^9i%u8O%l=2kr6tv$n@Qm6$k6JL;P!PEuy!Nls&{ zEfeJQm^^_T( zd8uH7GWXd%r>=A#6gsZPwv_McJ%)?3=c(N8IB|bpd)X#+&W^4ZCyyC2b=>{9uY=e8 z+mD}R-xI!kc3(ZCh2yf1h(k+*!rG!Fi9H+({LWak&(Bk}5Oh#>i(*=LQ2Juv{o`>5 zzWiV4mHFK9(BuULZW}^tzrI803-koIBJ`uJ$ zDZwH2#D?V4^L%%2dn;qibm6F}!2yTF@b|v!z$L#aSZSiRZ)f ztEw^bmP`@mOhQaoCNSJ{Z2J8CcuabOoUM@ITVa_=PJxGv1>Y@ruFm-XkEkKrhvj!U zesfmLWnr9j8xDlQ0C^jWWx^l0*}%3)^o^ji?LfaBUkhBy|nNA0nl=UfFC zjrMA~pOoM_qVc$e?^H!#$LXtz++x2JJsxx_@OdyvAK`o%)8ZIc?$FMl(6FFNT_W{( zo4wtG15>+2)!B^BD1`7&Ra5GG%n>0{DLaXw$Mc~XuYt1Q6pMty*w%{^-5I2L1q}LB zmrN{I>tbMW;4;c$n)#$ZD5B}CWWgk6#>gTitqTpRh7%?%D4+5nah99j(wK!AVqW)| zwVPfn;_wq=Usil{=1v(g{+`KMakH~t3U#d%Ghfc3?NXk#fa6H{JxdmjYB{0jQw7!p f98lFrVtOM{E#K%NmZZaJeN<^`!)BEh1_o;Yx8rXi diff --git a/docs/lf5/images/console_window.gif b/docs/lf5/images/console_window.gif deleted file mode 100644 index 315a7c56a4d72a28753f9dc3b4cdbaa6d551f418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56097 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 $K|v*Ph&@P8}o`s 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 VsZMvw)1LbDr$BwF8r~2H06QzTQ(yo9 diff --git a/docs/lf5/images/lf5_about.gif b/docs/lf5/images/lf5_about.gif deleted file mode 100644 index 206b5455e43a0815852ba3b03bd8e0bbdad1e2ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9451 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 L5l@T(;OPGWYHL>x diff --git a/docs/lf5/images/lf5_category_explorer.gif b/docs/lf5/images/lf5_category_explorer.gif deleted file mode 100644 index 0adf25485297edb0357662c76077ed079e127897..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62477 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 Z{ARi1q`jro-#@VUZC?!uN=61K{}1^T&LjW; diff --git a/docs/lf5/images/lf5_collapseall.gif b/docs/lf5/images/lf5_collapseall.gif deleted file mode 100644 index c32a6659d4597e087281babaeaeee4777a7241f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62701 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 z 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