Удалите Log4j и используйте Logback

Можно ли использовать Logback вместо Log4j? Я исключил зависимости log4j из всех файлов оценки моих проектов, но когда я создаю узлы, log4j все равно загружается из Corda-core.

Ниже показано, как я исключил зависимости в gradle.

configurations.all {
  exclude group: 'org.apache.logging.log4j', module: 'log4j-api'
  exclude group: 'org.apache.logging.log4j', module: 'log4j-core'
  exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl'
  exclude group: "org.slf4j", module: "jcl-over-slf4j"
  exclude group: 'org.apache.logging.log4j', module: 'log4j-web'
}

Затем я добавил logback в качестве зависимости

compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'

Но после развертывания узлов и их запуска я вижу, что они все еще используют фабрику регистраторов log4j.

    SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/daniel.newton/.capsule/apps/net.corda.node.Corda_3.1-corda/log4j-slf4j-impl-2.9.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/daniel.newton/dev/projects/corda/build/nodes/party/cordapps/trade-input-cordapp-1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/daniel.newton/dev/projects/corda/build/nodes/party/cordapps/common-1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/daniel.newton/dev/projects/corda/build/nodes/party/cordapps/corda-1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

Эти строки журнала предполагают, что logback даже не был найден.

Еще одна дополнительная информация заключается в том, что когда я запускаю тесты, которые существуют в одном из тех же проектов, что и приведенные ниже приложения cordapps, они работают нормально и успешно собирают журналы, но запуск узлов не работает.


person Dan Newton    schedule 25.05.2018    source источник
comment
Просто удалите файлы привязки log4j и slf4j->log4j из пути к классам и добавьте привязку Logback и Logback->slf4j в путь к классу. И не забудьте заменить log4j на конфигурацию Logback.   -  person Victor Gubin    schedule 25.05.2018
comment
@VictorGubin Я запустил gradle dependencies и нигде не нашел зависимостей log4j, но log4j все еще подхватывается каждый раз (что, как я знаю, означает, что он все еще где-то там). Каким-то образом net.corda.node.Corda_3.1-corda/log4j-slf4j-impl-2.9.1.jar!, кажется, все еще включает его. Я также сделал clean build.   -  person Dan Newton    schedule 29.05.2018


Ответы (2)


Лучше всего выбирать структуру ведения журналов, определяя ее на уровне приложения, а не на уровне библиотеки (cordapp).

В случае с cordapps следует использовать SLF4J API, а решение о соответствующей привязке оставить на усмотрение среды выполнения (corda.jar). corda.jar использует реализацию log4j. Возможно, вам нужно поднять вопрос на github для возможности переключения поставщиков журналов.

person dazraf    schedule 29.05.2018

Зависимость от log4j в Corda Core устраняется этим PR, который будет в следующем основном выпуске Corda: https://github.com/corda/corda/pull/3257.

Тем не менее, я бы повторил мнение Дазрафа о передовом опыте.

person Joel    schedule 29.05.2018