Как сохранить уровни ошибок в разных файлах в log4j? - PullRequest
0 голосов
/ 06 ноября 2019

Я использую log4j для приложения javaweb, я хочу сохранить каждый уровень в разных файлах.

У меня есть этот log4j.properties

# Root logger option
log4j.rootLogger=INFO, file, errorfile,fatalfile

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender

#Redirect to Tomcat logs folder
#log4j.appender.file.File=${catalina.home}/logs/logging.log

log4j.appender.file.File=C:\\log\\logging.log
log4j.appender.file.encoding=UTF-8
log4j.appender.file.Threshold=INFO
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}.%M:%L - %m%n

log4j.appender.errorfile=org.apache.log4j.RollingFileAppender
log4j.appender.errorfile.encoding=UTF-8
log4j.appender.errorfile.Threshold=ERROR
log4j.appender.errorfile.File=C:\\log\\errorlogging.log
log4j.appender.errorfile.MaxFileSize=10MB
log4j.appender.errorfile.MaxBackupIndex=10
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}.%M:%L - %m%n

log4j.appender.fatalfile=org.apache.log4j.RollingFileAppender
log4j.appender.fatalfile.encoding=UTF-8
log4j.appender.fatalfile.Threshold=FATAL
log4j.appender.fatalfile.File=C:\\log\\fatallogging.log
log4j.appender.fatalfile.MaxFileSize=10MB
log4j.appender.fatalfile.MaxBackupIndex=10
log4j.appender.fatalfile.layout=org.apache.log4j.PatternLayout
log4j.appender.fatalfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}.%M:%L - %m%n

Затем я хочусохраняйте ошибки только в файле с именем errorlogging, фатальный в файле fatallogging, но информацию в журнале файлов, но когда я отправляю ошибку или fatal, они сохраняются в loglogging, fatallogging и logging тоже, но я хочу это в разных файлах.

Способ сохранения журнала:

private static final Logger logger = Logger.getLogger(UserRepository.class);


logger.info("Begin "+userName);
logger.fatal("An error has occurred getting the user");
logger.fatal(e.getMessage(),e);

Как мне это сделать? Спасибо за вашу поддержку.

1 Ответ

1 голос
/ 10 ноября 2019

Проблема с вашей текущей конфигурацией журналирования состоит в том, что вы используете только один регистратор, который является rootLogger, и направляет все ваши сообщения журнала через rootLogger на ваши Файл , ErrorFile и FatalFile аппендеры с уровнем журнала INFO .

Вот что происходит, когда в вашем приложении регистрируется сообщение уровня INFO .

  1. Сначала корневой регистратор проверяет, может ли сообщение быть зарегистрировано или нет. Поскольку rootLogger настроен на запись сообщений INFO, сообщение будет перенаправлено всем настроенным приложениям.
  2. Сообщение приходит к File appender. Поскольку для самого файлового приложения определен порог (то есть INFO), он проверяет уровень. Поскольку условие проверки уровня выполнено, сообщение будет зарегистрировано.
  3. Теперь пришло сообщение для приложения ErrorFile. То же самое и здесь, за исключением порога ошибки. Поскольку сообщение журнала находится на уровне INFO, сообщение не будет зарегистрировано в ErrorFile.
  4. Теперь это сообщение поступает в приложение FatalFile. Здесь порог аппендера - Fatal. Сообщение не будет зарегистрировано в FatalFile.

Вот что происходит, когда в вашем приложении регистрируется сообщение об ошибке ERROR.

  1. Сначала корневой регистратор проверяет, может ли сообщение быть зарегистрировано или нет. Поскольку rootLogger настроен на ведение журнала сообщений INFO, а уровень сообщения - «Ошибка», сообщение будет перенаправлено всем настроенным приложениям.
  2. File appender -> Проверка уровня проходит для этого сообщения (как описано в предыдущем разделе),сообщение будет зарегистрировано в File appender.
  3. ErrorFile appender -> Проверка уровня пройдена, и сообщение будет зарегистрировано в ErrorFile.
  4. Приложение FatalFile -> Проверка уровня не удалась для этого, и сообщение не будет зарегистрировано в FatalFile.

Вот что происходит, когда сообщение уровня FATAL регистрируется в вашем приложении.

  1. Сначала корневой регистратор проверяет, может ли сообщение быть зарегистрировано или нет. Поскольку rootLogger настроен на запись сообщений INFO, а уровень сообщений - ФАТАЛЬНЫЙ, сообщение будет перенаправлено всем настроенным приложениям.
  2. File appender -> Проверка уровня проходит для этого сообщения, и сообщение будет зарегистрировано в File appender.
  3. ErrorFile appender -> Проверка уровня пройдена, и сообщение будет зарегистрировано в ErrorFile.
  4. 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
...