Hapus Log4j dan gunakan Logback

Apakah mungkin menggunakan Logback daripada Log4j? Saya telah mengecualikan dependensi log4j dari semua file kelas proyek saya tetapi ketika saya membangun node, log4j masih dibawa dari Corda-core.

Di bawah ini adalah cara saya mengecualikan dependensi secara bertahap.

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'
}

Saya kemudian menambahkan logback sebagai ketergantungan

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

Namun setelah menerapkan node dan memulainya, saya dapat melihat bahwa node tersebut masih menggunakan pabrik logger 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]

Baris log ini menunjukkan bahwa logback belum ditemukan.

Satu informasi tambahan adalah, ketika saya menjalankan pengujian yang ada di dalam salah satu proyek yang sama dengan cordapps di bawah ini berjalan dengan baik dan berhasil mengambil logback tetapi menjalankan node tidak.


person Dan Newton    schedule 25.05.2018    source sumber
comment
Cukup hapus toples pengikat log4j dan slf4j-›log4j dari jalur kelas, dan tambahkan Logback, dan pengikatan Logback-›slf4j ke jalur kelas. Dan jangan lupa ganti log4j dengan konfigurasi Logback.   -  person Victor Gubin    schedule 25.05.2018
comment
@VictorGubin Saya telah menjalankan gradle dependencies dan tidak memiliki ketergantungan log4j di mana pun yang dapat ditemukan, tetapi log4j masih diambil setiap kali (yang saya tahu berarti masih ada di suatu tempat). Entah bagaimana net.corda.node.Corda_3.1-corda/log4j-slf4j-impl-2.9.1.jar! sepertinya masih menyertakannya. Saya juga telah melakukan clean build.   -  person Dan Newton    schedule 29.05.2018


Jawaban (2)


Praktik terbaik dalam memilih kerangka logging adalah bahwa kerangka tersebut harus ditentukan pada tingkat aplikasi, bukan pada tingkat perpustakaan (cordapp).

Dalam kasus cordapps, seseorang harus menggunakan SLF4J API, dan menyerahkannya pada runtime (corda.jar) untuk memutuskan pengikatan yang sesuai. corda.jar menggunakan implementasi log4j. Mungkin Anda perlu mengangkat masalah di github untuk kemampuan mengganti penyedia log.

person dazraf    schedule 29.05.2018

Ketergantungan pada log4j di Corda Core dihilangkan dengan PR ini, yang akan ada di rilis utama Corda berikutnya: https://github.com/corda/corda/pull/3257.

Namun, saya akan menggemakan pandangan dazraf tentang praktik terbaik di sini.

person Joel    schedule 29.05.2018