gpt4 book ai didi

java - Android 上的 Log4j2

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:52 25 4
gpt4 key购买 nike

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

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

我创建了一个包含主要 Activity 的简单虚拟项目。

我添加了 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 缩减为:

<?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>

在 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 上(与主要 Activity 相同的目录),Test20150130\app\build\outputs\apk(与 apk 相同的目录),...

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

(当我尝试调试它时,我看到的源代码与实际执行不一致...)

我已经在 Android 项目上使用了 log4j,但我刚刚将一个 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 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...");

现在我只需要稍微回顾和改进它,但它确实有效......

关于java - Android 上的 Log4j2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28235021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com