由于本文是边学习边实践,比较啰嗦,想拿来就用的同学移步:https://blog.youkuaiyun.com/w_jiayou/article/details/106943376
之前只是把现成的xml文件拿来用,想要调整日志很费劲,今天从头开始边学习边测试
一、空的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds" debug="true">
</configuration>
既然决定要好好整理一下,就从什么都没有开始配置,启动项目:
com.springboot.demo02020623.Demo02020623Application
Connected to the target VM, address: '127.0.0.1:58330', transport: 'socket'
09:30:48,100 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Will scan for changes in [file:/D:/workspace/idea-workspace/demo02020623/target/classes/logbackConfig.xml]
09:30:48,203 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Setting ReconfigureOnChangeTask scanning period to 10 seconds
09:30:48,222 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
09:30:48,223 |-INFO in org.springframework.boot.logging.logback.SpringBootJoranConfigurator@1869fbd2 - Registering current configuration as safe fallback point
09:30:48,230 |-WARN in Logger[org.springframework.boot.context.logging.ClasspathLoggingApplicationListener] - No appenders present in context [default] for logger [org.springframework.boot.context.logging.ClasspathLoggingApplicationListener].
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.1.RELEASE)
_ _ |_ _ _|_. ___ _ | _
| | |\/|_)(_| | |_\ |_)||_|_\
/ |
3.3.1.tmp
除了一点打印出logback内部日志信息,啥都没有;
二、控制台输出
在xml配置中configuration标签下加入
<logger name="com.springboot.demo02020623.mapper" level="TRACE" />
<!-- <logger name="com.springboot.demo02020623.controller" level="TRACE" />-->
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- Console 输出设置 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
logger:用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
name:用来指定受此loger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:
TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity:是否向上级loger传递打印信息。默认是true。
appender:定义控制台输出内容
%d{HH:mm:ss.SSS} 当前时间,并格式化
[%thread] 线程
%-5level 日志等级,从左显示5个字符宽度
%logger{36} 日志出处(哪个个class)
%msg 日志内容
%n 换行符
root:设置打印log日志等级,例如:这里没有设置controller的打印日志等级,则controller的等级跟随root的等级,如下图:
controller:
@RequestMapping("/queryUsers1")
public Object queryUsers1(){
logger.info("controller==============info==============");
logger.warn("controller==============warn==============");
logger.error("controller==============error==============");
logger.trace("controller==============trace==============");
logger.debug("controller==============debug==============");
return iDmUsersService.selectDemo(null);
}
设置root的level=“TRACE”:
15:25:47.373 [http-nio-80-exec-1] INFO c.s.d.controller.DmUsersController - controller==============info==============
15:25:47.373 [http-nio-80-exec-1] WARN c.s.d.controller.DmUsersController - controller==============warn==============
15:25:47.373 [http-nio-80-exec-1] ERROR c.s.d.controller.DmUsersController - controller==============error==============
15:25:47.373 [http-nio-80-exec-1] TRACE c.s.d.controller.DmUsersController - controller==============trace==============
15:25:47.373 [http-nio-80-exec-1] DEBUG c.s.d.controller.DmUsersController - controller==============debug==============
设置root的level=“INFO”:
15:30:34.835 [http-nio-80-exec-3] INFO c.s.d.controller.DmUsersController - controller==============info==============
15:30:34.835 [http-nio-80-exec-3] WARN c.s.d.controller.DmUsersController - controller==============warn==============
15:30:34.835 [http-nio-80-exec-3] ERROR c.s.d.controller.DmUsersController - controller==============error==============
但是如果设置了<logger name="com.springboot.demo02020623.controller" level="TRACE" />
,不管root的level是什么,都会打印:
15:31:28.731 [http-nio-80-exec-4] INFO c.s.d.controller.DmUsersController - controller==============info==============
15:31:28.731 [http-nio-80-exec-4] WARN c.s.d.controller.DmUsersController - controller==============warn==============
15:31:28.731 [http-nio-80-exec-4] ERROR c.s.d.controller.DmUsersController - controller==============error==============
15:31:28.731 [http-nio-80-exec-4] TRACE c.s.d.controller.DmUsersController - controller==============trace==============
15:31:28.731 [http-nio-80-exec-4] DEBUG c.s.d.controller.DmUsersController - controller==============debug==============
至此控制台打印输出的基本功能已经实现了,但是项目上线之后我们还想通过日志查看项目的运行情况,这个时候就需要将日志保存到log文件中了。
三、输出日志到log文件
在xml配置中configuration标签下继续加入:
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
<property name="LOG_HOME" value="D:/log/logback"/>
<property name="project_name" value="demo02020623"/>
<!-- INFO日志 appender -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${project_name}/INFO.log</file> <!-- 日志名称 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${project_name}/INFO.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<!-- 如果日志大小超出限制,会将旧的日志打包并生成新的日志文件,其中%i代表同名文件的序列号 -->
<maxFileSize>20MB</maxFileSize> <!-- 日志最大尺寸,日志文件过大会使的编辑器打开非常慢 -->
<maxHistory>30</maxHistory> <!-- 保存30天 -->
<totalSizeCap>10GB</totalSizeCap> <!-- 总日志大小 -->
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!-- 日志过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 只打印INFO日志 -->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
用最大限制为2k测试了一下,没有问题:
其他等级的日志同理。
四、总结(个人观点):
父标签: configuration
子标签: property => 用来定义变量
logger=> 设置某一个包或者具体的某一个类的日志打印级别
property => 用来定义日志输出的方式、各种参数
root=> 设置总体日志打印级别,打印哪些property
至此已足够基本使用了。