Android 上的 Log4j2

2023-12-09

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

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

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

我添加了 log4j2 库...

这是等级:

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>

在活动中,我导入库...

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 事件上,但我得到了相同的错误。

(当我调试它时,我看到的源与实际执行不符......)

我已经在 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...");

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 上的 Log4j2 的相关文章

随机推荐

  • 为什么调用 boost::split() 会给出这么多警告?

    我需要一个在 dleimiter 上分割字符串的函数 并且我正在使用 boost 库来做其他事情 所以我尝试使用 boost split 它有效 但它给了我很多警告 我想知道为什么 以下是在 MSVC 10 中生成警告的简化代码 inclu
  • 未找到 ManagedBean 属性

    在我的 web 应用程序中 当我单击登录链接时 Tomcat Web 服务器抛出以下异常 exception javax servlet ServletException aluno jsf xhtml Property logout no
  • Spring Boot、Hibernate 搜索属性

    使用Spring Boot时如何提供Hibernate Search参数 spring datasource driverClassName org postgresql Driver hibernate search jmx enable
  • 使用 instantiateViewControllerWithIdentifier 和故事板传递属性值

    对于目标 C 来说 如果我的术语有点偏离 请见谅 我正在尝试将一个值从一个 UIViewController 类传递到另一个类 我正在使用故事板 我可以使用以下代码显示第二个 ViewController UIStoryboard main
  • 如何使用 Sitecore 中的工作流程向原始提交者发送电子邮件?

    当某个项目在工作流程中被审阅者拒绝时 我如何通知提交者 这似乎是一种很常见的情况 但我只看到 电子邮件操作 项中最基本的字段 收件人 发件人 主题 消息 是否有用户的系统变量以及用户的电子邮件地址 我希望它是这样的 user email G
  • 查找街道(获取其坐标)并计算标记之间的距离

    我无法找到有关如何使用 API 来执行以下操作的任何信息 搜索街道并获得一些可点击的结果 这些结果返回 LatLng 对象或其他内容 至少是坐标 因此 如果我搜索一条街道并单击结果 我将平移到该街道 例如 如何计算标记之间的距离 并可能在它
  • 了解 set() 函数

    在Python中 set 是一个无序集合 没有重复元素 但是 我无法理解它如何生成输出 例如 请考虑以下情况 gt gt gt x 1 1 2 2 2 2 2 3 3 gt gt gt set x set 1 2 3 gt gt gt y
  • 将图像上传到服务器:卡在 FileInputStream

    我试图将图像上传到服务器 但不知何故代码停在 FileInputStream 行 不知道为什么 我不知道如何调试或检查它 这是我的源代码 public class CreateSetcardStep1Activity extends App
  • 如何将元素从 ArrayList 复制到另一个而不是通过引用?

    我试图将每个元素从一个 ArrayList av 复制到另一个 copia 问题是它们是通过引用复制的 因此每当我对原始文件进行任何更改时 副本也会被修改 当然 这种行为是不受欢迎的 这个方法应该怎么写呢 public void copia
  • MVC路由模板来表示无限自引用的层次类别结构

    我有一个产品类别表来表示层次类别结构 一个典型的Parent Child数据库中的关系表 以 Guitar Center 的数据填充为例 如果您将它们渲染到页面上 ul and li 蓝色文本是我想要生成的 URL 对于任何给定的类别 链接
  • 命令不同步;现在在 Mysql 中调用存储过程时无法运行此命令

    我正在尝试运行一个程序 但出现此错误 Commands out of sync you can t run this command now 这是我得到的原始错误 命令不同步 你现在不能运行这个命令 SELECT DISTINCT prop
  • 刻度标签字体与 matplotlib 子图不一致

    我正在使用绘制网格matplotlib pyplot subplots 并且我希望刻度标签采用 LaTeX 的无衬线字体 但是当我使用子图时 我总是会得到至少一个以 matplotlib 的默认字体呈现的刻度标签 这是一个 MWE impo
  • last_insert_id() 与 SELECT Max(ID)

    使用 SELECT Max ID FROM table 是否比使用 SELECT last insert id 更安全 它们作为 2 个单独的查询运行 我担心在 last insert id 运行之前 会发生另一次插入 使用 SELECT
  • 为什么我们在循环中使用“i”,例如“for i in range”?

    为什么学习材料中在说明循环时经常使用 i 例如 它在循环时使用range功能 使用随机数对我来说似乎更合乎逻辑 因为range函数是处理数字的 询问我们为什么使用i有点像问为什么这么多人使用这封信x在数学问题中 这主要是因为i是一个非常简单
  • GSON java.lang.IllegalArgumentException:类“xx”声明多个名为“XX”的 JSON 字段并且 StackOverflowError

    我想将映射到非常复杂的对象的 sqlResult 转换为 JSON 以便将其保存到 redis 数据库中 现在我遇到了错误 java lang IllegalArgumentException class xx declares multi
  • 如何更改颤动表单中验证错误的位置?

    我有一个 TextFormField 来收集用户身份验证输入 这很好 但是当它显示验证消息时 会发生这种情况 如何更改错误消息的位置以使其不再发生 我只是想要一种方法来轻松解决这个问题并且该领域仍然很漂亮 这是代码 Form key for
  • HTML:Chrome 保存密码

    Firefox 和 IE 要求我保存密码 为什么 Chrome 不询问我 我必须改变什么
  • 更新 Postgres 中主键的部分(订单号)

    我有表 book id part name 1 1 chap 1 1 2 chap 2 1 3 chap 3 1 4 chap 4 主键是 book id 和部分 如何删除第 2 部分并更新部分顺序以获得 book id part name
  • 将数据(电话号码、备注等)添加到现有联系人 (ANDROID 2.1)

    我有 我面临一个大问题 我无法将数据添加到现有联系人 我正在开发一个管理联系人的应用程序 我可以添加 删除或编辑联系人 创建没问题 因为我为联系人创建了所有类型的数据 即使它们是空的 这不是一个好方法 稍后我会更改它 因此 当我想编辑这些数
  • Android 上的 Log4j2

    我正在尝试在 Android 项目上使用 log4j2 我正在 Android Studio 上工作 为了简化这个问题 我将解释我在一个简单的虚拟项目中所做的事情 我在真实项目中遇到的错误与这个虚拟项目中的错误相同 我创建了一个带有主要活动