Log4J ConsoleAppender нельзя назначить для драйвера Athena JDB C - PullRequest
1 голос
/ 31 января 2020

У меня проблемы с правильной регистрацией драйвера Athena JDB C. Я бы предпочел SL4J SimpleLogger, но кажется, что эта фабрика не поддерживается, а только Log4J (просто пишу это на тот случай, если вам интересно, почему существует 2 каркаса журналирования). К сожалению, мы не хотим изменять все текущие журналы приложений из-за одного нового драйвера jdb c.

При создании экземпляра регистратора без зависимости 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. Спасибо!

1 Ответ

1 голос
/ 17 февраля 2020

Вот мои выводы после некоторой отладки загрузки классов, если кто-то испытывает те же проблемы:

Драйвер Simba Athena, предоставляемый AWS, поставляется с включенным Log4J. Классы Log4J Apache переупаковываются в «затененный» пакет:

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

Эти классы по-прежнему загружают конфигурацию apache, как ожидается, как файл log4.properties в ресурсах. , «Стандартные» Apache Log4J классы будут иметь проблемы с взаимодействием с ними (например, apache Appenders не могут использоваться в свойствах log4j.properties, которые загружаются драйвером Athena из-за этого).

В случае, если вы просто хотите обойти сообщения об ошибках, созданные драйвером Athena (возможно, даже не используя Log4J в приложении, как в случае, о котором я упоминал), вы можете обращаться к классам в заштрихованных пакетах внутри стандартная конфигурация Log4J 1.2 и удаление любых зависимостей Log4J из пути сборки.

Пример:

Вместо

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

Использование

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

I знаю, что это не идеальное решение для всех сценариев ios, но, по крайней мере, вы можете таким образом контролировать ошибки, которые выдает драйвер Athena.

...