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