gpt4 book ai didi

java - 即使设置了System.setErr(),也无法使用自定义PrintStream打印错误

转载 作者:行者123 更新时间:2023-12-03 13:02:15 25 4
gpt4 key购买 nike

基本上,我希望控制台做两件事:

  • 我希望控制台为错误代码和常规信息消息加色(错误为红色,其他均为绿色)。
  • 我想将所有控制台消息保存到日志文件。

  • 因此,我创建了一个看起来像这样的打印流:
    public static class GeneralStream extends PrintStream {

    public GeneralStream(OutputStream out) {
    super(out);
    }

    @Override
    public void println(String string) {
    String time = DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now());

    String output = "["+time+"] ["+type.n()+"] "+string;
    Logs.logToFile(output);

    String coloredOutput = ANSI_RESET+ANSI_WHITE+"["+ANSI_CYAN+time+ANSI_WHITE+"] "+
    ANSI_WHITE+"["+ANSI_RESET+type.c()+type.n()+ANSI_WHITE+"] "+type.c()+string+ANSI_RESET;
    super.println(coloredOutput);
    }
    }
    伟大的。然后,使用以下命令在程序开始时将此打印流设置为默认PrintStream:
    // Set console output settings
    System.setOut(new Console.GeneralStream(System.out));
    System.setErr(new Console.GeneraStream(System.err));
    惊人的。最后,在执行System.out.println(“H​​ello World”)时,我得到了预期的结果。我的留言是彩色的。它们被记录到文件中。伟大的!实际上,即使我执行System.err.println(“Error!”),我仍然可以获得预期的结果。 但是,“自动”异常不会通过我设置的System.err打印。
    这是一个例子:
    // Set console output settings
    System.setOut(new Console.GeneralStream(System.out));
    System.setErr(new Console.ErrorStream(System.err));

    System.out.println("Hello world!");
    System.err.println("Printing an error!");

    // Real exception (NPE)
    Integer nullInteger = null;
    System.out.println(nullInteger.toString()); // won't print and will produce a NullPointException
    结果如下:
    As you can see, my System.out and System.err print fine but as soon as there is a real exception, it prints regularly.
    因此,我的问题是如何为此类错误设置自定义PrintStream,以便将它们记录到文件中(最好遵循我的自定义消息格式)。

    最佳答案

    如果您深入研究Throwable类如何打印堆栈跟踪,您会看到它使用了println(Object)方法,因此需要将此方法添加到自定义ErrorStream类中:

    @Override
    public void println(Object object) {
    println(String.valueOf(object));
    }
    即使这样,您可能仍想更改“未捕获的异常处理程序”以更改其记录异常的方式。似乎默认处理程序会先调用 System.err.print来输出 Exception in thread "{ThreadName}",然后再调用 Throwable.printStackTrace,因此最终会在消息中间出现时间戳和其他内容。例如:
        Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
    System.err.println("Uncaught exception in thread " + thread.getName());
    throwable.printStackTrace(System.err);
    });

    关于java - 即使设置了System.setErr(),也无法使用自定义PrintStream打印错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62823892/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com