温馨提示:本文翻译自stackoverflow.com,查看原文请点击:java - Log4J ConsoleAppender is not assignable to Athena JDBC Driver

java - Log4J ConsoleAppender无法分配给Athena JDBC驱动程序

发布于 2020-03-29 21:40:36

我无法正确安装Athena JDBC驱动程序。我更喜欢SL4J SimpleLogger,但似乎不支持该工厂,但支持ust 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专家的任何提示。谢谢!

查看更多

提问者
supernova
被浏览
91
supernova 2020-02-17 05:41

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

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

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

这些类仍将按预期加载apache配置,如资源中的log4.properties文件。“标准” 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驱动程序溢出的错误。