• springboot整合log4j2遇到的一个坑


    背景

    项目中使用springboot,需要用log4j2做日志框架

    问题

    项目启动报错:Could not initialize Log4J2 logging from classpath:log4j2-dev.yml

    是一个无法初始化Log4J2配置的问题,项目中采用的yml的配置文件。

    前置操作

    首先引入依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
    

    去掉默认的logback配置:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions><!-- 去掉默认配置 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    

    添加配置文件:

    配置logging.config

    以上是整合操作的必要配置,配置完成启动报错。

    问题排查

    根据异常信息描述,找到源码中初始化的代码:Log4J2LoggingSystem.loadConfiguration

    继续跟进:

    发现是一个抽象方法,idea中使用ctrl+alt+B查找实现类:

    因为使用的是yml,所以实现类应该是YamlConfig这个,找到具体实现:

    通过debug发现isActive是false,所以返回null。在此类中找到isActive的含义:

    这是关键的逻辑,原来回去检查是否存在上面几个依赖的类,调试返现没有YAMLFactory这个类,可以看出这个类是jackson包中的,看来是少依赖了包。

    解决

    引入jackson-dataformat-yaml依赖:

        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
        </dependency>
    

    启动正常,问题解决。

  • 相关阅读:
    unicode编码 utf8
    贝壳IM群聊优化之路
    企点电话SDK的日志追踪系统 https://mp.weixin.qq.com/s/uipndTV8W5s1_qose8MrQQ
    解码未知键的 json 字符串
    内部类
    牛客IOI周赛23普及组全题解
    20以内加减随机试卷
    2929百万级电商平台即时通讯系统设计实践(2)_ev
    org.objectweb.asm.ClassWriter.<init>(I)V异常 .
    VMware安装与卸载CentOS7 详细步骤版本2
  • 原文地址:https://www.cnblogs.com/f-anything/p/9228338.html
Copyright © 2020-2023  润新知