美文网首页技术分享
日志框架Logback

日志框架Logback

作者: 阿拉丁节能灯 | 来源:发表于2018-07-31 14:10 被阅读12次

    如果你生病了,是不是得看医生。医生一般都会问你哪有问题,如果你不说,或者是医疗器械也查不出哪出了问题,那这病是不是就没办法治了?程序也是这样,出了问题,首先得知道是哪出了问题。这个时候就用到了日志,记录程序的运行轨迹。今天我们就看一下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的项目结构如下

    image

    编辑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的日志文件中。

    再牛逼的梦想也经不住你傻逼似的坚持,与君共勉


    自古大神享空名,唯勤与肯出真知;捉鳖揽月笑可否,共月仗剑尽天涯。蚍蜉撼树,螳臂当车,精卫填海,愚公移山,可笑?可敬?有时候可悲的不是自己的弱小,而是自认为弱小。今天的分享就到这儿,未少不姓韦,有啥尽管怼

    相关文章

      网友评论

        本文标题:日志框架Logback

        本文链接:https://www.haomeiwen.com/subject/elthvftx.html