logback日志框架的知识

来源:互联网 发布:淘宝客服介入会怎么样 编辑:程序博客网 时间:2024/06/03 12:33

现在的项目中使用到的是logback的日志框架,因此将这方面的知识梳理一下:

根据项目中的logback.xml配置文件:

首先:

  1. <!-- 从高到地低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->  
  2. <!-- 日志输出规则  根据当前ROOT 级别,日志输出时,级别高于root默认的级别时  会输出 -->  
  3. <!-- 以下  每个配置的 filter 是过滤掉某些输出文件,当出现高级别文件时,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志--> 
  4. 在configuration标签中:有属性scan  scanPeriod debug  比如
    1. <configuration scan="true" scanPeriod="60 seconds" debug="false">  


    1. <!-- 属性描述 scan:性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。   
    2.     debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->  
    3. configuration下面有三个同级的标签:appender/logger/root
    4. 一、appender基本知识


      1.appender标签是logback配置文件中重要的组件之一。在logback配置文件中使用appender标签进行定义。可包含0个或多个appender标签

      2.appender主要作用就是:①控制打印日志的地方、②打印日志的输出格式。

      3.appender语法结构

      1)属性appender标签中包含两个强制需要的属性:①name、②class

      name:为这个appender起一个唯一标识的名称。与appender-ref中的值相对应。以引用appender。

      class:一个Appender类实例的完整类名称。

      2)appender标签中可以包含0个或者1个layout】标签。0个或者多个【encoder】标签,0个或者多个【filter】标签。

      3)除了上面3个公共标签之外,还可以包含任意多个与appender的class属性所在的类中的对应的属性标准确的说是setXXX()XXX标签。他就是利用了java的反射机制。例如:

      <configuration>  <appender name="FILE" class="ch.qos.logback.core.FileAppender">    <file>myApp.log</file>    <encoder>      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>    </encoder>  </appender>  <root level="debug">    <appender-ref ref="FILE" />  </root></configuration>

      在ch.qos.logback.core.FIleAppender类中有一个setFile(String file)的方法,所以就可以appender有任意数量的<file>标签

      5)其中layout标签有一个强制的属性名称为class,他的值为layout类对象实例的完整类名称。与appender标签一样,layout标签可以包含layout class对应实例的属性标签(setXXX中的XXX标签)。

      如果你的layout标签中class属性的值想为ch.qos.logback.classic.PatternLayout类的话,你可以选择不写,因为有默认值会自动填入到class属性值中。

      6)encoder标签有一个强制的属性名称为class,他的值为encoder类对象实例的完整类名称。 

      如果你的encoder标签中class属性的值想为ch.qos.logback.classic.encoder.PatternLayoutEncoder的类的话,你可以选择不写,因为有默认值会自动填入到class属相值中。

      7)默认值图标如下:

      4.要想记录多个日志信息格式是很简单的,那就定义多个appender标签,然后将他们关联到一个logger上去。例如:

      <configuration>  <appender name="FILE" class="ch.qos.logback.core.FileAppender">    <file>myApp.log</file><!--FileAppender中的一个SetFile方法。-->    <encoder>      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>    </encoder>  </appender>  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">    <encoder>      <pattern>%msg%n</pattern>    </encoder>  </appender>  <root level="debug">    <appender-ref ref="FILE" /><!--将日志输出到文件中-->    <appender-ref ref="STDOUT" /><!--将日志输出到控制台中-->  </root></configuration>

      这个配置文件中定义两个appender标签,名称分别为FILE和STDOUT,其中FILE的appender将日志记录到名字叫myApp.log日志中。这个encoder的实例为PatternLayoutEncoder。其中格式为<pattern>标签中的格式样式。

      两个appender标签都是与root元素通过【appender-ref】相关联的。

      ★★注意:每一个appender标签都有自己的encoder,encoder不能被多个appender所共享的。对于layout也是一样的。所以在logback配置文件没有任何语法提供让encoder或者layout可以被共享


      二、appender相关概念:


      1.appender的累加(叠加):相关内容请看:logback和slf4j的使用之Logger使用:activity属性描述

      2.几个常用appender实例:


      2.1.ConsoleAppender:

      就想他的名字一样,将日志信息打印到控制台上,更加准确的说:使用System.out或者System.err方式输出。

      使用encoder标签设置输出的格式。

      主要子标签有:

      2.1.1encoder:设置打印日志信息的格式

      2.1.2target:【String】设置一System.out还是System.err方式输出。默认值为System.out


      2.2.FileAppender:

      2.2.1.用于将日志信息输出到文件中。他有一个重要的标签:file标签。用于指定输出日志所在的文件。如日志不存在就会创建,如果存在,就会以【附加】或者【截断】的方式写入

      2.2.2.主要的标签有:

      append:【boolean】默认值为【true】。如果为true的话,就会以【附加】的方式写入到文件。

      如果值为false。就会截断方式写入。

      encoder:设置日志输出的格式信息

      file:保存文件的路径。要注意【\】反斜杠的问题。如果你想要保存到【c:\temp\test.log】,你肯定不想解释为【\t】为一个整体把。正确的做法是使用【c:/temp/test.log】或者 c:\\temp\\test.log】两个中的一个。

      2.2.3独一无二的文件名称:

      在应用开发或者短时间的项目中,一次运行项目都想创建一个新的日志文件信息,使用<timestamp>标签可以很容易实现这个功能

      例如:

      <configuration>  <!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under       the key "bySecond" into the logger context. This value will be       available to all subsequent configuration elements. -->  <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>  <appender name="FILE" class="ch.qos.logback.core.FileAppender">    <!-- use the previously created timestamp to create a uniquely         named log file -->    <file>log-${bySecond}.txt</file>    <encoder>      <pattern>%logger{35} - %msg%n</pattern>    </encoder>  </appender>  <root level="DEBUG">    <appender-ref ref="FILE" />  </root></configuration>


      2.3.RollingFileAppender

      从名字我们就可以得出:FileAppender是RollingFileAppender的父类。即RollingFileAppender继承FIleAppender类。功能:能够动态的创建一个文件。也就是说:到满足一定的条件,就会创建一个新的文件,然后将日志写入到新的文件中。

      2.3.1.有两个重要的标签与rolingFileAppender进行交互:

      2.3.1.1.RollingPolicy:

      2.3.1.2.TriggeringPolicy

      注意:为了使用RollingFileAppender必须有RollingPolicy和triggerPolicy。但是如果RoolingFileAppender中的RoolingPolicy同时也实现了TriggerPolicy接口的话,那么只要这一个模型就可以了。

      2.3.2.RollingFileAppender的标签:

      2.3.2.1file:与FileAppender一样。只能是确定的名称,不能改变。

      2.3.2.2append:与FileAppender一样,用于附加还是截断

      2.3.2.3encoder:设置输出日志的格式,与FIleAppender一样

      2.3.2.4rollingPolicy:当转换文件时,他会告诉RollingFileAppender

      2.3.2.5triggerPolicy.

      2.3.3一个重要的RollingPolicy:(TimeBaseRollingPolicy)

      这个TimeBaseRollingPolicy可能是最常用的rolling policy。

      他的转换文件名是依赖时间,例如可以设置天,或者月

      TimeBaseRollingPolicy实现了RollingPolicy接口,又实现了TriggerPolicy接口。

      2.3.3.1TimeBaseRollingPolicy有一个强制的标签和几个可选的标签:

      2.3.3.1.1fileNamePattern:这是一个强制的标签。他的值可以包含:文件的名称、适当的%d转换说明符。这个%d说明符可以包含一个【日期和时间】的模式。其中【模式】类似于【SimpleDateFormat】类。如果这个【模式】没有写的话,默认就是【yyyy-MM-dd】的模式。转换文件的名称从fileNamePattern中得到

      注意:在RollingFileAppender中有一个file标签,也是设置文件的名称的。file可以设置也可以不设置。如果你设置了file标签的话,他就不会转换到新的文件中。所有的日志 信息将会输入到同一个文件中。如果file标签没有设置。文件的名称就会在每一个阶段由filenamePattern计算得出。

      其中【日期和时间】格式的形式;【%d{格式}】。注意:在fileNamePattern中无论是斜杠【/】还是反斜杠【\】在fileNamePattern的任何位置或者在【日期时间】模式里面都作为文件分隔符。

      在fileNamePattern中可以有多个%d的说明符,但是只能有一个主的%d说明付。其他的%d说明符必须使用【aux】说明是从说明符。

      2.3.3.1.2maxHistory:这是一个可选的标签。用于控制文件保持的最大时间。异步的删除删除旧的文件。时间单位。如果你设置为6的话,那就是保持文件的时间是6个月。超过6个月的文件将会被删除。

      2.3.3.1.3totalSizeCap:这是所有日志文件的总大小空间。当日志文件的空间超过了设置的最大空间数量,就会删除旧的文件。注意:这个标签必须和maxHistory标签一起使用。

      2.3.4看看下面的例子

      2.3.5一个RollingFileAppender的完整例子:

      <configuration>  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">    <file>logFile.log</file>    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">      <!-- daily rollover -->      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>      <!-- keep 30 days' worth of history capped at 3GB total size -->      <maxHistory>30</maxHistory>      <totalSizeCap>3GB</totalSizeCap>    </rollingPolicy>    <encoder>      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>    </encoder>  </appender>   <root level="DEBUG">    <appender-ref ref="FILE" />  </root></configuration>

    二 :logger节点,可选节点,用来具体指明包的日志输出级别,它将会覆盖root的输出级别

  5. 用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>。<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger

  6.     name: 用来指定受此loger约束的某一个包或者具体的某一个类。
        level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前loger将会继承上级的级别。
    addtivity: 是否向上级loger传递打印信息。默认是true。同<loger>一样,可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger。
      
  7. 子节点<root>:它也是<loger>元素,但是它是根loger,是所有<loger>的上级。只有一个level属性,因为name已经被命名为"root",且已经是最上级了。
        level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,不能设置为INHERITED或者同义词NULL。 默认是DEBUG。

<configuration debug="false">  //我的项目中只用了debug
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">//<!-- ConsoleAppender 控制台输出日志 -->         <target>System.out</target>        <encoding>${loggingCharset}</encoding>        <layout class="ch.qos.logback.classic.PatternLayout">            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>        </layout>        <filter class="com.alibaba.citrus.logconfig.logback.LevelRangeFilter">            <levelMax>${loggingLevel}</levelMax>  //这个loggingLevel在其他配置文件里定义了  info        </filter>    </appender>    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">        <target>System.err</target>        <encoding>${loggingCharset}</encoding>        <layout class="ch.qos.logback.classic.PatternLayout">            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>        </layout>        <filter class="com.alibaba.citrus.logconfig.logback.LevelRangeFilter">            <levelMin>${loggingLevel}</levelMin>        </filter>    </appender>        <!-- ===================================================================== -->    <!--  appender definitions                                                 -->    <!-- ===================================================================== -->   <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender-->     <appender name="INFRARED" class="ch.qos.logback.core.rolling.RollingFileAppender">        <file>${loggingRoot}/infrared.log</file>        <encoding>${loggingCharset}</encoding>        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            <fileNamePattern>${loggingRoot}/infrared.log.%d{yyyy-MM-dd}</fileNamePattern>//日志文件名的格式            <maxHistory>30</maxHistory>  //<!-- 日志最大的历史 30天 -->          </rollingPolicy>        <layout class="ch.qos.logback.classic.PatternLayout">            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>        </layout>        <filter class="com.alibaba.citrus.logconfig.logback.LevelRangeFilter">            <levelMin>info</levelMin>        </filter>    </appender>        <appender name="FILTER" class="ch.qos.logback.core.FileAppender">           <file>${loggingRoot}/meeting-filter.log</file>       <encoding>${loggingCharset}</encoding>       <layout class="ch.qos.logback.classic.PatternLayout">            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>        </layout>    </appender>       <appender name="TDDL" class="ch.qos.logback.core.rolling.RollingFileAppender">      <file>${loggingRoot}/meeting-tddl.log</file>      <encoding>${loggingCharset}</encoding>        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">           <fileNamePattern>${loggingRoot}/meeting-tddl.log.%d{yyyy-MM-dd}</fileNamePattern>           <maxHistory>30</maxHistory>          </rollingPolicy>       <layout class="ch.qos.logback.classic.PatternLayout">            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>        </layout>   </appender>         <appender name="JmonitorAppender" class="com.alibaba.alimonitor.jmonitor.plugin.logback.JMonitorLogbackAppender">   </appender>  //这个我也不知道        <!-- ===================================================================== -->    <!--  logger user definition                                                    -->    <!-- ===================================================================== -->        <logger name="infrared" additivity="false">        <level value="INFO"/>        <appender-ref ref="INFRARED"/>    </logger>    <!-- ===================================================================== -->    <!--  logger definition                                                    -->    <!-- ===================================================================== -->    <logger name="com.alibaba.webx.filter" additivity="false">        <level value="WARN"/>        <appender-ref ref="FILTER"/>    </logger>    <logger name="com.alibaba.service.VelocityService" additivity="false">        <level value="WARN"/>        <appender-ref ref="VELOCITY"/>    </logger>        <logger name="com.taobao.tddl" additivity="false">      <level value="${loggingLevel}" />      <appender-ref ref="TDDL" />      <appender-ref ref="JmonitorAppender" />   </logger>       <logger name="java.sql" additivity="true">        <level value="DEBUG" />        <appender-ref ref="STDOUT" />    </logger>    <root>        <level value="${loggingLevel}" />         <appender-ref ref="STDERR" />        <appender-ref ref="STDOUT" />        <appender-ref ref="PROJECT" />        <appender-ref ref="PROJECT-DEBUG" />        <appender-ref ref="JmonitorAppender" />    </root></configuration>
ps:关于项目中的${loggingRoot}
public static void main(String[]gs){    System.out.println(System.getProperty("user.home"));}//打印出来的结果是:
C:\Users\wb-XXX330XXX    是系统的一些变量


原创粉丝点击