Z
ZHANK
异常处理

断言与日志

使用 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非常详细的追踪