From 3adac8205e4bd1207d4374aef15d7bdb6331db90 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Wed, 2 Oct 2019 11:04:02 +0300 Subject: [PATCH] allow logging IDEA process'es stdout/stderr keep printing to console if logging is enabled GitOrigin-RevId: fcaead66c44d33036f7f34ae12781c5a37e40de7 --- .../com/intellij/idea/PrintStreamLogger.java | 24 +++++++++++++++---- .../src/com/intellij/idea/StartupUtil.java | 5 ++-- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/idea/PrintStreamLogger.java b/platform/platform-impl/src/com/intellij/idea/PrintStreamLogger.java index e6ec24d959cf..f1e342c0e508 100644 --- a/platform/platform-impl/src/com/intellij/idea/PrintStreamLogger.java +++ b/platform/platform-impl/src/com/intellij/idea/PrintStreamLogger.java @@ -2,30 +2,46 @@ package com.intellij.idea; import com.intellij.openapi.diagnostic.Logger; +import org.jetbrains.annotations.NotNull; import java.io.OutputStream; import java.io.PrintStream; import java.nio.charset.Charset; class PrintStreamLogger extends PrintStream { - PrintStreamLogger(String name) { - super(new OutputStreamLogger(name), true); + PrintStreamLogger(String name, PrintStream originalStream) { + super(new OutputStreamLogger(name, originalStream), true); } } class OutputStreamLogger extends OutputStream { private static final int BUFFER_SIZE = 10000; private final byte[] myBuffer = new byte[BUFFER_SIZE]; + private final PrintStream myOriginalStream; private final Logger myLogger; private int myPosition; private boolean mySlashRWritten; - OutputStreamLogger(String name) { + OutputStreamLogger(String name, PrintStream originalStream) { + myOriginalStream = originalStream; myLogger = Logger.getInstance(name); } @Override - public synchronized void write(int b) { + public void write(int b) { + myOriginalStream.write(b); + processByte(b); + } + + @Override + public void write(@NotNull byte[] b, int off, int len) { + myOriginalStream.write(b, off, len); + for (int i = 0; i < len; i++) { + processByte(b[off + i]); + } + } + + private synchronized void processByte(int b) { if (b == '\r') { writeBuffer(); mySlashRWritten = true; diff --git a/platform/platform-impl/src/com/intellij/idea/StartupUtil.java b/platform/platform-impl/src/com/intellij/idea/StartupUtil.java index 13e11c3b910b..443c347b0888 100644 --- a/platform/platform-impl/src/com/intellij/idea/StartupUtil.java +++ b/platform/platform-impl/src/com/intellij/idea/StartupUtil.java @@ -493,6 +493,7 @@ public final class StartupUtil { } } + @SuppressWarnings("UseOfSystemOutOrSystemErr") @NotNull private static Logger setupLogger() { Logger.setFactory(new LoggerFactory()); @@ -502,8 +503,8 @@ public final class StartupUtil { log.info("------------------------------------------------------ IDE SHUTDOWN ------------------------------------------------------"); }); if (SystemProperties.getBooleanProperty("intellij.log.stdout", false)) { - System.setOut(new PrintStreamLogger("STDOUT")); - System.setErr(new PrintStreamLogger("STDERR")); + System.setOut(new PrintStreamLogger("STDOUT", System.out)); + System.setErr(new PrintStreamLogger("STDERR", System.err)); } return log; }