我得到了一个可以运行的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
我错过了什么?
最佳答案
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 methodcreate(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/