log4j区分不同客户端产生的日志
2016-12-09 21:11
295 查看
http://blog.csdn.net/loongshawn/article/details/53540252
公司开发了一个JavaFX的桌面应用客户端,由于某项功能比较耗时,同时可以打开多个客户端(客户端所在机器性能强劲),通常客户端的日志都会输出到指定路径文件,这样多客户端同时打开,日志也会输入到同一个文件,这样就没法区分哪些日志是哪个客户端产生的。
通常有两种方法来解决这个问题:
1、不同客户端日志写入不同文件;
2、不同客户端日志写入同一文件,给日志添加客户端前缀标识。
当然,本实例中利用方法二,将日志保存至同一文件,不设太多分支。可能不同的场景要求不同,本方法仅供参考。
首先,需要明确以下几点:
1、log4j仅在程序启动时初始化一次。
2、Client_ID(客户端ID)的生命周期为:启动软件——>关闭软件。因此是动态变化的。
3、在客户端中标明该客户端所属ID,若有查阅日志需要,便于定位日志。
在明确上面两点后,需要做的就是:
1、程序启动时初始化Client_ID,并将其添加为一个系统属性,并在客户端显示这个ID;
2、把这个Client_ID添加到log4j.property配置文件中去。
添加系统变量方式如下,其中StringUtil.getClientId()为随机序列产生方法,自行编写即可:
2
1
2
具体实现因人而异。
配置log4j.property文件,需要配置的地方如下:
1
可以看到,在日志输出格式前添加了标记[${client.id}] ,这个client.id就是前面已经设置好的系统变量。如果对这种格式标识符有什么不理解的,请查看这篇文章:https://my.oschina.net/u/140714/blog/189008。
这种格式输出的日志效果如下:
2
3
4
1
2
3
4
完整的log4j.property配置如下:
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
总体来说,可以满足需求。
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%n1
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.log1
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 实现效果
总体来说,可以满足需求。
相关文章推荐
- 一个友元类使用误区(C++)
- AndroidStudio 新手常遇到的错误以及解决办法
- Android在64位系统上app如何导入32位库
- input
- 求每行每列都有序的一个矩阵的第k大的值
- 日志-log4php
- 动力节点——面向对象思想概述(五)
- opencv快速傅里叶变换实例
- LUA学习路线汇总
- JavaSE学习(9) 二进制、位运算符、移位运算符
- Android 导入下载的Project缺少gradle文件处理办法
- 文本框事件——单击 隐藏与显示
- Nagios+zabbix+ganglia的相关参数分析和优缺点介绍
- 《Android开发艺术探索》--Android线程和线程池
- 借助tomecat发布web项目的发布
- 代理模式
- python3 用ConfigParser包处理 ini文件
- 关于使用Jsonp做跨域请求
- RSA算法的原理
- TCP/IP协议栈初始化(四) 向下走,找到IP向上进阶的入口