首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Appender.appender是空的,基于MDCSiftingAppender in log4j.properties (log4j 1)

Appender.appender是空的,基于MDCSiftingAppender in log4j.properties (log4j 1)
EN

Stack Overflow用户
提问于 2016-05-25 13:28:53
回答 2查看 916关注 0票数 0

我得到了一个正在工作的java项目。它使用log4j (而不是log4j 2)登录。

我想在不添加log4j 2或任何其他将破坏现有log4依赖项的依赖项的情况下添加一个sift附录程序。

我有这个log4j.properties文件

代码语言:javascript
复制
# 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

这是我的主要:

代码语言:javascript
复制
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");

我错过了什么,如何使“围裙”成员不为零?

下面是缩写main的堆栈跟踪

代码语言:javascript
复制
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

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-31 17:55:18

实际上,当对象为null并调用其参数之一时,就会发生NPE。 这里,您的object is null。因此,当您想要调用方法create(props)时,它得到的是NPE。

我试过复制你的NPE。但我的案子没有问题。我已经在Github中发布了我的代码。你可以下载并试一试。

注:我只用过一罐log4j-1.2.17.jar

票数 2
EN

Stack Overflow用户

发布于 2016-05-31 17:53:59

rg.ops4j.pax.logger中有一个bug

log4j不会在第三点之后解析

log4j.appender.sift.appender.layout

所以我用不同的方式实现了

代码语言:javascript
复制
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;
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37438715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档