【问题标题】:Appender.appender is null based on MDCSiftingAppender in log4j.properties (log4j 1)Appender.appender 为空,基于 log4j.properties 中的 MDCSiftingAppender (log4j 1)
【发布时间】:2016-05-25 13:28:53
【问题描述】:

我得到了一个有效的 java 项目。它使用 log4j(不是 log4j 2)记录。

我想添加一个 sift appender,而不添加 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

我错过了什么?

【问题讨论】:

  • 我在这里没有收到任何错误。我在我的回答中给出了一个 github 链接。请看一看。

标签: java logging configuration log4j


【解决方案1】:

实际上,当对象为空且其中一个为空时,就会发生 NPE 参数被调用。

在这里,您的附加程序object is null。所以当你想调用方法时 create(props),正在获取NPE。

我已尝试重现您的 NPE。但在我的情况下没有发生任何问题。我已经在Github 中发布了我的代码。你可以下载试试看。

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

【讨论】:

    【解决方案2】:

    rg.ops4j.pax.logger 中有一个错误

    log4j 在第三点之后不解析

    log4j.appender.sift.appender.layout

    所以我以不同的方式实现它

    log4j.appender.sift.appender=\
       appender:org.apache.log4j.FileAppender, \
       appender.File:/var/log/id-@{key}.log, \
       layout:org.apache.log4j.PatternLayout, \
       layout.ConversionPattern:%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %m%n
    
    
    public class MySiftAppender extends AppenderSkeleton
    {
        private String key;
        private String defaultValue = "default";
        private String appender;
        private final Map<String, FileAppender> appenders = new HashMap<>();
    
    
        public String getKey()
        {
            return key;
        }
    
        public void setKey(String key)
        {
            this.key = key;
        }
    
        public String getDefault()
        {
            return defaultValue;
        }
    
        public void setDefault(String defaultValue)
        {
            this.defaultValue = defaultValue;
        }
    
        public String getAppender()
        {
            return appender;
        }
    
        public void setAppender(String appender)
        {
            this.appender = appender;
        }
    
    
        private FileAppender getAppender(String name) {
            FileAppender app = appenders.get(name);
            if ( app != null ) {
                return app;
            }
    
            synchronized ( appenders ) {
                app = appenders.get(name);
                if ( app != null ) {
                    return app;
                }
    
                PatternLayout layout = null;
    
                for ( String p : appender.split("\\s*,\\s*") ) {
                    String[] d = p.split("\\s*:\\s*");
    
                    if ( d[0].equals("appender") ) {
                        app = (FileAppender) OptionConverter.instantiateByClassName(d[1], Appender.class, null);
                        app.setName(name);
                    }
    
                    if ( d[0].equals("appender.File") ) {
                        String pathname = d[1].replaceAll("\\@\\{key\\}", name);
                        app.setFile(pathname);
                    }
    
                    if ( d[0].equals("layout")) {
                        layout = (PatternLayout) OptionConverter.instantiateByClassName(d[1], Layout.class, null);
                        app.setLayout(layout);
                    }
    
                    if ( d[0].equals("layout.ConversionPattern")) {
                        layout.setConversionPattern(d[1]);
                    }
                }
    
                app.activateOptions();
    
                appenders.put(name, app);
    
                return app;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 2015-11-06
      • 2013-09-15
      相关资源
      最近更新 更多