关于springboot的CommandLineRunner运行出错没有日志记录分析

现象

在工作项目中,依赖springboot 2.0.3,有一个启动后缓存权限的功能,AdminServiceImpl类中实现了CommandLineRunner,如果启动springboot出错(比如t_role表不存在),看到的现象是程序还在运行,但是看不到任何错误输出。

为什么程序还在运行

CommandLineRunner是在springboot启动中相对靠后的流程,也就是在tomcat启动后才执行,所以虽然CommandLineRunner运行报错了,springboot把ApplicationContext已经close,所以看到druid的数据库连接closed,但是Tomcat已经启动运行,java进程还在。

为什么错误被“吞掉”

这里应该算springboot2.0.x中的一个bug,在github上也看得到issue,详细请看连接,并且在springboot2.1.1已经修复,所以最好的解决方案就是升级springboot到2.1.1

在springboot中都是使用JCL作为日志记录,JCL和SL4j只是一个日志规范,具体看实现,JCL自己本身写了简单的org.apache.commons.logging.impl.Jdk14Logger作为默认的实现,这样就好解释为什么没有日志记录了。因为我们没有配置logging.properties,所以看不到错误日志,也就出现所谓日志被“吞掉”。

解决办法

1 去掉commons-logging的依赖

configurations {
    all*.exclude group:'commons-logging', module: 'commons-logging'
}

2 升级springboot到2.1.1

在springboot2.x版本中是使用了spring-jcl模块,在2.1.1中加了一个commons-logging的SPI实现文件META-INF/services/org.apache.commons.logging.LogFactory,但是好奇为什么实现类LogFactoryService是Deprecated的,又没写清原因。。。

附带logback-spring.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--引入默认的一些设置-->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!--web信息-->
    <logger name="org.springframework.web" level="info"/>

    <!--写入日志到控制台的appender,用默认的,但是要去掉charset,否则windows下tomcat下乱码-->
    <appender name="CONSOLE"
              class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
            </Pattern>
        </layout>
    </appender>

    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_PATH" value="D:/logs/yunchuang/yunchuang"/>
    <!--写入日志到文件的appender-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名,每天一个文件-->
            <FileNamePattern>${LOG_PATH}.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!--异步到文件-->
    <appender name="asyncFileAppender" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>500</queueSize>
        <appender-ref ref="FILE"/>
    </appender>

    <!--生产环境:打印控制台和输出到文件-->
    <springProfile name="prod">
        <root level="info">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="asyncFileAppender"/>
        </root>
    </springProfile>

    <!--开发环境:打印控制台-->
    <springProfile name="dev">
        <root level="info">
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>

    <!--测试环境:打印控制台-->
    <springProfile name="test">
        <root level="info">
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>
</configuration>

转载于:https://my.oschina.net/u/866172/blog/2988940

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值