Java 使用log4j时是否可以打印额外的自定义文件以及StackTrace

Java 使用log4j时是否可以打印额外的自定义文件以及StackTrace,java,error-handling,log4j,stack-trace,exception-logging,Java,Error Handling,Log4j,Stack Trace,Exception Logging,我有如下所示的程序,现在它只打印stacktrace。 我的问题是,是否有可能获得堆栈跟踪和一个自定义字段,在这里我需要1090099 如果可能的话,请告诉我 package com; import org.apache.log4j.Logger; public class Test { private static final Logger logger = Logger.getLogger(Test.class); public static void main(Strin

我有如下所示的程序,现在它只打印stacktrace。 我的问题是,是否有可能获得堆栈跟踪和一个自定义字段,在这里我需要1090099

如果可能的话,请告诉我

package com;
import org.apache.log4j.Logger;
public class Test {

    private static final Logger logger = Logger.getLogger(Test.class);
    public static void main(String args[]) {
        try {
    String accountid = "1090099";
            String desc = null;
            System.out.println(desc.toUpperCase());
            } 
            catch (Exception t) 
        {
            logger.fatal("Exception inside the Test program  ", t);
        }
    }
}

2013-06-26 21:44:29,723[main] FATAL(Test.java:<main>:16)- Exception inside the Test program
java.lang.NullPointerException
    at com.Test.main(Test.java:12)
package-com;
导入org.apache.log4j.Logger;
公开课考试{
私有静态最终记录器=Logger.getLogger(Test.class);
公共静态void main(字符串参数[]){
试一试{
字符串accountid=“1090099”;
字符串desc=null;
System.out.println(desc.toUpperCase());
} 
捕获(异常t)
{
logger.fatal(“测试程序内部异常”,t);
}
}
}
2013-06-26 21:44:29723[main]致命(Test.java::16)-测试程序内部异常
java.lang.NullPointerException
位于com.Test.main(Test.java:12)

您即将实现这一目标


在您的情况下,您必须在
try
块外声明
accountid
,然后您可以将
accountid
异常一起附加到测试程序内
消息`

是,只要值在范围内,您就可以打印该值

String accountid = null;
try {
     accountid = "1090099";
     String desc = null;
     System.out.println(desc.toUpperCase());
 } catch (Exception t) {
     logger.fatal("Exception inside the Test program  " + accountid, t);
 } 

另外,我建议对您的其他日志调用使用logger.debug而不是system.out.println…

我将创建自己的异常类,其中包含成员以保存附加信息,并创建一个合适的toString()方法来显示这些信息。将原始异常包装到自定义异常中,并添加要保留的信息。

您必须手动将其包含在正在记录的消息中。但在我看来,您真正需要的是(映射的诊断上下文),这是一种在线程本地“上下文”中存储值的方法,可以用来区分与不同应用程序级实体相关的日志消息

package com;
import org.apache.log4j.*;
public class Test {

    private static final Logger logger = Logger.getLogger(Test.class);
    public static void main(String args[]) {
        MDC.put("accountid", "1090099");
        try {
            String desc = null;
            System.out.println(desc.toUpperCase());
            } 
            catch (Exception t) 
        {
            logger.fatal("Exception inside the Test program  ", t);
        } finally {
            MDC.remove("accountid");
        }
    }
}

然后,您将在appender的布局模式中包含
%X{accountid}
,它将在每个日志消息中包含适当的MDC条目,包括您调用的第三方代码记录的消息。

与公认的答案相比,我认为可以公平地说OP并不是真正在寻找MDC…:P尽管如此,还是有好消息!
String accountid = ""; 

try {
        accountid = "1090099";
        String desc = null;
        System.out.println(desc.toUpperCase());
    } 
        catch (Exception t) 
    {
        logger.fatal("Exception inside the Test program.\nAccount ID: " + accountid, t);
    }