`

Java异步日志使用介绍

    博客分类:
  • Java
阅读更多

近期开发了一个API供第三方使用接入开放平台。第三方在做压力测试时,发现平均响应时间在1m以上,不能满足他们的TPS

在关键处理环节加上了日志输出。本人使用的日志实现是logback,经过实际测试比log4j性能要好。通过观察日志,发现代码执行比较慢,但是非常随机,有时候从一个方法进入之前和进入之后都需要花费100ms。为什么会这样呢?

经过分析,定位到是logback同步日志输出在压力比较大的时候占用了执行时间。后来在网上查询是否有logback异步日志使用的样例,通过Baidu没有搜到,后来到了logback官网找到了异步日志的实现。

经过时间测试,在压力测试(10000人登陆,TPS2000,平均响应时间100ms),持续10分钟压测,异步日志产生日志4G数据量但几乎没有对性能造成太大的影响。

 

AsyncAppender介绍使用现摘录如下:

URLhttp://logback.qos.ch/manual/appenders.html#AsyncAppender

 

AsyncAppender logs ILoggingEvents asynchronously. It acts solely as an event dispatcher and must therefore reference another appender in order to do anything useful.

Lossy by default if 80% full AsyncAppender buffers events in a BlockingQueue. A worker thread created by AsyncAppender takes events from the head of the queue, and dispatches them to the single appender attached to AsyncAppender. Note that by default, AsyncAppender will drop events of level TRACE, DEBUG and INFO if its queue is 80% full. This strategy has an amazingly favorable effect on performance at the cost of event loss.

Application stop/redeploy Upon application shutdown or redeploy, AsyncAppender must be stopped in order to stop and reclaim the worker thread and to flush the logging events from the queue. This can be achieved by stopping the LoggerContext which will close all appenders, including any AsyncAppender instances.

Here is the list of properties admitted by AsyncAppender:

Property Name

Type

Description

queueSize

int

The maximum capacity of the blocking queue. By default, queueSize is set to 256.

discardingThreshold

int

By default, when the blocking queue has 20% capacity remaining, it will drop events of level TRACE, DEBUG and INFO, keeping only events of level WARN and ERROR. To keep all events, set discardingThreshold to 0.

includeCallerData

boolean

Extracting caller data can be rather expensive. To improve performance, by default, caller data associated with an event is not extracted when the event added to the event queue. By default, only "cheap" data like the thread name and the MDC are copied. You can direct this appender to include caller data by setting the includeCallerData property to true.

By default, event queue is configured with a maximum capacity of 256 events. If the queue is filled up, then application threads are blocked from logging new events until the worker thread has had a chance to dispatch one or more events. When the queue is no longer at its maximum capacity, application threads are able to start logging events once again. Asynchronous logging therefore becomes pseudo-synchronous when the appender is operating at or near the capacity of its event buffer. This is not necessarily a bad thing. The appender is designed to allow the application to keep on running, albeit taking slightly more time to log events until the pressure on the appenders buffer eases.

Optimally tuning the size of the appenders event queue for maximum application throughput depends upon several factors. Any or all of the following factors are likely to cause pseudo-synchronous behavior to be exhibited:

  • Large numbers of application threads
  • Large numbers of logging events per application call
  • Large amounts of data per logging event
  • High latency of child appenders

To keep things moving, increasing the size of the queue will generally help, at the expense of heap available to the application.

Lossy behavior In light of the discussion above and in order to reduce blocking, by default, when less than 20% of the queue capacilty remains, AsyncAppender will drop events of level TRACE, DEBUG and INFO keeping only events of level WARN and ERROR. This strategy ensures non-blocking handling of logging events (hence excellent performance) at the cost loosing events of level TRACE, DEBUG and INFO when the queue has less than 20% capacity. Event loss can be prevented by setting the discardingThreshold property to 0 (zero).

Example: AsyncAppender configuration (logback-examples/src/main/java/chapters/appenders/conc/logback-async.xml)

View as .groovy

<configuration>
  <appendername="FILE"class="ch.qos.logback.core.FileAppender">
    <file>myapp.log</file>
    <encoder>
      <pattern>%logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
  <appendername="ASYNC"class="ch.qos.logback.classic.AsyncAppender">
    <appender-refref="FILE"/>
  </appender>
  <rootlevel="DEBUG">
    <appender-refref="ASYNC"/>
  </root>
</configuration>

 

分享到:
评论

相关推荐

    异步写日志

    另一种方法是使用异步日志库,如Log4j2的AsyncAppender,它内部使用了Disruptor框架,提供了高效的无锁数据结构和事件处理机制,进一步减少了日志写入的延迟。 在Java中,我们通常使用的日志框架有Log4j、Logback和...

    async-log:Java异步日志记录的最小实现

    异步日志是Java中异步日志记录的最小实现。 原因:提供日志记录实现在多线程环境中效果很好,对性能的影响最小。 不能:该库在设计上非常缺乏功能,以使其保持可维护性和可移植性。用法创建日志存储库所有日志都保...

    基于log4j的java异步Log的打印实现

    使用消费者-生产者模式为主要指导思想设计的多线程log打印的一个通用模块类。基于log4j,但是不需要进行特别配置,不需要单独写配置文件,自带配置文件。仅需要简单的修改即可实现smtp远程log模式。 经测验,1000条...

    java异步写日志到文件中实现代码

    java异步写日志到文件中实现代码是指在Java应用程序中,使用异步写日志到文件中,以提高日志记录的效率和可靠性。下面是关于java异步写日志到文件中实现代码的详细知识点: 一、日志记录的重要性 日志记录是软件...

    java Log日志规范

    logback还支持异步日志记录,通过使用`AsyncAppender`,可以显著提高日志性能。 最后,logback2.xml和logback3.xml可能指的是logback的更新版本或特定项目的自定义版本,它们的配置方式与logback.xml相似,只是具体...

    Log4j2异步写日志效率测试源码

    而Log4j2的一个显著特性是支持异步日志写入,这种模式可以显著提高系统的整体性能,特别是在高并发环境下。 本文主要探讨Log4j2异步写日志的效率,通过源码分析和测试来展示其优势。首先,我们要理解Log4j2中的异步...

    java代码实例-日志规范史上最全java日志攻略(附教程)

    日志介绍 日志的作用和目的 日志规范 "使用的规范 ...异步日志的使用" spring整合log "依赖的选择 日志的配置文件" SpringBoot日志 "SpringBoot日志 中间转换包统一日志框架 SpringBoot修改日志的默认配置

    springboot日志框架logback异步输出配置

    每次日志输出到文件都会进行一次磁盘IO,在多应用的时候这种效果会导致一定的线程运行延迟,所以可以采用异步的方式处理。 采用异步写日志的方式,通过不让主线程去写日志文件而减少磁盘IO,避免并发下造成线程阻塞...

    Log4j2异步写日志源码

    `TestController.java`中的日志调用则实际触发了异步日志记录过程。这种机制在高并发环境下尤其有用,因为它能确保日志记录不会影响应用程序的响应速度。通过以上分析,我们可以看到Log4j2在实现高效日志管理方面的...

    用JAVA写的一个异步多线程批处理的组件

    在IT行业中,尤其是在Java开发领域,异步多线程批处理是一种常见的技术手段,用于高效地处理大量数据。本文将详细解析标题为“用JAVA写的一个异步多线程批处理的组件”的核心知识点,以及如何利用这个组件来优化大...

    modbus-master_JAVA与PLC异步通信_

    4. **异步通信**: 在Java中,可以使用java.nio包提供的非阻塞I/O(NIO)类来实现异步通信。通过注册监听器,可以在数据可用时执行回调函数,而不是一直等待数据。 5. **多线程**: 在处理异步通信时,通常会用到多...

    Java异步编程最佳实践_.docx

    例如,在日志记录场景中,使用异步日志框架可以让程序在记录日志的同时执行其他操作,避免了等待时间,提高了响应速度。 在Java中,实现异步编程主要依赖`java.util.concurrent`包中的`Future`和`FutureTask`类。`...

    java的日志合并

    本文通过一个具体的Java程序示例来介绍如何实现日志文件的合并。 #### 二、Java中的文件操作 本示例中涉及到了Java标准库中的几个关键类,包括`File`、`BufferedReader`、`BufferedWriter`等,用于处理文件读写操作...

    java日志数据的采集显示

    3. **Logback**:由Log4j的创始人Ceki Gülcü设计,作为Log4j的替代品,Logback提供了更高的性能和新的特性,比如异步日志记录。它同时支持SLF4J接口,使得与SLF4J兼容的库可以无缝集成。 4. **Java内置日志API**...

    Java组件设计-日志组件

    4. **异步日志**:为了提高性能,日志组件通常支持异步写入,避免因日志处理阻塞主线程。 5. **日志切割**:自动按日期、大小或其他条件分割日志文件,防止单个日志文件过大难以管理。 6. **MDC(Mapped Diagnostic ...

    java日志框架

    此外,Logback还支持异步日志记录,进一步提高了性能。 7. **最佳实践** - 为了遵循“日志应该易读且不影响性能”的原则,我们应该根据需要选择合适的日志级别,避免过度记录导致性能下降。 - 使用PatternLayout...

    JAVA nio异步长连接服务端与客户端

    在标题中提到的"JAVA nio异步长连接服务端与客户端",我们可以理解为使用Java NIO实现的TCP长连接通信。TCP长连接是指在客户端和服务端之间保持一个持久的连接,可以多次收发数据,而不必每次通信都建立新的连接。这...

    log4j 详解异步日志的配置和测试

    配置异步日志通常涉及使用 `AsyncAppender` 类,并指定一个后台处理类,如 `AsyncLogger`。 在代码中,使用 Log4j 很简单,只需通过 `Logger` 对象调用 `info` 或 `error` 等方法即可。例如: ```java import org....

    使用Log4j进行日志操作.zip_java 操作日志_java 日志_log4j_系统日志

    Log4j还提供了更高级的功能,如异步日志记录、过滤器、自定义日志等级和MDC(Mapped Diagnostic Context),用于关联特定上下文信息。通过这些特性,Log4j可以满足复杂日志需求,帮助开发者构建健壮的系统。 总的来...

    java的日志工具

    5. **Log4j 2**:作为Log4j的升级版,Log4j 2解决了Log4j的一些性能和设计问题,提供了更多的特性,比如动态日志配置、异步日志记录、更细粒度的日志级别控制以及XML和JSON格式的支持。 在实际开发中,通常会结合...

Global site tag (gtag.js) - Google Analytics