gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:20:20 24 4
gpt4 key购买 nike

我正在使用 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 将所有日志消息路由到您的 FileErrorFile>FatalFile 附加程序具有 INFO 日志级别。

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

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

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

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

以下是当应用程序中记录致命级别消息时会发生的情况。

  1. 首先,根记录器检查消息是否可以被记录。由于rootLogger配置为记录INFO消息并且消息级别为FATAL,因此该消息将被路由到所有配置的appender。
  2. 文件附加器 -> 此级别检查通过,消息将记录在文件附加器中。
  3. ErrorFile 附加程序 -> 级别检查通过,消息将记录在 ErrorFile 中。
  4. 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com