一、依赖
首先是maven项目,引入框架
针对ssm项目:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.11</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.11</version>
</dependency>
针对springboot项目:不需要额外的导入框架
<!--该依赖已经集成了logback-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
二、运行方式:
ssm项目:
classpath下会默认寻找logback-test.xml、logback.xml 文件
springboot项目:
classpath会寻找ogback-test.groovy、logback-test.xml、logback.groovy 或者 logback.xml,如果都找不到的话,才会加载项目路径下的 logback-spring.xml
三、配置结构图
四、配置组件详解
1、logger 日志记录器
logger日志级别继承 ,如果日志记录请求的级别高于或等于记录器的有效级别,则该日志请求是有效的。日志级别按以下顺序排序: TRACE < DEBUG < INFO < WARN < ERROR。
logger属性:
-
name:指定全限定包名
-
level:日志输出级别,如果没有配置,则参考上面的级别继承
-
additivity:默认为true。一个logger可以配置多个appender,logger输出的日志会输出到当前记录器绑定的appender和父级们logger(直到root logger)绑定的appender,可以设置additivity 属性为false,则logger输出的日志仅会输出到当前记录器绑定的appender如果additivity为true,会存在重复输出日志情况
如果additivity为true,会存在重复输出日志情况。
<logger name="org.springframework.web.servlet.DispatcherServlet" level="DEBUG" additivity="false">
<appender-ref ref="stdout" />
<appender-ref ref="normal" />
</logger>
<logger name="org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor" level="DEBUG" additivity="false">
<appender-ref ref="stdout" />
<appender-ref ref="normal" />
</logger>
<!-- mybatis日志打印的是mapper namespace -->
<logger name="com.mvc.testdemo2" level="info" additivity="false">
<appender-ref ref="stdout" />
<appender-ref ref="normal" />
</logger>
2、appender 配置日志文件输出目的,
常用的类有ConsoleAppender、FileAppender 、RollingFileAppender
1 子元素
1.1 file 文件地址
1.2 rollingPolicy 滚动行为
1.2.1 rollingPolicy 常用的类有TimeBasedRollingPolicy、SizeAndTimeBasedRollingPolicy
TimeBasedRollingPolicy :TimeBasedRollingPolicy是最受欢迎的滚动策略。它基于时间进行滚动,可以是按月或按天等。TimeBasedRollingPolicy承担滚动以及触发所述滚动的责任。它实现了rolling policy同时也实现了triggering policy。
子元素:{
fileNamePattern: 必选;它的值应包括文件名以及适当放置的%d转换说明符。所述 %d由指定的转换说明可包含日期和时间模式 java.text.SimpleDateFormat类。如果省略了日期和时间模式,则采用默认模式 yyyy-MM-dd;可以指定多个%d,但是只有一个主要的,其他的都要使用‘aux’标记,多个%d允许你组织对日志文件归类,例如按照年月分文件夹/var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.logmaxHistory: 设置存档文件保存时间,日志文件至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。totalSizeCap: 控制归档文件的大小
}
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/demo/local/log/local.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
SizeAndTimeBasedRollingPolicy : 支持按照时间拆分后,再按文件大小拆分:例如:
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.txt</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
1.3 encoder 日志输出格式
encoder负责转换事件为字节数组并将字节数组写入输出流中。PatternLayoutEncoder 是最常用的encoder,该类通过使用PatternLayout来格式化日志事件。我们可以直接配置PatternLayoutEncoder ,而不用配置PatternLayout,它默认使用PatternLayout进行格式输出
PatternLayout:
它将日志事件转换成字符串,但是可以自定义字符串通过调整PatternLayout的转换模式。
PatternLayout的转换模式跟C语言的printf()函数紧密相关。
常用的模式有:
% d{pattern}: 日期
% level 日志级别
%thread 线程名称
%class 全限定类名,日志请求记录所在的类
%method 日志请求记录所在的方法
%line 日志请求记录的行号
%n 换行
%logger{length} 输出日志logger记录器的名字,length指定输出名字长度,logback会智能缩写而不丢失语义。
%msg 输出日志记录器记录的消息
多个模式之间分隔符,在大多数情况下,文字需包含空格或其他分隔字符(’[’,’]’,’-’),这样就不会与转换词混淆
例如:
<encoder>
<pattern>%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n</pattern>
</encoder>
1.4 filter 对appender收到的日志进行过滤,只有满足Filter条件的日志才输出到日志文件
对appender收到的日志调用decide方法进行过滤,只有满足Filter条件的日志才输出到日志文件,decide方法有三个返回值,DENY、ACCEPT、NEUTRAL
如果返回的值为DENY,则立即删除日志事件,而不咨询其余的筛选器;
如果返回的值是NEUTRAL中性的,则查询列表中的下一个筛选器,如果没有其他筛选器可供查询,则日志事件将正常处理;
如果返回值为ACCEPT,则会立即处理日志事件,跳过其余筛选器的调用。
LevelFilter
该过滤器对日志的级别过滤,如果事件日志级别等于配置的级别,过滤器接受或者拒绝该事件日志,依赖于onMatch 和 onMismatch属性
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
1.5 triggeringPolicy 指定何时发送滚动
该triggering policy通过配置一个maxFileSize参数,当日志文件超过该阈值,会通知RollingFileAppender 触发日志翻滚。但一般triggering policy可以不用配置,TimeBasedRollingPolicy 已经完美集成了.
2 appender 实现类
2.1 RollingFileAppender 扩展了FileAppender,
具有滚动更新日志文件的功能;例如,RollingFileAppender可以登录到一个名为log.txt的文件,一旦满足某个条件,就可以保存当前日志文件,并滚动输出到新的日志文件
子元素:{
append:如果为true,则追加到已存在的日志文件,否则截断现有文件,默认为true file: 指定日志写入文件的名字。如果文件不存在,则创建包括父级目录。windows系统要避开“\”,正确例子可以指定为c:/temp/test.log或c:\\temp\\test.log encoder:输出的格式 rollingPolicy: 指定RollingFileAppender发生滚动时的行为 triggeringPolicy:指定RollingFileAppender何时发生滚动过程
}
2.2 FileAppender
子元素:{
append:如果为true,则追加到已存在的日志文件,否则截断现有文件,默认为true file: 指定日志写入文件的名字。如果文件不存在,则创建包括父级目录。windows系统要避开“\”,正确例子可以指定为D:/demo/local.log或D:\\demo\\local.log encoder: 输出的格式
}
2.3 ConsoleAppender 写日志到标准输出流,可以配置target属性为system.out,也可以指定System.error,默认System.out
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!--默认System.out,也可以指定System.error -->
<target>System.out</target>
<!-- encoders 默认类型ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
appender例如:
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默认使用PatternLayoutEncoder -->
<encoder>
<pattern>%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n</pattern>
</encoder>
</appender>
<appender name="normal" class="ch.qos.logback.core.rolling.RollingFileAppender">
//文件地址
<file>/home/demo/local/log/local.log.zip</file>
// 滚动行为
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
//文件名称
<fileNamePattern>/home/demo/local/log/local.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
//最大历史
<maxHistory>30</maxHistory>
</rollingPolicy>
//输出格式
<encoder>
<pattern>%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n</pattern>
</encoder>
</appender>
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/home/demo/local/log/error.log</file>
<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.FixedWindowRollingPolicy">
<fileNamePattern>/home/demo/local/log/error.%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n</pattern>
</encoder>
</appender>