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