SLF4J,即Simple Logging Facade for Java,是Java日志框架的一个抽象层。它本身并不提供日志的实现,而是为各种日志框架(如log4j、logback、java.util.logging等) 提供统一的接口,使开发者可以更方便地更换日志框架而无需修改代码。
使用示例
使用slf4j时我们需要优先引入其依赖
org.slf4j
slf4j-api
1.7.36
前面说到,Slf4j只是一个日志门面,那么真实使用时我们还需要添加一个该日志的具体的实现,比如slf4j-simple、logback,这里选择slf4j-simple做示例
org.slf4j
slf4j-simple
1.7.36
然后,通过以下步骤使用SLF4J进行日志记录:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger=LoggerFactory.getLogger(Printer.class);
logger.info("This is an info message");
logger.warn("This is an warn message");
logger.error("This is an error message",e);
这里可以通过在classpath中添加simplelogger.properties配置对日志打印级别与内容进行调整
# 全局日志默认级别
org.slf4j.simpleLogger.defaultLogLevel=INFO
# 按包配置日志打印级别
org.slf4j.simpleLogger.log.com.sucl.blog.log.slf4j=WARN
# 显示时间
org.slf4j.simpleLogger.showDateTime=true
# 时间格式
org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss
# 线程名
org.slf4j.simpleLogger.showThreadName=true
# 包路径
org.slf4j.simpleLogger.showLogName=true
# 短的包路径
#org.slf4j.simpleLogger.showShortLogName=false
SLF4J的配置
slf4j-simple只是一个简单的实现,其提供的功能有一定的局限性,并且无法对日志进行持久化,一般生成环境我们可以选择logback,只需要将上面的配置进行调整
ch.qos.logback
logback-classic
1.2.11
SLF4J本身不需要配置,因为它只是一个抽象层。配置是针对所选的日志实现框架进行的。例如,如果使用logback作为实现框架,那么需要创建一个logback.xml配置文件,并放置在项目的类路径下。
logback.xml配置文件的示例:
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
Logback是一种Java日志框架,它提供了多种Appender用于将日志输出到不同的目的地。以下是Logback中常见的几种Appender及其说明:
- 说明:将日志输出到控制台。
- 用途:通常用于开发和调试阶段,因为可以直接在控制台上看到日志输出。
- 说明:将日志输出到指定的文件。
- 用途:适用于将日志持久化到磁盘,方便后续查看和分析。
- 说明:将日志输出到文件,当文件达到一定大小时,会自动滚动(即创建新的日志文件)。
- 用途:适用于需要长时间运行的应用,可以避免单一日志文件过大导致的问题。
- 说明:将日志写入到数据库中。
- 用途:适用于需要将日志长期保存或进行复杂查询的场景。
- 说明:将日志发送到指定的socket服务器。
- 用途:适用于需要将日志发送到远程服务器或进行集中管理的场景。
- 说明:将日志以电子邮件的形式发送。
- 用途:适用于需要将重要日志或错误日志及时通知给相关人员的场景。
- 说明:将日志发送到syslog服务器。
- 用途:适用于需要将日志与系统的其他日志进行统一管理的场景。
除了上述常见的Appender外,Logback还支持自定义Appender,可以根据具体需求扩展日志输出的目的地。每种Appender都有其特定的用途和适用场景,可以根据实际需求选择合适的Appender进行配置。
日志的统一
SLF4J可以与多种日志框架结合使用,如Logback、Log4j和JDK自带的日志框架。只需将SLF4J的依赖和所选日志框架的依赖添加到项目中,并在配置文件中进行相应的配置即可。
- 与Log4j结合使用
org.slf4j
slf4j-log4j12
1.7.30
- 与JDK自带的日志框架结合使用
org.slf4j
slf4j-jdk14
1.7.30
实际项目中我们会引用很对外部jar,然而每个jar中使用的日志框架不可能完全相同,我们不可能为每一种日志提供专门的配置,而且日志的输出形式也很难统一,所以需要一种方式将所有第三方框架 的日志信息统一管理起来,前面说到的日志桥接就起到了作用。
比如我们当前系统使用的是slf4j+logback作为日志框架,现在引用了一个jar,它的日志框架选择了log4j2,示例如下:
依赖的log4j2:
org.apache.logging.log4j
log4j-api
org.apache.logging.log4j
log4j-core
日志配置classpath:log4j2.xml
内部会这样使用
public class Log4j2Printer {
private static final Logger LOGGER = LogManager.getLogger(Log4j2Printer.class);
public void doPrint(String info){
LOGGER.debug("调试打印:{}", info);
LOGGER.info("打印:{}", info);
LOGGER.warn("警告打印:{}", info);
LOGGER.error("错误打印:{}", info);
}
}
日志的输出:
slf4j-> 22:21:44.212 [main] INFO c.s.b.l.slf4j.logback.LogbackPrinter - 打印:我是logback的日志
slf4j-> 22:21:44.216 [main] WARN c.s.b.l.slf4j.logback.LogbackPrinter - 警告打印:我是logback的日志
slf4j-> 22:21:44.216 [main] ERROR c.s.b.l.slf4j.logback.LogbackPrinter - 错误打印:我是logback的日志
log4j2-> [22:21:44:605] [INFO] - com.sucl.blog.log.slf4j.log4j2.Log4j2Printer.doPrint(Log4j2Printer.java:17) - 打印:我是log4j2的日志
log4j2-> [22:21:44:606] [WARN] - com.sucl.blog.log.slf4j.log4j2.Log4j2Printer.doPrint(Log4j2Printer.java:18) - 警告打印:我是log4j2的日志
log4j2-> [22:21:44:608] [ERROR] - com.sucl.blog.log.slf4j.log4j2.Log4j2Printer.doPrint(Log4j2Printer.java:19) - 错误打印:我是log4j2的日志
这时只需要引入一个桥架包,这样我们只需要配置项目中的logback.xml,第三方的所有log4j2打印的日志则会按照我们的配置统一输出
org.apache.logging.log4j
log4j-to-slf4j
日志桥接允许应用程序在不更改代码的情况下,灵活地切换或同时使用不同的日志框架实现。具体来说,日志桥接包的意义体现在以下几个方面:
框架实现原理
SLF4J的实现原理主要基于Java的接口和抽象类。它定义了一套统一的日志记录接口,并提供了一个LoggerFactory类用于创建Logger对象。Logger对象负责实际的日志记录操作,但具体的实现细节则委托给了所选的日志框架。
接口层:定义了日志记录的接口,如Logger、LoggerFactory等。实现层:各种日志框架的具体实现,如Logback、Log4j等。桥接层:将接口层与实现层连接起来,使得应用程序可以在不同的日志框架之间轻松切换。
日志打印中的问题
在使用SLF4J进行日志记录时,可能会遇到一些问题,如日志不打印、日志级别不正确等。这些问题通常与所选日志框架的配置有关,需要检查配置文件和代码中的日志记录语句。
另外,还需要注意以下几点:
总结
SLF4J是一个强大的日志框架,它简化了日志记录的过程,并提供了与多种日志框架的兼容性。通过深入了解SLF4J的使用和配置, 我们可以更好地利用它进行Java应用的日志记录和管理。希望本文能够帮助读者更好地理解和使用SLF4J日志框架。