获取格式化程序的调用者 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 的名称.
关于它为什么不起作用,我可以想到以下几个原因:
- 有一个交接给另一个线程,而您在交接之前没有调用
LogRecord.getSourceClassName()
。这会导致日志记录推断出错误的调用者。
- 您创建了一个 'wrapper' class 来执行您的记录,记录器将 'wrapper' class 报告为调用者。 不要这样做。 直接使用记录器或使用日志记录框架。那里有很多伐木桥,您将创建的任何东西都将成为海盗船的木板。也就是说,com.sun.mail.util.MailLogger 包含所有用户评论一直试图向您解释的代码。
- 记录是用
logp
或 setSourceClassName
生成的,来源 class 是伪造的。
- 您的 JVM 使用堆栈跟踪生成异常时出现问题。
您需要包含更多源代码和示例日志文件输出数据。
我想为我的记录器添加一个 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 的名称.
关于它为什么不起作用,我可以想到以下几个原因:
- 有一个交接给另一个线程,而您在交接之前没有调用
LogRecord.getSourceClassName()
。这会导致日志记录推断出错误的调用者。 - 您创建了一个 'wrapper' class 来执行您的记录,记录器将 'wrapper' class 报告为调用者。 不要这样做。 直接使用记录器或使用日志记录框架。那里有很多伐木桥,您将创建的任何东西都将成为海盗船的木板。也就是说,com.sun.mail.util.MailLogger 包含所有用户评论一直试图向您解释的代码。
- 记录是用
logp
或setSourceClassName
生成的,来源 class 是伪造的。 - 您的 JVM 使用堆栈跟踪生成异常时出现问题。
您需要包含更多源代码和示例日志文件输出数据。