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

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就是前面已经设置好的系统变量。如果对这种格式标识符有什么不理解的,请查看这篇文章:。

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

[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

4 实现效果

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

经验分享 程序员 微信小程序 职场和发展