allow logging IDEA process'es stdout/stderr

keep printing to console if logging is enabled

GitOrigin-RevId: fcaead66c44d33036f7f34ae12781c5a37e40de7
This commit is contained in:
Dmitry Batrak
2019-10-02 08:32:43 +00:00
committed by intellij-monorepo-bot
parent bc1774a812
commit 3adac8205e
2 changed files with 23 additions and 6 deletions
@@ -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;
@@ -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;
}