欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

logback配置和使用

程序员文章站 2022-06-21 19:58:51
简介 logback是由log4j创始人设计的又一个开源日志组件。当前分成三个模块: logback core是其它两个模块的基础模块。 logback classic是log4j的一个 改良版本。此外logback classic完整实现SLF4J API,使你可以很方便地更换成其它日志系统,如l ......

简介

logback是由log4j创始人设计的又一个开源日志组件。当前分成三个模块:

  • logback-core是其它两个模块的基础模块。

  • logback-classic是log4j的一个 改良版本。此外logback-classic完整实现slf4j api,使你可以很方便地更换成其它日志系统,如log4j或jdk14 logging。

  • logback-access访问模块与servlet容器集成提供通过http来访问日志的功能。

配置

配置pom.xml

logback需要logback-corelogback-classicslf4j-apilogback-access这4个依赖。其中logback-classic已经包含了logback-core和slf4j-api依赖,由于maven依赖的传递性,所以我们只需导入logback-classic和logback-access依赖即可。

    <dependencies>
        <dependency>
          <groupid>ch.qos.logback</groupid>
          <artifactid>logback-classic</artifactid>
          <version>1.3.0-alpha4</version>
        </dependency>
        <dependency>
          <groupid>ch.qos.logback</groupid>
          <artifactid>logback-access</artifactid>
          <version>1.3.0-alpha4</version>
        </dependency>
    </dependencies>

初始化步骤

1. 在类路径中查找logback-test.xml文件。

2. 如果没有找到,则在类路径中查找logback.groovy文件。

3. 如果没有找到,则在类路径中查找logback.xml文件。

4. 如果没有找到,则尝试使用serviceloader加载classpath下meta-inf\services\ch.qos.logback.classic.spi.configurator文件中配置的com.qos.logback.classic.spi.configurator实现类(configurator文件内容为实现类的完全限定类名)。

5. 如果还是没有找到,则会加载默认配置,日志默认会输出到控制台,也就是使用basicconfigurator,basicconfigurator也是com.qos.logback.classic.spi.configurator接口的实现类。

public class basicconfigurator extends contextawarebase implements configurator {

    public basicconfigurator() {
    }

    public void configure(loggercontext lc) {
        addinfo("setting up default configuration.");
        
        consoleappender<iloggingevent> ca = new consoleappender<iloggingevent>();
        ca.setcontext(lc);
        ca.setname("console");
        layoutwrappingencoder<iloggingevent> encoder = new layoutwrappingencoder<iloggingevent>();
        encoder.setcontext(lc);
        
 
        // same as 
        // patternlayout layout = new patternlayout();
        // layout.setpattern("%d{hh:mm:ss.sss} [%thread] %-5level %logger{36} - %msg%n");
        ttlllayout layout = new ttlllayout();
 
        layout.setcontext(lc);
        layout.start();
        encoder.setlayout(layout);
        
        ca.setencoder(encoder);
        ca.start();
        
        logger rootlogger = lc.getlogger(logger.root_logger_name);
        rootlogger.addappender(ca);
    }
}

使用logback.xml

<configuration scan="true" scanperiod="30 seconds">
  <!-- 自定义属性,通过${}访问 -->
  <property name="filepath" value="/logs/" />
    
  <!-- 输出到控制台 -->
  <appender name="stdout" class="ch.qos.logback.core.consoleappender">
    <encoder>
      <pattern>%d{hh:mm:ss.sss} [%thread] %-5level %logger{36} %msg%n</pattern>
    </encoder>
  </appender>
  
  <!-- 输出到文件 -->
  <appender name="file" class="ch.qos.logback.core.rolling.rollingfileappender">
    <!-- 文件路径 -->
    <file>${filepath}app.log</file>
    <!-- 日志输出格式化 -->
    <encoder>
        <pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
    </encoder>
    
    <!-- 滚动策略 -->
    <rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">
      <!-- 每日滚动 -->
      <filenamepattern>${filepath}app.log%d{yyyy-mm-dd}.log</filenamepattern>
     
      <!-- 将30天的日志总大小限制在3gb内  -->
      <maxhistory>30</maxhistory>
      <totalsizecap>3gb</totalsizecap>
    </rollingpolicy>
  </appender> 
  
  <!-- 基于尺寸和时间的滚动策略 -->
  <appender name="rolling" class="ch.qos.logback.core.rolling.rollingfileappender">
    <file>${filepath}other.log</file>
    <rollingpolicy class="ch.qos.logback.core.rolling.sizeandtimebasedrollingpolicy">
      <filenamepattern>${filepath}other.log%d{yyyy-mm-dd}%i.log</filenamepattern>
       <!-- 每个日志文件最多100mb,保存60天的历史记录,总大小不超过20gb -->
       <maxfilesize>1kb</maxfilesize>    
       <maxhistory>60</maxhistory>
       <totalsizecap>20gb</totalsizecap>
    </rollingpolicy>
    <encoder>
        <pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
    </encoder>
  </appender>
  
  <!-- name属性指定包名或者完全限定类名 -->
  <logger name="service.otherservice" level="debug">
        <appender-ref ref="rolling" />
  </logger>

  <!-- 根logger -->
  <root level="debug">
    <!-- 配置输出源 -->
    <appender-ref ref="stdout" />
    <appender-ref ref="file" />
  </root>
</configuration>

测试:

public class helloservice {
    private final static logger logger = loggerfactory.getlogger(helloservice.class);
    
    public static void main(string[] args) {
        //根据logback.xml中配置的日志级别,trace级别的日志将不会输出,只会输出debug及以上级别的日志。
        //trace < debug < info <  warn < error
        logger.trace("---------------trace---------------");
        logger.debug("---------------debug---------------");
        logger.info("---------------info---------------");
        logger.warn("---------------warn---------------");
        logger.error("---------------error---------------");
    }
}

常用技巧

1. 使用占位符

        logger.debug("我是" + name + ",我今年" + age + "岁,很高兴认识你!");//普通方式
        logger.debug("我是{},我今年{}岁,很高兴认识你!", name, age);//占位符方式(推荐)

当debug日志被禁用时,普通方式中,参数依然会被构造拼接,而在占位符方式中,参数不会进行构造拼接。

2. 使用时应该使用slf4j的api而不是使用logback的api(依赖日志门面,而不是依赖具体的日志实现,便于更换其他日志框架)

3. 自动重新加载配置文件

元素的scan属性设置为true,logback会定时的扫描配置文件,如果配置文件发生了更改,将自动重新加载配置文件。默认每分钟扫描一次,可以设置scanperiod属性来指定扫描间隔。

<configuration scan="true" scanperiod="30 seconds" > 
  ...
</configuration>