我想在我的记录器中添加一个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()将无法正常工作
答案 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
,这是源类的名称。
我可以考虑为什么它不起作用的原因有几个:
LogRecord.getSourceClassName()
。这会导致日志记录推断出错误的调用者。logp
或setSourceClassName
生成的,而源类是伪造的。您需要包含更多源代码和示例日志文件输出数据。