You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Tinkerpop3 Gremlin的GraphTraversalSource时如何解决Log4j2警告

问题

使用Tinkerpop-3的Gremlin语言和GraphTraversalSource时,如何修复Log4j2的警告?

已尝试操作

代码文件 src/main/java/Main.java

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;

import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal;

public class Main {
    private static final Logger logger = LogManager.getLogger(Main.class);
    public static void main(String[] args) throws Exception {
        System.out.println("Hello world!");
        logger.info("Hello world!");
        GraphTraversalSource g = traversal().withRemote("conf/remote-graph.properties");
    }
}

日志配置文件 src/main/resources/log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
    <Properties>
        <Property name="baseDir">logs</Property>
    </Properties>
    <Appenders>
        <RollingFile name="RollingFile" fileName="${baseDir}/${date:yyyy-MM-dd}/log-${date:yyyy-MM-dd}.log"
                     filePattern="logs/${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz">
            <PatternLayout>
                <Pattern>%d [%p] [%c{1.}.%t] ::&#x09; %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout>
                <Pattern>%d [%p] [%c{1.}.%t] ::&#x09; %m%n</Pattern>
            </PatternLayout>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="STDOUT"/>
            <AppenderRef ref="RollingFile"/>
        </Root>
    </Loggers>
</Configuration>

Maven依赖 pom.xml

<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.20.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.20.0</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.5</version>
    </dependency>
</dependencies>
预期结果

注释掉GraphTraversalSource相关代码时程序正常运行;取消注释后,Log4j2日志能正常输出"Hello world!",和System.out的输出一致。
该代码是从使用OrientGraph的OrientDB环境中复制而来:

OrientGraph orientGraph = OrientGraph.open(configuration);
GraphTraversalSource g = orientGraph.traversal();
实际结果
Hello world!
2023-04-28 09:14:06,725 [INFO] [Main.main] ::    Hello world!
log4j:WARN No appenders could be found for logger (org.apache.commons.beanutils.converters.BooleanConverter).
log4j:WARN Please initialize the log4j system properly.
解决方案

警告的核心原因是依赖中混用了Log4j 1.x和2.x的桥接包,加上Tinkerpop依赖的组件(比如Apache Commons BeanUtils)仍在使用Log4j 1.x API,导致日志系统加载混乱,具体修复步骤如下:

  1. 替换错误的SLF4J桥接包
    移除slf4j-log4j12,换成Log4j 2.x官方的SLF4J桥接包log4j-slf4j-impl,同时添加Log4j 1.x到2.x的兼容桥接包,让依赖Log4j 1.x的组件也能通过Log4j2输出日志:

    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.20.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.20.0</version>
        </dependency>
        <!-- 替换原slf4j-log4j12 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.20.0</version>
        </dependency>
        <!-- 兼容Log4j 1.x的组件 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-1.2-api</artifactId>
            <version>2.20.0</version>
        </dependency>
    </dependencies>
    
  2. 修正配置文件路径
    确保log4j2.xml放在src/main/resources目录下(你当前的路径src/java/main/resources不符合Maven规范),这样程序启动时能正确加载配置。

  3. 清理依赖冲突
    执行mvn dependency:tree检查依赖树,若发现存在Log4j 1.x的log4j artifact,通过<exclusions>在对应的Tinkerpop依赖中排除:

    <!-- 示例:排除Gremlin驱动中的Log4j 1.x依赖 -->
    <dependency>
        <groupId>org.apache.tinkerpop</groupId>
        <artifactId>gremlin-driver</artifactId>
        <version>你的版本号</version>
        <exclusions>
            <exclusion>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

完成以上操作后重新运行程序,Log4j2的警告会消除,所有日志将按照你配置的log4j2.xml规则输出。


内容的提问来源于stack exchange,提问作者Zach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:58:17