redirect stdout and stderr to logger
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java index 4502c4c..1195855 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
@@ -36,6 +36,7 @@ import org.apache.iotdb.commons.service.metric.JvmGcMonitorMetrics; import org.apache.iotdb.commons.service.metric.MetricService; import org.apache.iotdb.commons.service.metric.cpu.CpuUsageMetrics; +import org.apache.iotdb.commons.utils.StdOutErrRedirect; import org.apache.iotdb.commons.utils.TestOnly; import org.apache.iotdb.confignode.client.ConfigNodeRequestType; import org.apache.iotdb.confignode.client.sync.SyncConfigNodeClientPool; @@ -111,6 +112,7 @@ "{} default charset is: {}", ConfigNodeConstant.GLOBAL_NAME, Charset.defaultCharset().displayName()); + StdOutErrRedirect.redirectSystemOutAndErrToLog(); new ConfigNodeCommandLine().doMain(args); }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java index 3241db3..98c7e3f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNode.java
@@ -44,6 +44,7 @@ import org.apache.iotdb.commons.udf.service.UDFClassLoaderManager; import org.apache.iotdb.commons.udf.service.UDFExecutableManager; import org.apache.iotdb.commons.udf.service.UDFManagementService; +import org.apache.iotdb.commons.utils.StdOutErrRedirect; import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRegisterReq; import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRegisterResp; import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRestartReq; @@ -165,6 +166,7 @@ public static void main(String[] args) { logger.info("IoTDB-DataNode environment variables: {}", IoTDBConfig.getEnvironmentVariables()); logger.info("IoTDB-DataNode default charset is: {}", Charset.defaultCharset().displayName()); + StdOutErrRedirect.redirectSystemOutAndErrToLog(); new DataNodeServerCommandLine().doMain(args); }
diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/StdOutErrRedirect.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/StdOutErrRedirect.java new file mode 100644 index 0000000..01455eb --- /dev/null +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/StdOutErrRedirect.java
@@ -0,0 +1,97 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.commons.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.OutputStream; +import java.io.PrintStream; + +public class StdOutErrRedirect { + private static final Logger LOGGER = LoggerFactory.getLogger(StdOutErrRedirect.class); + + private StdOutErrRedirect() {} + + public static void redirectSystemOutAndErrToLog() { + System.setOut(new PrintStream(new InfoLoggerStream(LOGGER))); + System.setErr(new PrintStream(new ErrorLoggerStream(LOGGER))); + } + + private static class InfoLoggerStream extends OutputStream { + + private final Logger logger; + + public InfoLoggerStream(Logger logger) { + super(); + this.logger = logger; + } + + @Override + public void write(int b) { + String string = String.valueOf((char) b); + if (!string.trim().isEmpty()) logger.info(string); + } + + @Override + public void write(byte[] b) { + String string = new String(b); + if (!string.trim().isEmpty()) { + logger.info(string); + } + } + + @Override + public void write(byte[] b, int off, int len) { + String string = new String(b, off, len); + if (!string.trim().isEmpty()) logger.info(string); + } + } + + private static class ErrorLoggerStream extends OutputStream { + + private final Logger logger; + + public ErrorLoggerStream(Logger logger) { + super(); + this.logger = logger; + } + + @Override + public void write(int b) { + String string = String.valueOf((char) b); + if (!string.trim().isEmpty()) logger.error(string); + } + + @Override + public void write(byte[] b) { + String string = new String(b); + if (!string.trim().isEmpty()) { + logger.error(string); + } + } + + @Override + public void write(byte[] b, int off, int len) { + String string = new String(b, off, len); + if (!string.trim().isEmpty()) logger.error(string); + } + } +}