代码方式配置Log4j并实现线程级日志管理 第一部分

一 为什么写略显过时的东西

  讲道理,现在还说Log4j有点过时了,因为自从Log4j2问世,全世界都在谈Log4j2的配置,所以今天要说的核心并不在如何配置Log4j,不论是配置文件方式,还是代码方式。

  我要说的重点,首先是通过以代码的方式来配置Log4j,为后面同样以代码方式配置Log4j2进行配置做个铺垫;二是想把自己是如何将需求转为实现的过程做一个分享;三是想通过这两篇博文的介绍来强调下,技能的提升光靠百度是不行的,一定是有真实的需求场景下,自己不仅要有文档阅读能力,还要学会跟踪源码,如此才能做到一法通万法通。

二 需求

  1. 抛弃死板的配置文件,灵活的通过代码方式对日志组件进行配置;
  2. 实现线程级的日志对象管理,可针对处理线程进行日志级别等属性控制;
  3. 实现日志的异步输出机制,Log4j本身的异步输出性能提升并不明显;
  4. 实现日志同时按日志文件大小及日期变更进行备份,Log4j本身并不提供两种方式同时生效的文件配置。

三 编程能力如何提升

  写到这儿我还是想再啰嗦两句,其实当下IT行业水挺混的,鱼龙混杂,有的人培训个两三个月就能出来拿个像样的工资,有的人能力还不错但是始终找不到中意的工作,不管什么需求上来就百度,其实百度上的东西八九成都是特么的抄来抄去的,死不要脸。

  既然现状已经如此了,那怎么提升自己,让自己和别人有所区别自然就是我们最应该考虑的事情,别总想着跟别人学靠运气找一家阔气的公司,本事是自己的,饭碗可不是铁打的。

  说到这里,那么对于已经入门的程序员,到底该怎么提升?别人怎么做的我不知道,我就说自己。对工作还是要认真的,哪怕轻松的任务,完成了请多思考下,代码结构,压力性能,模式设计,是否可以再提升下?不怕复杂的需求,有了需求才好,没做过的最好,做了就有了经验;学会看文档,看不懂英文的就看翻译的,看源码,看不懂就跟踪调试,跑两边比百度一下强很多,至少不会像网上有些人自己都没调试过就复制粘贴别人的东西,瞎说八道的好;技能横向扩展,多看书,知识体系健全之后你就不是你了。

四 我是如何分析Log4j的

  话归主题,既然要抛弃配置文件,那么我们需要考虑一个事情:配置文件的方式是怎么实现的?

  别多想,我不是在问Log4j是怎么读取配置文件,并作初始化的,这些破事儿网上大片大片的,说了有屌用。这里就一个简单的思路,Log4j是怎么解析配置文件的,我们的实现就应该是怎么样的。说的再直白些,配置文件无非是为了Log4j的某些对象实例化提供了属性设置,那么我们只需要找出来那些对象类型和配置文件的属性对应即可。

  我找一个简单的配置大伙先瞅瞅,如下:

log4j.rootLogger=DEBUG,console,dailyFile,im
log4j.additivity.org.apache=true
# 控制台(console)
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 回滚文件(rollingFile)
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold=DEBUG
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.Append=true
log4j.appender.rollingFile.File=D:/logs/log.log4j
log4j.appender.rollingFile.MaxFileSize=200KB
log4j.appender.rollingFile.MaxBackupIndex=50
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 定期回滚日志文件(dailyFile)
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold=DEBUG
log4j.appender.dailyFile.ImmediateFlush=true
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.File=D:/logs/log.log4j
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

  复杂不?复杂个球,翻来覆去就那么几个节点而已:

  1. logger
  2. appender

  除此之外我没看出来还有什么更特殊的节点,再仔细看看心里大概就有数了,appender有比较多的类型,如上我就看到了:

  1. ConsoleAppender
  2. RollingFileAppender
  3. DailyRollingFileAppender

  其他的不说了都一样。既然有这些appender的类型,那么Log4j必然有对应其实现的类,不信你自己翻翻源码:

Appender派生结构

  点到为止,已经明确了后续的编码重点,就在Appender接口的实现上,我们需要做的就是如何通过代码的方式来实例化这些对象,拿RollingFileAppender来说,毕竟主要的需求还是将日志输出到文件。

  查看RollingFileAppender源码设计。先说一句,看源码先看类的结构,有哪些方法和成员是对外公开,这部分是我们重点关注的;又有哪些方法和成员是受保护的,这部分是我们覆盖实现的重中之重;再看构造函数,有哪些能提供我们实例化对象的。基本上明确结构之后,再负载的设计也能下手了。类机构如下:

RollingFileAppender类结构

  RollingFileAppender派生自FileAppender,基本成员为最大文件容、最大备份文件数量等信息,父类中仍有许多可用信息,查看方法相同不多赘述。Root类的结构查看亦如此。

  这里要说明的事情就一个,如何查看源码,查看类结构,并从类结构中获取有用信息,便于我们进行封装、重写。第二部分就开始讲述我如何根据需求进行设计。

猜你喜欢

转载自blog.csdn.net/o983950935/article/details/84778258
今日推荐