[
https://issues.apache.org/jira/browse/LOG4J2-965?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14502282#comment-14502282
]
Gary Gregory commented on LOG4J2-965:
-------------------------------------
I reproduced this issue with the command line:
{noformat}
java
-Dlog4j.configurationFile=file:///C:/vcs/git/apache/logging/logging-log4j2/log4j-core/target/test-classes/log4j-jira965.xml
-cp
log4j-core\target\log4j-core-2.3-SNAPSHOT.jar;log4j-api\target\log4j-api-2.3-SNAPSHOT.jar;log4j-jcl\target\log4j-jcl-2.3-SNAPSHOT.jar;log4j-slf4j-impl\target\log4j-slf4j-impl-2.3-SNAPSHOT.jar;C:\Users\ggregory\.m2\repository\org\fusesource\jansi\jansi\1.11\jansi-1.11.jar;log4j-core\target\test-classes;C:\Java\slf4j-1.7.6\slf4j-api-1.7.6.jar
org.apache.logging.log4j.core.appender.JansiConsoleAppenderJira965
{noformat}
> Log4j2 cause System.out unable to work on windows
> -------------------------------------------------
>
> 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
>
> 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: [email protected]
For additional commands, e-mail: [email protected]