Получение имени класса вызывающей стороны для 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 который является именем исходного класса.

Есть несколько причин, по которым я могу подумать, почему это не сработает:

  1. Была передача в другой поток, и вы не звонили LogRecord.getSourceClassName() до того, как сдать руку. Это заставляет запись журнала выводить не того абонента.
  2. Вы создали класс "обертка" для ведения журнала, и регистратор сообщает, что класс "обертка" является вызывающим. Не делай этого. Используйте регистратор напрямую или используйте каркас регистрации. Существует множество лесозаготовительных мостов, и все, что вы создадите, будет доской для пиратского корабля. Тем не менее, com.sun.mail.util.MailLogger содержит код, который все комментарии пользователей пытались объяснить вам.
  3. Запись была сгенерирована с logp или же setSourceClassName и исходный класс был подделан.
  4. Возникла проблема с вашей JVM, генерирующей исключения со следами стека.

Вам нужно включить больше исходного кода и пример выходных данных файла журнала.

Другие вопросы по тегам