Spring5.x与⽇志框架的整合
logback介绍
(1)、根节点<configuration>有三个属性debug 、scan 、scanPeriod
debug : 默认为false ,设置为true时,将打印出logback内部⽇志信息,实时查看logback运⾏状态。
scan : 配置⽂件如果发⽣改变,将会重新加载,默认值为true。
scanPeriod : 检测配置⽂件是否有修改的时间间隔,如果没有给出时间单位,默认单位时毫秒,当scan为true时,这个属性⽣效,默认时间间隔为1min。
<configuration>有<appender>、<logger>、<root>三个⼦节点。
基本结构可以描述为:以<configuration>开头,后⾯有零个或多个<appender>元素,有零个或多个<logger>元素,有最多⼀个<root>元素
(2)、<appender> 是负责写⽇志的组件。
appender 有两个必要属性 name ,class 。name指定appender 的名称, class 指定appender的全限定名
class 包括:ch.ConsoleAppender / ch.FileAppender/ ch.RollingFileAppender。
ConsoleAppender:把⽇志添加到控制台
<encoder> : 对⽇志进⾏格式化。
<target> : 字符串System.out 或者 , 默认 System.out;
FileAppender:把⽇志添加到⽂件
<file>: 被写⼊的⽂件名,可以是相对⽬录 , 也可以是绝对⽬录 , 如果⽬录不存在则会⾃动创建
<append> : 如果是true , ⽇志被追加到⽂件结尾 , 如果是false,清空现存⽂件 , 默认是true
<encoder> : 对⽇志进⾏格式化
<prodent> : 如果是true,⽇志会被安全的写⼊⽂件 , 即使其他的FileAppender也会向此⽂件做写⼊操作 ,
默认是false RollingFileAppender [常⽤]:滚动记录⽂件,先将⽇志记录到指定⽂件,当符合某种条件时,将⽇志记录到其他⽂件<file> : 被写⼊的⽂件名,可以是相对⽬录,也可以解决⽬录,如果⽬录不存在则⾃动创建。
<append> : 如果是true,⽇志被追加到⽂件结尾,如果是false,清空现存⽂件,默认是true;
<encoder> : 对⽇志进⾏格式化
<rollingPolicy> : 当发⽣滚动时,决定 RollingFileAppender 的⾏为,涉及⽂件移动和重命名。
TimeBaseRollingPolicy :最常⽤的滚动策略,根据时间来制定滚动策略,即负责滚动也负责触发滚动。
<fileNamePattern> :必要节点,包含⽂件及“%d” 转换符,“%d”可以包含⼀个SimpleDateFormat 制定的时间
格式,如:%d{yyyy-MM},如果直接使⽤%d ,默认格式是yyyy-MM-dd。必须包含“%i” 例如:设置最⼩值,和最
⼤值分别为1和2,命名模式为log%i.log,会产⽣归档⽂件log1.log和log2.log,还可以指定⽂件压缩选项,例如:
log% 或者 log%i.log.zip
<maxHistory>:可选节点,控制保留的归档⽂件的最⼤数量,超出数量就删除旧⽂件,假设设置每个⽉滚动,且
<maxHistory> 是6,则只保存最近6个⽉的⽂件,删除之前的旧⽂件,注意:删除旧⽂件是哪些为了归档⽽创建的⽬录也
会被删除。
<triggeringPolicy> :告知RollingFileAppender  激活RollingFileAppender滚动
SizeBasedTriggeringPolicy :查看当前活动⽂件的⼤⼩ , 如果超过指定⼤⼩会告知 RollingFileAppender , 触发当前活动滚动
, 只有⼀个节点 , ⽤来规定⽂件⼤⼩
<maxFileSize> : 活动⽂件的⼤⼩ , 默认10MB
(3) logger节点⽤来设置某⼀个包或者具体的某⼀个类的⽇志打印级别,以及指定<appender>, logger 仅有⼀个name属性,两个可选属性level/addtivity 。
name :⽤来指定受此loger约束的某⼀个包或者具体的某⼀个类
level:⽤来设置打印级别,⼤⼩写⽆关,TRACE,DEBUG,INFO,WARE,ERROR,ALL和OFF,还有⼀个特殊值INHERITED 或者同义词NULL,代表强制执⾏上级的级别。
如果未设置此属性,那么当前logger将会继承上级的级别。
level⼤⼩:ERROR > WARN > INFO > DEBUG > TRACE,程序会打印⾼于或等于所设置级别的⽇志。
addtivity :是否向上级loger传递打印信息,默认为true;
<logger> 可以包含零个或多个<appender-ref>元素,表⽰这个appender将会添加到logger。
(4)、root节点:元素配置根 logger。该元素有⼀个 level 属性。没有 name 属性,因为已经被命名为“root”
level 属性的值⼤⼩写⽆关,其值为下⾯其中⼀个字符串:TRACE、DEBUG、INFO、WARN、ERROR、ALL 和OFF。注意不能设置为“INHERITED” 或“NULL”。元素可以包含零个或多个元素。与元素类似,声明元素后,会先关闭然后移除全部当前appender,只引⽤声明了的 appender。如果 root 元素没有引⽤任何 appender,就会失去所有 appender。
(5)、filter过滤节点
Logback 的过滤器基于三值逻辑(ternary logic),允许把它们组装或成链,从⽽组成任意的复合过滤策略。
这⾥的所谓三值逻辑是说,过滤器的返回值只能是 ACCEPT、DENY 和 NEUTRAL 的其中⼀个。
过滤器⼀般分为如下⼏类 :
级别过滤器(LevelFilter):LevelFilter 根据记录级别对记录事件进⾏过滤。如果事件的级别等于配置的级别,过滤器会根据onMatch 和 onMismatch 属性接受或拒绝事件。
临界值过滤器(ThresholdFilter):ThresholdFilter 过滤掉低于指定临界值的事件 . 当记录的级别等于或⾼于临界值时 , ThresholdFilter 的decide()⽅法会返回NEUTRAL ; 当记录级别低于临界值时 , 事件会被拒绝。
求值过滤器(EvaluatorFilter):EvaluatorFilter 封装了 EventEvaluator(ch.boolex.EventEvaluator) , 评估是否符合指定的条件。
添加logback依赖
<!-- ⽇志⽂件管理包 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>0.1.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.30</version>
</dependency>
<!-- ⽇志⽂件管理包 -->
logback-classic:包含了logback本⾝所需的slf4j-api.jar、logback-core.jar及logback-classsic.jar。
logback-ext-spring:由官⽅提供的对Spring的⽀持,它的作⽤就相当于log4j中的Log4jConfigListener。
jcl-over-slf4j:⽤来把Spring源代码中⼤量使⽤到的commons-logging替换成slf4j,只有在添加了这个依赖之后才能看到Spring框架本⾝打印的⽇志–即info⽂件中打印出的spring启动⽇志信息,否则只能看到开发者⾃⼰打印的⽇志。
扫描xml
尽量的在pom的build标签中加⼊如下内容,以扫描到l⽂件。
<build>
<!--扫描全局xml, 以便扫描到相关配置⽂件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
log4j与log4j2</resource>
</resources>
</build>
引⼊l⽇志配置⽂件
这⾥特别注意引⼊位置(maven⼯程)在src/main/resource这个根⽬录下。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 模块名 -->
<contextName>OS_PRO</contextName>
<!--定义⽇志⽂件的存储地址 logs为当前项⽬的logs⽬录还可以设置为../logs -->
<property name="LOG_HOME" value="logs"/>
<!--控制台⽇志,控制台输出 -->
<appender name="STDOUT" class="ch.ConsoleAppender">
<encoder class="ch.qos.der.PatternLayoutEncoder">
<!--格式化输出:%d表⽰⽇期,%thread表⽰线程名,%-5level:级别从左显⽰5个字符宽度,%msg:⽇志消息,%n是换⾏符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--⽂件⽇志,按照每天⽣成⽇志⽂件 -->
<appender name="FILE_ERROR" class="ch.olling.RollingFileAppender">
<rollingPolicy class="ch.olling.TimeBasedRollingPolicy">
<!--⽇志⽂件输出的⽂件名-->
<fileNamePattern>${LOG_HOME}/error-%d{yyyy-MM-dd}.log</fileNamePattern>
<!--⽇志⽂件保留天数-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.der.PatternLayoutEncoder">
<!--格式化输出:%d表⽰⽇期,%thread表⽰线程名,%-5level:级别从左显⽰5个字符宽度%msg:⽇志消息,%n是换⾏符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!--⽇志⽂件最⼤的⼤⼩-->
<!--⽇志⽂件最⼤的⼤⼩-->
<triggeringPolicy class="ch.olling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<!-- 过滤掉低于ERROR级别的-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
</appender>
<!--⽂件⽇志,按照每天⽣成⽇志⽂件 -->
<appender name="FILE_DEBUG" class="ch.olling.RollingFileAppender">
<rollingPolicy class="ch.olling.TimeBasedRollingPolicy">
<!--⽇志⽂件输出的⽂件名-->
<fileNamePattern>${LOG_HOME}/debugAndInfo-%d{yyyy-MM-dd}.log</fileNamePattern>
<!--⽇志⽂件保留天数-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.der.PatternLayoutEncoder">
<!--格式化输出:%d表⽰⽇期,%thread表⽰线程名,%-5level:级别从左显⽰5个字符宽度%msg:⽇志消息,%n是换⾏符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!--⽇志⽂件最⼤的⼤⼩-->
<triggeringPolicy class="ch.olling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<!-- 过滤掉低于DEBUG级别的-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
<!-- spring及apache-->
<logger name="org.springframework" level="INFO"/>
<logger name="org.apache.http" level="INFO"/>
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="pe.descriptor.sql.BasicBinder" level="TRACE"/>
<logger name="pe.descriptor.sql.BasicExtractor" level="DEBUG"/>
<logger name="org.hibernate.SQL" level="DEBUG"/>
<logger name="ine.QueryParameters" level="DEBUG"/>
<logger name="ine.query.HQLQueryPlan" level="DEBUG"/>
<!-- mybatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!--⽇志的输出级别由低到⾼(越来问题越严重)trace->debug->info->warn->error -->
<!-- ⽇志输出级别⽣成上禁⽌DEBUG, ⾄少INFO级别-->
<root level="INFO">
<!-- ⽣产上 STDOUT 要注释掉 -->
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE_DEBUG"/>
<appender-ref ref="FILE_ERROR"/>
</root>
</root>
</configuration>
这样使⽤:
private static Logger logger = Logger(当前类.class);
log4j介绍
关于配置⽂件的名称以及在项⽬中的存放位置
log4j 2.x版本不再⽀持像1.x中的.properties后缀的⽂件配置⽅式,2.x版本配置⽂件后缀名只能为".xml",".json"或者".jsn"。
系统选择配置⽂件的优先级(从先到后)如下:
(1)、classpath下的名为log4j2-test.json 或者log4j2-test.jsn的⽂件.
(2)、classpath下的名为l的⽂件.
(3)、classpath下名为log4j2.json 或者log4j2.jsn的⽂件.
(4)、classpath下名为l的⽂件.
我们⼀般默认使⽤l进⾏命名。如果本地要测试,可以把l放到classpath,⽽正式环境使⽤l,则在打包部署的时候不要打包l即可。
缺省默认配置⽂件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
配置⽂件节点解析
(1)、根节点Configuration有两个属性:status和monitorinterval,有两个⼦节点:Appenders和Loggers(表明可以定义多个Appender和Logger)。
status⽤来指定log4j本⾝的打印⽇志的级别。
monitorinterval⽤于指定log4j⾃动重新配置的监测间隔时间,单位是s,最⼩是5s。
(2)、Appenders节点,常见的有三种⼦节点:Console、RollingFile、File
Console节点⽤来定义输出到控制台的Appender
name:指定Appender的名字。
target:SYSTEM_OUT 或 SYSTEM_ERR,⼀般只设置默认SYSTEM_OUT。
PatternLayout:输出格式,不设置默认为:%m%n.
File节点⽤来定义输出到指定位置的⽂件的Appender
name:指定Appender的名字。
fileName:指定输出⽇志的⽬的⽂件带全路径的⽂件名。
PatternLayout:输出格式,不设置默认为:%m%n。
RollingFile节点⽤来定义超过指定⼤⼩⾃动删除旧的创建新的的Appender
name:指定Appender的名字.