2016-05-25 18 views
0

Ich bekam ein funktionierendes Java-Projekt. Es protokolliert mit log4j (nicht log4j 2).Appender.appender ist Null basierend auf MDCSiftingAppender in log4j.properties (log4j 1)

Ich möchte einen Sift Appender ohne log4j 2 oder eine andere Abhängigkeit hinzufügen, die bestehende log4 Abhängigkeit ruinieren wird.

Ich habe diese log4j.properties Datei

# 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 

und das ist mein Haupt:

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(); 
    } 
} 

Aber ich NPE bekommen, wenn ich versuche

logger.error("example1");

loggt sein, was ich bin fehlt wie man das "apender" member nicht null macht?

hier ist der Stack-Trace für die kurze 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) 

Aber ich NPE bekommen, wenn ich versuche

Was loggt bin ich dabei?

enter image description here

+0

Ich habe nicht bekommen einen Fehler hier verwendet. Ich habe einen GitHub-Link in meiner Antwort angegeben. Bitte guck dir das an. – SkyWalker

Antwort

2
01 nicht analysieren

Tatsächlich ist NPE aufgetreten, wenn das Objekt null ist und einer der Parameter aufgerufen wird.

Hier, Ihre Appender object is null. Wenn Sie die Methode create(props) aufrufen möchten, wird NPE abgerufen.

Ich habe versucht, Ihre NPE zu reproduzieren. Aber in meinem Fall ist kein Problem aufgetreten. Ich habe meinen Code in Github veröffentlicht. Sie können es herunterladen und ausprobieren.

N. B: Ich habe nur ein Glas log4j-1.2.17.jar

0

Es gab einen Fehler in rg.ops4j.pax.logger

log4j nicht nach dem dritten Punkt

log4j.appender.sift.appender.layout

so implementiert ich es anders

log4j.appender.sift.appender=\ 
    appender:org.apache.log4j.FileAppender, \ 
    appender.File:/var/log/[email protected]{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; 
     } 
    }