Можно ли печатать дополнительные пользовательские поля вместе со StackTrace при использовании log4j?

У меня есть эта программа, как показано ниже, сейчас ее единственная печать трассировки стека. мой вопрос заключается в том, можно ли получить трассировку стека, а также настраиваемое поле, здесь в моем случае мне нужно 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)

5 ответов

Решение

Да, вы можете напечатать значение, пока оно находится в области видимости.

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 для других ваших звонков...

Вы должны включить это вручную в сообщение, которое вы регистрируете. Но мне кажется, что вы действительно ищете 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 в каждое сообщение журнала, включая те, которые записываются с помощью вызываемого вами кода третьей стороны.

Я бы создал свой собственный класс Exception с членами для хранения дополнительной информации и подходящим методом toString(), который их отображает. Оберните оригинальное исключение в свое собственное исключение и добавьте информацию, которую вы хотите сохранить.

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

Вы близки к достижению этого.

В вашем случае вам придется объявить accountid вне try блок, а затем вы можете добавить accountid вместе с вашим Exception inside the Test program message`

Другие вопросы по тегам