【问题标题】:Log4J ConsoleAppender is not assignable to Athena JDBC DriverLog4J ConsoleAppender 不可分配给 Athena JDBC 驱动程序
【发布时间】:2020-01-31 10:26:33
【问题描述】:

我无法正确登录 Athena JDBC 驱动程序。我更喜欢 SL4J SimpleLogger,但似乎不支持这个工厂,而是使用 Log4J(只是写这个以防你想知道为什么有 2 个日志框架)。不幸的是,我们不想因为一个新的 jdbc 驱动程序而更改所有当前的应用程序日志记录。

在不依赖 Log4J 的情况下实例化记录器时,我得到一个 ClassNotFoundException,这是预期的并显示 Log4J 不包括在内。

log4j:ERROR A "org.apache.log4j.ConsoleAppender" object is not assignable to a "com.simba.athena.shaded.apache.log4j.Appender" variable.
log4j:ERROR The class "com.simba.athena.shaded.apache.log4j.Appender" was loaded by 
log4j:ERROR [jdk.internal.loader.ClassLoaders$AppClassLoader@368239c8] whereas object of type 
log4j:ERROR "org.apache.log4j.ConsoleAppender" was loaded by [jdk.internal.loader.ClassLoaders$AppClassLoader@368239c8].
log4j:ERROR Could not instantiate appender named "stdout".

Maven 依赖项:

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>com.syncron.amazonaws</groupId>
            <artifactId>simba-athena-jdbc-driver</artifactId>
            <version>2.0.2</version>
        </dependency>

log4j.properties

### Appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.Target=System.out  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

### Log Levels 
log4j.rootLogger=info, stdout  

这有点奇怪,因为两个类都加载了同一个类加载器,所以类加载器层次结构问题应该不是问题。我还验证了驱动程序绑定了 Log4J 1.2,因为它在一些错误中指向了该 JavaDocs。

希望 Log4J 专家提供任何提示。谢谢!

【问题讨论】:

    标签: java maven logging log4j amazon-athena


    【解决方案1】:

    如果有人遇到同样的问题,这是我在调试类加载一段时间后的发现:

    AWS 提供的 Simba Athena 驱动程序包含 Log4J。 Log4J Apache 类被重新打包在一个“阴影”包中:

    com.simba.athena.shaded.apache.log4j.Xyz
    

    这些类仍然会像资源中的 log4.properties 文件一样加载 apache 配置。 “标准” Apache Log4J 类将无法与这些类进行互操作(例如,因此无法在 Athena 驱动程序加载的 log4j.properties 中使用 apache Appenders)。

    如果您只想绕过 Athena 驱动程序创建的错误消息(可能甚至不像我提到的那样在应用程序中使用 Log4J),您可以在标准 1.2 Log4J 中处理阴影包中的类配置并从构建路径中删除任何 Log4J 依赖项。

    例子:

    代替

    log4j.appender.Appender1=org.apache.log4j.ConsoleAppender
    

    使用

    log4j.appender.Appender1=com.simba.athena.shaded.apache.log4j.ConsoleAppender
    

    我知道这不是适用于所有场景的完美解决方案,但至少您可以通过这种方式控制 Athena 驱动程序溢出的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      相关资源
      最近更新 更多