在项目开发过程中,日志是定位问题、监控系统运行状态的核心工具。相较于传统的System.out.println,专业日志框架具备日志级别控制、自定义输出格式、多目的地输出等优势,能极大提升开发与运维效率。本文以 IntelliJ IDEA 为开发环境,详细讲解不同类型项目(Java 基础项目、Spring Boot 项目)的日志打印实现方法,涵盖基础使用、框架集成、高级配置及最佳实践,助力开发者快速掌握规范的日志使用技巧。
一、日志框架选型:为什么不推荐直接使用 System.out?
在 IDEA 项目开发中,很多初学者习惯用System.out.println打印调试信息,但这种方式存在明显缺陷:
- 无日志级别区分,无法过滤冗余信息(比如线上环境不想输出调试信息);
- 输出格式固定,无法自定义(比如添加时间、线程 ID、类名等关键信息);
- 仅能打印到控制台,无法持久化到文件;
- 同步输出,高并发场景下会影响性能。
因此,推荐使用「日志门面 + 日志实现」的组合方案,核心选型如下:
- 日志门面:SLF4J(Simple Logging Facade for Java),统一日志 API,屏蔽不同实现框架的差异,便于后续切换框架;
- 日志实现:Logback(推荐)、Log4j2。Logback 是 SLF4J 的原生实现,性能优于 Log4j,且是 Spring Boot 的默认日志框架;Log4j2 功能强大,支持异步日志,适合高并发场景。
下文将以「SLF4J + Logback」组合为例,讲解具体实现流程。
二、Java 基础项目(非框架)日志打印实现
对于无框架依赖的 Java 基础项目,需手动引入日志框架依赖,完成基础配置后即可使用。
1. 引入依赖(Maven/Gradle)
若项目使用 Maven 管理依赖,在pom.xml中添加以下依赖(SLF4J 门面 + Logback 核心包):
xml
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
若使用 Gradle,在build.gradle中添加:
groovy
implementation 'org.slf4j:slf4j-api:1.7.36'
implementation 'ch.qos.logback:logback-classic:1.2.11'
2. 基础日志打印代码
依赖引入后,在 Java 类中通过 SLF4J 的LoggerFactory获取日志对象,即可调用不同级别日志方法(从低到高:trace、debug、info、warn、error):
java
运行
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogDemo {
// 获取Logger实例,参数为当前类的Class对象(推荐方式)
private static final Logger logger = LoggerFactory.getLogger(LogDemo.class);
public static void main(String[] args) {
// 不同级别日志打印
logger.trace("这是TRACE级日志(最详细,通常用于调试最细粒度信息)");
logger.debug("这是DEBUG级日志(调试信息,开发环境常用)");
logger.info("这是INFO级日志(业务正常运行信息)");
logger.warn("这是WARN级日志(警告信息,潜在风险)");
logger.error("这是ERROR级日志(错误信息,业务异常)");
// 日志中拼接参数(推荐使用占位符,避免字符串拼接开销)
String userName = "testUser";
int age = 25;
logger.info("用户信息:姓名={}, 年龄={}", userName, age);
// 打印异常信息(需传入Throwable对象,自动输出堆栈)
try {
int result = 1 / 0;
} catch (Exception e) {
logger.error("计算异常", e);
}
}
}
3. 自定义日志配置(logback.xml)
默认情况下,日志仅输出到控制台且级别为 DEBUG。若需自定义(比如输出到文件、调整日志级别),在src/main/resources下创建logback.xml配置文件:
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制台输出appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 自定义输出格式:时间 | 日志级别 | 线程ID | 类名 | 日志内容 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss} | %-5level | %thread | %logger{50} | %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 文件输出appender(按天滚动) -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志文件路径(IDEA项目中默认输出到项目根目录) -->
<file>logs/app.log</file>
<!-- 滚动策略:按天分割,保留30天 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} | %-5level | %thread | %logger{50} | %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 全局日志级别:TRACE < DEBUG < INFO < WARN < ERROR -->
<root level="INFO">
<!-- 同时输出到控制台和文件 -->
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<!-- 单独指定某个包的日志级别(比如调试com.example包时临时调整为DEBUG) -->
<logger name="com.example" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
</configuration>
三、Spring Boot 项目日志打印实现
Spring Boot 已内置 SLF4J + Logback,无需手动引入依赖,开箱即用,仅需简单配置即可满足需求。
1. 基础日志打印代码
Spring Boot 中推荐使用@Slf4j注解(Lombok)简化 Logger 对象的创建,需先引入 Lombok 依赖:
xml
<!-- Lombok依赖(简化代码) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
使用示例:
java
运行
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
// 注解自动生成Logger对象,无需手动声明
@Slf4j
@RestController
public class LogController {
@GetMapping("/testLog")
public String testLog() {
String param = "test";
log.debug("接收到请求,参数:{}", param); // 调试信息
log.info("处理请求开始,接口:/testLog"); // 业务信息
try {
// 业务逻辑
return "success";
} catch (Exception e) {
log.error("处理请求异常,参数:{}", param, e); // 异常信息
return "error";
}
}
}
2. 日志配置(application.yml/application.properties)
Spring Boot 支持在配置文件中快速调整日志级别、输出格式等,无需编写 logback.xml(如需复杂配置仍可创建)。
(1)application.yml 配置示例
yaml
logging:
# 全局日志级别(可指定具体包/类的级别)
level:
root: INFO # 全局默认INFO
com.example.controller: DEBUG # 控制器包下DEBUG级别
org.springframework: WARN # Spring框架相关WARN级别
# 日志输出格式
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
# 日志文件路径(IDEA中输出到项目根目录的logs文件夹)
file:
name: logs/spring-boot-app.log
# 日志文件滚动配置(Spring Boot 2.4+)
logback:
rollingpolicy:
max-file-size: 100MB # 单个文件最大100MB
max-history: 30 # 保留30天日志
clean-history-on-start: false # 启动时不清理历史日志
(2)application.properties 配置示例
properties
# 全局日志级别
logging.level.root=INFO
logging.level.com.example.controller=DEBUG
logging.level.org.springframework=WARN
# 控制台输出格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n
# 文件输出格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n
# 日志文件路径
logging.file.name=logs/spring-boot-app.log
# 日志文件滚动配置
logging.logback.rollingpolicy.max-file-size=100MB
logging.logback.rollingpolicy.max-history=30
logging.logback.rollingpolicy.clean-history-on-start=false
四、IDEA 中日志调试的实用技巧
1. 控制台日志过滤
IDEA 控制台支持按日志级别 / 关键词过滤日志:
- 点击控制台右上角的「Filter」按钮(漏斗图标);
- 可输入关键词(如 "error")过滤,或勾选仅显示指定级别日志(INFO/WARN/ERROR);
- 支持正则表达式过滤,比如输入
com.example.*仅显示指定包的日志。
2. 日志跳转到代码
Logback 配置中保留%logger{50}(类名)后,IDEA 控制台中点击类名可直接跳转到对应的 Java 类,快速定位日志输出位置。
3. 禁用第三方框架冗余日志
开发中常遇到 Spring、MyBatis 等框架输出大量 DEBUG 日志,可在配置文件中单独降低其日志级别:
yaml
logging:
level:
org.mybatis: WARN
org.springframework.web: WARN
com.zaxxer.hikari: WARN
五、日志使用最佳实践
-
日志级别合理使用:
- TRACE:最细粒度调试信息(如循环内的变量值);
- DEBUG:开发环境调试信息(如接口入参 / 出参);
- INFO:生产环境核心业务信息(如用户登录、订单创建);
- WARN:潜在风险(如参数不合法、资源不足);
- ERROR:业务异常(如数据库连接失败、接口调用超时)。
-
避免无效日志:
- 不要打印敏感信息(如密码、手机号);
- 避免重复日志(如多层调用中仅在核心层打印);
- 推荐使用占位符
{}拼接参数,而非字符串拼接(logger.info("参数:" + param)),减少性能开销。
-
日志持久化规范:
- 生产环境务必将日志输出到文件,并配置滚动策略(按大小 / 按天);
- 日志文件按模块拆分(如业务日志、异常日志),便于运维分析;
- 高并发项目使用异步日志(Logback/Log4j2 支持),避免阻塞主线程。
总结
- IDEA 项目中应优先使用 SLF4J + Logback 组合实现日志打印,替代
System.out.println; - Java 基础项目需手动引入依赖并配置 logback.xml,Spring Boot 项目可直接通过配置文件简化日志配置;
- 合理使用日志级别、自定义输出格式,结合 IDEA 控制台过滤技巧,能大幅提升调试效率;
- 生产环境需配置日志持久化和滚动策略,避免敏感信息泄露,保证日志输出性能。
掌握以上日志使用方法,能让你在项目开发中快速定位问题,同时为线上运维提供清晰、规范的日志数据。