向使用 STDERR 显示的异常添加时间
Add time to an exception displayed with STDERR
在我的应用程序中,我使用 log4j。所有的日志都写在一个文件中,但是如果发生错误 STDERR not handled by my logs,它会被重定向到另一个文件中。
例如,未处理的 NullPointerException 出现在此其他文件中。
我需要在异常前添加 date/time。我为此使用自定义 PrintStream :
Main.java
public class Main {
MyPrintStream ps;
public static void main(String[] args) {
System.setErr(new MyPrintStream(System.out));
Integer i = null;
String str = i.toString();
}
}
MyPrintStream.java
public class MyPrintStream extends PrintStream {
public MyPrintStream(OutputStream out) {
super(out);
}
@Override
public void println(String string) {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
super.println(simpleDateFormat.format(date) + " " + string);
}
}
输出:
Exception in thread "main" java.lang.NullPointerException
2018-03-21 18:05:53.749 at test.Main.main(Main.java:9)
我需要的是:
2018-03-21 18:05:53.749 Exception in thread "main" java.lang.NullPointerException
at test.Main.main(Main.java:9)
在我的输出中,每一行都有一个日期。我试图覆盖打印方法,并且有 3 倍的日期。如何在异常开始时只显示一次日期?
我还有一个可能的解决方案,就是每次出现这种未处理的异常时,用log4j显示一个日志,但是我不知道如果没有捕获到异常怎么办...
我找到了解决办法。我可以做一个 log4j appender 来重定向 stderr,我的文件也一样。
我可以使用 UncaughtExceptionHandler 在 non-catched 错误上添加日期:
public static void main(String[] args) {
Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
@Override
public void uncaughtException(Thread t, Throwable e) {
Date date = new Date(); // faire le new Date() ici, en dehors du block, garanti d'avoir une heure au plus juste, mais les traces pourraient être au final dans le désordre dans le fichier
synchronized (System.err) {
System.err.print(simpleDateFormat.format(date) );
System.err.print(" Exception in thread \""+t.getName()+"\" ");
e.printStackTrace(System.err);
}
}
});
Integer i = null;
String str = i.toString();
}
如果需要,我可以将 System.err 重定向到一个文件。
在我的应用程序中,我使用 log4j。所有的日志都写在一个文件中,但是如果发生错误 STDERR not handled by my logs,它会被重定向到另一个文件中。 例如,未处理的 NullPointerException 出现在此其他文件中。
我需要在异常前添加 date/time。我为此使用自定义 PrintStream :
Main.java
public class Main {
MyPrintStream ps;
public static void main(String[] args) {
System.setErr(new MyPrintStream(System.out));
Integer i = null;
String str = i.toString();
}
}
MyPrintStream.java
public class MyPrintStream extends PrintStream {
public MyPrintStream(OutputStream out) {
super(out);
}
@Override
public void println(String string) {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
super.println(simpleDateFormat.format(date) + " " + string);
}
}
输出:
Exception in thread "main" java.lang.NullPointerException
2018-03-21 18:05:53.749 at test.Main.main(Main.java:9)
我需要的是:
2018-03-21 18:05:53.749 Exception in thread "main" java.lang.NullPointerException
at test.Main.main(Main.java:9)
在我的输出中,每一行都有一个日期。我试图覆盖打印方法,并且有 3 倍的日期。如何在异常开始时只显示一次日期?
我还有一个可能的解决方案,就是每次出现这种未处理的异常时,用log4j显示一个日志,但是我不知道如果没有捕获到异常怎么办...
我找到了解决办法。我可以做一个 log4j appender 来重定向 stderr,我的文件也一样。
我可以使用 UncaughtExceptionHandler 在 non-catched 错误上添加日期:
public static void main(String[] args) {
Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
@Override
public void uncaughtException(Thread t, Throwable e) {
Date date = new Date(); // faire le new Date() ici, en dehors du block, garanti d'avoir une heure au plus juste, mais les traces pourraient être au final dans le désordre dans le fichier
synchronized (System.err) {
System.err.print(simpleDateFormat.format(date) );
System.err.print(" Exception in thread \""+t.getName()+"\" ");
e.printStackTrace(System.err);
}
}
});
Integer i = null;
String str = i.toString();
}
如果需要,我可以将 System.err 重定向到一个文件。