您的位置:首页 > 其它

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

2016-12-09 21:11 295 查看
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 实现效果



总体来说,可以满足需求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: