日志框架log4j
写在开篇
本文主要介绍了log4j、xml方式的配置以及插件的使用。
sl4j与log4j
关系
slf4j不是具体的日志解决方案,而是一种适配器的实现方式,为我们提供一个一致的API,开发者只需要关注slf4j的api接口,而不用关心具体日志是由log4j、log4j2还是logback等日志框架实现的。
适配过程
上面讲到sl4j是适配层,那么它是怎么适配到日志框架的呢?我们一起通过源码来看一下。
LoggerFactory类中获取logger的方法。
初始化ILoggerFactory。
看到这我们已经可以知道,各个日志框架是通过实现org/slf4j/impl/StaticLoggerBinder
来对sl4j进行适配的。下图是log4j2实现的StaticLoggerBinder。
从类加载器的用法可以看出org/slf4j/impl/StaticLoggerBinder.class
要和slf4j-api.jar包在同一个类加载器中,一般来说即要求放在同一路径下比较稳妥。
我们来浅窥下log4j2中对于StaticLoggerBinder的具体实现。
我们只需要关心,log4j2是通过Log4jLoggerFactory继承了ILoggerFactory、以及Log4jLogger继承了Logger,来实现适配到slf4j的即可。
log4j2配置
关于日志我们一开始不免会关心两个问题:
1、开发时日志是怎么输出到控制台,生产环境的日志是怎么输出的磁盘文件中的?
2、日志输出的格式为什么是这样的?
那我们就需要介绍下log4j2的配置了。
log4j2.xml
log4j2支持xml、json、yaml、properties四种配置方式,不过本文将通过大家常用的xml方式来介绍。
我们通过这个简单的xml配置来介绍。
可以看到,同体上来说,主要Configuration构成分为两个部分。
Appender
通过appender指定一个日志的输出方式,目前支持的Appender主要有
Console
、File
、RollingFile
、Async
、Routing
等
- Console
- 将日志打印到控制台
- name 指定Appender的名字
- target SYSTEM_OUT或SYSTEM_ERR
- PatternLayout pattern指定输出格式,不设置默认为:%m%n
- File
- 将日志打印到文件
- name 指定Appender的名字
- filename 指定输出日志的目的文件带全路径的文件名
- PatternLayout pattern指定输出格式,不设置默认为:%m%n
- RollingFile
- 将日志打印到文件,文件可以滚动保存
- name 指定Appender的名字
- filename 指定输出日志的目的文件带全路径的文件名
- filepattern 指定新建日志文件的名称格式
- filePermissions 指定日志文件权限
- PatternLayout pattern指定输出格式,不设置默认为:%m%n
- Policies 指定滚动日志的策略(支持基于时间、指定文件大小等滚动策略)
- Routing
- 指定日志路由,可以指定规则与Appender进行绑定
- name 指定Appender的名字
- pattern 根据所有注册的Lookups进行评估并将结果用于选择路由
Logger
指定logger与appeder进行关联,将logger中的日志输出到appender,由appender实现日志的控制台输出或者文件记录。
- Root
- 用来指定项目的根日志
- level 日志输出级别
- AppenderRef 用来指定该日志输出到哪个Appender
- Logger
- 自定义的子日志
- level 日志输出级别
- name 用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点
- additivity 日志是否在父Logger中输出,如果为false,只在自定义的Appender中进行输出
- AppenderRef 用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root
log4j2插件
在我们的自定义插件上需要使用@Plugin表明此时一个log4j2的插件,定义插件的名称和属性。
log4j为我们提供了Core、Converters、KeyProviders、Lookups、TypeConverters、Developer Notes等几种插件方式,我们下面将选取几个有代表性的为大家详细说明。
Core
Core插件是指那些由配置文件中的元素直接表示的插件,例如Appender、Layout、Logger或Filter。
在介绍core插件之前,先需要了解以下三个注解。
- @PluginFactory用于提供所有选项作为方法参数的静态工厂方法,即可以将xml中配置属性传递进方法中
- @PluginAttribute 插件的属性
- @PluginElement 插件的子元素
自定义appender插件
支持自定义appender:即指定日志输出目的地。
1、需要用@PluginFactory声明createAppender方法,创建一个Appender,
2、继承AbstractAppender,实现append方法,处理日志
在使用场景上,可以应用至将分布式服务的单机上日志输出到统一的机器上。
自定义layout插件
支持自定义layout:即负责对输出日志格式化。
1、需要用@PluginFactory声明createAppender方法,创建一个Appender
2、继承AbstractAppender,实现toSerializable方法,处理日志
在使用场景上,可以替换日志中的敏感信息。
Lookups
Lookups自定义插件支持对属性的key进行查找功能。而且自定义操作过程也很简单,只需要实现StrLookup,实现lookup方法。
在下面这个不同线程打印日志例子中我们看到Lookups的简单应用。
巨人的肩膀:
https://logging.apache.org/log4j/2.x/
https://blog.csdn.net/numb_zl/category_11244831.html
https://blog.csdn.net/huangjinjin520/article/details/120600251
https://blog.csdn.net/zyx1260168395/article/details/126539475
__EOF__

本文链接:https://www.cnblogs.com/kyrie17/p/17003598.html
关于博主:作者目前能力有限,部分文章是基于书籍、博客整理自己的思路,分享自己的想法,如有侵权,请联系我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律