如果你生病了,是不是得看医生。医生一般都会问你哪有问题,如果你不说,或者是医疗器械也查不出哪出了问题,那这病是不是就没办法治了?程序也是这样,出了问题,首先得知道是哪出了问题。这个时候就用到了日志,记录程序的运行轨迹。今天我们就看一下logback日志框架。
logback引包
在maven环境下,在pom.xml中写入
<!-- logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.1.3</version>
</dependency>
添加logback.xml
只要名字叫logback.xml,放在src/main/resource下,就不用在web.xml中配置上下文了,当然也可以在web.xml中配置,自行上网百度。logback.xml的项目结构如下
编辑logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 定义日志文件 输入位置 -->
<property name="log_dir" value="${catalina.base}/logs" />
<!-- 日志最大的历史 30天 -->
<property name="maxHistory" value="30"/>
<property resource="prop/config.properties"></property>
<!-- ConsoleAppender 控制台输出日志 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} ${user}[%thread] %-5level %logger -%msg%n</pattern>
</encoder>
</appender>
<!-- ERROR级别日志 -->
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender-->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器,只记录WARN级别的日志 -->
<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.TimeBasedRollingPolicy">
<!--日志输出位置 可相对、和绝对路径 -->
<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/error-log.log</fileNamePattern>
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6,
则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除-->
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<!-- INFO级别日志 appender -->
<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.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/info-log.log
</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<!-- DEBUG级别日志 appender -->
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器,只记录DEBUG级别的日志 -->
<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.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/debug-log.log
</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<root level="${level}">
<!-- 控制台输出 -->
<appender-ref ref="STDOUT" />
<!-- 文件输出 -->
<appender-ref ref="ERROR" />
<appender-ref ref="INFO" />
<appender-ref ref="DEBUG" />
</root>
</configuration>
其实logback.xml中只需要三个元素,一个是property,一个是appender,一个是logger,或者是logger的父类root
1. property
定义整个logback.xml的变量,如上面代码中
<property name="log_dir" value="${catalina.base}/logs" />
<!-- 日志最大的历史 30天 -->
<property name="maxHistory" value="30"/>
<property resource="prop/config.properties"></property>
定义了日志目录log_dir,最大历史期限maxHistory和引入了一个properties文件,可以用properties文件中定义的属性。
这里需要注意的
1.1. ${catalina.base}
在用tomcat部署项目时,我们希望项目的日志文件能在tomcat的目录下,而用eclipse启动时,日志会出现在eclipse的安装目录下,所以我们就会用${catalina.base},把路径定位在tomcat的根目录下
1.2. resource="prop/config.properties"
logback.xml中引入配置文件的好处在于,日志的输出级别,输出目录等。这样等项目打完包之后,需要修改日志级别,之前改配置文件即可,而不用修改源文件。用法如下:
<root level="${level}">
其中变量${level}就是在config.properties文件中定义的变量
level=debug
2. appender
输出目的地,一般就两个输出目的地,一个是console(控制台),一个是file(文件)。
appender有两个属性:name和class
name
就是这个appeder的名字,在下面的设置日志级别中会用到。其实我们编写代码都知道,名字要编写的有意义。想我本次logback日志中往控制台输出的日志name="STDOUT",往文件输出日志name="FILE"
class
class就是你这个appender依赖logback的类,
往控制台输出日志class="ch.qos.logback.core.ConsoleAppender",
往文件中输出日志class="ch.qos.logback.core.rolling.RollingFileAppender"(这个是日志输出协议的一种,叫滚动输出)
不管name怎么变,对应的class是不会变的。
appender还有一些字标签
encoder
这个标签主要是决定日志输出的格式,和其子标签pattern一起使用
<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>
其中
%d{yyyy-MM-dd HH:mm:ss.SSS}表示的是日期
[%thread]表示当前线程
%-5level表示日志级别
%logger{50}表示输出日志的logger对象
%msg表示日志信息
下面主要讲下name为FILE的appender的结构信息
<!-- 按照每天生成日志文件 -->
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log_dir}/fbajxx.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/fbajxx-info-%d{yyyyMMdd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}
-%msg%n
</Pattern>
</layout>
</appender>
子标签file
表示日志输出的日志文件,这个是日志输出的总文件,不会按照日期滚动,所有的日志都会输出到这个日志文件中
子标签rollingPolicy
关东协议定义,其属性class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"表名这个滚动协议是按照每天的日期滚动的。所谓滚动,既是按照每天产生一个日志文件。
子子标签fileNamePattern
定义滚动日志文件的命名格式
<fileNamePattern>${log_dir}/fbajxx-info-%d{yyyyMMdd}.%i.log</fileNamePattern>
子子标签maxHistory
标识这些日志文件最多存放时间
<maxHistory>30</maxHistory>
存放30天
下面代码
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
表示每个日期格式的日志文件最大只有50MB,如果超过50MB,则会新建一个日志文件,这是%i就派上用场了。
子标签layout
用途和标签encoder的作用一样,定义日志输出格式
logger
定义日志的输出级别,属性level可控制日志级别。其有个子标签为appender-ref就是指向刚刚上面定义的appender。 一个logger只能指定一个appender
root
root是logger的父级,也可说是根logger,一个root可以指定多个appender。同一个appender,定义了logger之后,就不要定义root了,没用。当然如果设置了logger的属性additivity="true",则表明log日志不仅会打印到本logger定义的文件,还会打印到root的日志文件中。
再牛逼的梦想也经不住你傻逼似的坚持,与君共勉
自古大神享空名,唯勤与肯出真知;捉鳖揽月笑可否,共月仗剑尽天涯。蚍蜉撼树,螳臂当车,精卫填海,愚公移山,可笑?可敬?有时候可悲的不是自己的弱小,而是自认为弱小。今天的分享就到这儿,未少不姓韦,有啥尽管怼
网友评论