一次鞭辟入里的 Log4j2 日志输出阻塞问题的定位 问题现象 线上某个应用的某个实例突然出现某些次请求服务响应极慢的情况,有几次请求超过 60s 才返回,并且通过日志发现,服务线程并没有做什么很重的操作.这种情况断断续续持续了半小时左右. 核心问题定位 由于半小时后,服务实例恢复正常,并且出现请求极慢的次数并不太多,没有能及时打印出现问题的时候线程堆栈采集相关信息.但是,我们有自己的法宝,JFR(关于 JFR,请参考我的另一系列JFR全解). JFR 非常适合用来事后复盘定位问题,并且配置得当…
如何监控 Log4j2 异步日志遇到写入瓶颈 在之前的一篇文章中(一次鞭辟入里的 Log4j2 异步日志输出阻塞问题的定位),我们详细分析了一个经典的 Log4j2 异步日志阻塞问题的定位,主要原因还是日志文件写入慢了.并且比较深入的分析了 Log4j2 异步日志的原理,最后给出了一些解决方案. 新的问题 - 如何更好的应对这种情况? 之前提出的解决方案仅仅是针对之前定位的问题的优化,但是随着业务发展,日志量肯定会更多,大量的日志可能导致写入日志成为新的性能瓶颈.对于这种情况,我们需要监控. 首…
前文已经讲了log4j2的AsyncAppender的实现[log4j2异步日志解读(一)AsyncAppender],今天我们看看AsyncLogger的实现. 看了这个图,应该很清楚AsyncLogger调用Disruptor,然后直接返回.至于高性能队列 这里已经展开讲了是如何实现的. AsyncLogger的调用流程 我们来看看AsyncLogger的调用流程,log.info()首先会调用抽象类AbstractLogger,然后调用了Logger的logMessage. //Logge…
目标:根据启动jar时传进main()的参数动态修改日志位置 一.修改启动项 MainMapLookup.setMainArguments(args);注:不要在lookup设置之前初始化log(如:private static final Logger log = LoggerFactory.getLogger(HttpServer.class);) public static void main(String[] args) throws InterruptedException, Serv…
配置及demo 方法一全部打开 加启动参数 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 启动参数的这个key有点说法: 按官方文档说明http://logging.apache.org/log4j/2.x/manual/async.html#AllAsync key是-Dlog4j2.contextSelector=... 但是你如果亲自做实验,或亲自使用过,可能就会发…
log4j.logback.log4j2 历史和关系,我们就在这里不展开讲了.直接上干货,log4j2突出于其他日志的优势,异步日志实现. 看一个东西,首先看官网文档 ,因为前面文章已经讲解了disruptor源码,本文主要展开说说异步日志AsyncAppender和AsyncLogger(基于disruptor实现). AsyncLogger笔者下文展开讲. 一.AsyncAppender 我们先来看看AsyncApperder核心,就是logger将数据通过append方法放入到阻塞队列中,…
一.说明 如果是使用slf4j规范的,请先引用: <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <versi…
一.添加 Log4j2 的依赖 <!-- 引入 log4j2 必须排除 logging --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> 当我们引入 log4j2 的时候,需要排除掉 spring-boot-starter…
1.背景 Log4j 2中记录日志的方式有同步日志和异步日志两种方式,其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式. 2.Log4j2中的同步日志 所谓同步日志,即当输出日志时,必须等待日志输出语句执行完毕后,才能执行后面的业务逻辑语句. 下面通过一个例子来了解Log4j2中的同步日志,并借此来探究整个日志输出过程. log4j2.xml配置如下: <?xml version="1.0" encoding="UTF-8"…
最近,业务增长的很迅猛,对于我们后台这块也是一个不小的挑战,这次遇到的核心业务接口的性能瓶颈,并不是单独的一个问题导致的,而是几个问题揉在一起:我们解决一个之后,发上线,之后发现还有另一个的性能瓶颈问题.这也是我经验不足,导致没能一下子定位解决:而我又对我们后台整个团队有着固执的自尊,不想通过大量水平扩容这种方式挺过压力高峰,导致线上连续几晚都出现了不同程度的问题,肯定对于我们的业务增长是有影响的.这也是我不成熟和要反思的地方.这系列文章主要记录下我们针对这次业务增长,对于我们后台微服务系统做的…