zoukankan      html  css  js  c++  java
  • logback使用

    logback简介

          Slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实现,一般常配合Log4j,LogBack,java.util.logging使用。Slf4j作为应用层的Log接入时,程序可以根据实际应用场景动态调整底层的日志实现框架(Log4j/LogBack/JdkLog…)。
    LogBack和Log4j都是开源日记工具库,LogBack是Log4j的改良版本,比Log4j拥有更多的特性,同时也带来很大性能提升。

    LogBack被分为3个组件,logback-core, logback-classic 和 logback-access。

    • logback-core提供了LogBack的核心功能,是另外两个组件的基础。
    • logback-classic则实现了Slf4j的API,所以当想配合Slf4j使用时,需要将logback-classic加入classpath。
    • logback-access是为了集成Servlet环境而准备的,可提供HTTP-access的日志接口。

    详细教程http://blog.csdn.net/aubdiy/article/details/51523188

    集成logback

    <!-- maven中加入logback引用 -->
    <dependency>  
        <groupId>org.slf4j</groupId>  
        <artifactId>slf4j-api</artifactId>  
        <version>${slf4j.version}</version>  
    </dependency>  
    <dependency>  
        <groupId>log4j</groupId>  
        <artifactId>log4j</artifactId>  
        <version>1.2.16</version>  
    </dependency>  
    <dependency>  
        <groupId>org.slf4j</groupId>  
        <artifactId>jcl-over-slf4j</artifactId>  
        <version>${slf4j.version}</version>  
    </dependency>  
    <dependency>  
        <groupId>ch.qos.logback</groupId>  
        <artifactId>logback-classic</artifactId>  
        <version>${logback.version}</version>  
    </dependency>  
    <dependency>  
        <groupId>ch.qos.logback</groupId>  
        <artifactId>logback-core</artifactId>  
        <version>${logback.version}</version>  
    </dependency>  
    <dependency>  
        <groupId>ch.qos.logback</groupId>  
        <artifactId>logback-access</artifactId>  
        <version>${logback.version}</version>  
    </dependency>  
    <dependency>  
        <groupId>org.logback-extensions</groupId>  
        <artifactId>logback-ext-spring</artifactId>  
        <version>0.1.4</version>  
    </dependency>  
    <!-- web.xml中添加日志监听器 -->  
    <context-param>  
        <param-name>logbackConfigLocation</param-name>  
        <param-value>classpath:logback.xml</param-value>  
    </context-param>  
    <listener>  
        <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>  
    </listener>  

    基本配置

    根节点<configuration>包含的属性:
    scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
    scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
    debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

    <configuration scan="true" scanPeriod="60 seconds" debug="false">  
          <!-- 其他配置省略-->  
    </configuration>  

    设置上下文名称contextName
    每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。

    <configuration scan="true" scanPeriod="60 seconds" debug="false">  
          <contextName>myAppName</contextName>  
          <!-- 其他配置省略-->  
    </configuration>  

    设置变量property
    用来定义变量值的标签,<property> 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过<property>定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。

    <configuration scan="true" scanPeriod="60 seconds" debug="false">  
          <property name="APP_Name" value="myAppName" />   
          <contextName>${APP_Name}</contextName>  
          <!-- 其他配置省略-->  
    </configuration>   

    配置logger

    loger

    用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
    name:
    用来指定受此loger约束的某一个包或者具体的某一个类。
    level:
    用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
    如果未设置此属性,那么当前loger将会继承上级的级别。
    addtivity:
    是否向上级loger传递打印信息。默认是true。
    <loger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger。

    当logger的 additivity 若是没有显式设置为false,则默认把parent logger的appender加入到自己的appender列表里。
    当logger没有显示设置level和additivity属性,那么继承parent logger (logback)的LEVEL 和 additivity 属性

    root

    也是<loger>元素,但是它是根loger。只有一个level属性,应为已经被命名为"root".
    level:
    用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。
    默认是DEBUG。
    <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger。

    例子1

    <configuration>   
       
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">   
        <!-- encoder 默认配置为PatternLayoutEncoder -->   
        <encoder>   
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>   
        </encoder>   
      </appender>   
       
      <root level="INFO">             
        <appender-ref ref="STDOUT" />   
      </root>     
         
     </configuration>  

    <root level="INFO">将root的打印级别设置为“INFO”,指定了名字为“STDOUT”的appender。
    当执行logback.LogbackDemo类的main方法时,root将级别为“INFO”及大于“INFO”的日志信息交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;

    例子2

    <configuration>   
       
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">   
        <!-- encoder 默认配置为PatternLayoutEncoder -->   
        <encoder>   
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>   
        </encoder>   
      </appender>   
       
      <!-- logback为java中的包 -->   
      <logger name="logback"/>   
       
      <root level="DEBUG">             
        <appender-ref ref="STDOUT" />   
      </root>     
         
     </configuration>  

    <logger name="logback" />将控制logback包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级<root>的日志级别“DEBUG”;
    没有设置addtivity,默认为true,将此loger的打印信息向上级传递;
    没有设置appender,此loger本身不打印任何信息。
    <root level="DEBUG">将root的打印级别设置为“DEBUG”,指定了名字为“STDOUT”的appender。

    当打印日志时,首先执行<logger name="logback" />,将级别为“DEBUG”及大于“DEBUG”的日志信息传递给root,本身并不打印;
    root接到下级传递的信息,交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;

    例子3

    <configuration>   
       <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">   
        <!-- encoder 默认配置为PatternLayoutEncoder -->   
        <encoder>   
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>   
        </encoder>   
      </appender>   
       
      <!-- logback为java中的包 -->    
      <!--logback.LogbackDemo:类的全路径 -->   
      <logger name="logback.LogbackDemo" level="INFO" additivity="false">  
        <appender-ref ref="STDOUT"/>  
      </logger>   
        
      <root level="ERROR">             
        <appender-ref ref="STDOUT" />   
      </root>     
    </configuration>  

    <logger name="logback.LogbackDemo" level="INFO" additivity="false">控制logback.LogbackDemo类的日志打印,打印级别为“INFO”;
    additivity属性为false,表示此loger的打印信息不再向上级传递,指定了名字为“STDOUT”的appender。
    <root level="DEBUG">将root的打印级别设置为“ERROR”,指定了名字为“STDOUT”的appender。

    当打印日志时,先执行<logger name="logback.LogbackDemo" level="INFO" additivity="false">,将级别为“INFO”及大于“INFO”的日志信息交给此loger指定的名为“STDOUT”的appender处理,在控制台中打出日志,不再向次loger的上级传递打印信息;

    如果将<logger name="logback.LogbackDemo" level="INFO" additivity="false">修改为 <logger name="logback.LogbackDemo" level="INFO" additivity="true">那打印结果将是什么呢?
    没错,日志打印了两次,因为打印信息向上级传递,logger本身打印一次,root接到后又打印一次

    配置appender

    <appender>是<configuration>的子节点,是负责写日志的组件。
    <appender>有两个必要属性name和class。

    • name指定appender名称,
    • class指定appender的全限定名。常见的有

    ConsoleAppender把日志添加到控制台
    FileAppender把日志添加到文件
    RollingFileAppender滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。使用<rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。

    <!-- 把日志添加到控制台 -->
    <configuration>  
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>  
          <pattern> [%thread] %-5level %logger{35} - %msg %n</pattern>  
        </encoder>  
      </appender>  
      <root level="DEBUG">  
        <appender-ref ref="STDOUT" />  
      </root>  
    </configuration>  
    
    <!-- 把日志添加到文件 -->
    <configuration>  
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">  
        <file>testFile.log</file>
        <!-- 追加日志 --> 
        <append>true</append>  
        <encoder>  
          <pattern> [%thread] %-5level %logger{35} - %msg%n</pattern>  
        </encoder>  
      </appender>  
      <root level="DEBUG">  
        <appender-ref ref="FILE" />  
      </root>  
    </configuration>  
    
    <!-- 按日期和大小拆分日志 -->
    <configuration>  
      <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>  
           <!-- 每个文件最大100MB,保留60天的历史意义,一共最大20gb -->  
           <maxFileSize>100MB</maxFileSize>      
           <maxHistory>60</maxHistory>  
           <totalSizeCap>20GB</totalSizeCap>  
        </rollingPolicy>  
        <encoder>  
          <pattern>%msg%n</pattern>  
        </encoder>  
      </appender>  
      <root level="DEBUG">  
        <appender-ref ref="ROLLING" />  
      </root>  
    </configuration>  

    子标签:

    <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
    <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。

    <rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。  

    • TimeBasedRollingPolicy: 根据时间来制定滚动策略
    • SizeAndTimeBasedRollingPolicy: 根据时间和大小来制定滚动策略

    <encoder>:对记录事件进行格式化。

    c {length } 
    lo {length } 
    logger{length }
    输出日志的logger名,可有一个整形参数,功能是缩短logger名,设置为0表示只输入logger最右边点符号之后的字符串。 Conversion specifier Logger name Result
    %logger mainPackage.sub.sample.Bar mainPackage.sub.sample.Bar
    %logger{0} mainPackage.sub.sample.Bar Bar
    %logger{5} mainPackage.sub.sample.Bar m.s.s.Bar
    %logger{10} mainPackage.sub.sample.Bar m.s.s.Bar
    %logger{15} mainPackage.sub.sample.Bar m.s.sample.Bar
    %logger{16} mainPackage.sub.sample.Bar m.sub.sample.Bar
    %logger{26} mainPackage.sub.sample.Bar mainPackage.sub.sample.Bar
    C {length } 
    class {length}
    输出执行记录请求的调用者的全限定名。参数与上面的一样。尽量避免使用,除非执行速度不造成任何问题。
    contextName
    cn
    输出上下文名称。
    d {pattern } 
    date {pattern}
    输出日志的打印日志,模式语法与java.text.SimpleDateFormat 兼容。 Conversion Pattern Result
    %d 2006-10-20 14:06:49,812
    %date 2006-10-20 14:06:49,812
    %date{ISO8601} 2006-10-20 14:06:49,812
    %date{HH:mm:ss.SSS} 14:06:49.812
    %date{dd MMM yyyy ;HH:mm:ss.SSS} 20 oct. 2006;14:06:49.812
    F / file 输出执行记录请求的java源文件名。尽量避免使用,除非执行速度不造成任何问题。
    caller{depth}caller{depth, evaluator-1, ... evaluator-n} 输出生成日志的调用者的位置信息,整数选项表示输出信息深度。

    例如, %caller{2}   输出为:

    0    [main] DEBUG - logging statement 
    Caller+0   at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
    Caller+1   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)

    例如, %caller{3}   输出为:

    16   [main] DEBUG - logging statement 
    Caller+0   at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
    Caller+1   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)
    Caller+2   at mainPackage.ConfigTester.main(ConfigTester.java:38)
    L / line 输出执行日志请求的行号。尽量避免使用,除非执行速度不造成任何问题。
    m / msg / message

    输出应用程序提供的信息。

    M / method 输出执行日志请求的方法名。尽量避免使用,除非执行速度不造成任何问题。
    n 输出平台先关的分行符“ ”或者“ ”。
    p / le / level 输出日志级别。
    r / relative 输出从程序启动到创建日志记录的时间,单位是毫秒
    t / thread 输出产生日志的线程名。
    replace(p ){r, t}

    p 为日志内容,r 是正则表达式,将p 中符合r 的内容替换为t 。

    例如, "%replace(%msg){'s', ''}"

    配置filter

    <filter>:
    过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一。

    • 返回DENY,日志将立即被抛弃不再经过其他过滤器;
    • 返回NEUTRAL,有序列表里的下个过滤器过接着处理日志;
    • 返回ACCEPT,日志会被立即处理,不再经过剩余过滤器。

    过滤器被添加到<Appender> 中,为<Appender> 添加一个或多个过滤器后,可以用任意条件对日志进行过滤。<Appender> 有多个过滤器时,按照配置顺序执行。

    常用的过滤器:

    LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志,有以下子节点:
    <level>:设置过滤级别
    <onMatch>:用于配置符合过滤条件的操作
    <onMismatch>:用于配置不符合过滤条件的操作

    <configuration>   
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">   
      <!-- 将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。 -->
      <filter class="ch.qos.logback.classic.filter.LevelFilter">   
        <level>INFO</level>   
        <onMatch>ACCEPT</onMatch>   
        <onMismatch>DENY</onMismatch>   
      </filter>   
      <encoder>   
        <pattern>   
          %-4relative [%thread] %-5level %logger{30} - %msg%n   
        </pattern>   
      </encoder>   
    </appender>   
    <root level="DEBUG">   
      <appender-ref ref="CONSOLE" />   
    </root>   
  • 相关阅读:
    win10去除桌面快捷方式小箭头
    java创建线程的几种方式
    Spring知识点总结
    Myeclipse运行报错:an out of memory error has occurred的解决方法
    vue-cli的使用
    3种jQuery弹出大图效果
    Weixin API -- 微信js接口
    setTimeOut传参数
    PHP的八种数据类型
    99%的人都理解错了HTTP中GET与POST的区别
  • 原文地址:https://www.cnblogs.com/zhangyaxiao/p/8205674.html
Copyright © 2011-2022 走看看