java - 用不同的信息写入多个 log4j 文件

标签 java log4j

我正在处理的 API 无法连接到数据库,但需要记录 API 中发生的事件。为此,我正在考虑使用 log4j 创建带有 API 事件信息的日志文件。

问题是所有日志条目最终都在两个日志中,而不是分开的。

我需要满足的要求

  • 包含特定信息的多个日志文件
  • 备份日志文件无限期存在

Log4j 属性文件

log4j.rootLogger=QuietAppender, LoudAppender, FirstLog, SecondLog, TRACE

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n

# setup A1
log4j.appender.QuietAppender=org.apache.log4j.RollingFileAppender
log4j.appender.QuietAppender.Threshold=INFO
log4j.appender.QuietAppender.File=${wls.logs-path}/test-api/test-api-info.log
log4j.appender.QuietAppender.MaxFileSize=512KB
log4j.appender.QuietAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.QuietAppender.layout.ConversionPattern=%d %p [%c] - %m%n
# Keep three backup files.
log4j.appender.QuietAppender.MaxBackupIndex=100
# Pattern to output: date priority [category] - message
log4j.appender.QuietAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.QuietAppender.layout.ConversionPattern=%d %p [%c] - %m%n

# setup A2
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender
log4j.appender.LoudAppender.Threshold=DEBUG
log4j.appender.LoudAppender.File=${wls.logs-path}/test-api/test-api-debug.log
log4j.appender.LoudAppender.MaxFileSize=512KB
# Keep three backup files.
log4j.appender.LoudAppender.MaxBackupIndex=3
# Pattern to output: date priority [category] - message
log4j.appender.LoudAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.LoudAppender.layout.ConversionPattern=%d %p [%c] - %m%n

# setup FirstLog
log4j.appender.FirstLog=org.apache.log4j.RollingFileAppender
log4j.appender.FirstLog.Threshold=INFO
log4j.appender.FirstLog.File=${wls.logs-path}/test-api/first-info.log
log4j.appender.FirstLog.MaxFileSize=10240kB
log4j.appender.FirstLog.MaxBackupIndex=99999
log4j.appender.FirstLog.layout=org.apache.log4j.PatternLayout
log4j.appender.FirstLog.layout.ConversionPattern=%d %p [%c] - %m%n

# setup SecondLog
log4j.appender.SecondLog=org.apache.log4j.RollingFileAppender
log4j.appender.SecondLog.Threshold=INFO
log4j.appender.SecondLog.File=${wls.logs-path}/test-api/second-info.log
log4j.appender.SecondLog.MaxFileSize=10240kB
log4j.appender.SecondLog.MaxBackupIndex=99999
log4j.appender.SecondLog.layout=org.apache.log4j.PatternLayout
log4j.appender.SecondLog.layout.ConversionPattern=%d %p [%c] - %m%n

Java 类

private static final Logger logkp = Logger.getLogger("FirstLog");
private static final Logger logda = Logger.getLogger("SecondLog");

logkp.info(sb.toString());
logda.info(sb.toString());

当前结果

2015-05-27 10:27:46,175 INFO [SecondLog] - 12645,APIServer1,0,000bdc5000000100011055042d0114a6

2015-05-27 10:27:46,583 INFO [FirstLog] - APIServer1,Caller,test-Version-1.0,certValue,1
2015-05-27 10:28:22,458 INFO [SecondLog] - 12645,APIServer1,0,000bdc5000000100011055042d0114a6

2015-05-27 10:28:22,793 INFO [FirstLog] - APIServer1,Caller,test-Version-1.0,certValue,1

2015-05-27 10:28:25,203 INFO [SecondLog] - 12645,APIServer1,0,000bdc5000000100011055042d0114a6

2015-05-27 10:28:25,528 INFO [FirstLog] - APIServer1,Caller,test-Version-1.0,certValue,1

2015-05-27 10:28:26,686 INFO [SecondLog] - 12645,APIServer1,0,000bdc5000000100011055042d0114a6

最佳答案

对此我不是 100% 确定,因为我使用 log4j 已经有一段时间了,我们过去常常用 xml 编写配置,但我认为你必须像这样创建记录器:

log4j.rootLogger=QuietAppender, LoudAppender, TRACE
log4j.logger.FirstLogger = FirstLog, INFO
log4j.additivity.FirstLogger = false
log4j.logger.SecondLogger = SecondLog, INFO
log4j.additivity.SecondLogger = false

... // then configure appenders as you did

得到你想要的输出。将可加性设置为 false “切断”与 rootLogger 的连接。它默认设置为 true 并将导致所有日志消息附加到记录器和记录器的所有祖先。将其设置为 false 会改变这一点。

如果您的 API 有自己的命名空间——比如说“my.own.API”,那么您也可以像这样创建一个 API-Logger:

log4j.logger.my.own.API = MyAPIAppender, INFO
log4j.additivity.my.own.API = false

然后像这样创建记录器:

package my.own.API

public class MyAPIClass{
    private static Logger apiLog = Logger.getLogger(MyAPIClass.class);
    // ...
}

关于java - 用不同的信息写入多个 log4j 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30491245/

相关文章:

java - 生产者消费者死锁

Java - 确切含义http.maxConnections

java - 多个appender log4j 性能

java - ClassNotFoundException:org.apache.log4j.Priority

java - 如何使用 Log4j 将自定义属性记录到 AppInsight?

java - Hibernate、JPA - 具有两个表的多对多示例

java - 适用于 Windows 上 Install4j 的 JRE 8?

java - Spring Web MVC : Use same request mapping for request parameter and path variable

log4j - log4J 的 java.util.logging.Handler 等价物是什么

java - 如何使用 pojo 找出类级别 Log4J 附加程序