java - 仅针对特定流程将日志写入不同的文件

标签 java logging log4j

我需要针对特定​​的代码流写入不同的日志文件。此流程不限于单个包,还使用其他类也引用的实用程序类。

# Root logger option
log4j.rootLogger=INFO, file ,sim

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=../log/main.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=30
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n


#log messages to a log file
log4j.appender.sim=org.apache.log4j.RollingFileAppender
log4j.appender.sim.File=../log/custom.log
log4j.appender.sim.MaxFileSize=10MB
log4j.appender.sim.MaxBackupIndex=30
log4j.appender.sim.layout=org.apache.log4j.PatternLayout
log4j.appender.sim.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

这样,尽管我在 Java 类中执行了此操作,但所有内容都会记录在两个日志中

private static Logger customLogger= Logger.getLogger("custom");

我的情况是,只要我想在代码流中写入,我就需要写入那个customLogger。此流程不限于单包。

最佳答案

函数getLogger(String name)实际上获取与您作为参数传递的字符串捆绑在一起的记录器。此方法通常与类名一起使用,因此您可以检索使用类名配置的附加程序。

如果您没有在 log4j.properties 中指定任何内容(您的情况),那么它会使用 rootLogger 并配置了您的附加程序,因此它会记录两次。

解决这个问题的方法是声明一个具有自定义名称的记录器,然后获取名称为“sim”的记录器,并将其与您的 sim 附加程序捆绑在一起。

将以下内容添加到您的 log4j.properties 中,它将起作用:

log4j.logger.sim=INFO, sim
log4j.additivity.sim=false

但是,我不推荐这种处理日志记录的方式,因为当您的类开始使用多个记录器时,推理可能会变得非常复杂。

关于java - 仅针对特定流程将日志写入不同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54648028/

相关文章:

python - 在aiohttp 2中指定日志请求格式

java - Hibernate SQL 参数记录

logging - 登录 Umbraco 的最佳实践是什么?

java - Wildfly 日志记录到文件问题

java - 部署在 ActiveMQ 内部时的 Camel log4j 配置

java - 避免Java反序列化中的重复对象

java - Spring 4 Web 套接字 - 我必须有 stomp 代理吗?

java - Apache Spark 使用 Java 加入示例

java - 适合内存的顺序数据的 QuickSort 和 MergeSort 性能与磁盘上访问顺序数据的速度比较慢

java - 通过批处理文件运行 maven java 项目时忽略 log4j 属性