断言与日志
使用 assert 断言、java.util.logging 与 SLF4J 日志框架
断言与日志
断言在开发期发现问题,日志在生产期追踪问题。
学完本章你将: 使用 assert、了解 JDK Logging 与 SLF4J。
assert 断言
java
// 断言用于开发期校验,默认关闭
public double divide(int a, int b) {
assert b != 0 : "除数不能为0,b=" + b;
return (double) a / b;
}
// 运行时启用断言
// java -ea com.example.Main
JDK 内置日志
java
import java.util.logging.*;
public class LogDemo {
private static final Logger logger =
Logger.getLogger(LogDemo.class.getName());
public static void main(String[] args) {
logger.info("应用启动");
logger.warning("磁盘空间低");
logger.severe("致命错误!");
try {
riskyOperation();
} catch (Exception e) {
logger.log(Level.SEVERE, "操作失败", e);
}
}
}
SLF4J + Logback(推荐)
xml
<!-- logback.xml -->
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>myapp.log</file>
<encoder>
<pattern>%d{HH:mm:ss} [%level] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Service {
private static final Logger log =
LoggerFactory.getLogger(Service.class);
public void process(String id) {
log.info("处理订单: {}", id); // 占位符
log.debug("详细参数: {}", someObject);
log.error("处理失败", exception);
}
}
日志级别
| 级别 | 用途 |
|---|---|
| ERROR | 错误,需要立即处理 |
| WARN | 警告,潜在问题 |
| INFO | 重要业务流程 |
| DEBUG | 调试信息 |
| TRACE | 非常详细的追踪 |