Имя метода не печатается правильно в log4j logger в Java
Мой журнал происходит в getParam()
метод. но он зарегистрирован как main
метод. И у меня есть три объекта, но я не вижу никакой информации о том, какой объект регистрируется. Я тоже хочу эту информацию.
Вот вывод:
INFO [main]: info
INFO [main]: debug
INFO [main]: trace
вот код:
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
class Log4jTest {
private static Logger log=Logger.getLogger(Log4jTest.class);
private String param;
public Log4jTest(String param){
this.param=param;
}
public String getParam(){
log.info(param);
return param;
}
}
public class Log4j_testing {
public static void main(String[] args) throws FileNotFoundException{
Log4jTest l1= new Log4jTest("info");
l1.getParam();
Log4jTest l2= new Log4jTest("debug");
l2.getParam();
Log4jTest l3= new Log4jTest("trace");
l3.getParam();
}
}
мои log4j.properties:
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.stdout.layout.ConversionPattern=%-5p [%t]: %m%n
С другой стороны: если я закомментировал вышеупомянутую закомментированную строку и закомментировал последнюю строку, я получаю
11:19:41,586 INFO Log4jTest:19 - info
11:19:41,589 INFO Log4jTest:19 - debug
11:19:41,589 INFO Log4jTest:19 - trace
Это дает правильный номер строки (19), который регистрируется, но не правильный метод.
3 ответа
Добавлять %M
к вашему образцу. Однако, как указано в JavaDoc: "Генерация информации о местоположении вызывающего абонента является чрезвычайно медленной и ее следует избегать, если только скорость выполнения не является проблемой".
В некоторых случаях некоторые шаблоны игнорируются или никогда не регистрируются (%C
, %F
, %l
, %L
, %M
). Это верно при использовании асинхронных регистраторов и асинхронных приложений. Вот что говорит об этом руководство пользователя Log4j 2.x (см. Стр. 187):
Если один из макетов настроен с использованием атрибута, связанного с местоположением, например HTML locationInfo, или одного из шаблонов%C или $class, %F или% file,% l или%location, %L или%line, %M или% метод, Log4j сделает снимок стека и проследит трассировку стека, чтобы найти информацию о местоположении. [...] влияние на производительность создания снимка трассировки стека еще выше для асинхронных регистраторов: ведение журнала с местоположением в 4 - 20 раз медленнее, чем без местоположения. По этой причине асинхронные регистраторы и асинхронные приложения не включают информацию о местоположении по умолчанию.
Вы можете переопределить поведение по умолчанию в конфигурации вашего регистратора или асинхронного приложения, указав
includeLocation="true"
,
Документ для PatteryLayout говорит нам, что %M
предоставит имя метода, где был сделан запрос на регистрацию, но я так и не смог заставить его работать, и в итоге я поместил имя метода в сообщение журнала.