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
@RestController
public 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/后发现控制台输入为:
INFO 35004 --- [nio-8080-exec-1] c.l.s.controller.HelloController : info级别的日志
WARN 35004 --- [nio-8080-exec-1] c.l.s.controller.HelloController : warn级别的日志
ERROR 35004 --- [nio-8080-exec-1] c.l.s.controller.HelloController : error级别的日志
我们发现trace和debug级别日志没有出现,这是因为SpringBoot日志默认级别为Info,日志只显示Info以及这个级别更高级别的日志,日志顺序为trace<debug<info<warn<error那么如果我们想显示trace或者debug级别的日志就需要修改配置文件application.yml
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_Filemyfirstspring-boot-part3logs
运行后会在F:Java_Filemyfirstspring-boot-part3logs生成spring.log日志文件
2.2.2 logging.file.name
logging:
level:
root: info
file:
#path: F:Java_Filemyfirstspring-boot-part3logs
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_Filemyfirstspring-boot-part3logs
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中的结果展示为:
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 使用使用<springProfile>
查看不同条件日志
修改/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信息
原文始发于微信公众号(springboot葵花宝典):Spring-3-日志管理
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/184479.html