java - 基于 log4j.properties 中的 MDCSiftingAppender,Appender.appender 为 null (log4j 1)

标签 java logging configuration log4j

我得到了一个可以运行的java项目。它使用 log4j(而不是 log4j 2)进行记录。

我想添加一个 sift 附加程序,而不添加 log4j 2 或任何其他会破坏现有 log4 依赖项的依赖项。

我有这个log4j.properties文件

# Root logger
log4j.rootLogger=INFO, sift
log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer
log4j.configDebug = true

# Sift appender
log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender
log4j.appender.sift.key=session_id
log4j.appender.sift.default=no_session_id
log4j.appender.sift.appender=org.apache.log4j.FileAppender
log4j.appender.sift.appender.layout=org.apache.log4j.PatternLayout
log4j.appender.sift.appender.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %m%n
log4j.appender.sift.appender.file=/var/log/rr/$\\{session_id\\}.log
log4j.appender.sift.appender.append=true

这是我的主要内容:

public class SiftExampleLog4j {

    static org.apache.log4j.Logger logger = Logger.getLogger(SiftExampleLog4j.class);

    public void log() {
        BasicConfigurator.configure();
        org.apache.log4j.MDC.put("session_id","MyGooApp");

        logger.error("example1");

        org.apache.log4j.MDC.put("session_id","MyFooApp");

        logger.error("example2");
    }

    public static void main (String[] args){
    new SiftExampleLog4j().log();
    }
}

但是当我尝试登录时,我得到了 NPE

logger.error("example1");

我缺少什么如何使“apender”成员不为空?

这是短main的堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
    at org.apache.log4j.sift.MDCSiftingAppender.getAppender(MDCSiftingAppender.java:109)
    at org.apache.log4j.sift.MDCSiftingAppender.append(MDCSiftingAppender.java:79)
    at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
    at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
    at org.apache.log4j.Category.callAppenders(Category.java:206)
    at org.apache.log4j.Category.forcedLog(Category.java:391)
    at org.apache.log4j.Category.error(Category.java:305)
    at com.waze.rr_logger.SiftExampleLog4j.log(SiftExampleLog4j.java:14)
    at com.waze.rr_logger.SiftExampleLog4j.main(SiftExampleLog4j.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

但是当我尝试登录时,我得到了 NPE

我错过了什么?

enter image description here

最佳答案

Actually NPE is occured when the object is null and one of it's parameter is called.

Here, your appender object is null. So when you want to call method create(props), it is getting NPE.

我已尝试重现您的 NPE。但在我的例子中并没有出现问题。我已将我的代码发布在 Github 。您可以下载并尝试一下。

注意:我只使用了一个 jar log4j-1.2.17.jar

关于java - 基于 log4j.properties 中的 MDCSiftingAppender,Appender.appender 为 null (log4j 1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37438715/

相关文章:

java - 在jsp中显示数据

multithreading - 实现线程安全日志记录

date - application.yaml 和属性中的 Spring 启动日期处理

.net - "Unrecognized configuration section connectionStrings."

java - 在应用程序中记录 GC 信息

ios - 如何让我的 iOS4.2 SDK 开发的代码与 iOS3.1.3 一起工作?

java - 工作线程/后台线程 "smothers"UI 线程 Android - 为什么?

java - 无法使用 Ebean 使用 GENERATED IDENTITY 主键创建记录

减少行间垂直间距的Java代码

python - 日志记录包的调试方法不起作用