slf4j(一)springboot集成

一、介绍:

SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J 是一个用于日志系统的简单 Facade,允许最终用户在部署其应用时使用其所希望的日志系统。spring-boot内部已经集成了slf4j,所以我们只要对slf4j做下简单的配置即可。

二、集成:

1、日志配置文件

springboot默认加载classpath下 logback-spring.xml,如果自定义名称可以通过properties配置指定路径。如我命名为logback.xml

<configuration>

    <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
    <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
    <!-- 定义日志存储的路径,不要配置相对路径 -->
    <property name="FILE_PATH" value="usr/logs/demo.%d{yyyy-MM-dd}.%i.log" />

    <!-- 控制台输出日志 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 按照上面配置的LOG_PATTERN来打印日志 -->
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!--每天生成一个日志文件,保存15天的日志文件。rollingFile是用来切分文件的 -->
    <appender name="FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${FILE_PATH}</fileNamePattern>
            <!-- keep 15 days' worth of history -->
            <maxHistory>15</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 日志文件的最大大小,超过这个大小重新生成一个文件 -->
                <maxFileSize>1MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- project default level -->
    <logger name="src" level="INFO" />

    <!-- 日志输出级别 常用的日志级别按照从高到低依次为:ERROR、WARN、INFO、DEBUG。 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>
2、在application.properties引入日志配置
logging.config=classpath:logback.xml

如果想区分环境可以通过不同的环境的application-xx.properties指定不同的日志文件路径。 

3、引用Logger对象

(1)方法一:

package com.demo.service.impl;

import com.demo.dao.UserDao;
import com.demo.dto.User;
import com.demo.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service("userService")
public class UserServiceImpl implements UserService {

    private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

    @Autowired
    private UserDao userDao;

    @Override
    public void insert(User user) {
        logger.warn("写入数据库");
        userDao.insertUser(user);
    }
}

(2)方法二:更简洁的写法是使用lombok的@Slf4j注解。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
4、打印日志

使用log.error、log.info、log.debug、log.trace打印对应级别的日志。注意对于error级别,打印exception才会有异常堆栈信息,如

log.error("获取数据错误,settingId={}",settingId,e);

打印:

 

如果是

log.error("获取数据错误,settingId={}",settingId);

 则只打印一句日志:

5、测试:

我把<maxFileSize>1MB</maxFileSize>改成10KB放到服务器上测试,

可以看到超过10KB,重新生成文件了。

三、SLF4J打印SQL

在application.properties中加入:

logging.level.dao所在的包=日志级别可以打印SQL日志,如我的:
server.port=9999
server.context-path=/quartzgroup
logging.config=classpath:logback.xml
#打印SQL日志
logging.level.com.demo.dao=debug


my.pool.url=jdbc:mysql://localhost:3306/quartzgroup?useUnicode=true&characterEncoding=utf8
my.pool.username = root
my.pool.password= wtyy
my.pool.driver-class-name = com.mysql.jdbc.Driver

my.pool.defaultAutoCommit = true
my.pool.maxWait=60000
my.pool.maxActive = 6
my.pool.maxIdle = 5
my.pool.minIdle = 2
my.pool.initialSize = 3
my.pool.validationQuery = SELECT 1
my.pool.testWhileIdle = true
my.pool.timeBetweenEvictionRunsMillis=60000
my.pool.minEvictableIdleTimeMillis=30000
my.pool.testOnBorrow=false
my.pool.testOnReturn=false

mybatis.mapper-locations=classpath*:Mapper/*Mapper.xml

日志如下:

也可以通过xml来配置日志输出地方、SQL日志等:

<configuration>
    <property name="log.dir" value="/data/log/test"/>
    <!--日志输出格式-->
    <!--<property name="LOG_PATTERN" VALUE="" />-->

    <!--控制台日志-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制台最低日志级别 debug-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <pattern>%date{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) --- [%thread] %cyan((%file:%line\))- %msg%n</pattern>
            <!-- 控制台也要使用utf-8,不要使用gbk -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
    <!-- 1.先按日期存日志,日期变了,将前一天的日志文件名重命名为xxx%日期%索引,新的日志仍然是sys.log -->
    <!-- 2.如果日期没有变化,但是当前日志文件的大小超过1kb时,对当前日志进行分割 重名名 -->
    <appender name="SYSLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.dir}/sys.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.dir}/sys.%d.%i.log</fileNamePattern>
            <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->
            <maxHistory>90</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>500MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <!-- pattern节点,用来设置日志的输入格式 -->
            <pattern>%date{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) --- [%thread] %cyan((%file:%line\))- %msg%n</pattern>
            <!-- 记录日志的编码 -->
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
    </appender>

    <!--SQL日志-->
    <logger name="com.demo.mapper" level="DEBUG" additivity="false">
        <appender-ref ref="SYSLOG" />
        <appender-ref ref="CONSOLE" />
    </logger>
    <logger name="com.demo.permission.mapper" level="DEBUG" additivity="false">
        <appender-ref ref="SYSLOG" />
        <appender-ref ref="CONSOLE" />
    </logger>

    <!-- 控制台、文件日志输出级别 -->
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="SYSLOG" />
    </root>
</configuration>

03-08
### SLF4J 日志门面 Java 使用教程 #### SLF4J 简介 SLF4J 是 Simple Logging Facade for Java 的缩写,旨在为不同日志框架提供个通用接口。通过这个接口,开发者可以在应用程序中编写日志记录逻辑而不必依赖特定的日志实现库[^2]。 #### 二、引入依赖 为了在项目中使用 SLF4J,需先添加相应的 Maven 或 Gradle 依赖项。以下是 Maven 配置示例: ```xml <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <!-- 如果选用 Logback 作为实际的日志实现 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> ``` 对于 Gradle 用户,则应在其 `build.gradle` 文件内加入如下语句: ```groovy implementation 'org.slf4j:slf4j-api:1.7.30' // 若采用 Logback 实现 runtimeOnly 'ch.qos.logback:logback-classic:1.2.3' ``` #### 三、基本用法 旦配置完成,就可以像下面这样创建 Logger 对象并调用相应的方法来输出信息了: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Example { private static final Logger logger = LoggerFactory.getLogger(Example.class); public void run() { String message = "This is a test."; // 记录调试级别消息 logger.debug("Debugging info: {}", message); // 打印警告级别的错误提示 try { int result = divideByZero(); } catch (ArithmeticException e) { logger.warn("Caught exception while dividing by zero", e); } // 输出严重程度更高的异常堆栈跟踪 try { throw new RuntimeException("Something went wrong!"); } catch (RuntimeException ex) { logger.error("Runtime error occurred.", ex); } } private int divideByZero() throws ArithmeticException { return 1 / 0; // This will cause an arithmetic exception. } } ``` 上述代码片段展示了如何利用占位符 `{}` 来安全地格式化字符串参数,从而避免潜在的安全风险以及性能损耗。 #### 四、常见问题及其解决办法 ##### 无法找到绑定 当运行时环境中不存在任何有效的 SLF4J 绑定时会抛出此类告警。这通常意味着缺少必要的桥接器 JAR 文件。确保至少存在种适配器连接到所选的具体日志系统(比如 log4j-over-slf4j.jar, jcl-over-slf4j.jar)。同时确认版本兼容性良好[^3]。 ##### 不同模块间冲突 大型企业级应用可能集成了多个第三方组件,它们各自携带了自己的日志管理工具包。为了避免重复加载或相互干扰的情况发生,在构建过程中应当移除不必要的冗余依赖关系,并指定唯套标准日志处理机制给整个工程使用。 ##### 性能考虑 尽管 SLF4J 提供了便捷的日志封装层,但在高并发场景下仍需要注意控制开销。建议仅针对重要事件启用较高级别的日志等级;另外可以借助异步模式进步提升效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_t_y_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值