Получение имени класса вызывающей стороны для Formatter [Java Logging with File Handler]
Я хочу добавить FileHandler в мой логгер. И я также создаю новый Formatter(java.util.logging.Formatter) для моего FileHandler
В методе формата https://docs.oracle.com/javase/7/docs/api/java/util/logging/Formatter.html возможно ли получить класс который вызвал журнал https://docs.oracle.com/javase/7/docs/api/java/util/logging/Logger.html?
Изменить: я завернул свой регистратор в классе, так что getSourceClassName() не будет работать
1 ответ
... возможно ли получить класс, который вызвал журнал? Обратите внимание, что 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()
до того, как сдать руку. Это заставляет запись журнала выводить не того абонента. - Вы создали класс "обертка" для ведения журнала, и регистратор сообщает, что класс "обертка" является вызывающим. Не делай этого. Используйте регистратор напрямую или используйте каркас регистрации. Существует множество лесозаготовительных мостов, и все, что вы создадите, будет доской для пиратского корабля. Тем не менее, com.sun.mail.util.MailLogger содержит код, который все комментарии пользователей пытались объяснить вам.
- Запись была сгенерирована с
logp
или жеsetSourceClassName
и исходный класс был подделан. - Возникла проблема с вашей JVM, генерирующей исключения со следами стека.
Вам нужно включить больше исходного кода и пример выходных данных файла журнала.