簡體   English   中英

Android上的Log4j2

[英]Log4j2 on Android

我正在嘗試在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縮減為:

<?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(與主活動相同的目錄),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-952Log4jConfigure.java

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM