【发布时间】:2014-11-03 15:01:24
【问题描述】:
我们正在 Spring XD v1.0.0.RELEASE 上运行多个流和作业。
相应的流和作业模块将消息记录到 Spring XD 的全局日志文件中,位于 $XD_HOME/logs
我们需要区分每个作业和流创建的日志消息。用 ${xd.job.name} 或 ${xd.stream.name} 的值标记每个日志行应该对我们有用。例如,
1) 在一个配置文件(Spring XD 配置、XML 上下文文件、Java 类...随便)中,设置一个 Java 上下文(?)变量:
if(moduleType == "job") {
name = ${xd.job.name};
} else if(moduleType == "stream") {
name = ${xd.stream.name};
} else {
name = "XD";
}
2) 相应地配置 $XD_HOME/config 下的 log4j 属性文件:
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2} [${name}] - %m%n
3) 运行作业 (xd.job.name = "fooJob") 和流 (xd.stream.name = "barStream) 的 Spring XD 的日志输出"):
...
13:07:41,169 DEBUG task-scheduler-1 myjobimpl.TransactionManager [fooJob] - Initiating transaction commit
...
13:08:43,215 INFO task-scheduler-15 mystreamimpl.JsonDecoder [barStream] - Decoding JSON: {...}
...
14:08:42,569 INFO DeploymentsPathChildrenCache-0 monitor.IntegrationMBeanExporter [XD] - Summary on shutdown: MessageChannelMonitor: [name=input, sends=0]
4) 由其他库(例如 Spring Data、Apache Commons 等)记录的任何消息都应具有 [fooJob]、[barStream] 或 [XD],与调用库的作业或流的值相同。
到目前为止,我们提出的唯一半生不熟的解决方案是在 log4j 的 MDC or NDC 中设置 $name,但我们不知道如何在基于每个流或每个作业(MDC 和 NDC 在每个线程的基础上工作)。
有没有办法将作业或流名称添加到相应的日志行中?
【问题讨论】:
标签: logging spring-batch spring-integration spring-xd