Я пытаюсь добавить ведение журнала для Ktor http-запросов в приложении для Android. В соответствии с документы я должен добавить зависимость gradle
implementation "io.ktor:ktor-client-logging:$ktor_version"
и просто используйте этот фрагмент
val client = HttpClient() {
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.HEADERS
}
}
Проблема в том, что компилятор «игнорирует» пакет «io.ktor.client.features.logging», добавленный как зависимость. Странно то, что JsonFeature (добавленный как аналогичная зависимость) работает нормально.
install(JsonFeature) { // perfectly works
...
}
install(Logging) { // unresolved reference
...
}
Я уже проверил .jar файл, который Gradle добавил в проект, он содержит все ожидаемые классы, я могу открыть их и увидеть исходный код, но волшебным образом просто не могу использовать в своем приложении. После нескольких часов исследований я предполагаю, что это может быть как-то связано с метаданными Gradle или с тем, что функция ведения журнала является многоплатформенной, и требуется некоторая дополнительная конфигурация Gradle, но, к сожалению, я не эксперт Gradle.
Пробовал добавлять enableFeaturePreview("GRADLE_METADATA") к settings.gradle, но безрезультатно. Даже пытался добавить "-jvm" в зависимость.
implementation "io.ktor:ktor-client-logging-jvm:$ktor_version"
С этой зависимостью Android Studio успешно находит пакет, но не компилируется со следующей ошибкой
More than one file was found with OS independent path 'META-INF/ktor-http.kotlin_module'
Кто-нибудь может пояснить, как правильно настроить зависимость для регистратора Ktor?
Для ktor-client-logging у вас должна быть установлена зависимость для каждой платформы:
commonMain {
dependencies {
implementation "ch.qos.logback:logback-classic:1.2.3"
implementation "io.ktor:ktor-client-logging:$ktor_version"
}
}
androidMain {
dependencies {
implementation "io.ktor:ktor-client-logging-jvm:$ktor_version"
}
}
iosMain {
dependencies {
implementation "io.ktor:ktor-client-logging-native:$ktor_version"
}
}
что касается мета META-INF/ktor-http.kotlin_module, добавьте к app/build.gradle внутри блока android {}:
android {
packagingOptions {
exclude 'META-INF/common.kotlin_module'
exclude 'META-INF/*.kotlin_module'
}
}
@ ArchieG.Quiñones, вы случайно не инициализируете HttpClient с помощью HttpClient { install(Logging) { logger = Logger.DEFAULT } } и, возможно, level = LogLevel.ALL без дополнительной информации? Боюсь, я не смогу помочь.
Да, я сделал. Я пытаюсь увидеть журналы в Android, но не могу их увидеть. У вас есть работающий проект, на который я смотрю?
io.ktor:ktor-client-logging-jvm предполагает, что у вас есть SL4J в качестве зависимости. Добавьте его как зависимость, и вы увидите журналы.
Спасибо за добавление к ответу @Emmanuel, я думал, что клиент уже включил SL4J -> github.com/ktorio/ktor/blob/master/ktor-client/…
Я тоже так думал, но, как мы видим, это зависимость только для компиляции.
Хороший улов в том, что @Emmanuel согласно документации Вход в Кторlogback, который является преемником log4j, упоминается и включается в commonMain и, таким образом, должен охватывать случай отсутствующей зависимости для SL4J.
Я сделал настройку правильно, но я не вижу никаких журналов. Можете ли вы провести меня здесь?