You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2015/04/29 08:30:43 UTC

logging-log4j2 git commit: [LOG4J2-965] System.out no longer works after the Console appender and JANSI are initialized.

Repository: logging-log4j2
Updated Branches:
  refs/heads/master 15df0f056 -> d04659cde


[LOG4J2-965] System.out no longer works after the Console appender and
JANSI are initialized.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/d04659cd
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/d04659cd
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/d04659cd

Branch: refs/heads/master
Commit: d04659cde3f58521cb8c114ab5032b19a4644cc5
Parents: 15df0f0
Author: Gary Gregory <ga...@gmail.com>
Authored: Tue Apr 28 23:30:34 2015 -0700
Committer: Gary Gregory <ga...@gmail.com>
Committed: Tue Apr 28 23:30:34 2015 -0700

----------------------------------------------------------------------
 .../log4j/core/appender/ConsoleAppender.java    | 13 +++--
 .../core/appender/ConsoleAppenderTest.java      | 51 ++++++++++++++------
 src/changes/changes.xml                         |  3 ++
 3 files changed, 44 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d04659cd/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
index a652a1e..81a1152 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
@@ -181,28 +181,27 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
 
     private static OutputStream getOutputStream(final boolean follow, final Target target) {
         final String enc = Charset.defaultCharset().name();
-        PrintStream printStream = null;
+        OutputStream outputStream = null;
         try {
-            // Cannot use a CloseShieldOutputStream here;
-            // see org.apache.logging.log4j.core.appender.ConsoleAppenderTest
             // @formatter:off
-            printStream = target == Target.SYSTEM_OUT ?
+            outputStream = target == Target.SYSTEM_OUT ?
                 follow ? new PrintStream(new SystemOutStream(), true, enc) : System.out :
                 follow ? new PrintStream(new SystemErrStream(), true, enc) : System.err;
             // @formatter:on
+            outputStream = new CloseShieldOutputStream(outputStream);
         } catch (final UnsupportedEncodingException ex) { // should never happen
             throw new IllegalStateException("Unsupported default encoding " + enc, ex);
         }
         final PropertiesUtil propsUtil = PropertiesUtil.getProperties();
         if (!propsUtil.getStringProperty("os.name").startsWith("Windows")
                 || propsUtil.getBooleanProperty("log4j.skipJansi")) {
-            return printStream;
+            return outputStream;
         }
         try {
             // We type the parameter as a wildcard to avoid a hard reference to Jansi.
             final Class<?> clazz = Loader.loadClass(JANSI_CLASS);
             final Constructor<?> constructor = clazz.getConstructor(OutputStream.class);
-            return (OutputStream) constructor.newInstance(printStream);
+            return new CloseShieldOutputStream((OutputStream) constructor.newInstance(outputStream));
         } catch (final ClassNotFoundException cnfe) {
             LOGGER.debug("Jansi is not installed, cannot find {}", JANSI_CLASS);
         } catch (final NoSuchMethodException nsme) {
@@ -210,7 +209,7 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
         } catch (final Exception ex) {
             LOGGER.warn("Unable to instantiate {}", JANSI_CLASS);
         }
-        return printStream;
+        return outputStream;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d04659cd/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
index 0b480eb..d190a7a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
@@ -38,7 +38,6 @@ import org.easymock.EasyMockSupport;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -57,8 +56,8 @@ public class ConsoleAppenderTest {
     public static void beforeClass() {
         System.setProperty(LOG4J_SKIP_JANSI, "true");
     }
-    
-    private final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+    ByteArrayOutputStream baos;
 
     EasyMockSupport mocks;
 
@@ -69,16 +68,35 @@ public class ConsoleAppenderTest {
         System.setProperty(LOG4J_SKIP_JANSI, "true");
         mocks = new EasyMockSupport();
         psMock = mocks.createMock("psMock", PrintStream.class);
+        baos = new ByteArrayOutputStream();
+    }
+
+    private enum SystemSetter {
+        SYSTEM_OUT {
+            @Override
+            void systemSet(final PrintStream printStream) {
+                System.setOut(printStream);
+            }
+        },
+        SYSTEM_ERR {
+            @Override
+            void systemSet(final PrintStream printStream) {
+                System.setErr(printStream);
+            }
+        },
+        ;
+        abstract void systemSet(PrintStream printStream);
     }
 
-    private void testConsoleStreamManagerDoesNotClose(PrintStream ps, String targetName) {
+    private void testConsoleStreamManagerDoesNotClose(PrintStream ps, String targetName, SystemSetter systemSetter) {
         try {
             psMock.write((byte[]) anyObject(), anyInt(), anyInt());
             expectLastCall().anyTimes();
             psMock.flush();
+            expectLastCall().anyTimes();
 
             mocks.replayAll();
-            System.setOut(psMock);
+            systemSetter.systemSet(psMock);
             final Layout<String> layout = PatternLayout.createLayout(null, null, null, null, false, false, null, null);
             final ConsoleAppender app = ConsoleAppender.createAppender(layout, null, targetName, "Console", "false",
                     "false");
@@ -92,23 +110,22 @@ public class ConsoleAppenderTest {
             app.stop();
             assertFalse("Appender did not stop", app.isStarted());
         } finally {
-            System.setOut(ps);
+            systemSetter.systemSet(ps);
         }
         mocks.verifyAll();
     }
 
     @Test
-    @Ignore
     public void testFollowSystemErr() {
-        testFollowSystemPrintStream(System.err, Target.SYSTEM_ERR);
+        testFollowSystemPrintStream(System.err, Target.SYSTEM_ERR, SystemSetter.SYSTEM_ERR);
     }
 
     @Test
     public void testFollowSystemOut() {
-        testFollowSystemPrintStream(System.out, Target.SYSTEM_OUT);
+        testFollowSystemPrintStream(System.out, Target.SYSTEM_OUT, SystemSetter.SYSTEM_OUT);
     }
 
-    private void testFollowSystemPrintStream(PrintStream ps, Target target) {
+    private void testFollowSystemPrintStream(PrintStream ps, Target target, SystemSetter systemSetter) {
         final ConsoleAppender app = ConsoleAppender.newBuilder().setTarget(target).setFollow(true)
                 .setIgnoreExceptions(false).build();
         app.start();
@@ -117,9 +134,12 @@ public class ConsoleAppenderTest {
                     Level.INFO, new SimpleMessage("Test"), null);
 
             assertTrue("Appender did not start", app.isStarted());
-            System.setOut(new PrintStream(baos));
-            app.append(event);
-            System.setOut(ps);
+            systemSetter.systemSet(new PrintStream(baos));
+            try {
+                app.append(event);
+            } finally {
+                systemSetter.systemSet(ps);
+            }
             final String msg = baos.toString();
             assertNotNull("No message", msg);
             assertTrue("Incorrect message: \"" + msg + "\"", msg.endsWith("Test" + Constants.LINE_SEPARATOR));
@@ -130,14 +150,13 @@ public class ConsoleAppenderTest {
     }
 
     @Test
-    @Ignore
     public void testSystemErrStreamManagerDoesNotClose() {
-        testConsoleStreamManagerDoesNotClose(System.err, "SYSTEM_ERR");
+        testConsoleStreamManagerDoesNotClose(System.err, "SYSTEM_ERR", SystemSetter.SYSTEM_ERR);
     }
 
     @Test
     public void testSystemOutStreamManagerDoesNotClose() {
-        testConsoleStreamManagerDoesNotClose(System.out, "SYSTEM_OUT");
+        testConsoleStreamManagerDoesNotClose(System.out, "SYSTEM_OUT", SystemSetter.SYSTEM_OUT);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d04659cd/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e3cd1e6..d8a76cd 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -24,6 +24,9 @@
   </properties>
   <body>
     <release version="2.3" date="2015-0?-??" description="GA Release 2.3">
+      <action issue="LOG4J2-965" dev="ggregory" type="fix" due-to="Khotyn Huang">
+        System.out no longer works after the Console appender and JANSI are initialized.
+      </action>
       <action issue="LOG4J2-998" dev="ggregory" type="update" due-to="Mariano Gonzalez">
         Make org.apache.logging.log4j.core.Logger#updateConfiguration protected.
       </action>