我正在使用 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 的文件中,将 fatal error 保存在文件 fatallogging 中,但将信息保存在文件日志记录中,但是当我发送错误或 fatal error 时,它们也会保存在 errorlogging、 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);
我该怎么做?谢谢您的支持。
最佳答案
当前日志记录配置的问题是您仅使用一个记录器(即 rootLogger),并通过 rootLogger 将所有日志消息路由到您的 File、ErrorFile 和 >FatalFile 附加程序具有 INFO 日志级别。
以下是在您的应用程序中记录 INFO 级别消息时发生的情况。
- 首先,根记录器检查消息是否可以被记录。由于 rootLogger 配置为记录 INFO 消息,因此该消息将被路由到所有配置的附加程序。
- 消息到达文件附加器。由于文件追加器本身定义了阈值(即 INFO),因此追加器会检查级别。由于满足级别检查条件,因此将记录该消息。
- 现在消息到达 ErrorFile 附加程序。这里也有同样的事情,除了阈值是错误。由于日志消息处于 INFO 级别,因此该消息不会记录在 ErrorFile 中。
- 现在消息到达 FatalFile 附加程序。这里的追加器阈值是致命的。消息不会记录在 FatalFile 中。
以下是在您的应用程序中记录错误级别消息时会发生的情况。
- 首先,根记录器检查消息是否可以被记录。由于rootLogger配置为记录INFO消息并且消息级别为Error,因此该消息将被路由到所有配置的appender。
- 文件附加器 -> 此级别检查通过(如上一节所述),消息将记录在文件附加器中。
- ErrorFile 附加程序 -> 级别检查通过,消息将记录在 ErrorFile 中。
- FatalFile 附加程序 -> 此级别检查失败,并且消息不会记录在 FatalFile 中。
以下是当应用程序中记录致命级别消息时会发生的情况。
- 首先,根记录器检查消息是否可以被记录。由于rootLogger配置为记录INFO消息并且消息级别为FATAL,因此该消息将被路由到所有配置的appender。
- 文件附加器 -> 此级别检查通过,消息将记录在文件附加器中。
- ErrorFile 附加程序 -> 级别检查通过,消息将记录在 ErrorFile 中。
- FatalFile 附加程序 -> 此级别检查失败,并且消息不会记录在 FatalFile 中。
您所要求的只能使用 Log4j 过滤器来完成。请参阅下面的 URL,获取有关如何使用过滤器的精彩示例。
https://riptutorial.com/java/example/19786/filter-logoutput-by-level--log4j-1-x-
此示例使用 XML 配置,我不确定使用属性配置是否可以实现相同的效果。
最简单的解决方案(或黑客)是,如果您至少有 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
关于java - 如何在log4j中的不同文件中保存错误级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58735080/