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 "Thiago Kronig (JIRA)" <ji...@apache.org> on 2015/04/29 17:36:07 UTC

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

    [ https://issues.apache.org/jira/browse/LOG4J2-965?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14519577#comment-14519577 ] 

Thiago Kronig commented on LOG4J2-965:
--------------------------------------

Tested on Linux Oracle JDK 6 and JDK 8.
Closing it, as I already tested the patch on Windows yesterday.

Cheers!

> System.out no longer works after the Console appender and JANSI are initialized
> -------------------------------------------------------------------------------
>
>                 Key: LOG4J2-965
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-965
>             Project: Log4j 2
>          Issue Type: Bug
>    Affects Versions: 2.1, 2.2
>         Environment: Windows, with jansi  in classpath
>            Reporter: Khotyn Huang
>            Priority: Critical
>             Fix For: 2.3
>
>
> h3. Demonstration
> The underlining project demonstrate the bug.
> The project's build.gradle file:
> {code:title=build.gradle}
> apply plugin: 'java'
> version = '1.0'
> repositories {
>     mavenCentral()
> }
> def log4j2Version = '2.2'
> def log4j2GroupId = "org.apache.logging.log4j"
> dependencies {
>     compile log4j2GroupId + ':log4j-core:' + log4j2Version
>     compile log4j2GroupId + ":log4j-jcl:" + log4j2Version
>     compile log4j2GroupId + ":log4j-slf4j-impl:" + log4j2Version
>     compile 'org.fusesource.jansi:jansi:1.11'
> }
> {code}
> A log4j2.xml in classpath:
> {code:title=log4j2.xml}
> <?xml version="1.0" encoding="UTF-8"?>
> <Configuration status="WARN">
>     <Appenders>
>         <File name="root" fileName="${sys:user.home}/logs/windowsbug.log">
>             <PatternLayout>
>                 <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
>             </PatternLayout>
>         </File>
>     </Appenders>
>     <Loggers>
>         <Root level="info">
>             <AppenderRef ref="root"/>
>         </Root>
>     </Loggers>
> </Configuration>
> {code}
> And the main class:
> {code:title=Log4j2WindowsBug.java}
> import org.slf4j.LoggerFactory;
> /**
>  * @author khotyn 15/3/2 下午8:17
>  */
> public class Log4j2WindowsBug {
>     public static void main(String[] args) {
>         System.out.println("Able to print on Windows");
>         LoggerFactory.getLogger(Log4j2WindowsBug.class);
>         System.out.println("Unable to print on Windows");
>     }
> }
> {code}
> The output of the demo under Windows is:
> {code}
> Able to print on Windows
> {code}
> The third line did not print to Windows console.
> h3. Reason
> It seems that log4j2 will wrapper System.out to WindowsAnsiOutputStream if jansi is available in classpath. And in OutputStreamManager's close method, the wrapper WindowsAnsiOutputStream is not considered, and cause the underling System.out closed.
> {code:title=OutputStreamManager.java}
>     protected synchronized void close() {
>         final OutputStream stream = os; // access volatile field only once per method
>         if (stream == System.out || stream == System.err) {
>             return;
>         }
>         try {
>             stream.close();
>         } catch (final IOException ex) {
>             LOGGER.error("Unable to close stream " + getName() + ". " + ex);
>         }
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

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