2

我有这个程序,如下所示,现在它只打印堆栈跟踪。我的问题是,是否可以获得堆栈跟踪以及自定义字段,在我的情况下我需要 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)
4

5 回答 5

2

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

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

然后,您将在附加程序的布局模式中包含%X{accountid}某个位置,并且它将在每个日志消息中包含适当的 MDC 条目,包括由您调用的第三方代码记录的那些。

于 2013-06-26T16:44:36.053 回答
1

我将创建自己的 Exception 类,其中包含保存附加信息的成员,以及显示它们的合适的 toString() 方法。将原始异常包装在您的自定义异常中并添加您想要保留的信息。

于 2013-06-26T16:43:32.787 回答
0

你即将实现这一目标。

在您的情况下,您必须声明块accountid外部try,然后您可以附加accountid您的Exception inside the Test program消息`

于 2013-06-26T16:39:23.920 回答
0

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

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 进行其他日志记录调用...

于 2013-06-26T16:39:50.050 回答
0
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);
    }
于 2013-06-26T16:44:46.530 回答