[英]java.util.logging print file name
如何打印在 java.util.logging 中調用記錄器的名稱文件?
更具體地說,我需要為每個記錄調用打印行號、函數名和文件名。 java.util.logging 有可能嗎?
行號和文件名不存儲在 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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.