[英]Log4J ConsoleAppender is not assignable to Athena JDBC Driver
我无法让 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 专家的任何提示。 谢谢!
如果有人遇到相同的问题,这是我在调试类加载一段时间后的发现:
AWS 提供的 Simba Athena 驱动程序附带了 Log4J。 Log4J Apache 类被重新打包在一个“阴影”包中:
com.simba.athena.shaded.apache.log4j.Xyz
这些类仍然会像资源中的log4.properties文件一样按预期加载 apache 配置。 “标准”Apache Log4J 类在与这些类的互操作时会遇到麻烦(例如,Apache Appender 不能用于由 Athena 驱动程序加载的 log4j.properties 中,因此)。
如果您只想绕过 Athena 驱动程序创建的错误消息(甚至可能不像我提到的那样在应用程序中使用 Log4J),您可以在标准 1.2 Log4J 配置中处理阴影包中的类并删除构建路径中的任何 Log4J 依赖项。
例子:
代替
log4j.appender.Appender1=org.apache.log4j.ConsoleAppender
用
log4j.appender.Appender1=com.simba.athena.shaded.apache.log4j.ConsoleAppender
我知道这不是适用于所有场景的完美解决方案,但至少您可以通过这种方式控制 Athena 驱动程序溢出的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.