在Java中的system.out.println重定向

24 浏览
0 Comments

在Java中的system.out.println重定向

我希望捕获println并将其重定向到文件并打印出来。这是我的代码,我希望打印出123 和 456,但是它不起作用,我认为在打印outContent之前需要停止捕获,但是我不知道该如何做。\n代码如下:\n

public static void main(String args[]){
    ByteArrayOutputStream outContent = new ByteArrayOutputStream();
    System.setOut(new PrintStream(outContent));
    System.out.println("123");
    System.out.println("456");
    System.out.println(outContent.toString());
}

0
0 Comments

在Java中,System.out.println被广泛用于在控制台打印输出。然而,有时候我们希望将输出重定向到Log4J或其他日志框架,以便更好地进行日志管理和分析。这个问题就是关于如何在将System.out.println重定向到Log4J的同时保留类名信息。

在Stack Overflow的这个帖子中,有人提出了这个问题,并给出了解决方案。下面是这个问题出现的原因以及解决方法的整理:

问题的原因:

在Java中,System.out是一个PrintStream对象,它有一个println方法用于在控制台打印输出。然而,PrintStream对象没有直接提供将输出重定向到其他地方的方法。所以,要想将System.out.println重定向到Log4J,就需要找到一种方式来捕获System.out的输出并将其传递给Log4J。

解决方法:

在这个帖子中,有人给出了一种解决方案。他们创建了一个名为SystemOutLogger的类,继承了PrintStream,并重写了println方法。在重写的println方法中,他们首先获取当前调用println方法的类名,然后将类名和输出内容传递给Log4J进行日志记录。

代码如下:

import org.apache.log4j.Logger;
import java.io.PrintStream;
public class SystemOutLogger extends PrintStream {
    private Logger logger;
    public SystemOutLogger(Logger logger) {
        super(System.out);
        this.logger = logger;
    }
    @Override
    public void println(String message) {
        // 获取当前调用println方法的类名
        String className = new Throwable().getStackTrace()[1].getClassName();
        // 将类名和输出内容传递给Log4J进行日志记录
        logger.info(className + " - " + message);
    }
}

然后,需要在应用程序的入口处将System.out重定向到SystemOutLogger。这可以通过以下代码实现:

Logger logger = Logger.getLogger("MyLogger");
SystemOutLogger systemOutLogger = new SystemOutLogger(logger);
System.setOut(systemOutLogger);

通过这种方式,System.out.println的输出将被重定向到Log4J,并且输出内容中会保留类名信息,方便进行日志分析和管理。

本文介绍了如何将System.out.println重定向到Log4J,并保留类名信息的解决方法。通过创建一个继承PrintStream的自定义类,并重写println方法,我们可以捕获System.out的输出并将其传递给Log4J进行日志记录。这种方法能够提高日志管理的灵活性和可扩展性,方便进行日志分析和排查错误。

0
0 Comments

在Java中,如果想要将输出信息重定向到一个文件中,可以使用System.setOut()方法。下面是具体的代码示例:

System.setOut(new PrintStream(new File("<your log file>"));

使用上述代码,可以将所有的System.out.println输出重定向到指定的日志文件中。希望这对你有所帮助。

0
0 Comments

这是一个Java程序,它演示了在控制台输出的同时将内容写入文件的技巧。程序中定义了一个名为"RedirectStdOut"的类,其中包含一个名为"LoggingPrintStream"的内部类。在"main"方法中,程序创建了一个文件输出流"os",并将其传递给"LoggingPrintStream"类的实例"lps"。然后程序调用"lps"的"install"方法,将标准输出重定向到"os"上。接下来,程序通过调用"System.out.println"方法输出一些文本,这些文本将同时显示在控制台和文件中。最后,程序调用"lps"的"uinstall"方法,将标准输出恢复到原来的状态。

"LoggingPrintStream"类实现了"PrintStream"接口,并重写了"write"方法。在"install"方法中,程序保存了原始的标准输出流"old",然后将"System.out"设置为一个新的"PrintStream"对象,该对象在写入内容时将内容同时写入"old"和"os"。在"uinstall"方法中,程序首先刷新"os",然后关闭"os"和恢复"System.out"为"old"。

这个程序的目的是将输出内容同时输出到控制台和文件中。通过重定向标准输出流,可以实现这一目的。通过使用"LoggingPrintStream"类,我们可以在需要的时候将输出重定向到文件,并在不需要时将其恢复到控制台。

这个程序的输出结果将同时显示在控制台和名为"Log.txt"的文件中。

0