logback控制台输出导致进程假死

本文记录了一次线上环境中微服务调用超时的问题排查过程。通过jstack发现大量日志打印线程处于waiting状态,进一步定位到控制台输出为瓶颈。最终解决方案为调整日志配置,避免控制台输出,但具体原因仍需深入研究。

记一次线上logback日志的问题,微服务调用时客户端调用服务端超时,

检查线上机器后发现机器没有什么问题,GC也正常,于是使用jstack排查一下

线程堆栈信息 发现大量日志打印线程处于waiting状态

 

再查找wait  d3a0结尾的那个资源,看是那个线程正在占用,发现是控制台输出

网上查询后,最终解决方案是日志不往控制台输出,但是里面具体的原因还有待探究

在使用Logback控制台输出Exception,可通过以下步骤实现: 1. **项目依赖**:如果是Spring Boot项目,官方文档说明默认已依赖了一些日志框架,其中推荐使用的就是Logback,无需手动添加依赖 [^3]。 2. **配置日志级别**:可以在配置文件里对日志输出级别进行精细控制。例如,把root换成包名,像下面这样配置: ```yaml logging: level: com.example.controller: debug com.example.mapper: error ``` 这样就能对不同包的日志输出级别进行控制 [^2]。 3. **代码中使用**:在代码里使用`org.slf4j.Logger`和`org.slf4j.LoggerFactory`来记录日志。在捕获到异常时,把异常信息记录下来。示例代码如下: ```java package com.example.weblearn3.controller; import java.io.PrintWriter; import java.io.StringWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping({"/","/homepage","index.html"}) public class HomeController { private Logger logger = LoggerFactory.getLogger(HomeController.class); @RequestMapping(method = RequestMethod.GET) public String home() { try { int a = 1/0; } catch (Exception e) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); logger.error("Main错误:" + sw.toString()); } System.out.println("home"); return "home"; } } ``` 在这个示例中,捕获到异常之后,借助`StringWriter`和`PrintWriter`把异常的堆栈信息转换为字符串,再使用`logger.error`方法将其记录下来,这样异常信息就会在控制台输出 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值