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

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