Java API测试--Logback

Posted 计算机ISO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java API测试--Logback相关的知识,希望对你有一定的参考价值。

1. 前言

日常开发中,测试时必不可少的,日志的生产和管理对问题处理往往有很大的帮助。虽然SpringBoot在内部日志都是用CommonsLogging,但是默认配置是支持常用的日志框架的,如Log4J、Log4J2、Logback和Java.Util.Logging。

四者关系:

Sl4j(The Simple Logging Facade for Java)是一个简单日志门面抽象框架,只提供Facade API和一个简单的日志类实现,符合Facde设计模式。门面模式的最大目的是解耦,在不同模块变动的不需要关系日志框架的具体实现。

Sl4j作为应用的Log进行接入时,可以选择四种日志框架之一实现。

LogBack时Log4j的改良版本,拥有更多特性和性能提升。Log4j2虽然说是Log4j的下一版本,但是完全重写了,我们可以认为是另外一个日志实现框架。

LogBack官方推荐其结合Sl4j使用,log4j 2.0版本也正在Apache基金会孵化中了。

2. Logback

默认情况SpringBoot使用Logback的INFO级别来记录日志输出到控制台。

Java API测试--Logback

控制台输出元素依次具体如下:

  • 时间日期:精确到毫秒

  • 日志级别:ERROR WARN INFO DEBUG TRACE

  • 进程ID

  • 分隔符: —标识实际日志开始

  • 线程名:就是方括号中的

  • Logger名:通常是监听的类名

  • 具体日志内容

2.1 配置

在maven中添加spring-boot-starter-logging

<dependency>
<groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

不过当配置了spring-boot-starter时,其依赖就有spring-boot-starter-logging的了,所以可以不用添加也可以。

2.2 配置文件

SpringBoot官方推荐使用以-spring结尾的文件名作为日志配置,例如logback-spring.xml,这样的话可以使用springboot多环境日志输出特性。建议动手试试,并修改部分玩玩,非常有趣的。

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <!-- 日志根目录-->
  <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="./logs/spring-boot-logback"/>

  <!-- 日志级别 -->
  <springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="DEBUG"/>

  <!-- 标识这个"STDOUT" 将会添加到这个logger -->
  <springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/>

  <!-- 日志文件名称-->
  <property name="LOG_PREFIX" value="spring-boot-logback" />

  <!-- 日志文件编码-->
  <property name="LOG_CHARSET" value="UTF-8" />

  <!-- 日志文件路径+日期-->
  <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}" />

  <!--对日志进行格式化-->
  <property name="LOG_MSG" value="- | [%X{requestUUID}] | [%d{yyyyMMdd HH:mm:ss.SSS}] | [%level] | [${HOSTNAME}] | [%thread] | [%logger{36}] | --> %msg|%n "/>

  <!--文件大小,默认10MB-->
  <property name="MAX_FILE_SIZE" value="50MB" />

  <!-- 配置日志的滚动时间 ,表示只保留最近 30 天的日志-->
  <property name="MAX_HISTORY" value="30"/>

  <!--输出到控制台-->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
      <!-- 输出的日志内容格式化-->
      <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>${LOG_MSG}</pattern>
      </layout>
  </appender>

  <!--输出到文件-->
  <appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender">
  </appender>

  <!-- 定义 ALL 日志的输出方式:-->
  <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <!--日志文件路径,日志文件名称-->
      <File>${LOG_HOME}/all_${LOG_PREFIX}.log</File>

      <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

          <!--日志文件路径,新的 ALL 日志文件名称,“ i ” 是个变量 -->
          <FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}%i.log</FileNamePattern>

          <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
          <MaxHistory>${MAX_HISTORY}</MaxHistory>

          <!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
          <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
              <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
          </timeBasedFileNamingAndTriggeringPolicy>

      </rollingPolicy>

      <!-- 输出的日志内容格式化-->
      <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>${LOG_MSG}</pattern>
      </layout>
  </appender>

  <!-- 定义 ERROR 日志的输出方式:-->
  <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <!-- 下面为配置只输出error级别的日志 -->
      <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>ERROR</level>
          <OnMismatch>DENY</OnMismatch>
          <OnMatch>ACCEPT</OnMatch>
      </filter>
      <!--日志文件路径,日志文件名称-->
      <File>${LOG_HOME}/err_${LOG_PREFIX}.log</File>

      <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

          <!--日志文件路径,新的 ERR 日志文件名称,“ i ” 是个变量 -->
          <FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}%i.log</FileNamePattern>

          <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
          <MaxHistory>${MAX_HISTORY}</MaxHistory>

          <!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
          <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
              <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
          </timeBasedFileNamingAndTriggeringPolicy>
      </rollingPolicy>

      <!-- 输出的日志内容格式化-->
      <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>${LOG_MSG}</Pattern>
      </layout>
  </appender>

  <!-- additivity 设为false,则logger内容不附加至root ,配置以配置包下的所有类的日志的打印,级别是 ERROR-->

  <logger name="org.springframework"     level="ERROR" />
  <logger name="org.apache.commons"     level="ERROR" />
  <logger name="org.apache.zookeeper"   level="ERROR" />
  <logger name="com.alibaba.dubbo.monitor" level="ERROR"/>
  <logger name="com.alibaba.dubbo.remoting" level="ERROR" />

  <!-- ${LOG_ROOT_LEVEL} 日志级别 -->
  <root level="${LOG_ROOT_LEVEL}">

      <!-- 标识这个"${STDOUT}"将会添加到这个logger -->
      <appender-ref ref="${STDOUT}"/>

      <!-- FILE_ALL 日志输出添加到 logger -->
      <appender-ref ref="FILE_ALL"/>

      <!-- FILE_ERROR 日志输出添加到 logger -->
      <appender-ref ref="FILE_ERROR"/>
  </root>
  <!--&lt;!&ndash; 生产环境生效 &ndash;&gt;-->
  <!--<springProfile name="prod">-->
  <!--<root level="error">-->
  <!--<appender-ref ref="STDOUT" />-->
  <!--<appender-ref ref="FILE" />-->
  <!--</root>-->
  <!--</springProfile>-->
  <!--&lt;!&ndash; 测试和开发环境日志级别为INFO/并且记录日志文件 &ndash;&gt;-->
  <!--<springProfile name="dev,test">-->
  <!--&lt;!&ndash; 日志输出级别 &ndash;&gt;-->
  <!--<root level="INFO">-->
  <!--<appender-ref ref="STDOUT" />-->
  <!--<appender-ref ref="FILE" />-->
  <!--</root>-->
  <!--</springProfile>-->
</configuration>

application.yml

server:
port: 8000

logging:
path: ./logs/logback
level:
  root: info

要使用其他环境,去掉logback-spring.xml中下面的注释即可,并在运行时指定profile

java -jar x.jar -spring.profiles.active=dev

2.3 单元测试

  1. 使用Slf4j

package com.usdj.test.logback;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
* @program: Java-API-Test
* @description:
* @author: JerryDeng
* @create: 2019-03-15 20:37
**/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

  private static final Logger log = LoggerFactory.getLogger(ApplicationTests.class);
  //private final Logger log = LoggerFactory.getLogger(this.getClass());
  @Test
  public void contextLoads() {
    log.info("Output info log");
    log.debug("Output debug log");
    log.error("Output error log");
  }
}
  1. 使用lombok插件,如果你IDE装了的话

package com.usdj.test.logback;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
* @program: Java-API-Test
* @description:
* @author: JerryDeng
* @create: 2019-03-15 20:37
**/
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class ApplicationTests {

@Test
public void contextLoads() {
log.info("Output info log");
log.debug("Output debug log");
log.error("Output error log");
}
}

Java API测试--Logback

Logback功能挺强大,而已方便使用,本节项目代码如下:

https://github.com/usdj/Java-API-Test

不过需要注意的是,《阿里巴巴Java开发手册》有条强制规范要求

就是在阿里应用中日志必须通过日志门面实现。该手册也放在上面链接中。

长按识别以下二维码关注我,定期发送资深工程师学习笔记,知识干货,一般网上搜不到哦!码字不容易,转请注出处和二维码。



以上是关于Java API测试--Logback的主要内容,如果未能解决你的问题,请参考以下文章

走进Java接口测试之日志框架Logback

玩 2.3.8 sbt 不包括 logback

Java日志框架logback剖析

# Java 常用代码片段

# Java 常用代码片段

Java日志框架:logback详解