Можно ли печатать дополнительные пользовательские поля вместе со 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`