我们对springboot使用的日志,有个全局观。
1.首先,引用哪几个依赖会出现引入日志的依赖
2.这些常用的日志特征是什么,如何选择哪种日志
3.如何配置这些日志,要配置什么内容
4.具体的日志框架如何使用。
回答:
Spring Boot日志实战指南
一、依赖怎么加
直接抄就行:
用默认的Logback(啥都不用干)
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Boot自动带了日志,直接用。
换用Log4j2
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
二、哪个好用?
Logback:Spring Boot默认的,够用,简单
Log4j2:性能好,高并发用这个
普通项目用Logback,高并发用Log4j2
三、配置怎么写
application.yml里配:
yaml
yaml
logging:
level:
root: info # 全局级别
com.xxx.service: debug # 自己的包用debug
org.springframework: warn # spring的包用warn
file:
name: /tmp/app.log # 输出到文件
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
想更复杂就建logback-spring.xml:
xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 文件输出,每天一个文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 开发环境用控制台 -->
<springProfile name="dev">
<root level="info">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
<!-- 生产环境用文件 -->
<springProfile name="prod">
<root level="info">
<appender-ref ref="FILE"/>
</root>
</springProfile>
</configuration>
四、代码里怎么用
方式1:传统写法
java
java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Service
public class UserService {
// 声明logger
private static final Logger log = LoggerFactory.getLogger(UserService.class);
public void addUser(String name) {
log.info("开始添加用户: {}", name); // 这样写,别用字符串拼接
try {
// 业务代码
log.debug("详细参数: {}", getDetails()); // debug级别
} catch (Exception e) {
log.error("添加用户失败: {}, 原因: {}", name, e.getMessage(), e); // 错误要带异常
}
}
}
方式2:用Lombok(推荐)
java
java
import lombok.extern.slf4j.Slf4j;
@Slf4j // 加这个注解,自动生成log变量
@Service
public class OrderService {
public void createOrder() {
log.info("创建订单");
if (log.isDebugEnabled()) { // 复杂日志先判断级别
log.debug("订单详情: {}", expensiveData());
}
}
}
五、重要技巧
别这么写:
java
log.info("用户:" + userId + ",数据:" + bigData()); // 垃圾写法,影响性能
要这么写:
java
log.info("用户: {},数据: {}", userId, bigData()); // 正确写法
日志级别:
error:出错了,必须处理
warn:有点问题,但还能用
info:正常流程记录(用户登录、下单)
debug:调试信息(开发时用)
trace:最详细的(基本不用)
环境区分:
开发环境:级别用debug,输出到控制台
生产环境:级别用info,输出到文件
六、一句话总结
普通项目直接用Spring Boot默认的Logback
application.yml配基本设置,复杂需求建logback-spring.xml
代码里用@Slf4j注解,日志用{}占位符
生产环境记得调高日志级别,别让debug日志拖慢系统
我们对springboot使用的日志,有个全局观。
1.首先,引用哪几个依赖会出现引入日志的依赖
2.这些常用的日志特征是什么,如何选择哪种日志
3.如何配置这些日志,要配置什么内容
4.具体的日志框架如何使用。
回答: