日志打印及配置更新

            记录日志是项目不可或缺的功能,一般Java用的比较多的是Slf4j、Log4j、Logback等。而且一般的做法都是在类,或父类里调用 LoggerFactory.getLogger(this.getClass())来创建一个Logger。像Controller、Service等还好,只需在父类中定义即可,其它的工具类,帮助类,抽象出来的业务类等就较麻烦,每个类都要这么来一下。

            以前看过Log4j中打印日志时怎么获取到调用类、方法名及行数的实现,Log4j中是利用打印当前调用栈轨迹来获取的。获取当前堆栈有两种方式:1、Thread.currentThread().getStackTrace();2、new Throwable().getStackTrace()。获取到StackTraceElement[]后,从最近的调用栈开始比较与FQCN(Logger类名称)做比较,查找出对应的StackTraceElement。里面包含了当前类、方法、字段、行数信息。

            了解了Log4j代码实现之后,其实可以定义一个LogUtil工具类专门来用记录日志,LogUtil中调用Log4j记录日志,不用在每个类中去单独创建Logger。主要的技术点就一个,在LogUtil中调用Log4j的时候更改FQCN为LogUtil类名称即可(以前是Logger的类名称)。这样一来想在哪里记录直接调用LogUtil即可,再也不用到处定义Logger了。当然此方法也有一个弊端,因为LogUtil里只定义了一个Logger,所以所有使用LogUtil打印出来的日志不能简单的使用Log4j的按包路径定义日志打印级别。

            现在微服务模式非常流行,其中有一个统一配置中心,在Spring Boot中,除了日志配置文件之外,其它配置文件都可以放到配置中心去。因为Slf4j是在Spring初始化之前就已经初始化完了,所以日志配置文件只能每个项目里添加一个。虽然不能控制Slf4j的初始化顺序,但我们换个思路,可以在后面重新对Slf4j进行初始化一次。只要获取到各个实现的LoggerContext即可重新初始化,如果是Log4j实现则调用LogManager.getContext(false)获取,如果是Logback实现则调用LoggerFactory.getILoggerFactory()直接获取即可。除了这种方式外,还有一种更简单的,直接在Log4j或Logback配置文件中开启热加载,它会每隔一段时间扫描下日志文件是否有修改,只需从远程配置中心获取到日志配置后写入指定目录即可。

---------------------------------------

相关实现代码(Github):synchplay/easyJLog

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值