首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.util.logging打印文件名

java.util.logging打印文件名
EN

Stack Overflow用户
提问于 2022-05-18 12:19:33
回答 1查看 52关注 0票数 0

如何打印在java.util.logging中调用记录器的名称文件?

更具体地说,对于每个日志记录调用,我需要打印行号、函数名和文件名。在java.util.logging中有可能吗?

EN

回答 1

Stack Overflow用户

发布于 2022-05-20 16:27:02

行号和文件名没有存储在LogRecord中。如果您没有通过MemoryHandler执行任何线程切换,则可以使用StackTrace或StackWalker在自定义格式化程序中推断调用方。

下面是一个示例:

代码语言:javascript
复制
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);
    }
}

示例输出如下:

代码语言:javascript
复制
May 20, 2022 06:01:04 AM LogTest main
INFO: This is a test
LogTest.main(LogTest.java:14)

您可以通过调用StackTraceElement上的方法来改变这种情况,而不是像我在这里所做的那样只调用toString。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72289046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档