解决因缺少Log4j依赖导致应用启动失败的问题

前言

最近公司在做版本升级,所有对aaa(指代某个内部依赖)有依赖的应用需要排除掉。从这点看,几乎不会有什么问题,因为仅仅是排除一些maven依赖而已嘛。但是,一位同学在排除依赖的时候,仅仅是把aaa排除了,而没有在测试环境进行测试,在线上发布的时候,日志报dubbo服务注册失败(抛异常和dubbo admin没有看到注册的服务),导致应用启动失败(回滚后正常),影响正常业务5分钟。

事后排查这个问题的时候发现,有两个原因导致了应用启动失败:

  1. 去除aaa依赖后,导致应用有多个slf4j的依赖
  2. 去除aaa依赖后,导致log4j依赖缺失(应用使用logback)

第一点很好解决,因为从error日志可以直接知道原因,修改pom依赖并把非logback实现的日志依赖排掉就好了。

但是,第二点折腾了一下午才最终确定是因为log4j依赖缺失导致的。

下面把排查过程记录如下:

把应用回滚后正常,那么问题肯定出在回滚之后的提交上,经过和正常版本的代码的diff,发现只有zkclient的版本不同。

异常版本的依赖是如下:

<dependency>
 <groupId>com.github.sgroschupf</groupId>
 <artifactId>zkclient</artifactId>
 <version>0.1</version>
</dependency>

正常的依赖是:

<dependency>
 <groupId>com.101tec</groupId>
 <artifactId>zkclient</artifactId>
 <version>0.10</version>
</dependency>

分析到这里,已经有了解决思路,一种是直接修改zkclient的依赖,一种是继续分析为什么两种版本的不同会导致应用启动失败。通过继续分析,发现groupId为com.101tec的日志框架使用的是Slf4j,而groupId为com.github.sgroschupf的日志框架是Log4j,而那位同事在排除aaa依赖的时候顺便把log4j的依赖也排掉了,所以才导致应用启动失败。

com.github.sgroschupf的log框架:

com.101tec的log框架:

再回到刚开始dubbo注册服务失败的问题,一切都明了了——因为把log4j依赖排掉了,导致dubbo使用zkclient注册服务的时候因为无法初始化Log4j,导致无法初始化ZkClient,进而导致dubbo注册失败。

通过这个事件,获得如下教训:

  1. 尽量在一个系统内使用同一个日志框架
  2. 如果是依赖jar有不同的日志实现,使用更高版本的依赖
  3. 发布之前一定要记得在测试环境进行测试

总结

以上就是关于因缺少Log4j依赖导致应用启动失败的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • log4j详细的常用配置说明介绍

    很多屌丝都觉得log4j不好用,因为它不输出到IDE的控制台,哈哈,其实都是配置惹的祸,下面看我怎么一步步配置到控制台的,log4j的输出级别和输出模式相信屌丝们都知道的,这里不多说了,直接看代码注释: # All,TRACE,DEBUG,INFO,WARN,ERROR,FITAL,OFF #全局项目日志配置 log4j.rootLogger=ERROR #指定的包下所有的日志(只输出项目com包下的日志) log4j.logger.com=DEBUG,yin,dailly_rolling_fi

  • Java log4j详细教程

    一:Log4j入门简介学习 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. 此外,通过Log4j其他语言接口,您可以在C.C++..Net.PL/SQL程序中

  • 很详细的Log4j配置步骤

    1. 配置文件 Log4J配置文件的基本格式如下:  复制代码 代码如下: #配置根Logger log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , - #配置日志信息输出目的地Appender log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 -

  • log4j使用教程详解(怎么使用log4j2)

    1. 去官方下载log4j 2,导入jar包,基本上你只需要导入下面两个jar包就可以了(xx是乱七八糟的版本号): log4j-core-xx.jar log4j-api-xx.jar 2. 导入到你的项目中:这个就不说了. 3. 开始使用: 我们知道,要在某个类中使用log4j记录日志,只需要申明下面的成员变量(其实不一定要是成员变量,只是为了方便调用而已) 复制代码 代码如下: private static Logger logger = LogManager.getLogger(MyAp

  • log4j的使用详细解析

    1 Log4j配置说明 1.1 配置文件Log4j可以通过java程序动态设置,该方式明显缺点是:如果需要修改日志输出级别等信息,则必须修改java文件,然后重新编译,很是麻烦: log4j也可以通过配置文件的方式进行设置,目前支持两种格式的配置文件: •xml文件•properties文件(推荐)下面是一个log4j配置文件的完整内容: 复制代码 代码如下: log4j.rootCategory=INFO, stdoutlog4j.rootLogger=info, stdout ### std

  • log4j的配置文件详细解析

    1.Log4j的优点Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送地:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. log4j的好处在于:(1) 通过修改配置文件,就可以决定log信息的目的地--控制台.文件.GUI组件.甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等. (2) 通过修

  • 解决因缺少Log4j依赖导致应用启动失败的问题

    前言 最近公司在做版本升级,所有对aaa(指代某个内部依赖)有依赖的应用需要排除掉.从这点看,几乎不会有什么问题,因为仅仅是排除一些maven依赖而已嘛.但是,一位同学在排除依赖的时候,仅仅是把aaa排除了,而没有在测试环境进行测试,在线上发布的时候,日志报dubbo服务注册失败(抛异常和dubbo admin没有看到注册的服务),导致应用启动失败(回滚后正常),影响正常业务5分钟. 事后排查这个问题的时候发现,有两个原因导致了应用启动失败: 去除aaa依赖后,导致应用有多个slf4j的依赖 去

  • Java @Async注解导致spring启动失败解决方案详解

    前言 在这篇文章里,最后总结处,我说了会讲讲循环依赖中,其中一个类添加@Async有可能会导致注入失败而抛异常的情况,今天就分析一下. 一.异常表现,抛出内容 1.1循环依赖的两个class 1.CycleService1 @Service public class CycleService1 { @Autowired private CycleService2 cycleService2; @WangAnno @Async public void doThings() { System.out

  • 80端口被占用导致Apache启动失败怎么解决

    Apache启动不了,电脑80端口被占有如何解决 问题如下: 1. 80端口被占用,Apache启动失败.√MySQL5.1已启动.2.Apache启动不了,80端口被httpd.exe占用~急!! 我们用电脑做服务器时,我们通常要配置环境,当我们在配置服务器的时候,经常需要用到一些端口,而经常要用到的就是80端口了,但往往都会出现被占有,在这里跟大家分享一下,电脑80端口被占有应该怎样解决. 环境:win xp系统 win7系统 解决办法: 1.首先按win+R打开运行,然后输入CMD 2.在

  • /var/log/pacct文件导致MySQL启动失败的案例分享

    毫无预兆的,MySQL 罢工了. 用 mysql.server 启动脚本启动之后,没有任何提示信息就结束,mysqld进程自然是没有起来. 把 mysql.server 里面 $bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file >/dev/null 2>&1 这句的输出重定向去掉后运行,结果发现报错: File size limit exceedednohup ... ... 这样看来自然是有文件太大了.

  • Spring Boot 2.6.x整合Swagger启动失败报错问题的完美解决办法

    目录 问题 原因 解决方案 方案一(治标) 方案二(治本) 总结 问题 Spring Boot 2.6.x版本引入依赖 springfox-boot-starter (Swagger 3.0) 后,启动容器会报错: Failed to start bean ‘ documentationPluginsBootstrapper ‘ ; nested exception… 原因 Springfox 假设 Spring MVC 的路径匹配策略是 ant-path-matcher,而 Spring Bo

  • MySQL数据库innodb启动失败无法重启的解决方法

    问题介绍 电脑在使用过程中死机,重启后发现mysql没有启动成功,查看错误日志发现是innodb出现问题导致mysql启动失败. 错误日志 $ mysql.server start Starting MySQL . ERROR! The server quit without updating PID file (/usr/local/var/mysql/fdipzonedeMacBook-Air.local.pid). 22:08:37 mysqld_safe Starting mysqld

  • ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)

    本文为大家详细分享了搭建ThinkPHP框架时遇到的问题,为大家提供了解决方法,具体内容如下 第一部分:框架搭建 我也是刚接触ThinkPHP,所以将目前的心得以及学习步骤按照我认为更容易理解的方式记录下来. 要使用ThinkPHP首先是要把环境搭建好,下面两个大体步骤来介绍: 第一步:下载软件 1.Xmapp(此软件将Apache.MySQL等集成了,使用起来很方便) 2.ThinkPHP3.2.3下载 第二步:搭建框架 1.将xmapp安装好,我们可以看到一个htdocs文件夹,我们可以将下

  • Mysql/MariaDB启动时处于进度条状态导致启动失败的原因及解决办法

    今天打开网站突然发现网站无法打开,后来通过SSH登陆服务器发现MARIADB数据库没有启动成功,再次启动还是无法成功启动,一直处于启动进度条,进度条结束后提示ERROR.查看日志出现以下错误: InnoDB: Unable to lock ./ibdata1, error: 11 后经调试发现是因为MariaDB数据库所在分区已经满了,造成无法启动. 只有将MariaDB数据库存放数据目录移动到另外一个磁盘份额比较大的分区或者将当前分配删除一些不必要的文件. 移动办法: 1.停掉mysql服务器

  • MySQL中配置文件my.cnf因权限问题导致无法启动的解决方法

    本文主要给大家介绍了关于MySQL中配置文件my.cnf因权限问题导致无法启动的相关解决过程,分享出来供大家参考学习,下面来一起看看详细的介绍: 问题描述 MySQL 无法启动,报如下错误: 问题分析 查看 MySQL 错误日志发现如下错误(提示 MySQL 库的 host 表无法打开): 查看 /etc/my.cnf 配置文件: 到 MySQL 数据库所在目录查看表是否存在: 发现 MySQL 库的 host 表是存在的,那为什么会提示不存在呢? 问题应该出在 /etc/my.cnf 文件上,

  • 解决IDEA修改 .vmoptions 文件后导致无法启动的问题

    今天在pojie IDEA修改 .vmoptions 文件添加-javaagent时补丁路径填写错误,导致Idea无法启动. 解决方法 打开我的电脑->C盘->Users->用户window的名(每个人都不同根据自己的来)->.IntelliJIdea2019.3(idea版本名称)->config->找到idea64.exe.vmoptions双击, 删除-javaagent那一行(或者自己新添加的) 保存修改重新打开idea发现就可以重新启动了 最新idea2020

随机推荐