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);
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
可以看到,在日志输出格式前添加了标记[${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] - -------------------------------------------------------
完整的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 实现效果
总体来说,可以满足需求。