如何将错误级别保存在log4j的不同文件中?

我正在将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文件中,但将信息保存在文件日志记录中,但是当我发送错误或致命信息时,它们也会保存在errorlogging,fatallogging和日志记录中,但我希望在不同的文件中使用它。

我保存日志的方式是:

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);

我该怎么做?,谢谢您的支持。

wangyue001 回答:如何将错误级别保存在log4j的不同文件中?

当前日志记录配置的问题是,您仅使用了一个rootLogger记录器,并将所有日志消息通过rootLogger路由到您的 File ErrorFile FatalFile 附加程序,具有 INFO 日志级别。

这是在应用程序中记录 INFO 级别消息时发生的情况。

  1. 首先,根记录器检查是否可以记录该消息。由于rootLogger配置为记录INFO消息,因此该消息将被路由到所有已配置的附加程序。
  2. 消息到达文件附加器。由于文件附加程序本身已定义阈值(即INFO),因此附加程序将检查级别。由于满足级别检查条件,因此将记录该消息。
  3. 现在,该消息到达ErrorFile附加程序。除了阈值是错误之外,这里也一样。由于日志消息处于INFO级别,因此该消息将不会记录在ErrorFile中。
  4. 现在,该消息到达FatalFile附加程序。在此,附加器阈值是致命的。消息将不会记录在FatalFile中。

这是在您的应用程序中记录错误级别消息时发生的情况。

  1. 首先,根记录器检查是否可以记录该消息。由于rootLogger配置为记录INFO消息,并且消息级别为错误,因此该消息将被路由到所有已配置的附加程序。
  2. 文件附加器->通过这一级检查(如上一节所述),消息将记录在文件附加器中。
  3. ErrorFile附加器->通过级别检查,该消息将记录在ErrorFile中。
  4. FatalFile追加器->此级别的级别检查失败,并且消息不会记录在FatalFile中。

这是在您的应用程序中记录致命级别的消息时发生的情况。

  1. 首先,根记录器检查是否可以记录该消息。由于rootLogger配置为记录INFO消息,并且消息级别为FATAL,因此该消息将被路由到所有已配置的附加程序。
  2. 文件附加器->通过这一级检查,消息将记录在文件附加器中。
  3. ErrorFile附加器->通过级别检查,该消息将记录在ErrorFile中。
  4. FatalFile追加器->此级别的级别检查失败,并且消息不会记录在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
本文链接:https://www.f2er.com/3150288.html

大家都在问