You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/07/20 16:55:21 UTC
[18/24] incubator-ignite git commit: # ignite-788: cosnole messages
# ignite-788: cosnole messages
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/53b4e2a7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/53b4e2a7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/53b4e2a7
Branch: refs/heads/ignite-788-last-review
Commit: 53b4e2a7dbeac3625623486fadc3e031201af72e
Parents: d3315eb
Author: ashutak <as...@gridgain.com>
Authored: Fri Jul 17 19:11:49 2015 +0300
Committer: ashutak <as...@gridgain.com>
Committed: Fri Jul 17 19:11:49 2015 +0300
----------------------------------------------------------------------
.../src/test/config/log4j2-verbose-test.xml | 42 ++---
.../ignite/logger/log4j2/ContextTestTmp.java | 51 +++---
.../ignite/logger/log4j2/Log4J2Logger.java | 161 +++++++++++++------
.../logger/log4j2/GridLog4j2SelfTest.java | 59 +++++--
4 files changed, 204 insertions(+), 109 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53b4e2a7/modules/core/src/test/config/log4j2-verbose-test.xml
----------------------------------------------------------------------
diff --git a/modules/core/src/test/config/log4j2-verbose-test.xml b/modules/core/src/test/config/log4j2-verbose-test.xml
index 4c75689..8abb07f 100644
--- a/modules/core/src/test/config/log4j2-verbose-test.xml
+++ b/modules/core/src/test/config/log4j2-verbose-test.xml
@@ -18,26 +18,26 @@
-->
<Configuration>
- <!--<Appenders>-->
- <!--<Routing name="FILE">-->
- <!--<Routes pattern="$${sys:nodeId}">-->
- <!--<Route>-->
- <!--<RollingFile name="Rolling-${sys:nodeId}" fileName="${sys:IGNITE_HOME}/work/log/ignite-${sys:nodeId}.log"-->
- <!--filePattern="${sys:IGNITE_HOME}/work/log/ignite-${sys:nodeId}-%i-%d{yyyy-MM-dd}.log.gz">-->
- <!--<PatternLayout pattern="[%d{ABSOLUTE}][%-5p][%t][%c{1}] %m%n"/>-->
- <!--<Policies>-->
- <!--<TimeBasedTriggeringPolicy interval="6" modulate="true" />-->
- <!--<SizeBasedTriggeringPolicy size="10 MB" />-->
- <!--</Policies>-->
- <!--</RollingFile>-->
- <!--</Route>-->
- <!--</Routes>-->
- <!--</Routing>-->
- <!--</Appenders>-->
+ <Appenders>
+ <Routing name="FILE">
+ <Routes pattern="$${sys:nodeId}">
+ <Route>
+ <RollingFile name="Rolling-${sys:nodeId}" fileName="${sys:IGNITE_HOME}/work/log/ignite-${sys:nodeId}.log"
+ filePattern="${sys:IGNITE_HOME}/work/log/ignite-${sys:nodeId}-%i-%d{yyyy-MM-dd}.log.gz">
+ <PatternLayout pattern="[%d{ABSOLUTE}][%-5p][%t][%c{1}] %m%n"/>
+ <Policies>
+ <TimeBasedTriggeringPolicy interval="6" modulate="true" />
+ <SizeBasedTriggeringPolicy size="10 MB" />
+ </Policies>
+ </RollingFile>
+ </Route>
+ </Routes>
+ </Routing>
+ </Appenders>
- <!--<Loggers>-->
- <!--<Root level="INFO">-->
- <!--<!–<AppenderRef ref="FILE" level="DEBUG"/>–>-->
- <!--</Root>-->
- <!--</Loggers>-->
+ <Loggers>
+ <Root level="INFO">
+ <AppenderRef ref="FILE" level="DEBUG"/>
+ </Root>
+ </Loggers>
</Configuration>
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53b4e2a7/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/ContextTestTmp.java
----------------------------------------------------------------------
diff --git a/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/ContextTestTmp.java b/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/ContextTestTmp.java
index 5b6d4ad..cb91303 100644
--- a/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/ContextTestTmp.java
+++ b/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/ContextTestTmp.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.core.config.*;
import org.apache.logging.log4j.core.layout.*;
import java.net.*;
+import java.nio.charset.*;
/**
* TODO: Add class description.
@@ -40,20 +41,30 @@ public class ContextTestTmp {
final URL cfgUrl = U.resolveIgniteUrl("modules/core/src/test/config/log4j2-verbose-test.xml");
- Configurator.initialize(LogManager.ROOT_LOGGER_NAME, cfgUrl.toString());
+ String loggerName = LogManager.ROOT_LOGGER_NAME;
- LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
- AbstractConfiguration cfg = (AbstractConfiguration) ctx.getConfiguration();
- ConsoleAppender appender = ConsoleAppender.createDefaultAppenderForLayout(PatternLayout.createDefaultLayout());
+ Configurator.initialize(loggerName, cfgUrl.toString());
+
+ LoggerContext context= (LoggerContext) LogManager.getContext();
+ Configuration config= context.getConfiguration();
+
+ PatternLayout layout= PatternLayout.createLayout("%m%n", null, null, Charset.defaultCharset(),false,false,null,null);
+ Appender appender=ConsoleAppender.createAppender(layout, null, null, "CONSOLE_APPENDER", null, null);
appender.start();
- cfg.addAppender(appender);
- AppenderRef[] refs = new AppenderRef[] { AppenderRef.createAppenderRef(appender.getName(), null, null) };
- LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.ALL, LogManager.ROOT_LOGGER_NAME, "true", refs, null, cfg, null);
- loggerConfig.addAppender(appender, null, null);
- cfg.addLogger(LogManager.ROOT_LOGGER_NAME, loggerConfig);
- ctx.updateLoggers();
+ AppenderRef ref= AppenderRef.createAppenderRef("CONSOLE_APPENDER",null,null);
+ AppenderRef[] refs = new AppenderRef[] {ref};
+ LoggerConfig loggerConfig= LoggerConfig.createLogger("false", Level.INFO,"CONSOLE_LOGGER","CONSOLE_LOGGER",refs,null,null,null);
+ loggerConfig.addAppender(appender,null,null);
+
+ config.addAppender(appender);
+ config.addLogger("CONSOLE_LOGGER", loggerConfig);
+ context.updateLoggers(config);
+
+ Logger logger=LogManager.getContext().getLogger("CONSOLE_LOGGER");
+ logger.info("HELLO_WORLD");
- logTest();
+ logTest(logger);
+ logTest(LogManager.getRootLogger());
System.out.println("FInish");
}
@@ -82,15 +93,15 @@ public class ContextTestTmp {
ctx.updateLoggers();
}
- private static void logTest() {
- LogManager.getRootLogger().log(Level.OFF, "*******************");
- LogManager.getRootLogger().log(Level.FATAL, "*******************");
- LogManager.getRootLogger().log(Level.ERROR, "*******************");
- LogManager.getRootLogger().log(Level.WARN, "*******************");
- LogManager.getRootLogger().log(Level.INFO, "*******************");
- LogManager.getRootLogger().log(Level.DEBUG, "*******************");
- LogManager.getRootLogger().log(Level.TRACE, "*******************");
- LogManager.getRootLogger().log(Level.ALL, "*******************");
+ private static void logTest(Logger logger) {
+ logger.log(Level.OFF, "*******************");
+ logger.log(Level.FATAL, "*******************");
+ logger.log(Level.ERROR, "*******************");
+ logger.log(Level.WARN, "*******************");
+ logger.log(Level.INFO, "*******************");
+ logger.log(Level.DEBUG, "*******************");
+ logger.log(Level.TRACE, "*******************");
+ logger.log(Level.ALL, "*******************");
}
private static void addConsoleAppender(final Logger logger, final Level maxLevel) {
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53b4e2a7/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/Log4J2Logger.java
----------------------------------------------------------------------
diff --git a/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/Log4J2Logger.java b/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/Log4J2Logger.java
index 8fc4e57..ef8e73a 100644
--- a/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/Log4J2Logger.java
+++ b/modules/log4j2/src/main/java/org/apache/ignite/logger/log4j2/Log4J2Logger.java
@@ -29,11 +29,13 @@ import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.appender.*;
import org.apache.logging.log4j.core.appender.routing.*;
import org.apache.logging.log4j.core.config.*;
+import org.apache.logging.log4j.core.layout.*;
import org.jetbrains.annotations.*;
import java.io.*;
import java.lang.reflect.*;
import java.net.*;
+import java.nio.charset.*;
import java.util.*;
import static org.apache.ignite.IgniteSystemProperties.*;
@@ -72,6 +74,9 @@ public class Log4J2Logger implements IgniteLogger, LoggerNodeIdAware {
public static final String NODE_ID = "nodeId";
/** */
+ public static final String CONSOLE_APPENDER = "autoConfiguredIgniteConsoleAppender";
+
+ /** */
private static volatile boolean inited;
/** */
@@ -85,6 +90,8 @@ public class Log4J2Logger implements IgniteLogger, LoggerNodeIdAware {
@SuppressWarnings("FieldAccessedSynchronizedAndUnsynchronized")
private Logger impl;
+ private volatile Logger consoleLogger;
+
/** Quiet flag. */
private final boolean quiet;
@@ -95,9 +102,11 @@ public class Log4J2Logger implements IgniteLogger, LoggerNodeIdAware {
* Creates new logger with given implementation.
*
* @param impl Log4j implementation to use.
+ * @param consoleLogger
*/
- public Log4J2Logger(final Logger impl) {
+ public Log4J2Logger(final Logger impl, Logger consoleLogger) {
assert impl != null;
+ this.consoleLogger = consoleLogger;
addConsoleAppenderIfNeeded(new C1<Boolean, Logger>() {
@Override public Logger apply(Boolean init) {
@@ -303,75 +312,112 @@ public class Log4J2Logger implements IgniteLogger, LoggerNodeIdAware {
// User configured console appender, but log is quiet.
quiet = false;
-// if (!consoleAppenderFound && !quiet && Boolean.valueOf(System.getProperty(IGNITE_CONSOLE_APPENDER, "true"))) {
-// // Console appender not found => we've looked through all categories up to root.
-// assert rootLogger != null;
-//
-// // User launched ignite in verbose mode and did not add console appender with INFO level
-// // to configuration and did not set IGNITE_CONSOLE_APPENDER to false.
-// if (errAppender != null) {
-// rootLogger.addAppender(createConsoleAppender(Level.INFO));
-//
-// // TODO implement.
-//// if (errAppender.getThreshold() == Level.ERROR)
-//// errAppender.setThreshold(Level.WARN);
-//// }
-//// else
-//// // No error console appender => create console appender with no level limit.
-//// rootLogger.addAppender(createConsoleAppender(Level.OFF));
-////
-////// if (logLevel != null)
-////// impl.setLevel(logLevel);
-// }
-// else
-// // No error console appender => create console appender with no level limit.
-// rootLogger.addAppender(createConsoleAppender(Level.OFF));
-//
-// if (logLevel != null)
-// impl.setLevel(logLevel);
-// }
+ if (!consoleAppenderFound && !quiet && Boolean.valueOf(System.getProperty(IGNITE_CONSOLE_APPENDER, "true"))) {
+ // Console appender not found => we've looked through all categories up to root.
+ assert rootLogger != null;
+
+ // User launched ignite in verbose mode and did not add console appender with INFO level
+ // to configuration and did not set IGNITE_CONSOLE_APPENDER to false.
+ if (errAppender != null) {
+ consoleLogger = createConsoleLogger(rootLogger, Level.INFO);
+
+// if (errAppender.getThreshold() == Level.ERROR)
+// errAppender.setThreshold(Level.WARN);
+ }
+ else
+ // No error console appender => create console appender with no level limit.
+ consoleLogger = createConsoleLogger(rootLogger, Level.ALL);
+ }
quiet0 = quiet;
inited = true;
}
}
-// /**
-// * Creates console appender with some reasonable default logging settings.
-// *
-// * @param maxLevel Max logging level.
-// * @return New console appender.
-// */
-// // TODO review.
-// private Appender createConsoleAppender(Level maxLevel) {
-// ConsoleAppender console = ConsoleAppender.createAppender(PatternLayout.createDefaultLayout(), null,
-// "SYSTEM_OUT", "console", null, null);
-//
-// final LoggerContext ctx = new LoggerContext("console");
+// private void createConsoleLogger(Logger logger, Level maxLevel) {
+// final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
//
// final Configuration cfg = ctx.getConfiguration();
//
-// console.start();
+// ConsoleAppender appender = ConsoleAppender.createAppender(PatternLayout.createDefaultLayout(), null,
+// "SYSTEM_OUT", CONSOLE_APPENDER, null, null);
+//
+// appender.start();
//
-// cfg.addAppender(console);
+// cfg.addAppender(appender);
//
-// AppenderRef ref = AppenderRef.createAppenderRef("console", null, null);
+// LoggerConfig oldLogCfg = cfg.getLoggerConfig(logger.getName());
//
-// AppenderRef[] refs = new AppenderRef[] {ref};
+// AppenderRef ref = AppenderRef.createAppenderRef(CONSOLE_APPENDER, Level.ALL, null);
//
-// LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.ALL, LogManager.ROOT_LOGGER_NAME,
-// "true", refs, null, cfg, null);
+// LoggerConfig newLogCfg = LoggerConfig.createLogger("false", oldLogCfg.getLevel(),
+// oldLogCfg.getName(), "true", new AppenderRef[]{ref}, null, cfg, null);
//
-// loggerConfig.addAppender(console, null, null);
+// newLogCfg.addAppender(appender, Level.ALL, null);
//
-// cfg.addLogger("org.apache.logging.log4j", loggerConfig);
+// cfg.addLogger(logger.getName(), oldLogCfg);
//
+// ctx.reconfigure();
// ctx.updateLoggers();
+// }
+
+ /**
+ * Creates console appender with some reasonable default logging settings.
+ *
+ * @param maxLevel Max logging level.
+ * @return New console appender.
+ */
+ // TODO review.
+// private void createConsoleLogger(Logger log, Level maxLevel) {
+// ConsoleAppender consoleApp = ConsoleAppender.createAppender(PatternLayout.createDefaultLayout(), null,
+// "SYSTEM_OUT", CONSOLE_APPENDER, null, null);
+//
+// final LoggerContext ctx = log.getContext();
+//
+// final Configuration cfg = ctx.getConfiguration();
+//
+// consoleApp.start();
+//
+// cfg.addAppender(consoleApp);
+//
+// AppenderRef ref = AppenderRef.createAppenderRef(CONSOLE_APPENDER, null, null);
+//
+// LoggerConfig logCfg = LoggerConfig.createLogger("true", null, log.getName(),
+// "true", new AppenderRef[] {ref}, null, cfg, null);
+//
+// logCfg.getAppenderRefs().add(ref);
//
-// ctx.getLogger("console").error("");
+// cfg.addLogger(log.getName(), logCfg);
//
-// return console;
+// ctx.updateLoggers();
+//
+// return consoleApp;
// }
+ /**
+ * Creates console appender with some reasonable default logging settings.
+ *
+ * @param maxLevel Max logging level.
+ * @return New console appender.
+ */
+ // TODO review.
+ private Logger createConsoleLogger(Logger log, Level maxLevel) {
+ LoggerContext context= (LoggerContext) LogManager.getContext();
+ Configuration config= context.getConfiguration();
+
+ PatternLayout layout= PatternLayout.createLayout("[%d{ABSOLUTE}][%-5p][%t][%c{1}] %m%n", null, null, Charset.defaultCharset(),false,false,null,null);
+ Appender appender=ConsoleAppender.createAppender(layout, null, null, "CONSOLE_APPENDER", null, null);
+ appender.start();
+ AppenderRef ref= AppenderRef.createAppenderRef("CONSOLE_APPENDER",null,null);
+ AppenderRef[] refs = new AppenderRef[] {ref};
+ LoggerConfig loggerConfig= LoggerConfig.createLogger("false", Level.INFO,"CONSOLE_LOGGER","CONSOLE_LOGGER",refs,null,null,null);
+ loggerConfig.addAppender(appender,null,null);
+
+ config.addAppender(appender);
+ config.addLogger("CONSOLE_LOGGER", loggerConfig);
+ context.updateLoggers(config);
+
+ return (Logger)LogManager.getContext().getLogger("CONSOLE_LOGGER");
+ }
/** {@inheritDoc} */
@Override public void setNodeId(UUID nodeId) {
@@ -404,12 +450,12 @@ public class Log4J2Logger implements IgniteLogger, LoggerNodeIdAware {
*/
@Override public Log4J2Logger getLogger(Object ctgr) {
if (ctgr == null)
- return new Log4J2Logger((Logger)LogManager.getRootLogger());
+ return new Log4J2Logger((Logger)LogManager.getRootLogger(), (Logger)LogManager.getContext().getLogger("CONSOLE_LOGGER"));
if (ctgr instanceof Class)
- return new Log4J2Logger((Logger)LogManager.getLogger(((Class<?>)ctgr).getName()));
+ return new Log4J2Logger((Logger)LogManager.getLogger(((Class<?>)ctgr).getName()), (Logger)LogManager.getContext().getLogger("CONSOLE_LOGGER"));
- return new Log4J2Logger((Logger)LogManager.getLogger(ctgr.toString()));
+ return new Log4J2Logger((Logger)LogManager.getLogger(ctgr.toString()), (Logger)LogManager.getContext().getLogger("CONSOLE_LOGGER"));
}
/** {@inheritDoc} */
@@ -418,6 +464,8 @@ public class Log4J2Logger implements IgniteLogger, LoggerNodeIdAware {
warning("Logging at TRACE level without checking if TRACE level is enabled: " + msg);
impl.trace(msg);
+
+ if (consoleLogger != null) consoleLogger.trace(msg);
}
/** {@inheritDoc} */
@@ -426,6 +474,7 @@ public class Log4J2Logger implements IgniteLogger, LoggerNodeIdAware {
warning("Logging at DEBUG level without checking if DEBUG level is enabled: " + msg);
impl.debug(msg);
+ if (consoleLogger != null) consoleLogger.debug(msg);
}
/** {@inheritDoc} */
@@ -434,26 +483,32 @@ public class Log4J2Logger implements IgniteLogger, LoggerNodeIdAware {
warning("Logging at INFO level without checking if INFO level is enabled: " + msg);
impl.info(msg);
+
+ if (consoleLogger != null) consoleLogger.info(msg);
}
/** {@inheritDoc} */
@Override public void warning(String msg) {
impl.warn(msg);
+ if (LogManager.getContext().getLogger("CONSOLE_LOGGER") != null) LogManager.getContext().getLogger("CONSOLE_LOGGER").warn(msg);
}
/** {@inheritDoc} */
@Override public void warning(String msg, @Nullable Throwable e) {
impl.warn(msg, e);
+ if (consoleLogger != null) consoleLogger.warn(msg, e);
}
/** {@inheritDoc} */
@Override public void error(String msg) {
impl.error(msg);
+ if (consoleLogger != null) consoleLogger.error(msg);
}
/** {@inheritDoc} */
@Override public void error(String msg, @Nullable Throwable e) {
impl.error(msg, e);
+ if (consoleLogger != null) consoleLogger.error(msg, e);
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53b4e2a7/modules/log4j2/src/test/java/org/apache/ignite/logger/log4j2/GridLog4j2SelfTest.java
----------------------------------------------------------------------
diff --git a/modules/log4j2/src/test/java/org/apache/ignite/logger/log4j2/GridLog4j2SelfTest.java b/modules/log4j2/src/test/java/org/apache/ignite/logger/log4j2/GridLog4j2SelfTest.java
index ba3f37b..3b07fa9 100644
--- a/modules/log4j2/src/test/java/org/apache/ignite/logger/log4j2/GridLog4j2SelfTest.java
+++ b/modules/log4j2/src/test/java/org/apache/ignite/logger/log4j2/GridLog4j2SelfTest.java
@@ -23,14 +23,14 @@ import org.apache.ignite.configuration.*;
import org.apache.ignite.internal.util.typedef.*;
import org.apache.ignite.internal.util.typedef.internal.*;
import org.apache.ignite.logger.*;
+import org.apache.ignite.spi.discovery.tcp.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
import org.apache.ignite.testframework.*;
import org.apache.ignite.testframework.junits.common.*;
import java.io.*;
import java.util.*;
-import static org.apache.ignite.IgniteSystemProperties.*;
-
/**
* Grid Log4j2 SPI test.
*/
@@ -40,6 +40,9 @@ public class GridLog4j2SelfTest extends TestCase {
public static final String LOG_PATH_TEST = "modules/core/src/test/config/log4j2-test.xml";
/** */
+ public static final String LOG_PATH_VERBOSE_TEST = "modules/core/src/test/config/log4j2-verbose-test.xml";
+
+ /** */
public static final String LOG_PATH_MAIN = "config/ignite-log4j2.xml";
/**
@@ -115,19 +118,45 @@ public class GridLog4j2SelfTest extends TestCase {
* @throws Exception If failed.
*/
public void testVerboseMode() throws Exception {
- System.setProperty(IGNITE_QUIET, "false");
-
-// try (Ignite ignite = G.start(getConfiguration("grid" + id))) {
-// id8 = U.id8(ignite.cluster().localNode().id());
-//
-// String logPath = "work/log/ignite-" + id8 + ".log";
-//
-// logFile = U.resolveIgnitePath(logPath);
-// assertNotNull("Failed to resolve path: " + logPath, logFile);
-// assertTrue("Log file does not exist: " + logFile, logFile.exists());
-//
-// assertEquals(logFile.getAbsolutePath(), ignite.log().fileName());
-// }
+ final PrintStream backupSysOut = System.out;
+ final ByteArrayOutputStream testOut = new ByteArrayOutputStream();
+
+ try {
+ // Redirect the default output to a stream.
+ System.setOut(new PrintStream(testOut));
+
+ System.setProperty("IGNITE_QUIET", "false");
+
+ TcpDiscoverySpi disco = new TcpDiscoverySpi();
+
+ disco.setIpFinder(new TcpDiscoveryVmIpFinder(false) {{
+ setAddresses(Collections.singleton("127.0.0.1:47500..47509"));
+ }});
+
+ IgniteConfiguration cfg = new IgniteConfiguration()
+ .setGridLogger(new Log4J2Logger(LOG_PATH_VERBOSE_TEST))
+ .setConnectorConfiguration(null)
+ .setDiscoverySpi(disco);
+
+ try (Ignite ignite = G.start(cfg)) {
+ String testInfoMsg = "******* Hello Tester! INFO message *******";
+ String testDebugMsg = "******* Hello Tester! DEBUG message *******";
+
+ ignite.log().info(testInfoMsg);
+ ignite.log().debug(testDebugMsg);
+
+ String consoleOut = testOut.toString();
+
+ assertTrue(consoleOut.contains(testInfoMsg));
+ assertTrue(consoleOut.contains(testDebugMsg));
+ }
+ }
+ finally {
+ // Restore the stdout and write the String to stdout.
+ System.setOut(backupSysOut);
+
+ System.out.println(testOut.toString());
+ }
}
/**