Проблема с вашей текущей конфигурацией журналирования состоит в том, что вы используете только один регистратор, который является rootLogger, и направляет все ваши сообщения журнала через rootLogger на ваши Файл , ErrorFile и FatalFile аппендеры с уровнем журнала INFO .
Вот что происходит, когда в вашем приложении регистрируется сообщение уровня INFO .
- Сначала корневой регистратор проверяет, может ли сообщение быть зарегистрировано или нет. Поскольку rootLogger настроен на запись сообщений INFO, сообщение будет перенаправлено всем настроенным приложениям.
- Сообщение приходит к File appender. Поскольку для самого файлового приложения определен порог (то есть INFO), он проверяет уровень. Поскольку условие проверки уровня выполнено, сообщение будет зарегистрировано.
- Теперь пришло сообщение для приложения ErrorFile. То же самое и здесь, за исключением порога ошибки. Поскольку сообщение журнала находится на уровне INFO, сообщение не будет зарегистрировано в ErrorFile.
- Теперь это сообщение поступает в приложение FatalFile. Здесь порог аппендера - Fatal. Сообщение не будет зарегистрировано в FatalFile.
Вот что происходит, когда в вашем приложении регистрируется сообщение об ошибке ERROR.
- Сначала корневой регистратор проверяет, может ли сообщение быть зарегистрировано или нет. Поскольку rootLogger настроен на ведение журнала сообщений INFO, а уровень сообщения - «Ошибка», сообщение будет перенаправлено всем настроенным приложениям.
- File appender -> Проверка уровня проходит для этого сообщения (как описано в предыдущем разделе),сообщение будет зарегистрировано в File appender.
- ErrorFile appender -> Проверка уровня пройдена, и сообщение будет зарегистрировано в ErrorFile.
- Приложение FatalFile -> Проверка уровня не удалась для этого, и сообщение не будет зарегистрировано в FatalFile.
Вот что происходит, когда сообщение уровня FATAL регистрируется в вашем приложении.
- Сначала корневой регистратор проверяет, может ли сообщение быть зарегистрировано или нет. Поскольку rootLogger настроен на запись сообщений INFO, а уровень сообщений - ФАТАЛЬНЫЙ, сообщение будет перенаправлено всем настроенным приложениям.
- File appender -> Проверка уровня проходит для этого сообщения, и сообщение будет зарегистрировано в File appender.
- ErrorFile appender -> Проверка уровня пройдена, и сообщение будет зарегистрировано в ErrorFile.
- FatalFile appender -> Проверка уровня не удалась для этого, и сообщение не будет зарегистрировано в FatalFile.
То, что вы спрашиваете, может быть сделано только с использованием фильтров Log4j. См. Ниже URL-адрес для хорошего примера использования фильтров.
https://riptutorial.com/java/example/19786/filter-logoutput-by-level--log4j-1-x-
В этом примере используется конфигурация XML, и я не уверен, что то же самое можно получить с помощью свойствконфигурация.
Самое простое решение (или взлом) заключается в том, что если у вас есть как минимум 2 пакета и все ваши журналы выполняются из пакета 2-го уровня, то вы можете использовать это вместо фильтров.
#FatalFile logger (Define this before the Error Logger)
log4j.logger.firstpackage.secondpackage=Fatal, FatalFile
log4j.additivity.firstpackage.secondpackage=false
#ErroFile logger
log4j.logger.firstpackage=Error, ErrorFile
log4j.additivity.firstpackage=false