配置SLF4J日志输出到D盘logs目录和控制台

下面我将为您提供一个完整的配置方案,将日志同时输出到控制台的D盘logs目录下,并设置不同的日志级别。

1. 添加必要的依赖

在Maven项目的pom.xml中添加以下依赖:

<dependencies>
    <!-- SLF4J API -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>2.0.9</version>
    </dependency>
    
    <!-- Logback实现 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.4.11</version>
    </dependency>
    
    <!-- Lombok(用于@Slf4j注解) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

2. 创建Logback配置文件

src/main/resources目录下创建logback.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 定义变量 -->
    <property name="LOG_DIR" value="D:/logs" />
    <property name="LOG_FILE" value="application" />
    
    <!-- 控制台输出 -->
    <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>
        <!-- 设置控制台日志级别 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <!-- 文件输出 - 所有级别 -->
    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/${LOG_FILE}.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <!-- 设置文件滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/${LOG_FILE}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <!-- 设置文件日志级别 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>

    <!-- 文件输出 - 错误级别 -->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/${LOG_FILE}-error.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/${LOG_FILE}-error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <!-- 只记录ERROR级别日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 根日志记录器 -->
    <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE_ALL" />
        <appender-ref ref="FILE_ERROR" />
    </root>

    <!-- 特定包的日志级别配置示例 -->
    <logger name="com.yourpackage.service" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE_ALL" />
    </logger>
    
    <!-- 第三方库日志级别控制 -->
    <logger name="org.hibernate" level="WARN" />
    <logger name="org.springframework" level="INFO" />
</configuration>

3. 使用@Slf4j注解记录日志

在Java类中使用Lombok的@Slf4j注解:

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ExampleService {
    
    public void process() {
        log.trace("这是一条TRACE级别日志");
        log.debug("这是一条DEBUG级别日志 - 用于调试");
        log.info("这是一条INFO级别日志 - 业务信息");
        log.warn("这是一条WARN级别日志 - 警告信息");
        log.error("这是一条ERROR级别日志 - 错误信息");
        
        try {
            // 模拟可能出错的代码
            int result = 10 / 0;
        } catch (Exception e) {
            log.error("处理过程中发生错误: ", e);
        }
    }
    
    public static void main(String[] args) {
        ExampleService service = new ExampleService();
        service.process();
        
        // 打印日志文件位置信息
        log.info("日志文件保存在: D:/logs/ 目录下");
    }
}

4. 确保D盘logs目录存在

在运行应用程序前,请确保D盘logs目录存在,或者应用程序有权限创建该目录。您也可以添加以下代码在应用程序启动时创建目录:

import java.io.File;

public class LogDirectoryCreator {
    public static void ensureLogDirectoryExists() {
        File logDir = new File("D:/logs");
        if (!logDir.exists()) {
            boolean created = logDir.mkdirs();
            if (created) {
                System.out.println("创建日志目录: " + logDir.getAbsolutePath());
            } else {
                System.err.println("无法创建日志目录: " + logDir.getAbsolutePath());
            }
        }
    }
}

在应用程序启动时调用:

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class LogTest {
    public static void main(String[] args) {
        log.trace("TRACE级别消息");
        log.debug("DEBUG级别消息");
        log.info("INFO级别消息");
        log.warn("WARN级别消息");
        log.error("ERROR级别消息");
        
        try {
            throw new RuntimeException("测试异常");
        } catch (Exception e) {
            log.error("捕获到异常", e);
        }
        
        System.out.println("请检查D:/logs/目录下的日志文件");
    }
}

7. 测试配置

创建一个简单的测试类来验证配置是否正常工作:

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class LogTest {
    public static void main(String[] args) {
        log.trace("TRACE级别消息");
        log.debug("DEBUG级别消息");
        log.info("INFO级别消息");
        log.warn("WARN级别消息");
        log.error("ERROR级别消息");
        
        try {
            throw new RuntimeException("测试异常");
        } catch (Exception e) {
            log.error("捕获到异常", e);
        }
        
        System.out.println("请检查D:/logs/目录下的日志文件");
    }
}

 

 

posted @ 2025-08-23 12:55  红尘沙漏  阅读(27)  评论(0)    收藏  举报