Java接口测试之日志框架Logback的具体使用

目录
  • 一、引言
  • 二、前言
  • 三、LogBack、Slf4j和Log4j之间的关系
  • 四、默认日志Logback
  • 五、配置详解
    • 1、添加日志依赖
    • 2、配置文件
  • 六、多环境日志输出
  • 七、单元测试
  • 八、工程目录
  • 九、总结

一、引言

对于一个成熟的接口测试框架,日志管理这个是必不可少的。在开发和调试阶段,日志可以帮助我们更快的定位问题;而在测试的运维过程中,日志系统又可以帮助我们记录大部分的异常信息,通

二、前言

Spring Boot 在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每种 Logger 都可以通过配置使用控制台或者文件输出日志内容。

三、LogBack、Slf4j和Log4j之间的关系

Slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实现,一般常配合Log4j,LogBack,java.util.logging使用。Slf4j作为应用层的Log接入时,程序可以根据实际应用场景动态调整底层的日志实现框架(Log4j/LogBack/JdkLog…)。

LogBack和Log4j都是开源日记工具库,LogBack 是 Log4j 的改良版本,比 Log4j 拥有更多的特性,同时也带来很大性能提升,同时天然支持SLF4J。

LogBack 官方建议配合 Slf4j 使用,这样可以灵活地替换底层日志框架。

TIPS:为了优化log4j,以及更大性能的提升,Apache基金会已经着手开发了log4j 2.0, 其中也借鉴和吸收了logback的一些先进特性。

四、默认日志Logback

默认情况下,Spring Boot 会用 Logback 来记录日志,并用 INFO 级别输出到控制台。在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了。

从上图可以看到,日志输出内容元素具体如下:

  • 时间日期:精确到毫秒
  • 日志级别:ERROR, WARN, INFO, DEBUG or TRACE
  • Logger名:通常使用源代码的类名
  • 分隔符:--- 标识实际日志的开始
  • 进程 ID
  • 线程名:方括号括起来(可能会截断控制台输出)
  • 日志内容

五、配置详解

1、添加日志依赖

假如maven依赖中添加了spring-boot-starter-logging:

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

那么,我们的Spring Boot应用将自动使用 logback 作为应用日志框架,Spring Boot 启动的时候,由 org.springframework.boot.logging.Logging-Application-Listener根据情况初始化并使用。

但是呢,实际开发中我们不需要直接添加该依赖,你会发现spring-boot-starter其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架 logback

2、配置文件

Spring Boot 官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些 spring boot特有的配置项(下面会提到)。并且放在src/main/resources下面即可。

配置文件 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" />

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

    <!--输出到控制台-->
    <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>

</configuration>

配置文件 application.yml

server:
  port: 8888  # 端口号

logging:
  path: ./logs/zuozewei
  level:
    root: info #日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出

日志会每天新建一个文件夹,日文文件配置的每50兆,一个文本文件,超过新写入一个

文件夹:20181228
文件夹内容:all_spring-boot-logback0.log 
文件夹内容:all_spring-boot-logback1.log
文件夹内容:all_spring-boot-logback2.log

文件夹内容:err_spring-boot-logback0.log

六、多环境日志输出

根据不同环境(prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出,在 logback-spring.xml中使用 springProfile 节点来定义,方法如下:

文件名称不是 logback.xml,想使用spring扩展profile支持,要以logback-spring.xml 命名

<!-- 生产环境生效 -->
    <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>

可以启动服务的时候指定 profile (如不指定使用默认),如指定prod 的方式为:

java -jar xxx.jar –spring.profiles.active=prod

七、单元测试

此处我选择使用lombok效率插件,所以只需要@Slf4j注解即可简化private Logger logger = LoggerFactory.getLogger(this.getClass())的写法
RunWith(SpringRunner.class)

@SpringBootTest
@Slf4j
public class LogbackdemoApplicationTests {

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

}

生成的日志:

- | [] | [20181228 22:53:20.756] | [INFO] | [192.168.1.18] | [main] | [c.z.l.LogbackdemoApplicationTests] | --> Starting LogbackdemoApplicationTests on 192.168.1.18 with PID 82507 (started by apple in /Users/apple/Downloads/Springboot-logback-demo)|
- | [] | [20181228 22:53:20.762] | [INFO] | [192.168.1.18] | [main] | [c.z.l.LogbackdemoApplicationTests] | --> No active profile set, falling back to default profiles: default|
- | [] | [20181228 22:53:21.590] | [INFO] | [192.168.1.18] | [main] | [c.z.l.LogbackdemoApplicationTests] | --> Started LogbackdemoApplicationTests in 1.69 seconds (JVM running for 3.525)|
- | [] | [20181228 22:53:21.955] | [INFO] | [192.168.1.18] | [main] | [c.z.l.LogbackdemoApplicationTests] | --> 输出info|
- | [] | [20181228 22:53:21.955] | [ERROR] | [192.168.1.18] | [main] | [c.z.l.LogbackdemoApplicationTests] | --> 输出error|

八、工程目录

九、总结

到此为止终于介绍完 Logback日志框架了,平时使用的时候推荐用自定义logback-spring.xml来配置,代码中使用日志也很简单,类里面添加private Logger logger = LoggerFactory.getLogger(this.getClass()); 即可,如果使用lombok效率插件需要@Slf4j注解。

本文源码:github.com/zuozewei/blog-example/tree/master/Java-api-test/03-log-framework/springboot-logback-demo

到此这篇关于Java接口测试之日志框架Logback的具体使用的文章就介绍到这了,更多相关Java Logback内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JAVAlogback日志管理详解

    目录 1.问题描述 2.解决方案 2.1 配置 简要说明 2.2 效果 (1)测试方法 (2)执行效果 总结 1.问题描述 关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友. 2.解决方案 这次其实是碰到了一个问题,一般的情况是,会单独在linux上创建个用户,线上和开发环境一样,这样脚本中假如有相对目录的话,也能保持一致,但是这次因为线上环境创建其他用户有问题,只能用root用户操作,导致logback定义的目录,

  • Java日志框架之logback使用详解

    为什么使用logback 记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结一下,logback大约有以下的一些优点: 内核重写.测试充分.初始化内存加载更小,这一切让logback性能和log4j相比有诸多倍的提升 logback非常自然地直接实现了slf4j,这个严格来说算不上优点,只是这样,再理解slf4j的前提下会很容易理解logback,也同时很容易用其他日志框架

  • 详解slf4j+logback在java工程中的配置

    本文主要介绍一下slf4j+logback在java工程中的配置,面向的读者主要是已经对slf4j+logback有一定了解的同学,但是在文章开头也做了一些知识铺垫,下面咱们进入正题. 在介绍slf4j+logback配置之前,首先对日志组件logback进行介绍. (一)日志组件logback的介绍及配置使用方法 一.logback的介绍     Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classi

  • Java logback日志的简单使用

    说明 logback作为log4j的替代,有很多优势.要将logback应用到项目中,步骤很简单.加入依赖的jar包和配置文件即可. logback.xml中主要元素: <property> 定义属性,定义之后,后文可以通过该变量引用. <appender> 定义日志输出格式.位置.文件分割等.被<logger>或<root>引用. <logger> 定义日志名称及对应的级别.name可以是包名.类名或者单纯的字符串.如果是包名或者类名,那么该包

  • Java接口测试之日志框架Logback的具体使用

    目录 一.引言 二.前言 三.LogBack.Slf4j和Log4j之间的关系 四.默认日志Logback 五.配置详解 1.添加日志依赖 2.配置文件 六.多环境日志输出 七.单元测试 八.工程目录 九.总结 一.引言 对于一个成熟的接口测试框架,日志管理这个是必不可少的.在开发和调试阶段,日志可以帮助我们更快的定位问题:而在测试的运维过程中,日志系统又可以帮助我们记录大部分的异常信息,通 二.前言 Spring Boot 在所有内部日志中使用Commons Logging,但是默认配置也提供

  • 在Java中使用日志框架log4j的方法

    日志就是记录程序的运行轨迹,方便快速定位问题 如果用System.out.println(),信息是打印在控制台.等到产品上线后没有控制台,如果有报错信息,根本不知道去哪里看,就不知道是哪里出错. 而且开发的时候希望打印输出的内容多.方便排查,上线后只希望打印容易出错的部分.System.out.println()满足不了这个需求 而日志框架可以让错误信息输出到多个指定文件,不同的文件有不同的输出内容.方便排错,定位错误 一.log4j介绍 Log4j有三个主要的组件/对象:Loggers(记录

  • 详解Java单元测试之Junit框架使用教程

    目录 单元测试 Junit单元测试框架 单元测试快速入门 单元测试 单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,进而检查方法的正确性 目前测试方法是怎么进行的,存在什么问题? 1.只有一个main方法,如果一个方法的测试失败了,其他方法测试会受到影响 2.无法得到测试的结果报告,需要程序员自己去观察测试是否成功 3.无法实现自动化测试 Junit单元测试框架 1.Junit是使用Java语言实现的单元测试框架,它是开源的

  • SpringBoot日志框架如何使用

    不管是开发过程中调试还是线上问题的定位追踪,日志都发挥着及其重要的作用.平时,我们会用System.out.println()打印一些信息到控制台,我们可以使用该语句输出日志,但是System.out会增加资源的消耗,所以最好使用日志框架打印日志信息. Java中的日志框架有JCL.Jboss-logging.slf4j.logback.log4j.log4j2等等,其中JCL.Jboss-logging.slf4j属于日志门面(日志的抽象),logback.log4j.log4j2是日志框架的

  • 浅谈Java日志框架slf4j作用及其实现原理

    SLF4J是一个日志框架抽象层,底下绑定具体的日志框架,比如说Log4J,Logback,Java Logging API等.SLF4J也有自身的默认实现,但是我们还是主要以日志框架抽象层的身份使用SLF4J. 要使用SLF4J,得包含对"org.slf4j:slf4j-api"的依赖. 简单回顾门面模式 slf4j是门面模式的典型应用,因此在讲slf4j前,我们先简单回顾一下门面模式, 门面模式,其核心为外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用.用一

  • Java日志框架用法及常见问题解决方案

    日志定义: 在计算机领域,日志文件(logfile)是一个记录了发生在运行中的操作系统或其他软件中的事件的文件,或者记录了在网络聊天软件的用户之间发送的消息. 日志记录(Logging):是指保存日志的行为.最简单的做法是将日志写入单个存放日志的文件. 日志级别优先级: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 日志框架的作用: ①:跟踪用户对系统访问,记录了系统行为的时间.地点.状态等相关信息

  • SpringBoot logback日志框架使用过程解析

    一.基本知识说明 SpringBoot默认使用logback作为日志框架 ,所以引入起步依赖后就可以直接使用logback,不需要其他依赖. SpringBoot会默认加载classpath:logback.xml或者classpath:logback-spring.xml 作为日志的配置文件,在springboot项目中可以直接把日志配置文件放在resources目录下. 简单使用时也可以不使用日志配置文件,将日志相关的配置直接放在application.yml中,如下 #日志设置 loggi

  • Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    在前面几篇文章中,我们详细介绍了Android系统进程间通信机制Binder的原理,并且深入分析了系统提供的Binder运行库和驱动程序的源代码.细心的读者会发现,这几篇文章分析的Binder接口都是基于C/C++语言来实现的,但是我们在编写应用程序都是基于Java语言的,那么,我们如何使用Java语言来使用系统的Binder机制来进行进程间通信呢?这就是本文要介绍的Android系统应用程序框架层的用Java语言来实现的Binder接口了. 熟悉Android系统的读者,应该能想到应用程序框架

  • 手把手教你从零设计一个java日志框架

    输出内容 - LoggingEvent 提到日志框架,最容易想到的核心功能,那就是输出日志了.那么对于一行日志内容来说,应该至少包含以下几个信息: 日志时间戳 线程信息 日志名称(一般是全类名) 日志级别 日志主体(需要输出的内容,比如info(str)) 为了方便的管理输出内容,现在需要创建一个输出内容的类来封装这些信息: public class LoggingEvent { public long timestamp;//日志时间戳 private int level;//日志级别 pri

随机推荐