← 返回首页
📝

Java日志框架详解:SLF4J与Logback

📂 java ⏱ 2 min 285 words

Java日志框架详解:SLF4J与Logback

概述

日志是应用程序的重要组成部分。本教程介绍SLF4J、Logback和Log4j2的使用。

1. SLF4J + Logback

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggingExample {
    private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class);
    
    public static void main(String[] args) {
        // 基本日志
        logger.trace("Trace级别日志");
        logger.debug("Debug级别日志");
        logger.info("Info级别日志");
        logger.warn("Warn级别日志");
        logger.error("Error级别日志");
        
        // 带参数的日志
        String name = "Alice";
        int age = 25;
        logger.info("用户信息: name={}, age={}", name, age);
        
        // 异常日志
        try {
            int result = 10 / 0;
        } catch (Exception e) {
            logger.error("除零错误", e);
        }
        
        // 条件日志
        if (logger.isDebugEnabled()) {
            logger.debug("调试信息: {}", getDebugInfo());
        }
    }
    
    private static String getDebugInfo() {
        return "调试数据";
    }
}

2. Logback配置

<!-- logback.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>
    
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    
    <!-- 文件输出 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>app.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    
    <!-- 异步日志 -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE"/>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="ASYNC"/>
    </root>
</configuration>

3. Log4j2配置

<!-- log4j2.xml -->
<?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>
        <File name="File" fileName="app.log">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Logger name="com.example" level="debug" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Logger>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

4. 实际应用示例

AOP日志

import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LoggingAspect {
    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
    
    @Before("execution(* com.example.service.*.*(..))")
    public void beforeMethod(JoinPoint joinPoint) {
        logger.info("调用方法: {}", joinPoint.getSignature().getName());
    }
    
    @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        logger.info("方法返回: {} -> {}", joinPoint.getSignature().getName(), result);
    }
    
    @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex")
    public void afterThrowing(JoinPoint joinPoint, Exception ex) {
        logger.error("方法异常: {} -> {}", joinPoint.getSignature().getName(), ex.getMessage());
    }
}

5. 最佳实践

  1. 使用SLF4J作为门面:统一日志API
  2. 使用Logback或Log4j2:作为实现框架
  3. 使用合适的日志级别:避免过多日志
  4. 使用异步日志:提高性能
  5. 集中管理日志:使用ELK等工具

总结

日志是应用程序的重要组成部分。掌握SLF4J、Logback和Log4j2的使用,可以有效监控和调试应用程序。