获取格式化程序的调用者 class 名称 [Java 使用文件处理程序记录]

Getting caller class name for Formatter [Java Logging with File Handler]

我想为我的记录器添加一个 FileHandler。我还为我的 FileHandler

创建了一个新的 Formatter(java.util.logging.Formatter)

格式化方法https://docs.oracle.com/javase/7/docs/api/java/util/logging/Formatter.html#format(java.util.logging.LogRecord), is it possible to get the class which called the log https://docs.oracle.com/javase/7/docs/api/java/util/logging/Logger.html#log(java.util.logging.Level,%20java.lang.String)method

编辑:我将记录器包装在 class 中,因此 getSourceClassName() 将不起作用

...is it possible to get the class which called the log? Note that LogRecord.getSourceClassName() returns the Logger class.

LogRecord.getSourceClassName() 完全按照您的意愿行事。这是一个例子:

import java.io.File;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class FileHandlerTest {

    private static final Logger logger = Logger.getLogger("tester");

    static {
        try {
            FileHandler h = new FileHandler();
            logger.addHandler(h);
            h.setFormatter(new TestFormatter());
        } catch (IOException ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    private static class TestFormatter extends Formatter {

        @Override
        public String format(LogRecord record) {
            return record.getSourceClassName();
        }

    }

    public static void main(String[] args) throws Exception {
        System.out.println(new File(".").getCanonicalPath());
        System.out.println(System.getProperty("user.home"));
        logger.log(Level.INFO, "This not a test. This is the real thing!");
    }
}

当我 运行 在我的机器上执行此操作时,它会在我的用户主目录中创建一个名为 java0.log 的文件,其中包含文本 FileHandlerTest,这是源 class 的名称.

关于它为什么不起作用,我可以想到以下几个原因:

  1. 有一个交接给另一个线程,而您在交接之前没有调用 LogRecord.getSourceClassName()。这会导致日志记录推断出错误的调用者。
  2. 您创建了一个 'wrapper' class 来执行您的记录,记录器将 'wrapper' class 报告为调用者。 不要这样做。 直接使用记录器或使用日志记录框架。那里有很多伐木桥,您将创建的任何东西都将成为海盗船的木板。也就是说,com.sun.mail.util.MailLogger 包含所有用户评论一直试图向您解释的代码。
  3. 记录是用 logpsetSourceClassName 生成的,来源 class 是伪造的。
  4. 您的 JVM 使用堆栈跟踪生成异常时出现问题。

您需要包含更多源代码和示例日志文件输出数据。