Android上的Log4j2

我正在尝试在Android Project上使用log4j2(我正在使用Android Studio)。

为了简化这个问题,我将解释我在一个简单的虚拟项目中所做的事情(我在实际项目中得到的错误比在这个虚拟项目中得到的错误)。

我创建了一个带有主要活动的简单虚拟项目。

我添加了log4j2库…

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

我已将log4j2.xml缩减为:

                 

在Activity上,我导入了库…

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

但是当我尝试使用它们时……

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

我在’Logger logger = LogManager.getLogger(“Queries”)上有错误;’

 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) 

我不确定log4j2.xml文件应该在哪里,所以我托盘将它放在\ src上\ src \ main \ java \ com \ example \ test20150130(与主活动相同的目录),Test20150130 \ app \ build \ outputs \ apk(与apk相同的目录),…

由于错误信息,我尝试了getLogger无处不在:最初在onCreate上,然后,我将它托盘在onClick事件上,但我得到了同样的错误。

(当我托盘调试它时,我看到的来源与实际执行不一致……)

我有log4j已经在Android项目上工作,但我刚刚将一个Java EE项目迁移到log4j2,我想在Android项目上做同样的事情……

log4j2文档中关于Android的信息非常少。 它只是说有几个模块不能在Android上工作(JNDI,JMX,…),但没有别的……也许它需要内部的那些模块(JNDI?)…

寻找信息,我已经建立了这个( https://issues.apache.org/jira/browse/LOG4J2-446?jql=project%20%3D%20LOG4J2%20AND%20text%20 ~%20android )但我做了找到解决方案……

可以在Android上使用log4j2吗?

非常感谢你提前

我终于得到了我想要的东西……

我正在使用Android,我无法按名称恢复记录器(LogManager.getLogger(“xxx”)以最糟糕的方式崩溃应用程序…)

我认为问题在寻找log4j2.xml时开始。 我把文件放在各处,但它不起作用……所以,我想把log4j2.xml内容提供给一个String …

这就是我所做的……

  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; 

现在,我可以使用loggerContext来获取我的记录器……

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

现在我只需要稍微检讨和改进它,但它有效……

基于您自己的答案,但使用简化的代码(使用Configurator.initialize()而不是XmlConfigurationFactory等):

 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; 

注意:

  • 此代码必须在第一次调用之前运行,例如LogManager.getLogger()
  • 成员函数Configurator.initialize()不是log4j2公共API的一部分(参见此处 )

另请参见LOG4J2-952和Log4jConfigure.java