loback的介绍与配置-(通俗易通)

一.logback的配置介绍

  Logback的配置分为三个内容:Loggerappenderlayout

  Logger作为日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。

  appender:主要用于指定日志输出的目的地目的地可以是控制台、文件、远程套接字服务器、 MySQLPostreSQLOracle和其他据库、 JMS和远程UNIX Syslog守护进程等。 

  Layout:负责把事件转换成字符串,格式化日志信息的输出.

 二.Logger context的介绍

  各个logger都会被关联到一个LoggerContext上,LoggerContext负责制造logger,也负责以树结构排列各logger.所有的logger都是通过org.slf4j.LoggerFactory类的静态方法getLogger取得。

private Logger logger = LoggerFactory.getLogger(Example.class);

 三.Logger级别的打印与规则设置

日志级别分为:
    TRACE(跟踪) < DEBUG < INFO < WARN < ERROR

如果
Logger没有被分配级别,那么它将继承root的默认级别:DEBUG

打印方法决定记录请求的级别。例如,如果 L 是一个 logger 实例,那么,语句 L.info("..")是一条级别为 INFO的记录语句。记录请求的级别在高于或等于其 logger 的有效级别时被称为被启用,否则,称为被禁用。 

记录请求级别为 p,其 logger的有效级别为 q,只有则当 p>=q时,该请求才会被执行。
该规则是 logback 的核心。级别排序为: TRACE < DEBUG < INFO < WARN < ERROR

 四.Logback的默认配置 

Logback启动后,会在classpath下查找文件logback-test.xml,如果文件不存在会查找logback.xml文件,如果这2个文件都不存在,logbackBasicConfigUrator自动对自己进行配置,这样会导致记录输出到控制台上。

 五.logback.xml常用配置详解

  1.根节点<configuration>的配置

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

   2.子节点<contextName>

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

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

   3.子节点<property>

     作用:用来定义变量值,它有两个属性namevalue,通过<property>定义的值会被插入到logger上下文中,可以使”${}”来使用变量。

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
   <property name="APP_Name" value="myAppName" /> 
         name: 变量的名称
        value: 的值时变量定义的值 
     <contextName>${APP_Name}</contextName> 
   <!--其他配置省略--> 
</configuration>    

   4.子节点<timestamp>

    作用:获取时间戳字符串,他有两个属性keydatePattern

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
  <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
           key: 标识此<timestamp> 的名字;
           datePattern: 设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。
  <contextName>${bySecond}</contextName> 
  <!-- 其他配置省略--> 
</configuration>    

  5.子节点<appender>

    作用:负责写日志的组件,它有两个必要属性nameclassname指定appender名称,class指定appender的全限定名,name的不同,也决定了这个appender的作用不同

  5.1class为:ConsoleAppender时,表示要将日志打印到控制台,有以下属性

    <encoder>:对日志进行格式化

     <target>:字符串System.out(默认)或者System.err(区别不多说了)

<configuration> 
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
      <encoder> 
              <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> 
      </encoder> 
   </appender> 

   <root level="DEBUG"> 
      <appender-ref ref="STDOUT" /> 
   </root> 
</configuration>

此配置表示: 把 >= DEBUG 级别的日志都输出到控制台上

   5.2 classFileAppender时:表示把日志添加到文件中。有以下属性

     <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。

     <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true

     <encoder>:对记录事件进行格式化.负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。

     <prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false(如果设置成了true其它的FileAppender也可以向该文件中写,就是速度慢) 

<configuration> 
  <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>testFile.log</file> 
    <append>true</append> 
    <encoder> 
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
    </encoder> 
  </appender> 
  <root level="DEBUG"> 
    <appender-ref ref="FILE" /> 
  </root> 
</configuration>
上述配置表示: 把>=DEBUG级别的日志都输出到testFile.log

   5.3classRollingFileAppender:表示滚动记录文件,先将日志记录到指定的文件上,当符合某个条件时,会将日志记录到其它文件上。有以下属性:

    <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。

     <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true

     <rollingPolicy>:当发生滚动时,会根据class定义的滚动策略来决定RollingFileAppender的行为,可能是文件移动和重命名。

     在这里请注意:FollingFileAppender下的rollingPolicy策略有4种,这里只介绍一种最常用的SizeAndTimeBasedRollingPolicy

    当rollingPolicy的class为SizeAndTimeBasedRollingPolicy:表示按照文件的大小和日期生成日志文件

      <fileNamePattern>:生成文件的名字

      <maxFileSize>  :生成文件的大小

      <maxHistory>   :保存日志文件的日期,以天为单位

      <totalSizeCap>  :保存日志的最大容量

  注意:在配置<fileNamePattern>时,按日期格式化的配置 .%d{yyyy-MM-dd}.%i 是不能更改的,否则会失效

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <property name="LOG_HOME" value="D:logs" />
    <!-- 滚动记录文件 -->
    <appender name="metrics" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}metrics.log</file> 
        <append>true</append>
        <!-- 每天创建1个日志 文件,当超过1MB时创建新的文件-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy" >
            <fileNamePattern>${LOG_HOME}metrics.%d{yyyy-MM-dd}.%i.log</fileNamePattern>  <!-- 注意标红这里是不能更改的,必须包含的元素 -->
            <maxFileSize>1MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap> 
        </rollingPolicy>
        <encoder> 
                  <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n|==|%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
        </encoder>      
    </appender>
    <logger name="metrics.zpb" level="info" additivity="false">
        <appender-ref ref="metrics"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="metrics"/>
    </root>
</configuration>

  6.子节点<loger>

    作用:用来设置打印哪一个包下的日志或者某一具体类的日志,以及打印的级别,以及指定<appender>

    <loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性

    name: 用来指定受此loger约束的某一包或者具体的某一个类

    Level: 用来设置打印级别,大小写无关,:trace < debug <info < warn < error < all < off

    还有一特定值,INHERITED或同义词NULL,代表强制执行上级的级别,如果未设置些属性,那么当前logger将会继承上级的级别

    addtivity: 是否向上级loger传递打印信息。默认是true,<logger>一样,可以包含零个或多个

    <appender-ref>元素,标识这个appender将会添加到这个loger

  7.子节点<root>

    作用:节点,其实它也是一个loger,只不过是loger的顶级,只有一个level属性

       level: 用来设置打印级别,大小无关,trace < debug <info < warn < error < all < off

         不能设置为INHERITED或者同义词NULL,默认是DEBUG

 六.logback所需jar包

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.7</version>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-core</artifactId>
  <version>1.1.7</version>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-access</artifactId>
  <version>1.1.7</version>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.1.7</version>
</dependency>

 七.自定义输出格式

%m         输出代码中指定的消息
        
%p         输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
        
%r         输出自应用启动到输出该log信息耗费的毫秒数
        
%c         输出所属的类目,通常就是所在类的全名
        
%t         输出产生该日志事件的线程名
        
%n         输出一个回车换行符,Windows平台为“
”,Unix平台为“
”
        
%d         输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
        
%L         输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

八.示例

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    
      <!-- 输出到控制台上 -->
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
      <encoder> 
              <pattern>%d{yyyy-MM-dd HH:mm:ss}| %-5level|%c %L|%m%n</pattern> 
        </encoder> 
   </appender> 
     <logger name="com.zpb.metrics" level="debug" additivity="false">
              <appender-ref ref="STDOUT"/>
      </logger>
      <!-- 输出到文件上 -->    
      <appender name="metrics" class="ch.qos.logback.core.FileAppender">
          <File>D:logsmetrics.log</File>
          <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss}| %-5level|%c|%m %n</pattern>
         </encoder>
      </appender>
      <!-- logger 中的配置的解释:
          name: 从指定的包路径下接收日志
          level: 设置日志接收的级别
          additivity:表示此logger信息不再向上级传递
       -->
      <logger name="com.metrics.zpb" level="info" additivity="false">
              <appender-ref ref="metrics"/>
      </logger>
      
    <root level="INFO">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="metrics"/>
    </root>
</configuration>

此配置表示:将不同级别的日志分别输出到控制台和日志文件中
原文地址:https://www.cnblogs.com/MrRightZhao/p/11010138.html