springboot项目,放到服务器上跑,定时任务运行过程中中断,查看日志却发现没有报错。
在本地跑,发现控制台能打印报错信息,而日志也没有记录报错。
经排查,发现是因为报错出现在线程池中,没有在日志中记录。
原先使用线程池:
ExecutorService executorService = Executors.newFixedThreadPool(15);
新建类继承ThreadPoolExecutor
,重写afterExecute
方法。
@Slf4j
public class TaskExecutor extends ThreadPoolExecutor {
public TaskExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (t != null) {
log.error(t.getMessage(), t);
ExecutorService executorService = new TaskExecutor(10, 15,
0L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>());
日志中就有异常信息了。
背景springboot项目,放到服务器上跑,定时任务运行过程中中断,查看日志却发现没有报错。在本地跑,发现控制台能打印报错信息,而日志也没有记录报错。经排查,发现是因为报错出现在线程池中,没有在日志中记录。原先使用线程池:ExecutorService executorService = Executors.newFixedThreadPool(15);解决新建类继承ThreadPoolExecutor,重写afterExecute方法。@Slf4jpublic class TaskE
我们在捕获到异常并对异常进行处理时可能会遇到如下一些问题:
1.不确定应如何处理这些异常
2.需要记录异常日志时没有记录,或者异常在不同的地方重复记录,使得排错调试不方便
3.处理日志时,需要在每一个try-catch块包含一些处理代码,有时候异常处理的代码比正常执行代码还多,污染正常执行代码。
4.同样类型异常有不同的处理方式,使最终的处理变得复杂。
5.接口抛出异常,破坏封装,打破了接口与实现之间的清晰界限。
6.异常处理代码散落在,修改起来时非常麻烦。无法对某些异常进行统一处理和修改。
spring boot demo 是一个用来深度学习并实战 spring boot 的项目,该项目已成功集成 actuator(监控)、admin(可视化监控)、logback(日志)、aopLog(通过AOP记录web请求日志)、统一异常处理(json级别和页面级别)、freemarker(模板引擎)、thymeleaf(模板引擎)、Beetl(模板引擎)、Enjoy(模板引擎)、JdbcTemplate(通用JDBC操作数据库)、JPA(强大的ORM框架)、mybatis(强大的ORM框架)、通用Mapper(快速操作Mybatis)、PageHelper(通用的Mybatis分页插件)、mybatis-plus
背景:本来想集成个日志记录,这次用的springboot内置的log4j,结果发现运行时候报的异常无法写入到日志文件,不禁感叹,我就是为了记录错误,结果你记不进去,要你有何用?然后就开始了漫长的百度过程,发现好多都是答非所问,真是服了
一、日志配置不是本次重点,简单介绍一下吧:
#yml中配置log配置
logging:
level:
#com包下为error级别
com: error
#日志输出文件名,这样配置会建立文件在项目根目录
file:
name: handlerlo
解决springboot整合logback-spring.xml后控制台不输出debug级别的日志
今天我去配置项目的拦截器的时候,想在拦截器里面打印一些debug的日志信息,发现一直无法打印出来,而日志文件能够正常的记录,我就自己去测试了一下,发现了最终的问题所在。
首先我去检查了我日志文件中对于debug级别的日志处理,我发现没有任何问题
<!-- console -->
<appender name="STDOUT" class="ch.qos.logback.core.C
场景描述:springboot项目启动,日志停留在某处,不继续打印。jps看到服务启动, 访问服务接口失败,没有任何日志输出,包括异常日志也没有。
解决办法:
1.是否是log配置有问题,查看log配置没有问题,修改日志级别为debug,还是没有异常日志输出
2.是否项目中存在异常捕捉,未打印异常信息。 经排查,修改代码中的e.printStackTrace() 。 但这不影响异常日志打印出来
3.将服务器jar包下载下来,本地启动成功。服务器日志和本地日志 前后差别: 服务器日志卡在 数据库连接池
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos
SpringBoot项目启动失败,没有任何错误信息的解决方案
参考链接:https://blog.csdn.net/shangjianli/article/details/99681359
SpringBoot项目启动失败,控制台中没有任何错误信息提示,可以在 SpringBoot 启动类中添加 try...catch 即可,
package top.simba1949;
imp...
作为javaer都知道spring相关项目大部分情况下都会通过全局捕获异常,并将其包装为更人性化地提示给前端。并且在捕获异常后一般也都会记录到日志里(异常的调用堆栈信息),方便开发排查问题。
这里有个比较明显的问题就是系统中通常会有比较多的业务异常,即如用户不存在,状态不对等等业务异常,如果也记录全部异常堆栈信息,那么个人就觉得有点浪费磁盘空间,且底层框架的堆栈信息对排查问题没有多大指导性意义。如下图(图范围有限,底下还有许多堆栈信息):
遂经过调整优化后的spring全局异常处理器之处理业务异常
Spring Boot AOP可以用来记录日志,可以使用@Aspect注解来定义切面,并在其中定义@ Before,@ After,@ Around等注解以在方法调用之前/之后/环绕时记录日志。例如:@Aspect
public class LoggingAspect { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Before("execution(* com.example.demo.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
logger.info("Before Method : " + joinPoint.getSignature().getName());
} @After("execution(* com.example.demo.service.*.*(..))")
public void logAfter(JoinPoint joinPoint) {
logger.info("After Method : " + joinPoint.getSignature().getName());
One or more listeners failed to start. Full details will be found in the appropriate container log
14148