在Spring Boot中,默认使用的是Logback作为日志框架。要配置Logback,可以在src/main/resources目录下创建一个名为logback-spring.xml的文件,然后在其中添加以下配置:
在 Logback 中,日志的输出被称为 appender,包含控制台输出、文件输出、网络输出等多种方式。以下是一个简单的 Logback 配置文件示例:
范例
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml" /> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root> <!-- 控制台输出 --> <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> </appender> <!-- 文件输出 --> <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}.log</fileNamePattern> <!-- 保留 7 天的日志 --> <maxHistory>7</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> </configuration>
在这个配置文件中,我们首先引入了Spring Boot默认的日志配置,然后定义了根日志级别(INFO),以及控制台和文件输出。控制台输出使用了ConsoleAppender,文件输出使用了RollingFileAppender,并配置了滚动策略。
最后,我们将这两个 appender 关联到 root 节点中,表示所有日志都会输出到这两个地方。
除了这些常用的配置,Logback 还提供了很多高级特性,例如过滤器、异步输出等。根据实际需求,可以选择相应的配置方案。
可以根据自己的需求调整日志级别、输出格式、文件存储路径等参数。
实战
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 说明: 1、日志级别及文件 日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中 例如:error级别记录到log_error_xxx.log或log_error.log(该文件为当前记录的日志文件),而log_error_xxx.log为归档日志, 日志文件按日期记录,同一天内,若日志文件大小等于或大于2M,则按0、1、2...顺序分别命名 例如log-level-2013-12-21.0.log 其它级别的日志也是如此。 2、文件路径 若开发、测试用,在Eclipse中运行项目,则到Eclipse的安装路径查找logs文件夹,以相对路径../logs。 若部署到Tomcat下,则在Tomcat下的logs文件中 3、Appender FILEERROR对应error级别,文件名以log-error-xxx.log形式命名 FILEWARN对应warn级别,文件名以log-warn-xxx.log形式命名 FILEINFO对应info级别,文件名以log-info-xxx.log形式命名 FILEDEBUG对应debug级别,文件名以log-debug-xxx.log形式命名 stdout将日志信息输出到控制上,为方便开发测试使用 --> <contextName>logback</contextName> <!-- 日志文件输出位置 --> <property name="LOG_PATH" value="./webserverLog" /> <!-- 单个日志文件最大值 --> <property name="maxFileSize" value="2MB" /> <!-- ERROR 日志记录器,滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 --> <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${LOG_PATH}/log_error.log</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 归档的日志文件的路径及格式,归档日志文件路径可以与file指定文件路径不同。%d{yyyy-MM-dd}指定日期格式,%i指定索引 如:log-error-2020-05-19.68.log--> <fileNamePattern>${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,命名日志文件,例如log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>${maxFileSize}</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 追加方式记录日志 --> <append>true</append> <!-- 日志输出格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger Line:%-3L - %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录error级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 设置过滤级别 --> <level>ERROR</level> <!-- 用于配置符合过滤条件的操作 --> <onMatch>ACCEPT</onMatch> <!-- 用于配置不符合过滤条件的操作 --> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- WARN 日志记录器--> <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/log_warn.log</file> <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>${maxFileSize}</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger Line:%-3L - %msg%n</pattern> <charset>utf-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- INFO 日志记录器--> <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/log_info.log</file> <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>${maxFileSize}</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger Line:%-3L - %msg%n</pattern> <charset>utf-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!--DEBUG 日志记录器 --> <appender name="FILEDEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/log_debug.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>${maxFileSize}</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger Line:%-3L - %msg%n</pattern> <charset>utf-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 控制台输出日志 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!--encoder 默认配置为PatternLayoutEncoder--> <encoder> <!-- 设置日志输出格式 --> <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger Line:%-3L - %msg%n</pattern> <charset>utf-8</charset> </encoder> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> </appender> <!-- 自定义监控日志记录器--> <appender name="MONITORLOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/log_monitor.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/monitor/log-monitor-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>${maxFileSize}</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger Line:%-3L - %msg%n</pattern> <charset>utf-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- <appender name="DB" class="com.croot.monitor.appender.SynDBAppender">--> <!-- <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">--> <!-- <dataSource class="com.alibaba.druid.pool.DruidDataSource">--> <!-- <!– DruidDataSource 中的属性配置 –>--> <!-- <driverClassName>org.sqlite.JDBC</driverClassName>--> <!-- <url>jdbc:sqlite:monitor.db</url>--> <!-- <username></username>--> <!-- <password></password>--> <!-- </dataSource>--> <!-- </connectionSource>--> <!-- </appender>--> <!-- <appender name="ASYNC_DB" class="ch.qos.logback.classic.AsyncAppender">--> <!-- <appender-ref ref="DB" />--> <!-- </appender>--> <!-- <appender name="ERRORDB" class="com.croot.monitor.appender.SynDBAppender">--> <!-- <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">--> <!-- <dataSource class="com.alibaba.druid.pool.DruidDataSource">--> <!-- <!– DruidDataSource 中的属性配置 –>--> <!-- <driverClassName>org.sqlite.JDBC</driverClassName>--> <!-- <url>jdbc:sqlite:monitor.db</url>--> <!-- <username></username>--> <!-- <password></password>--> <!-- </dataSource>--> <!-- </connectionSource>--> <!-- <!– 此日志文件只记录error级别的 –>--> <!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">--> <!-- <!– 设置过滤级别 –>--> <!-- <level>ERROR</level>--> <!-- <!– 用于配置符合过滤条件的操作 –>--> <!-- <onMatch>ACCEPT</onMatch>--> <!-- <!– 用于配置不符合过滤条件的操作 –>--> <!-- <onMismatch>DENY</onMismatch>--> <!-- </filter>--> <!-- </appender>--> <!-- <appender name="ASYNC_ERRORDB" class="ch.qos.logback.classic.AsyncAppender">--> <!-- <appender-ref ref="ERRORDB" />--> <!-- </appender>--> <logger name="com.croot.framework.logger.aspect" level="INFO" additivity="false"> <appender-ref ref="MONITORLOG"/> <!-- <appender-ref ref="ASYNC_DB" />--> </logger> <!-- <logger name="com.croot.framework.logger.BizLogger" level="INFO" additivity="false">--> <!-- <appender-ref ref="MONITORLOG"/>--> <!-- <appender-ref ref="ASYNC_DB" />--> <!-- </logger>--> <!-- mybatis日志打印 org.apache.ibatis包下的类的日志输出--> <logger name="org.apache.ibatis" level="WARN" /> <logger name="java.sql" level="WARN" /> <!-- 生产环境下,将此级别配置为适合的级别,以免日志文件太多或影响程序性能 --> <root level="INFO"> <appender-ref ref="FILEERROR" /> <appender-ref ref="FILEWARN" /> <appender-ref ref="FILEDEBUG" /> <appender-ref ref="FILEINFO" /> <!-- <appender-ref ref="ASYNC_ERRORDB" />--> <!-- 生产环境将请stdout去掉 --> <appender-ref ref="STDOUT" /> </root> </configuration>
配置时间
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${logBase}/${appName}-server.log</file> <!--SizeAndTimeBasedRollingPolicy策略继承了TimeBasedRollingPolicy策略--> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--每天生成一个文件 %i表示序号 从0开始--> <fileNamePattern>${logBase}/${appName}-server-%d{yyyy-MM-dd}.log.%i</fileNamePattern> <!--每个文件的大小限制--> <MaxFileSize>100MB</MaxFileSize> <!--最多保留10天的文件,10天之前的将被清除--> <MaxHistory>10</MaxHistory> <!--该滚动策略日志的总大小,超过的日志会被清除--> <totalSizeCap>1GB</totalSizeCap> <!--启动时清理日志文件 此项置灰清理超过保留天数的 也会清理超过总大小的--> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%X{TRACE_ID}] %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender>