SpringBoot配置日志每天输出到指定文件

本文详细介绍如何在SpringBoot项目中配置logback日志框架,实现控制台与文件日志输出,包括按日滚动、自动切分大文件及分级别输出至不同文件的功能。

在使用springboot搭建项目时,它内部引入了logback作为日志框架,默认只有info级别的控制台日志输出

在线上环境都是输出到文件的,并且每日一个文件夹自动更换文件(文件内容超出一定大小,自动切分)并且以递增的序号排列,不同级别的日志分文件输出,在SpringBoot项目中如何配置呢?

在springboot的配置文件里.yml或.properties文件内配置log的配置文件路径,如下:

然后在resources下创建logback-spring.xml文件

文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">

    <!-- Log file path -->
    <property name="log.path" value="E:/home/logs/seq-test" />

    <!-- Console log output -->
    <appender name="console"
              class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{MM-dd HH:mm:ss.SSS} %-5level [%logger{50}] - %msg%n
            </pattern>
        </encoder>
    </appender>

    <!-- Log file debug output -->
    <appender name="fileRolling_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n
            </pattern>
        </encoder>
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level>
            <onMatch>DENY</onMatch> <onMismatch>NEUTRAL</onMismatch> </filter> -->
    </appender>
    <!-- Log file error output -->
    <appender name="fileRolling_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n
            </pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
    <root level="info">
        <!--{dev.start}-->
<!--        <appender-ref ref="console" />-->
        <!--{dev.end}-->
        <!--{alpha.start}
        <appender-ref ref="fileRolling_info" />
        {alpha.end}-->
<!--        {release.start}-->
        <appender-ref ref="fileRolling_info" />
<!--        {release.end}-->
        <appender-ref ref="fileRolling_error" />
    </root>
    <!-- Framework level setting -->
    <include resource="config/logger-core.xml" />

    <!-- Project level setting -->
    <!-- <logger name="your.package" level="DEBUG" /> -->
    <logger name="org.springframework" level="INFO"></logger>
    <logger name="org.mybatis" level="INFO"></logger>
</configuration>

配置了三种策略,

1 控制台,

2输出到日志文件并且级别是info,文件大小超过50M后自动切割,写到下个文件

3 输出到日志文件并且级别是error,文件大小超过50M后自动切割,写到下个文件

 

我们来看一下效果,如下图,每天一个文件夹,各自的日志文件从0升序生成。

info开头的这个日志文件记录的有info级别的也有error级别的

 

error开头的日志文件只有error级别的日志

我们可以把切分文件的限制改小一点,测一下自动切分文件 

在Spring Boot项目中,可以通过配置`logback-spring.xml`或`log4j2.xml`实现将不同日志分类输出到独立文件。以下是完整解决方案: --- ### **1. Logback配置方案(推荐)** 在`src/main/resources/logback-spring.xml`中配置文件输出: #### 按模块分离 ```xml <!-- 主日志文件控制台+全部日志) --> <appender name="MAIN-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/application.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>logs/application.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>50MB</maxFileSize> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 单独记录Controller日志 --> <appender name="CONTROLLER-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/controller.log</file> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/controller.%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> </appender> <!-- 单独记录SQL日志 --> <appender name="SQL-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/sql.log</file> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>logs/sql.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>10MB</maxFileSize> </rollingPolicy> </appender> <!-- 按包路径分配 --> <logger name="com.example.controller" level="INFO" additivity="false"> <appender-ref ref="CONTROLLER-FILE"/> <appender-ref ref="MAIN-FILE"/> </logger> <logger name="org.hibernate.SQL" level="DEBUG" additivity="false"> <appender-ref ref="SQL-FILE"/> </logger> <root level="INFO"> <appender-ref ref="MAIN-FILE"/> <appender-ref ref="CONSOLE"/> </root> ``` --- ### **2. Log4j2配置方案** 在`src/main/resources/log4j2-spring.xml`中配置: #### 按级别分离 ```xml <Configuration> <Appenders> <!-- 错误日志单独文件 --> <RollingFile name="ErrorFile" fileName="logs/error.log" filePattern="logs/error-%d{yyyy-MM-dd}.log.gz"> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> </RollingFile> <!-- 审计日志 --> <RollingFile name="AuditFile" fileName="logs/audit.log" filePattern="logs/audit-%d{yyyy-MM-dd}.log"> <PatternLayout pattern="%d{ISO8601} | %-5level | %t | %c | %msg%n"/> </RollingFile> </Appenders> <Loggers> <!-- 自定义审计日志 --> <Logger name="AUDIT_LOGGER" level="INFO" additivity="false"> <AppenderRef ref="AuditFile"/> </Logger> <!-- MyBatis SQL日志 --> <Logger name="org.mybatis" level="DEBUG" additivity="false"> <AppenderRef ref="SqlFile"/> </Logger> <Root level="INFO"> <AppenderRef ref="Console"/> <AppenderRef ref="ErrorFile"/> </Root> </Loggers> </Configuration> ``` --- ### **3. 高级功能实现** #### 动态文件名(按日期/用户) ```xml <!-- 在Logback中使用变量 --> <property name="LOG_DIR" value="logs/${spring.profiles.active:-default}"/> <!-- 在Log4j2中通过Lookup --> <RollingFile name="UserLog" fileName="logs/user-${ctx:user:-system}.log"> <!-- 通过MDC注入用户标识 --> <Pattern>%X{userId} | %msg%n</Pattern> </RollingFile> ``` Java代码注入变量: ```java MDC.put("user", "admin123"); // Logback ThreadContext.put("userId", "1001"); // Log4j2 ``` --- ### **4. Spring Profile差异化配置** ```xml <!-- logback-spring.xml --> <springProfile name="dev"> <logger name="com.example" level="DEBUG"/> </springProfile> <springProfile name="prod"> <logger name="com.example" level="INFO"/> <appender name="SENTRY" class="io.sentry.logback.SentryAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> </appender> </springProfile> ``` --- ### **5. 文件目录自动创建** 确保日志目录存在: ```java @PostConstruct public void initLogDir() { new File("logs").mkdirs(); } ``` 或在配置指定绝对路径: ```xml <property name="LOG_HOME" value="/var/log/myapp"/> ``` --- ### **最佳实践建议** 1. **文件命名规范**:`模块名[-日期].log[.gz]` 2. **滚动策略**: - 按大小滚动:`SizeBasedTriggeringPolicy` - 按时间滚动:`TimeBasedRollingPolicy` 3. **保留策略**:`<maxHistory>30</maxHistory>` 4. **监控报警**:对ERROR日志文件设置监控
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员beige

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值