Как уровни работают в Log4j?

Я изучаю Log4j и пытаюсь понять, почему он печатает отладочное сообщение дважды? Я прочитал о additivty, и понимаю, что регистрация будет распространяться на родителя, который в этом случае будет "root". Однако уровень "root" является фатальным, поэтому не следует ли фильтровать этот запрос на регистрацию?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
    <appender name="dataAccessLogger" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="conversionPattern" value="%m%n" />
        </layout>
    </appender>

    <logger name="com.supertrooper">
        <level value="debug" />
        <appender-ref ref="dataAccessLogger" />
    </logger>

    <root>
        <level value="fatal" />
        <appender-ref ref="dataAccessLogger" />
    </root>
</log4j:configuration>

Код:

// Field in class
private static Logger logger = Logger.getLogger(Log4JTesting.class);

// How I use it
logger.debug("Hello world!-----------------");

1 ответ

com.supertrooper logger унаследует приложение от корневого, поэтому вам не нужно явно добавлять этого приложения в дочерний регистратор. Если вы сделаете это, как в вашем примере, вы получите дублированные сообщения.

Тот факт, что корневой логгер установлен как "роковой", не меняет того факта, что его дополнения будут наследоваться детьми (независимо от того, для какого уровня журнала они установлены). Если вы хотите, чтобы приложение регистрировало только фатальные сообщения, независимо от того, из какого регистратора они пришли, то вам нужно установить пороговое значение для самого приложения.

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