Java 使用log4j时是否可以打印额外的自定义文件以及StackTrace
我有如下所示的程序,现在它只打印stacktrace。 我的问题是,是否有可能获得堆栈跟踪和一个自定义字段,在这里我需要1090099 如果可能的话,请告诉我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
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);
}