一、主流日志框架
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: debug
org.springframework: warn
file:
name: logs/app.log
pattern:
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:便于日志追踪和排查问题
- 异步日志:在高并发场景下使用异步日志提升性能
- 日志轮转:配置合理的日志文件大小和保存时间
到此这篇关于java log 日志级别和使用技巧的文章就介绍到这了,更多相关java log日志级别内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论