日志可以分为具体实现和接口,区别是如果直接调用接口,会使用多态,根据项目中添加的具体实现,根据反射进行调用
具体实现包括
log4j
- log4j是通过一个.properties的文件作为主配置文件的
- log4j想要生效,我们需要在web.xml中进行配置,这段配置目的在于告诉工程去哪加载log4j的配置文件和定义一个扫描器,这样可以随心所欲的放置log4j配置文件。
- log4j在高并发高QPS情况下,是存在性能问题的。
log4j2
- log4j 2采用的是.xml,.json或者.jsn这种方式来做,毕竟properties文件的可阅读性真的是有点差。
- log4j2就比较简单,以maven工程为例,我们只需要把log4j2.xml放到工程resource目录下就行了。
- log4j2采取异步日志模式,解决了因日志造成的性能问题
logback
Logback是由log4j创始人设计的又一个开源日志组件,
也是SpringBoot内置的日志处理框架log4j2推出时间晚
它的一些优点
- logback比log4j要快大约10倍,而且消耗更少的内存。
- logback-classic模块直接实现了SLF4J的接口,所以我们迁移到logback几乎是零开销的。
- logback不仅支持xml格式的配置文件,还支持groovy格式的配置文件。相比之下,Groovy风格的配置文件更加直观,简洁。
- logback-classic能够检测到配置文件的更新,并且自动重新加载配置文件。
- logback能够优雅的从I/O异常中恢复,从而我们不用重新启动应用程序来恢复logger。
- logback能够根据配置文件中设置的上限值,自动删除旧的日志文件。
- logback能够自动压缩日志文件。
- logback能够在配置文件中加入条件判断(if-then-else)。可以避免不同的开发环境(dev、test、uat…)的配置文件的重复。
- logback带来更多的filter。
- logback的stack trace中会包含详细的包信息。
- logback-access和Jetty、Tomcat集成提供了功能强大的HTTP-access日志。
jul
jdk本身自带的日志打印
接口包括
jcl
jcl可以看作是一个门面,目前仅支持几种实现方式,org.apche.commons.logging.impl.jdk14logger,org.apche.commons.logging.impl.jdk13lumberjacklogger,org.apche.commons.logging.impl.simplelog,所以会有局限性
slf4j
image.pngslf4j是一个门面,一个适配器,所有的日志代码都可以用slf4j来写,它会根据项目具体依赖的日志实现包进行日志操作。
通过slf4j写日志的好处是,当更换日志的实现方案时,无需修改日志代码,只需修改pom.xml即可
使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合(各种桥接包)。SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
小结
image.png接口:将所有日志实现适配到了一起,用统一的接口调用。
实现:目前主流的日志实现
旧日志到slf4j的适配器:如果使用了slf4j,但是只想用一种实现,想把log4j的日志体系也从logback输出,这个是很有用的。
slf4j到实现的适配器:如果想制定slf4j的具体实现,需要这些包。
slf4j跟commons-logging类似,是各种日志实现的通用入口,log4j、log4j2、logback、slf4j-simple和java.util.logging是比较常见的日志实现系统,目前应用比较广泛的是Log4j和logback,而logback作为后起之秀,以替代log4j为目的,整体性能比log4j较佳,log4j的升级版log4j2也是有诸多亮点,用户可以根据项目需求和个人习惯,选择合适的日志实现。
网友评论