`
bryan.liu
  • 浏览: 19328 次
  • 性别: Icon_minigender_1
  • 来自: suzhou
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Unit Test中Logback 性能测试及优化

阅读更多

发现问题

Technorati Tags: unit test,logback,io,performance
系统使用Logback作为日志记录,但是在执行Unit Test的时候,运行速度降低了一个数量级,没用时 0.0n,用了之后变成 0.n,看如下三个测试用例:

1. 不写Log语句(包括初始化语句)

clip_image002[7]

2. 加上Log语句,没有配置文件(logback.xml, logback-test.xml)

clip_image004[8]

3. 加上配置文件

clip_image006[5]

最快时间和最慢时间有25的差距

分析问题

分析下来主要是Logback在读取配置文件的时候消耗IO了时间,做了和外部的交互。

虽然对于服务运行,这个级别的时间消耗影响不是很大,而且这个读取配置文件只是一次性消耗,运行以后就不再读了(其实可以配置)。

但是对于Unit Test,首先,使单元测试变为一个“不纯”的单元测试,因为和外界进行了交互(IO)。其次,每次跑单个测试都得做这么一次IO的话,总体累计起来也是非常可观的。如果使用TDD,Unit Test跑得慢,会降低开发节奏,影响开发效率

[Feathers]给单元测试下了一个极好的定义:

单元测试应该跑起来很快,如果不快,那她们就不是单元测试。每秒钟应该至少能够运行100个测试。

从上面的测试数据来看,只有第一个测试是能达到这个速度的级别。

注:如果多个Unit Test作为一个Test Suite一起跑的话,这种IO消耗也只有一次,但是我们平时开发面对的更多的是单个Unit Test的执行,所以我们要尽量降低单个Unit Test的执行时间。

但是log语句又不能不写,Unit Test又不能不做,纠结,纠结啊

解决问题

在Logback的Manual中找到:Logback可以通过编程方式或者配置文件来配置

Logback采取下面的步骤进行自我配置:

  1. 尝试在classpath下查找文件logback-test.xml
  2. 如果文件不存在,则查找文件logback.xml
  3. 如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这回导致记录输出到控制台。
注:来源于The Logback Manual

查看Logback的代码,发现是一个叫ContextInitializer的类来进行初始化的。重写这个类,改变其逻辑,让他不再读XML配置文件。在Test路径下建一个类 , ch.qos.logback.classic.util.ContextInitializer ,将原来的代码全部考过来,做如下修改

修改URL url = null; 如下所示:

  1:   public void autoConfig() throws JoranException {
  2:     StatusListenerConfigHelper.installIfAsked(loggerContext);
  3:     //Commented by jianhua, eliminate io expense for reading config file when run the unit test
  4:     //Just use the BasicConfigurator for unit test.
  5:     URL url = null;
  6:     //URL url = findURLOfDefaultConfigurationFile(true);
  7:     if (url != null) {
  8:       configureByResource(url);
  9:     } else {
 10:       BasicConfigurator.configure(loggerContext);
 11:     }
 12:   }

这样就不会去读XML配置文件而直接使用BasicConfigurator

注意 一定要是在Test路径下重写这个类,因为是在Test目录下重写的,所以不会影响正式代码的Log配置。

最后结果

clip_image009

和测试2差不多,和不写Log还是相差了6倍左右,暂时可以接受,不去深究了,洗洗睡了。

按照Logback自己的说法,创建一个logger只要13ms,读取存在的logger只要94纳秒,显然在这儿他达不到,参考:LOGBack: Evolving Java Logging

针对dao的“集成单元测试”,顺便也重写了一下BasicConfigurator,原来只配了root的Logger,默认级别应该是Debug吧,总之输出了很多不必要的Log,消耗了很多额外时间。现在在BasicConfigurator中添加两个Logger,将Log配置写在代码中,不用去做额外的IO了。

  public static void configure(LoggerContext lc) {
    StatusManager sm = lc.getStatusManager();
    if(sm != null)  {
     sm.add(new InfoStatus("Setting up default configuration.", lc));
    }
    ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<ILoggingEvent>();
    ca.setContext(lc);
    ca.setName("console");
    PatternLayoutEncoder pl = new PatternLayoutEncoder();
    pl.setContext(lc);
    pl.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
    pl.start();
    ca.setEncoder(pl);
    ca.start();
    Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
    rootLogger.addAppender(ca);
    
    Logger log1 = lc.getLogger("org.dbunit");
    log1.setLevel(Level.INFO);
    
    Logger log2 = lc.getLogger("org.hibernate");
    log2.setLevel(Level.WARN);
  }

效果也不错,单个测试的时间只有原来的一半。

分享到:
评论

相关推荐

    Slf4j+logback实现logback测试

    在`test-logback`这个测试场景中,通常我们会编写一个测试类,验证日志是否按预期工作。这可能包括: 1. **设置测试环境**: 配置测试用的`logback-test.xml`,可能需要更改日志级别或者输出文件等,以便于测试观察...

    Logback中文文档-实用

    整个文档覆盖了Logback从基础到高级的各个方面,提供了关于Logback配置、排版、Appender和过滤器使用以及性能优化的详尽信息,是学习和使用Logback的首选资料。文档还特别指出,该手册禁止用于商业用途,仅供个人...

    logback测试

    在这个“logback测试”中,我们将探讨如何配置和使用 Logback 进行基本的日志记录,包括打印到控制台和写入文件。 **一、Logback 的核心组件** 1. **Logger**: 这是实际执行日志记录的对象,你可以通过 ...

    logback中文文档pdf

    本文档将深入探讨 logback 的核心特性、配置、性能优化以及与其他日志系统的集成。首先,我们来了解日志记录的重要性:在软件开发中,日志是诊断问题、监控系统行为和收集性能数据的关键工具。Logback 提供了一套...

    在SpringBoot中使用logback优化异常堆栈的输出.doc

    本文将详细介绍如何利用logback优化SpringBoot应用中的异常堆栈输出,以提高日志的可读性和实用性。 一、背景 在编程过程中,异常的抛出是难以避免的。为了便于调试和问题追踪,我们会记录异常堆栈信息。然而,原始...

    Logback中文手册

    通过这份Logback中文手册,读者不仅可以了解logback的基本操作,还能深入学习高级特性,如自定义appender、过滤器和触发策略,以及如何优化日志系统的性能。无论是初学者还是经验丰富的开发者,都能从中受益,提升对...

    Logback类库含logback.xml配置文件

    学习 Logback 包括理解如何配置 `logback.xml` 文件以满足项目需求,如何在代码中使用 SLF4J API 来记录日志,以及如何管理和优化日志输出,比如控制日志文件大小、滚动策略等。对于 Java 开发者来说,熟练掌握 ...

    logback

    **标题:“logback”** **描述:** 在IT领域,logback是一个广泛使用的日志记录框架,...通过深入阅读并实践手册中的内容,开发者可以充分利用logback的强大功能,优化日志管理,从而更好地理解和诊断应用程序的行为。

    LogBack 中文开发手册

    Logback 中文手册,清晰版. 简单地说,Logback 是一个 Java 领域的日志框架。它被认为是 Log4J 的继承人。 Logback 主要由三个模块组成: logback-core logback-classic logback-access

    logback官方中文版文档.pdf

    要开始使用logback,首先需要确保项目中包含了logback的相关依赖。这通常通过Maven或Gradle等构建工具来管理。在SpringBoot项目中,logback通常与SLF4J(Simple Logging Facade for Java)一起使用,作为默认的日志...

    logback日志记录写入kafka

    在IT行业中,日志记录是系统监控、故障排查和性能分析的重要工具。Logback是一款广泛使用的Java日志框架,它提供了高效且灵活的日志记录功能。SLF4J(Simple Logging Facade for Java)则是一个日志抽象层,允许...

    Logback框架需要的3个jar包和logback.xml文件

    Logback 是一个在Java应用程序中广泛使用的日志记录框架,它是对早期的log4j框架的一个升级和扩展。Logback 提供了高效、灵活的日志记录解决方案,支持多种日志级别,如DEBUG、INFO、WARN、ERROR等,帮助开发者调试...

    logback下载 日志文件jar包

    Logback 是一款广泛使用的日志记录框架,由 Ceki Gülcü 创建,作为其先前作品 Log4j 的改进版。这个压缩包包含了实现 Logback 功能所...Logback 的高效性能和强大的功能使其成为 Java 开发中的首选日志解决方案之一。

    logback例子

    Logback是一个在Java应用程序中用于处理日志的开源库,它是Log4j的后继者,由Ceki Gülcü创建,提供了更高的性能和更丰富的功能。 **描述解析:** 描述中的"logback-demos.rar" 提示我们这是一个压缩文件,包含了...

    logback.的jar包

    Logback 分为三个主要组件:logback-core、logback-classic 和 logback-access,这与给定的压缩包文件中的三个 jar 包相对应。 1. **logback-core**: 这是 Logback 的核心模块,提供了基本的日志处理机制,包括事件...

    logback+self4j 进行日志记录

    **日志记录在软件开发中扮演着至关重要的角色,它帮助开发者追踪程序运行状态,定位错误,优化性能。Logback 和 SLF4J(Simple Logging Facade for Java)是Java世界中广泛使用的日志框架,它们配合使用可以提供高效...

    logback所需jar包

    此外,`logback-test.xml`是通常用于测试环境的日志配置文件,而`logback.xml`则用于生产环境。配置文件中,你可以定义日志级别(TRACE、DEBUG、INFO、WARN、ERROR、FATAL)、日志输出目的地(控制台、文件、数据库...

    spring boot logback 开发、测试、生产环境配置.xml

    spring boot环境下的 logback 三种环境即:开发环境、测试环境、生产环境的应用日志的详细配置.

    logback_中文手册(译者陈华)

    logback官方中文开发文档,logback中文手册,陈华,logback中文开发文档

    Logback中文文档

    **Logback 中文文档概述** Logback 是一个用于日志记录的开源框架,由 Ceki Gülcü(SLF4J 的创始人)开发,作为 log4j 的后继者。...通过学习和实践,你将能够有效地利用 Logback 优化你的日志管理和故障排查工作。

Global site tag (gtag.js) - Google Analytics