log4j区分不同客户端产生的日志

http://blog.csdn.net/loongshawn/article/details/53540252

1 应用场景

公司开发了一个JavaFX的桌面应用客户端,由于某项功能比较耗时,同时可以打开多个客户端(客户端所在机器性能强劲),通常客户端的日志都会输出到指定路径文件,这样多客户端同时打开,日志也会输入到同一个文件,这样就没法区分哪些日志是哪个客户端产生的。

通常有两种方法来解决这个问题:

  • 1、不同客户端日志写入不同文件;
  • 2、不同客户端日志写入同一文件,给日志添加客户端前缀标识。

当然,本实例中利用方法二,将日志保存至同一文件,不设太多分支。可能不同的场景要求不同,本方法仅供参考。

2 设计思路

首先,需要明确以下几点:

  • 1、log4j仅在程序启动时初始化一次。
  • 2、Client_ID(客户端ID)的生命周期为:启动软件——>关闭软件。因此是动态变化的。
  • 3、在客户端中标明该客户端所属ID,若有查阅日志需要,便于定位日志。

在明确上面两点后,需要做的就是:

  • 1、程序启动时初始化Client_ID,并将其添加为一个系统属性,并在客户端显示这个ID;
  • 2、把这个Client_ID添加到log4j.property配置文件中去。

3 相关配置

3.1 添加系统属性

添加系统变量方式如下,其中StringUtil.getClientId()为随机序列产生方法,自行编写即可:

String clientId = StringUtil.getClientId();
System.setProperty("client.id",clientId);
 
 
  • 1
  • 2
  • 1
  • 2

3.2 客户端显示当前ID

具体实现因人而异。

这里写图片描述

3.3 配置log4j.property

配置log4j.property文件,需要配置的地方如下:

log4j.appender.info.layout.ConversionPattern=[${client.id}] %d{yyyy-MM-dd-HH-mm-SSS} [%t] [%c] [%p] - %m%n
 
 
  • 1
  • 1

可以看到,在日志输出格式前添加了标记[${client.id}] ,这个client.id就是前面已经设置好的系统变量。如果对这种格式标识符有什么不理解的,请查看这篇文章:https://my.oschina.net/u/140714/blog/189008

这种格式输出的日志效果如下:

[UI-08.1209.563] 2016-12-09-16-00-622 [main] [com.loongshawn.axf.client.util.WellcomeUtil] [INFO] - -------------------------------------------------------
[UI-08.1209.563] 2016-12-09-16-00-623 [main] [com.loongshawn.axf.client.util.WellcomeUtil] [INFO] - 平台初始化...
[UI-08.1209.563] 2016-12-09-16-00-623 [main] [com.loongshawn.axf.client.util.WellcomeUtil] [INFO] - -------------------------------------------------------

 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

完整的log4j.property配置如下:

log4j.rootLogger=debug,info,error,DEBUG,CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[${client.id}] %d{yyyy-MM-dd-HH-mm-SSS} [%t] [%c] [%p] - %m%n

log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=[${client.id}] %d{yyyy-MM-dd-HH-mm-SSS} [%t] [%c] [%p] - %m%n
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold = info
log4j.appender.info.append=true
log4j.appender.info.File=${log.base}/system/logs/info/info.log

log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=[${client.id}] %d{yyyy-MM-dd-HH-mm-SSS} [%t] [%c] [%p] - %m%n
log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold = error
log4j.appender.error.append=true
log4j.appender.error.File=${log.base}/system/logs/error/error.log

log4j.logger.DEBUG=debug
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEBUG.layout.ConversionPattern=[${client.id}] %d{yyyy-MM-dd-HH-mm-SSS} [%t] [%c] [%p] - %m%n
log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
log4j.appender.DEBUG.Threshold = debug
log4j.appender.DEBUG.append=true
log4j.appender.DEBUG.File=${log.base}/system/logs/debug/debug.log
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

4 实现效果

这里写图片描述

总体来说,可以满足需求。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值