JAVA Log 日志级别和使用技巧
一、主流日志框架
1. Logback (推荐)
Spring Boot默认日志框架
2. Log4j2
高性能日志框架
3. SLF4J + Logback (最常用组合)
import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class MyClass {private static final Logger logger = LoggerFactory.getLogger(MyClass.class); }
二、日志级别详解
日志级别从低到高:
级别 | 描述 | 使用场景 |
---|---|---|
TRACE | 最详细的跟踪信息 | 方法进入退出、详细流程跟踪 |
DEBUG | 调试信息 | 开发阶段的调试信息 |
INFO | 重要的运行信息 | 系统启动、关键业务流程 |
WARN | 警告信息 | 不影响系统运行的异常情况 |
ERROR | 错误信息 | 需要关注的处理错误 |
FATAL | 致命错误 | 导致系统崩溃的错误 |
级别关系:
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
三、配置示例
1. Logback配置 (logback-spring.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.SSS} [%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}.%i.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 异步日志 --><appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"><appender-ref ref="FILE"/><queueSize>512</queueSize></appender><!-- 日志级别配置 --><root level="INFO"><appender-ref ref="CONSOLE"/><appender-ref ref="ASYNC"/></root><!-- 包级别日志 --><logger name="com.example.service" level="DEBUG"/><logger name="org.springframework" level="WARN"/>
</configuration>
2. Log4j2配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console><RollingFile name="File" fileName="logs/app.log"filePattern="logs/app-%d{yyyy-MM-dd}-%i.log"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/><AppenderRef ref="File"/></Root></Loggers>
</Configuration>
四、使用技巧和最佳实践
1. 正确的日志记录方式
@Service
public class UserService {private static final Logger logger = LoggerFactory.getLogger(UserService.class);public User getUserById(Long id) {// 使用占位符,避免字符串拼接logger.debug("查询用户信息, userId: {}", id);try {User user = userRepository.findById(id);if (user != null) {logger.info("成功查询用户: {}", user.getUsername());} else {logger.warn("用户不存在, userId: {}", id);}return user;} catch (Exception e) {logger.error("查询用户失败, userId: {}", id, e);throw new RuntimeException("查询用户失败", e);}}// 使用条件判断提升性能public void processData(List<String> data) {if (logger.isDebugEnabled()) {logger.debug("处理数据, 数据量: {}, 内容: {}", data.size(), data);}// 复杂处理逻辑...}
}
2. 异常日志记录
public class ExceptionHandlingExample {// 不好的方式 - 丢失堆栈信息public void badExceptionLogging() {try {// 业务代码} catch (Exception e) {logger.error("操作失败: " + e.getMessage()); // 错误!}}// 好的方式 - 完整异常信息public void goodExceptionLogging() {try {// 业务代码} catch (BusinessException e) {logger.warn("业务异常, 用户ID: {}, 操作: {}", userId, operation, e);} catch (Exception e) {logger.error("系统异常, 用户ID: {}, 操作: {}", userId, operation, e);}}
}
3. 性能敏感场景的日志优化
public class PerformanceSensitiveClass {public void highPerformanceMethod() {// 使用lambda延迟计算,避免不必要的字符串构建logger.debug("处理请求参数: {}", () -> buildExpensiveLogMessage());// 或者使用条件判断if (logger.isDebugEnabled()) {logger.debug("详细数据: {}", expensiveDataToString());}}private String buildExpensiveLogMessage() {// 构建复杂的日志消息return "expensive message";}
}
五、环境特定的日志配置
application.yml (Spring Boot)
logging:level:com.example: DEBUGorg.springframework: WARNfile:name: logs/app.logpattern:console: "%d{yyyy-MM-dd HH:mm:ss} - %logger{36} - %msg%n"file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
-
选择合适的日志级别:生产环境用INFO,开发环境用DEBUG
-
使用占位符:避免不必要的字符串拼接
-
合理记录异常:总是传递异常对象给logger
-
性能考虑:在循环或高性能代码中使用条件判断
-
使用MDC:便于日志追踪和排查问题
-
异步日志:在高并发场景下使用异步日志提升性能
-
日志轮转:配置合理的日志文件大小和保存时间