我得到了一个正在工作的java项目。它使用log4j (而不是log4j 2)登录。
我想在不添加log4j 2或任何其他将破坏现有log4依赖项的依赖项的情况下添加一个sift附录程序。
我有这个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");
我错过了什么,如何使“围裙”成员不为零?
下面是缩写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
我遗漏了什么?

发布于 2016-05-31 17:55:18
实际上,当对象为null并调用其参数之一时,就会发生NPE。 这里,您的
object is null。因此,当您想要调用方法create(props)时,它得到的是NPE。
我试过复制你的NPE。但我的案子没有问题。我已经在Github中发布了我的代码。你可以下载并试一试。
注:我只用过一罐log4j-1.2.17.jar
发布于 2016-05-31 17:53:59
在rg.ops4j.pax.logger中有一个bug
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;
}
}https://stackoverflow.com/questions/37438715
复制相似问题