要在 Spring Boot 项目中将日志写入到 Logback 的配置文件 logback.xml
中,你可以按照以下步骤进行设置:
创建 Logback 配置文件:
- 在 src/main/resources 目录下创建一个名为
logback.xml
的文件。这是默认的 Logback 配置文件名,Spring Boot 会自动加载这个文件。配置 Logback 输出到文件:
- 在
logback.xml
文件中,配置一个<appender>
来定义日志输出的方式。你可以使用RollingFileAppender
李定义日志输出到文件中。- 配置
<file>
标签来指定日志文件的路径和文件名。确保路径是相对于项目根目录的。- 配置
<encoder>
标签来定义日志的格式。配置日志级别:
- 使用
<root>
标签来配置根日志记录器,并设置合适的日志级别,例如<level value="INFO" />
。Spring Boot 应用中使用 Logback:
- 在 Spring Boot 项目中,Logback 通常是默认的日志框架。你不需要额外的配置来使用 Logback,只需确保
logback.xml
文件正确配置即可。重启应用:
- 一旦你修改了
logback.xml
文件,你可能需要重启你的 Spring Boot 应用程序,以使新的日志配置生效。
下面是一个示例的 logback.xml
配置文件,用于将日志输出到 logs/app.log
文件中:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>7</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
在这个配置中:
<maxFileSize>10MB</maxFileSize>
设置了日志文件的最大大小为 10MB。<fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
定义了日志文件的命名模式,%i
表示当文件大小超过限制时,新文件会被命名为app.日期.序号.log
,例如app.2024-05-21.1.log
。<maxHistory>7</maxHistory>
表示保留的历史日志文件数量为 7 个,超过这个数量的日志文件将被删除。通过这样的配置,当
app.log
文件大小超过 10MB 时,Logback 会自动将该文件改名为app1.log
,并创建新的app.log
文件来继续写入日志。同时,历史日志文件会根据maxHistory
的设置进行保留和管理。
<timeBasedFileNamingAndTriggeringPolicy>
是 Logback 中的一个类,具体是ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP
。这个类是用于基于时间和文件大小来命名和触发日志文件滚动的策略。在 Logback 的 RollingFileAppender 中,你可以配置一个 RollingPolicy 来定义日志文件滚动的方式。
SizeAndTimeBasedFNATP
是一个结合了时间和文件大小的策略,它可以根据时间和文件大小来触发日志文件的滚动。具体来说,
SizeAndTimeBasedFNATP
可以根据以下两个条件来触发日志文件的滚动:
- 时间条件:根据时间来触发日志文件的滚动,例如每天、每小时或者其他时间间隔。
- 文件大小条件:根据日志文件的大小来触发日志文件的滚动,当日志文件达到设定的最大大小时,会触发滚动。
通过结合时间和文件大小条件,
SizeAndTimeBasedFNATP
可以帮助你控制日志文件的大小和保留历史日志的数量,以避免日志文件过大或占用过多磁盘空间。在 Logback 的配置中,你可以使用
<timeBasedFileNamingAndTriggeringPolicy>
元素来配置这种基于时间和文件大小的日志文件滚动策略,以便更灵活地管理日志文件的滚动和保留。
下面是一个完整的logback.xml的配置,可根据自己的要求自行修改
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan : 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true-->
<configuration scan="false" scanPeriod="60 seconds" debug="false">
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<contextName>logback</contextName>
<property name="log.path" value="logs"></property>
<property name="Console_Pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%logger{50}] - %msg%n"/>
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${Console_Pattern}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="RollingFileInfo" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{50}] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 WARN 日志 -->
<appender name="RollingFileWarn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/warn.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{50}] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="RollingFileError" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{50}] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--additivity:是否继承root节点,默认是true继承。默认情况下子Logger会继承父Logger的appender,
也就是说子Logger会在父Logger的appender里输出。
若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。-->
<logger name="org.springframework" level="INFO" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
</logger>
<logger name="org.mybatis" level="INFO"></logger>
<Logger name="org.apache.catalina" level="info"/>
<Logger name="org.apache.tomcat.util" level="info"/>
<!-- 从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF-->
<root level="ALL">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
<!--生产环境:输出到文件-->
<springProfile name="pro">
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</springProfile>
</configuration>