Перенаправить сообщения логгера из абстрактного дочернего класса, который наследует логгер от родителя - PullRequest
0 голосов
/ 01 мая 2019

Я работаю над проектом Java (не моим), который использует Spring-bean среди многих других зависимостей. Моя цель - перенаправить все сообщения журнала из нескольких классов Spring-Bean в файл, чтобы они не были видны в журнале консоли. Я пошел с программным подходом, потому что это то, что мне больше подходит в этой ситуации, и после поиска в Google некоторых решений Log4j нашел то, что (почти) работает для меня:

public static void removeConsoleLogsByClassName(String fullClassName) {
    LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    Configuration config = ctx.getConfiguration();
    PatternLayout layout = PatternLayout.newBuilder()
            .withPattern("%d{yyyy-MM-dd HH:mm:ss} %c{2} | [%t] | %-5level: - %m%n")
            .withConfiguration(config).build();
    Appender appender = FileAppender.createAppender(
             "some_location_goes_here/logfile.log",
            "false",
            "false", "fileAppender", "true", "false", "false", "8192", layout, null, "false", null, config);
    appender.start();
    config.addAppender(appender);
    AppenderRef ref = AppenderRef.createAppenderRef("fileAppender", null, null);
    AppenderRef[] refs = new AppenderRef[] { ref };
    org.apache.logging.log4j.core.config.LoggerConfig loggerConfig = LoggerConfig.createLogger(false,
            org.apache.logging.log4j.Level.TRACE,
            fullClassName,
            "true", refs, null, config, null);
    loggerConfig.addAppender(appender, null, null);
    if ("false".equals(TestInfo.getEnableLog())) {
        loggerConfig.setLevel(org.apache.logging.log4j.Level.OFF);
    }
    config.addLogger(fullClassName, loggerConfig);
    ctx.updateLoggers();
}

С помощью этого метода я могу предоставить имя класса и программно перенаправить сообщения регистратора в файл, что именно то, что мне нужно. Это работает за исключением (абстрактных) классов внутри Spring-бинов, которые наследуют объект LOGGER от некоторого родительского класса.

В моем случае я пытаюсь перенаправить сообщения журнала из AbstractBeanFactory в файл, но они все равно отображаются в консоли. Я предполагаю, что это потому, что этот класс наследует объект LOGGER от DefaultSingletonBeanRegistry, но я не уверен.

Иерархия классов

Если у кого-нибудь есть какой-либо совет / решение для этого, я был бы очень признателен. Заранее спасибо.

1 Ответ

0 голосов
/ 02 мая 2019

Если вы посмотрите на исходный код высшего класса в иерархии ( SimpleAliasRegistry ), вы увидите инициализацию регистратора:

/** Logger available to subclasses. */
protected final Log logger = LogFactory.getLog(getClass());

Возвращается getClass()тип конкретного класса во время выполнения.поэтому, когда вы видите абстрактный класс в журнале, это место, в котором был написан журнал, но реальный класс, который дает регистратору его имя, является некоторым подклассом.
Я бы посоветовал вам попытаться изменить шаблон на всежурналы, а затем он напечатает имя реального имени регистратора (который является подклассом)

...