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级别来记录日志输出到控制台。
控制台输出元素依次具体如下:
时间日期:精确到毫秒
日志级别: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>
<!--<!– 生产环境生效 –>-->
<!--<springProfile name="prod">-->
<!--<root level="error">-->
<!--<appender-ref ref="STDOUT" />-->
<!--<appender-ref ref="FILE" />-->
<!--</root>-->
<!--</springProfile>-->
<!--<!– 测试和开发环境日志级别为INFO/并且记录日志文件 –>-->
<!--<springProfile name="dev,test">-->
<!--<!– 日志输出级别 –>-->
<!--<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 单元测试
使用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");
}
}
使用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");
}
}
Logback功能挺强大,而已方便使用,本节项目代码如下:
https://github.com/usdj/Java-API-Test
不过需要注意的是,《阿里巴巴Java开发手册》有条强制规范要求
就是在阿里应用中日志必须通过日志门面实现。该手册也放在上面链接中。
长按识别以下二维码关注我,定期发送资深工程师学习笔记,知识干货,一般网上搜不到哦!码字不容易,转请注出处和二维码。
以上是关于Java API测试--Logback的主要内容,如果未能解决你的问题,请参考以下文章