Регистрация Android log4j из скомпилированной зависимости не работаетJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Регистрация Android log4j из скомпилированной зависимости не работает

Сообщение Anonymous »

Я создаю класс Java, который будет включать в себя различные операторы журналирования, и хочу скомпилировать его в зависимость, которая будет использоваться приложением Android
(и отдельно в автономных приложениях Java/настольных компьютерах)
Класс выглядит следующим образом:

Код: Выделить всё

package com.example.shared;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class ExampleClass {

public static Logger logger = LogManager.getLogger(ExampleClass.class);

public ExampleClass(){}

public void printMessages(){
logger.error("This is an error message from ExampleClass!");
logger.warn("This is a warn message from ExampleClass!");
logger.info("This is an info message from ExampleClass!");
logger.debug("This is a debug message from ExampleClass!");
logger.trace("This is a trace message from ExampleClass!");
}
}
Зависимость будет скомпилирована с помощью maven с pom.xml следующим образом:

Код: Выделить всё

4.0.0
com.example
shared
1.0.0
Shared


1.8
1.8
UTF-8
UTF-8
1.8




org.apache.logging.log4j
log4j-api
2.20.0


org.apache.logging.log4j
log4j-core
2.20.0



Чтобы использовать это в своем проекте Android, я включил локальные репозитории Maven и импортировал артефакт вместе с log4j api/core и реализацией среды выполнения Android:
app/build.gradle

Код: Выделить всё

plugins {
id 'com.android.application'
}

android {
compileSdk 34
buildToolsVersion "30.0.3"

defaultConfig {
applicationId "com.example.android"
minSdk 26
targetSdk 34
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

packagingOptions {
resources.excludes.add("META-INF/*")
resources.excludes.add("serviceAccountKey*.json")
}
}

dependencies {

implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'

implementation 'com.example:shared:1.0.0'

implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
runtimeOnly 'com.celeral:log4j2-android:1.0.0'
}
Конфигурация log4j, которую я пытаюсь использовать (которая должна печатать только строки INFO), представлена ​​в app/src/main/assets/log4j2.xml: Основная деятельность моего приложения для Android настроена, как показано ниже:

Код: Выделить всё

package com.example.android;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

import com.example.shared.ExampleClass;

public class MainActivity extends AppCompatActivity {

public static Logger logger = LogManager.getLogger(MainActivity.class);

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//Test logging from dependency
ExampleClass ec = new ExampleClass();
ec.printMessages();
}
}
Однако, когда я пытаюсь запустить приложение и протестировать операторы ведения журнала, конфигурация игнорируется и печатаются все уровни ведения журнала:

Код: Выделить всё

E/ExampleClass: This is an error message from ExampleClass!
W/ExampleClass: This is a warn message from ExampleClass!
I/ExampleClass: This is an info message from ExampleClass!
D/ExampleClass: This is a debug message from ExampleClass!
V/ExampleClass: This is a trace message from ExampleClass!
Но если я удалю runtimeOnly 'com.celeral:log4j2-android:1.0.0' из app/build.gradle, я столкнусь с ошибкой ниже:
р>

Код: Выделить всё

W/System.err: ERROR StatusLogger Unable to load services for service class org.apache.logging.log4j.spi.Provider
W/System.err:  java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory;  or its super classes (declaration of 'java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.art/javalib/core-oj.jar)
W/System.err:     at org.apache.logging.log4j.util.ServiceLoaderUtil.callServiceLoader(ServiceLoaderUtil.java:110)
W/System.err:     at org.apache.logging.log4j.util.ServiceLoaderUtil$ServiceLoaderSpliterator.(ServiceLoaderUtil.java:146)
W/System.err:     at org.apache.logging.log4j.util.ServiceLoaderUtil.loadClassloaderServices(ServiceLoaderUtil.java:101)
W/System.err:     at org.apache.logging.log4j.util.ServiceLoaderUtil.loadServices(ServiceLoaderUtil.java:83)
W/System.err:     at org.apache.logging.log4j.util.ServiceLoaderUtil.loadServices(ServiceLoaderUtil.java:77)
W/System.err:     at org.apache.logging.log4j.util.ProviderUtil.(ProviderUtil.java:67)
W/System.err:     at org.apache.logging.log4j.util.ProviderUtil.lazyInit(ProviderUtil.java:145)
W/System.err:     at org.apache.logging.log4j.util.ProviderUtil.hasProviders(ProviderUtil.java:129)
W/System.err:     at org.apache.logging.log4j.LogManager.(LogManager.java:90)
W/System.err:     at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:598)
W/System.err:     at com.example.android.MainActivity.(MainActivity.java:14)
W/System.err:     at java.lang.Class.newInstance(Native Method)
W/System.err:     at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
W/System.err:     at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:44)
W/System.err:     at android.app.Instrumentation.newActivity(Instrumentation.java:1253)
W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3353)
W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
W/System.err:     at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
W/System.err:     at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
W/System.err:     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err:     at android.os.Looper.loop(Looper.java:223)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7656)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Хотя я печатаю строку ошибки:

Код: Выделить всё

W/System.err: ERROR ExampleClass This is an error message from ExampleClass!
Почему это не работает должным образом?
Обновление 1: кто-то проголосовал за закрытие этого вопроса, так как «Требуется больше внимания». Есть только одна проблема, требующая ответа - я исправил последнее утверждение, чтобы отразить это.
Окончательное редактирование:
После обновления до log4j v2. .24.1 (и удаление зависимости времени выполнения celeral log4j2-android) теперь яснее, что происходит.
Log4j не удалось найти/разрешить конфигурацию, представленную в каталоге ресурсов, и поэтому никакие регистраторы не определены. По умолчанию для регистраторов, которые я пытаюсь использовать, установлено значение Level.ERROR, поэтому появляется одна строка с ошибкой:

Код: Выделить всё

W/System.err: ERROR ExampleClass This is an error message from ExampleClass!
все еще регистрировался. Предыдущий log4j-android при использовании просто пересылал все в класс журнала Android, который регистрирует все уровни в консоли (не то, что я хотел).
Проблема, которую я пытаюсь решить. нужно решить, почему конфигурация не загружается

Подробнее здесь: https://stackoverflow.com/questions/789 ... ot-working
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»