Log4j2 en Android

Estoy tratando de usar log4j2 en Android Project (estoy trabajando en Android Studio).

Para simplificar esta pregunta, explicaré lo que he hecho en un proyecto ficticio simple (tengo el mismo error en el proyecto real que en este proyecto ficticio).

Creo un proyecto ficticio simple con una actividad principal.

Añado las libs log4j2 …

Este es el gradle:

apply plugin: 'com.android.application' android { packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE' } compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.example.test20150130" minSdkVersion 19 targetSdkVersion 21 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.android.support:support-v4:21.0.3' compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.1' compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.1' } 

He reducido el log4j2.xml a esto:

 <?xml version="1.0" encoding="UTF-8"?> <Configuration status="debug"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%m%n" /> </Console> </Appenders> <Loggers> <root level="INFO"> <AppenderRef ref="Console"/> </root> <logger name="Queries" level="ALL" additivity="false"> <AppenderRef ref="Console"/> </logger> </Loggers> 

En la actividad, importo las bibliotecas …

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

Pero cuando trato de usarlos …

 Logger logger= LogManager.getLogger ("Queries"); logger.error ("It works..."); 

Tengo un error en el 'Logger logger = LogManager.getLogger ("Consultas");'

 01-30 00:49:29.413 1685-1685/com.example.test20150130 E/AndroidRuntime? FATAL EXCEPTION: main Process: com.example.test20150130, PID: 1685 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test20150130/com.example.test20150130.MainScreenActivity}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at org.apache.logging.log4j.util.ReflectionUtil$PrivateSecurityManager.getCallerClass(ReflectionUtil.java:301) at org.apache.logging.log4j.util.ReflectionUtil.getCallerClass(ReflectionUtil.java:214) at org.apache.logging.log4j.util.ReflectionUtil.getCallerClass(ReflectionUtil.java:193) at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:72) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:195) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:41) at org.apache.logging.log4j.LogManager.getContext(LogManager.java:160) at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:492) at com.example.test20150130.MainScreenActivity.delayedHide(MainScreenActivity.java:162) at com.example.test20150130.MainScreenActivity.onPostCreate(MainScreenActivity.java:129) at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1150) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2178) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) 

No estoy seguro de dónde debe estar el archivo log4j2.xml, por lo que trayed para ponerlo en \ src, en \ src \ main \ java \ com \ example \ test20150130 (mismo directorio que la actividad principal), Test20150130 \ app \ Build \ outputs \ apk (mismo directorio que el apk), …

Debido a la información del error, intenté el getLogger por todas partes: inicialmente en el onCreate, entonces, lo trayed en un acontecimiento del onClick, pero conseguí el mismo error.

(Cuando me trayed para depurarlo, las fuentes que veo no están alineadas con la ejecución real …)

Ya tenía log4j trabajando en el proyecto de Android, pero acabo de migrar un proyecto de Java EE a log4j2 y quiero hacer lo mismo en el proyecto de Android …

La documentación log4j2 tiene muy poca información sobre Android. Sólo dice que hay varios módulos que no funcionan en Android (JNDI, JMX, …), pero nada más … Tal vez requiere internamente esos módulos (JNDI?) …

Buscando información, he fundado esto ( https://issues.apache.org/jira/browse/LOG4J2-446?jql=project%20%3D%20LOG4J2%20AND%20text%20~%20android ) pero lo hice 'N encontrar una solución …

¿Es posible usar log4j2 en Android?

Muchas gracias por adelantado

    Por fin tengo lo que estaba buscando …

    Estoy trabajando con Android, y no pude recuperar los registradores por nombre (LogManager.getLogger ("xxx") bloquea la aplicación de la peor manera posible …)

    Creo que el problema comienza cuando busca el log4j2.xml. Puse el archivo en todas partes, pero no funciona … … por lo que, quería proporcionar el contenido log4j2.xml en un String …

    Aquí es lo que he hecho …

      String log4j2xmlFileContent=getLog4j2xmlContent();//Content of my log4j2.xml // convert String into InputStream InputStream is = new ByteArrayInputStream(log4j2xmlFileContent.getBytes()); ConfigurationSource source=null; try{ source = new ConfigurationSource(is); } catch (IOException ioe){ ioe.printStackTrace(); } Configuration config = org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory.getInstance().getConfiguration(source); loggerContext = (LoggerContext) LogManager.getContext(); try { //loggerContext.stop(); loggerContext.start(config); } catch (Exception e){ e.printStackTrace(); } return loggerContext; 

    Y ahora, puedo usar ese loggerContext para obtener mis registradores …

      loggerHitosCarga = context.getLogger("HitosCarga"); loggerPeticiones = context.getLogger("Peticiones"); loggerQueries = context.getLogger("Queries"); loggerDepuracionActual=context.getLogger("DepuracionActual"); loggerDepuracionActual.warn("FUNCIONAAAAA!!!!.."); loggerHitosCarga.info("Loggers inicializados..."); 

    Ahora sólo tengo que revisar y mejorar un poco, pero funciona …

    Basado en su propia respuesta pero con código simplificado (usando Configurator.initialize() lugar de XmlConfigurationFactory etc.):

     import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.ConfigurationSource; import org.apache.logging.log4j.core.config.Configurator; // Content of log4j2.xml String log4j2xmlFileContent = getLog4j2xmlContent(); // convert String into InputStream InputStream is = new ByteArrayInputStream(log4j2xmlFileContent.getBytes()); try { ConfigurationSource source = new ConfigurationSource(is); return Configurator.initialize(null, source); } catch (IOException e) { e.printStackTrace(); } return null; 

    Tenga en cuenta que:

    • Este código debe ejecutarse antes de la primera llamada de, por ejemplo, LogManager.getLogger()
    • La función miembro Configurator.initialize() no forma parte de la API pública log4j2 (consulte aquí )

    Consulte también LOG4J2-952 y Log4jConfigure.java

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.