Spring-3-日志管理
1 日志框架简介
我们在开发过程中会经常使用的日志,目前存在很多日志框架:JCL、SLF4J、log4j、logback等等。
日志抽象层 | 日志实现 |
SLF4J | log4j2、Logback |
选择一个日志抽象层框架+日志实现,类似我们使用JDBC选择不同的数据驱动。
SpringBoot日志默认设置:
- SLF4J+Logback
- 默认值输出到控制台
- 默认级别Level为INFO
- 默认日志文件大小为10M
输出格式为
2019-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] osbcembedded.FilterRegistrationBean:映射过滤器:'hiddenHttpMethodFilter' 到:[/*]
输出以下项目:
日期和时间:毫秒精度,易于排序。
日志级别:ERROR、WARN、INFO、DEBUG或TRACE。
进程标识。
---用于区分实际日志消息开始的分隔符。
线程名称:括在方括号中(可能会被截断以用于控制台输出)。
记录器名称:这通常是源类名称(通常缩写)。
日志消息
2 SpringBoot日志的默认配置
2.1 日志默认级别
新建一个Controller,端口默认为8080
@RestControllerpublic class HelloController { Logger logger = LoggerFactory.getLogger(HelloController.class); @RequestMapping("/") public String index(){ //由低到高 trace<debug<info<warn<error //可以调整输出的日志级别;日志就只会在这个级别以以后的高级别生效 logger.trace("trace级别的日志"); logger.debug("debug级别的日志"); //SpringBoot默认给我们使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别;root级别 logger.info("info级别的日志"); logger.warn("warn级别的日志"); logger.error("error级别的日志"); return "logger info "; }}
访问http://localhost:8080/后发现控制台输入为:
访问http://localhost:8080/后发现控制台输入为: INF
我们发现trace和debug级别的日志没有出现,这是因为SpringBoot日志默认级别为Info,日志只显示Info以及这个级别更高级别的日志,日志顺序为trace
logging: level: root: trace #修改日志的级别,默认root是info
访问http://localhost:8080/后发现控制台输入为:
TRACE 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController : trace级别的日志DEBUG 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController : debug级别的日志INFO 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController : info级别的日志WARN 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController : warn级别的日志ERROR 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController : error级别的日志
2.2 文件输出
默认情况下SpringBoot 日志只在控制台输出,如果想让日志输出到文件,需要设置属性logging.file.name或者logging.file.path
下表对logging.file.name和logging.file.path进行比较
logging.file.name |
logging.file.path |
Example | Description |
(none) | (none) | ||
只能在控制台输出 |
Specific file | (none) | my.log |
写入指定的日志文件。名称可以是确切的位置,也可以是相对于当前目录的位置。 |
(none) | Specific directory | /var/log |
将spring.log写到制定的文件夹,可以是确切的位置,也可以是相对于当前目录的位置 |
2.2.1 logging.file.path
logging: level: root: info file: path: F:\Java_File\myfirst\spring-boot-part3\logs
运行后会在F:\Java_File\myfirst\spring-boot-part3\logs生成spring.log日志文件
2.2.2 logging.file.name
logging: level: root: info file: #path: F:\Java_File\myfirst\spring-boot-part3\logs name: my.log
运行后会在该项目下生成my.log日志文件
注:logging.file.name, logging.file.path 不能同时生效logging.file.name会覆盖logging.file.path
2.3 日志的格式设置
我们先查看一下,默认在控制台的输出:
%d-时间格式%thread-线程%-5level-从左5字符宽度%logger{50}-日志50个字符%msg-信息%n-换行
在application.yml中配置日志格式使用%clr转换字配置颜色
logging: level: root: info file: #path: F:\Java_File\myfirst\spring-boot-part3\logs name: my.log pattern: console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} %clr([%thread]){red} %highlight(%-5level) %logger{50} -%msg%n" file: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} === %clr([%thread]){red} == %highlight(%-5level) == %logger{50} == %msg%n"
在console和my.log中的结果展示为:
- 控制台结果
- .log结果
3 SpringBoot 自定义配置日志文件
Logging System | Customization |
Logback | logback-spring.xml , logback-spring.groovy , logback.xml , or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
配置路径:
src/main/resources/ Logback -> logback.xml 或 logback-spring.xml Log4j2 -> log4j2.xml 或 log4j2-spring.xml JUL -> logging.properties
新建src/main/resources/logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 属性定义 --> <!--日志保存路径--> <property name="LOG_HOME" value="${user.dir}/logs/"/> <property name="appName" value="OA-SEARCH"/> <property name="maxHistory" value="90"/> <!-- 彩色日志依赖的渲染类 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" /> <!-- ConsoleAppender 控制台输出日志 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- 对日志进行格式化 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> </appender> <!-- DEBUG日志 --> <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender--> <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 对日志进行格式化 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> <!-- 过滤器,记录「所有」级别的日志 --> <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>${LOG_HOME}/debug/debugLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern> <maxFileSize>256MB</maxFileSize> <maxHistory>${maxHistory}</maxHistory> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50}\(%F %L\) -%msg%n</pattern> </encoder> </appender> <!-- INFO级别日志 --> <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 过滤器,只记录「INFO」级别的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/info/infoLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern> <maxFileSize>256MB</maxFileSize> <maxHistory>${maxHistory}</maxHistory> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50}\(%F %L\) -%msg%n</pattern> </encoder> </appender> <!-- WARN级别日志 --> <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 过滤器,只记录「WARN」级别的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/warn/warnLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern> <maxFileSize>256MB</maxFileSize> <maxHistory>${maxHistory}</maxHistory> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50}\(%F %L\) -%msg%n</pattern> </encoder> </appender> <!-- ERROR级别日志 --> <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 过滤器,只记录「ERROR」级别的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/error/errorLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern> <maxFileSize>256MB</maxFileSize> <maxHistory>${maxHistory}</maxHistory> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50}\(%F %L\) -%msg%n</pattern> </encoder> </appender> <!-- MyBatis log configure --> <logger name="com.apache.ibatis" level="DEBUG"/> <logger name="org.mybatis.spring" level="DEBUG"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> <logger name="druid.sql" level="INFO"/> <logger name="org.mybatis.spring" level="INFO"/> <logger name="org.springframework" level="INFO"/> <logger name="org.springframework.context" level="WARN"/> <logger name="org.springframework.beans" level="WARN"/> <logger name="com.baomidou.mybatisplus" level="INFO"/> <logger name="org.apache.ibatis.io" level="INFO"/> <!-- 自己项目的mapper 路径 --> <logger name="com.aoke.oa.search" level="INFO"/> <!-- 根日志,所有日志appender都必须包含在root/logger中,否则不会起作用 --> <root level="INFO"> <appender-ref ref="STDOUT"/> <appender-ref ref="DEBUG"/> <appender-ref ref="INFO"/> <appender-ref ref="WARN"/> <appender-ref ref="ERROR"/> </root></configuration>
启动应用后访问 http://localhost:8080/。控制台结果为:
2022-02-16 19:38:51.776 INFO 11448 --- [nio-8080-exec-1] c.l.s.controller.HelloController : info级别的日志2022-02-16 19:38:51.776 WARN 11448 --- [nio-8080-exec-1] c.l.s.controller.HelloController : warn级别的日志2022-02-16 19:38:51.776 ERROR 11448 --- [nio-8080-exec-1] c.l.s.controller.HelloController : error级别的日志
日志文件结果:
3.1 使用**使用
**查看不同条件日志
修改/logback-spring.xml
<!-- 根日志,所有日志appender都必须包含在root/logger中,否则不会起作用 --> <root level="INFO"> <appender-ref ref="STDOUT"/> <springProfile name="dev"> <appender-ref ref="DEBUG"/> </springProfile > <appender-ref ref="INFO"/> <appender-ref ref="WARN"/> <springProfile name="production"> <appender-ref ref="ERROR"/> </springProfile > </root>
添加VM参数 -Dspring.profiles.active=dev 启动应用后访问 http://localhost:8080/
2022-02-16 19:48:50.000 INFO 14824 --- [nio-8080-exec-4] c.l.s.controller.HelloController : info级别的日志2022-02-16 19:48:50.000 WARN 14824 --- [nio-8080-exec-4] c.l.s.controller.HelloController : warn级别的日志2022-02-16 19:48:50.001 ERROR 14824 --- [nio-8080-exec-4] c.l.s.controller.HelloController : error级别的日志
发现没有出现debug文件夹控制台也没有出现debug信息