第二十五章:日志管理之自定义Appender

前言

前面两章节我们介绍了一些日志框架的常见配置及使用实践。一般上,在开发过程中,像 、 日志框架都提供了很多 ,基本上可以满足大部分的业务需求了。但在一些特殊需求或者需要将日志进行集中管理(集群部署时,日志是分拆到不同服务器上的,不可能去每一台服务器上去下载文件的,也不便于日志检索)时,就需要自定义 ,将日志集中输出或者其他一些特殊需求。所以本章节就来简单介绍下关于 和 的自定义 知识。

一点知识

log4j2自带Appender

logback自带Appender

自定义Appender

一点知识

log4j2自定义Appender

logback自定义Appender

关于ShutdownHook

参考资料

总结

最后

老生常谈

一点知识

编写自定义 时,我们先来看看 和 自带了哪些 ,了解下是否可以满足我们的个性化需求,避免重复制造轮子。

log4j2自带Appender

先看一张官网提供的 说明:

基本上已经覆盖了百分之九十的业务场景了。相关的详细说明或者配置大家自行搜索或者查看官网说明。官网地址:http://logging.apache.org/log4j/2.x/manual/appenders.html

logback自带Appender

和 一样,自带的都差不多了。

或者查看官网:https://logback.qos.ch/manual/appenders.html

自定义Appender

自定义 时,可以按实现的功能,适当的继承( 的 类基本上被设置成了 无法继承)或者参考一些已有的功能,当然了也可以直接继承其基类接口的。以下就简单的示例下,没有实现特定的功能,⊙﹏⊙‖∣

log4j2自定义Appender

按官网的扩展说明,我们来简单实现一个appender。

官网地址:http://logging.apache.org/log4j/2.x/manual/extending.html#Appenders

0.编写自定义appender类,继承 抽象实现类:

简单说明下,相关注意点:

注解:这个注解,是为了在之后配置 时,指定的Appender Tag。

构造函数:除了使用父类的以外,也可以增加一些自己的配置。

重写 方法:这里面需要实现具体的逻辑,日志的去向。

方法:主要是接收 中的配置项。

1.使用自定义的appender。

这里需要注意,需要在 中,加入属性 为自定类所在包名 才会被扫描生效,不知道是否还有其他方法。

2.启动后,就可以看见相关输出了。

不知道如何整合 的,可以查看:《第二十三章:日志管理之整合篇》

logback自定义Appender

的自定义,也是类似的,都是基于一个基类 来实现。本身 提供了 和 两个抽象类(同步和非同步),所以我们自定义时,只需要看实际业务继承其中的一个即可。先看下其类继承结构:

0.编写自定义 类。

也简单说明下,相关注意点:

方法:初始时调用。故在编写如数据库入库,连接缓存或者mq时,可以在这个方法里面进行初始化操作。

:当停止时,调用。可做些资源释放操作。

1.使用自定义appender:

2.应用启动,查看控制台输出,效果是一样的:

关于ShutdownHook

当你运行了以上的自定义 后,停止应用时,你会发现定义的 方法并没有被执行。还需要配置一个 系统钩子,使得在 在退出时之前会调用。

一点知识

我们知道,在 中,注册一个关闭钩子是很简单的,使用 类即可,具体用法如下:

而在 中,只需要配置 为 即可。

对于 而言,也可以在 中配置:

也是可以的。再或者在启动类手动注册这个 也是可以的

这里有个坑, 而言,配置失效了。谷歌了一圈也没有发现解决方法,网上的方案试了一遍都是不行。。很尴尬。要是使用 的话,可以取巧下,在 方法里面,注册钩子之后调用 方法。希望有知道的大神分享下如何解决!

参考资料

https://blog.csdn.net/zhoucheng05_13/article/details/78494458

http://logging.apache.org/log4j/2.x/manual/appenders.html

http://logging.apache.org/log4j/2.x/manual/extending.html#Appenders

https://logback.qos.ch/manual/appenders.html

https://blog.csdn.net/hupoling/article/details/75353854

总结

本文主要是简单介绍了 和 自定义 相关知识。实现起来是相对简单的,需要注意当涉及需要关闭释放相关资源时,需要确认下关闭前是否有被调用,不然可能造成连接未关闭等行为,避免不必要的问题。关于最后使用 关闭钩子未生效问题,由于现在都默认使用 了,这个问题就不深究了,还望有知道的同学分享下解决方案!谢谢!同时由于没有对两个框架有过多的深入了解,只能点到为止了,若文中有误,还望指出!

最后

目前互联网上很多大佬都有 系列教程,如有雷同,请多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。

老生常谈

个人QQ:

微信公众号:

完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-25

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180825G1KQMO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励