簡體   English   中英

java.util.logging 打印文件名

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM