获取Formatter [使用文件处理程序进行Java日志记录]的调用者类名称

时间:2018-01-12 09:42:06

标签: java class logging formatting filehandler

我想在我的记录器中添加一个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)中,是否可以获取调用日志https://docs.oracle.com/javase/7/docs/api/java/util/logging/Logger.html#log(java.util.logging.Level,%20java.lang.String)method的类?

编辑:我将记录器包装在一个类中,因此getSourceClassName()将无法正常工作

1 个答案:

答案 0 :(得分:0)

  

...是否有可能获得调用日志的类?请注意,LogRecord.getSourceClassName()返回Logger类。

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,这是源类的名称。

我可以考虑为什么它不起作用的原因有几个:

  1. 在另一个线程中有一手牌,你没有在手牌关闭之前拨打LogRecord.getSourceClassName()。这会导致日志记录推断出错误的调用者。
  2. 您创建了一个“包装器”类来执行日志记录,并且记录器将“包装器”类报告为调用者。 不要这样做。直接使用记录器或使用记录框架。那里有很多伐木桥,你要创建的任何东西都将是一艘海盗船。也就是说,{{3}}包含所有用户评论都试图向您解释的代码。
  3. 该记录是使用logpsetSourceClassName生成的,而源类是伪造的。
  4. 您的JVM在堆栈跟踪中生成异常时出现问题。
  5. 您需要包含更多源代码和示例日志文件输出数据。