You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by ca...@apache.org on 2006/12/16 01:06:14 UTC

svn commit: r487724 - in /logging/log4j/branches/v1_2-branch: src/java/org/apache/log4j/AsyncAppender.java tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java

Author: carnold
Date: Fri Dec 15 16:06:13 2006
New Revision: 487724

URL: http://svn.apache.org/viewvc?view=rev&rev=487724
Log:
Bug 41186: DiscardSummary events create NPE in layouts

Modified:
    logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/AsyncAppender.java
    logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java

Modified: logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/AsyncAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/AsyncAppender.java?view=diff&rev=487724&r1=487723&r2=487724
==============================================================================
--- logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/AsyncAppender.java (original)
+++ logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/AsyncAppender.java Fri Dec 15 16:06:13 2006
@@ -466,7 +466,11 @@
           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);
     }
   }
 

Modified: logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java?view=diff&rev=487724&r1=487723&r2=487724
==============================================================================
--- logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java (original)
+++ logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/AsyncAppenderTestCase.java Fri Dec 15 16:06:13 2006
@@ -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 @@
 
         }
     }
+
+    /**
+     * 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;
+        }
+      }
+    }
+
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org