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

标签 java logging

我正在使用 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/

相关文章:

java - 如何在java中解码具有 'default'类属性的json字符串?

logging - 关于在日志中使用表情符号的想法

java - 访问 Java 应用程序中的记录器

objective-c - 迁移到 iOS 9 后“无效上下文 0x0”

java - 如何在应用程序的文本字段中包含笑脸符号?

java - java中的变量继承

java - 用实际字符替换 Java unicode 编码

python - 如何用日志模块替换打印调试消息

使用 NLog 进行 Azure 日志流式处理

java - 从大文件中删除 4 字节 UTF 字符