开源日志框架slf4j、log4j、logback的关系及介绍

在大型系统的开发过程中,日志是一个重要的组件,这对于代码调试、线上问题定位都有很大的帮助,本文主要介绍了Java中常用的几种开源日志框架并做了具体的分析。

本文介绍的日志框架主要有以下几种:

  • Commons-loggin
  • SLF4J
  • Log4J
  • LogBack

1. commons-logging

commons-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,commons-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。同时common-logging内部也有一个Simple logger的简单实现,但是功能很弱。所以使用common-logging,通常都是配合着其他日志框架来使用。

2. SLF4J

The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at deployment time. —https://www.slf4j.org/

类似于commons-logging,是对不同日志框架提供的一个接口封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。

commons-logging通过动态查找的机制,在程序运行时自动找出真正使用的日志库,它使用了ClassLoader寻找和载入底层的日志库。

SLF4J在编译时静态绑定真正的Log库。另外,SLF4J 支持参数化的log字符串,避免了之前为了减少字符串拼接的性能损耗而不得不写的if(logger.isDebugEnable()),现在你可以直接写:logger.debug(“current user is: {}”, user)。

3. Log4j

Apache基金会的开源项目,内部把日志系统抽象封装成Logger 、appender 、pattern等实现,我们可以通过配置文件轻松的实现日志系统的管理和多样化配置。通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIXSyslog守护进程等。通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。

4. Logback

Logback是由Log4j创始人设计的又一个开源日志组件。Logback分为三个模块:logback-core,logback-classic和logback-access。Logback-core是其它两个模块的基础模块,logback-classic是Log4j的一个改良版本。此外logback-classic完整实现SLF4J API,使你可以很方便地更换成其它日志框架如Log4j。logback-access访问模块与Servlet容器集成提供通过Http来记录日志的功能。

Logback作为一个通用可靠、快速灵活的日志框架,将作为Log4j的替代,和SLF4J组成新的日志系统的完整实现,Logback声称具有极佳的性能。

5. Logback配置及介绍

一个典型的logback.xml配置文件的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">

<!-- 测试系统日志存储路径 -->
<property name="LOG_HOME" value="/Users/zhaoyonghui/Desktop" />

<!-- 线上系统日志存储路径 -->
<!--<property name="LOG_HOME" value="/usr/offerLog" />-->

<!-- 控制台输出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<Target>System.out</Target>
<Encoding>UTF-8</Encoding>
<encoder>
<!-- 格式化输出,%date:日期; %thread:线程名; %-5level:级别; %logger:%line:双横线; %msg:日志消息; %n:换行符 -->
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] [%logger:%line] --%mdc{client} %msg%n</pattern>
</encoder>
</appender>

<!-- 按照每天生成日志文件 -->
<appender name="logfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Encoding>UTF-8</Encoding>
<encoder>
<!-- 格式化输出,%date:日期; %thread:线程名; %-5level:级别; %logger:%line:双横线; %msg:日志消息; %n:换行符 -->
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] [%logger:%line] --%mdc{client} %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>

<!--日志文件保留天数-->
<maxHistory>30</maxHistory>

<!--日志文件最大的大小-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>15MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>

</rollingPolicy>
</appender>


<!-- 日志记录器 -->
<logger name="org.springframework" level="WARN"/>
<logger name="org.springframework.remoting" level="WARN"/>
<logger name="org.springframework.scheduling.quartz" level="WARN"/>
<logger name="org.springframework.data.jpa" level="DEBUG"/>
<logger name="ch.qos.logback" level="WARN"/>

<!-- 日志输出级别 -->
<root level="DEBUG">
<appender-ref ref="stdout" />
<appender-ref ref="logfile"/>
</root>

</configuration>

以上内容就是开源日志框架slf4j、log4j、logback的关系及介绍的全部内容了,谢谢你阅读到了这里!

Author: zhaoyh