Skip to content
袁逸凡 edited this page Aug 13, 2018 · 3 revisions

Log4j 1.x改造

很多人分不清1.x和2.x的区别,很简单,你用properties文件配置的就是1.x,用xml文件配置的话就是2.x。估计大多数用的还是Log4j1。

异步HttpAppender(强烈推荐)

最推荐的是使用异步的 Http Appender,本项目实现的异步HttpAppender依托于Apache的Http-Client,同时有时间触发器与日志数量触发器,将日志批量收集以后压缩(注:会自动根据正文大小选择是否使用压缩)发送到服务器,且能与服务器保持长连接以达到极高性能的日志传输。

log4j.rootLogger=all,lofka
log4j.appender.lofka=com.github.tsingjyujing.lofka.appender.log4j.HttpAsyncAppender
log4j.appender.lofka.application=你的应用名称
log4j.appender.lofka.target=Lofka服务器地址
log4j.appender.lofka.interval=100
log4j.appender.lofka.maxBufferSize=100

其中,interval是时间触发极限(单位:毫秒),maxBufferSize是日志堆积量出发极限(单位:条),当两条中任意一条被触发的时候就会发送日志。

服务器地址的配置形如:http://lofka.exmaple.com/或者http://172.16.9.179:9500/,总而言之,取决于你的Lofka服务器和网络配置。

应用名称可以随便定义,但是推荐的实现参考最佳实现中描述的

同步 Http Appender

如果你有较高的实时性需求,即使毫秒级的误差也会给你造成麻烦,那么你可以选择使用同步日志发送器,在每收到一条日志的时候日志系统都会单独发送。

log4j.rootLogger=all,lofka
log4j.appender.lofka=com.github.tsingjyujing.lofka.appender.log4j.HttpAppender
log4j.appender.lofka.application=你的应用名称
log4j.appender.lofka.target=Lofka服务器地址

利用原生的SocketAppender

如果你不能引入第三方的包,那么还有一个方案给你选择,就是利用SocketServer将你的原生日志对象接收并且转码。

log4j.appender.socket=org.apache.log4j.net.SocketAppender
log4j.appender.socket.RemoteHost=Lofka服务器IP地址
log4j.appender.socket.port=9501
log4j.appender.socket.application=你的应用名称
log4j.appender.socket.locationInfo=true

其中需要注意的是,application在Log4j内部的实现原理是放在MDC中,SocketServer特地将其提取出来作为app_name使用。

严重故障说明

由于Log4j 1.2.x 本身的设计缺陷,或导致写入死锁(理论上说任何Appender都可能死锁,但是SocketAppender涉及到Java原生的序列化,速度会更慢一些,出现死锁的概率更大)。

任何能够不使用Log4j 1.x的场合都应该弃用Log4j 1.x

参考资料: