后端学习笔记三 RuoYi的log配置分析
Ruoyi-Vue 在SpringBoot中,可以发现在每次idea启动时会发现控制台会输出很多log信息(其实只要是SpringBoot项目在Console窗口都会打印log信息),正好我在RuoYi的项目中我也看到了logback.xml的文件,这个文件说白了就是控制Console如何打印日志的,我记得刚开始学框架时,看网上的教程感觉Spring框架真恶心,代码没写几行,倒是天天配xml,自从学了SpringBoot框架就发现自己好久没配xml了,log这里就是在配xml。。(满满的回忆~~~) RuoYi的logback.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路径 -->
<property name="log.path" value="/Users/junshuoli/Projects/Ruoyi-Vue/logs" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.ruoyi" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<root level="info">
<appender-ref ref="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
<!--系统用户操作日志-->
<logger name="sys-user" level="info">
<appender-ref ref="sys-user"/>
</logger>
</configuration>
根节点就是configuration,在这里的话里面没有任何属性,其实里面有一个scan的属性,当这个属性设置为true的时候,他就会热部署,这个属性是默认就为true的,所以在RuoYi项目里什么都没配,如果xml文件某个子节点或者属性发生变化时,就会自动热部署; 还有个属性叫做scanPeriod,说白了就是检测这个xml文件是否修改的程序的扫描周期,默认单位是毫秒,如果给这个属性赋值true的话,扫描周期就是一分钟;debug属性:如果这个为true的话,就会打印logback的内部log,平时如果不管它默认值就为false; 接下来可以看到一个叫做property的标签,这个标签就是来定义变量值的标签,这个定义的值可以用在xml其他地方,在你定义该变量之后,可以在其他地方使用${}这种套外套的方法来使用定义的变量。 比如在这里就是使用log.path这个变量名并给它赋值了一个我的mac电脑上的一个log地址,当然这个地址要能写入,因为我刚开始配置这个项目时就是背坑在了这里,找了半天都找不到bug,后来发现RuoYi大佬定义的位置在我的mac上不能被写入,需要权限才行;然后另一个log.pattern变量定义了一个日志输出格式,在这里这几个标志如下:%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %logger{20} 表示logger名字最长20个字符,否则按照句点分割。%method,%line在运行中动态获取包类名、方法名及行号 %msg:日志消息,%n是换行符 接下来是appender节点,节点的name属性是节点名称,class是用来指定日志输出的策略,总的来说,输出位置有下面这几种:
1、FileAppender 普通地输出到本地文件
2、FlumeAppender 将几个不同源的日志汇集、集中到一处。
3、JMSQueueAppender & JMSTopicAppender 与JMS相关的日志输出
4、RewriteAppender 对日志事件进行掩码或注入信息
5、RollingFileAppender 对日志文件进行封存(详细)
6、RoutingAppender 在输出地之间进行筛选路由
7、SMTPAppender 将LogEvent发送到指定邮件列表
8、SocketAppender 将LogEvent以普通格式发送到远程主机
9、SyslogAppender 将LogEvent以RFC 5424格式发送到远程主机
10、AsynchAppender 将一个LogEvent异步地写入多个不同输出地
11、ConsoleAppender 将LogEvent输出到命令行
12、FailoverAppender 维护一个队列,系统将尝试向队列中的Appender依次输出LogEvent,直到有一个成功为止
在这里用的是第十一个,也就是输出到命令行(当然就是注释写的意思) 接下来是encoder节点,主要就是对记录日志进行格式化,然后里面的节点就是pattern节点,意思就是设置日志记录行格式; 接下来就是指定日志信息输出,这里使用的日志策略就是输出到文件中,(前提就是满足日志文件大小) file节点就是指定被写入的文件名,在这里就用上了上面使用的变量log.path了,也就是说存在该路径下的下一层的sys-info.log文件,当然如果这个路径在路径中不存在的话,那么就会自动创建,接下来就是rollingPolicy设置日志的滚动策略,当达到条件之后自动将条件前的日志生成一个备用的日志文件,条件后的日志文件输出到最新的日志文件中,在这里用的滚动策略是按照时间来滚动(class中现在指定的),还有一种就是基于索引实现(FixedWindowRollingPolicy),当然这里也没用到。。。。 接下来就是fileNamePattern,设置生成滚动生成文件的格式,按照天来说的,在这里设置的就是60天。就是在61天,第一天的日志就会被清掉。 接下来就是指定log级别,比如ruoyi的log就是最低为info级别,spring框架的log就是error级别,然后root节点就是指定最基础的日志输出级别;