如何打印在java.util.logging中调用记录器的名称文件?
更具体地说,对于每个日志记录调用,我需要打印行号、函数名和文件名。在java.util.logging中有可能吗?
发布于 2022-05-20 16:27:02
行号和文件名没有存储在LogRecord中。如果您没有通过MemoryHandler执行任何线程切换,则可以使用StackTrace或StackWalker在自定义格式化程序中推断调用方。
下面是一个示例:
import java.util.logging.LogRecord;
import java.util.logging.SimpleFormatter;
public class CallSiteFormatter extends java.util.logging.Formatter {
private final java.util.logging.Formatter target = new SimpleFormatter();
public CallSiteFormatter() {
}
@Override
public String format(LogRecord record) {
StackTraceElement stack = inferCaller();
return String.format("%s%s", target.format(record), stack);
}
private boolean isPrintImplFrame(String cname) {
for (Class<?> k = getClass(); k != java.util.logging.Formatter.class; k = k.getSuperclass()) {
if (k.getName().equals(cname) || cname.startsWith("java.util.logging.")) {
return true;
}
}
return false;
}
private StackTraceElement inferCaller() {
StackTraceElement stack[] = (new Throwable()).getStackTrace();
int ix = 0;
while (ix < stack.length) {
StackTraceElement frame = stack[ix];
String cname = frame.getClassName();
if (isPrintImplFrame(cname)) {
break;
}
ix++;
}
while (ix < stack.length) {
StackTraceElement frame = stack[ix];
String cname = frame.getClassName();
if (!isPrintImplFrame(cname)) {
return frame;
}
ix++;
}
return new StackTraceElement(CallSiteFormatter.class.getName(), "format", null, -1);
}
}示例输出如下:
May 20, 2022 06:01:04 AM LogTest main
INFO: This is a test
LogTest.main(LogTest.java:14)您可以通过调用StackTraceElement上的方法来改变这种情况,而不是像我在这里所做的那样只调用toString。
https://stackoverflow.com/questions/72289046
复制相似问题