Как создать log4j wrap и получить правильные логи - PullRequest
1 голос
/ 08 сентября 2011

У меня есть многопоточное приложение, и я хочу добавить текстовую информацию в каждое сообщение журнала, я создаю фабрику и расширяю класс, он отлично работает

...
protected Logger logger = Logger.getLogger("Test", new MyLog4JFactory());
...

import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggerFactory;

public class MyLog4JFactory implements LoggerFactory{
    @Override
    public Logger makeNewLoggerInstance(String arg0) {
        return new MyLogger(arg0);
    }

}


import org.apache.log4j.Logger;
public class MyLogger extends Logger{
    protected MyLogger(String name) {
        super(name);
    }
    private String getMessage(Object msg){
        StringBuffer sb = new StringBuffer();
        return sb.append(msg).append(" ").append("My text").toString();
    }
    @Override
    public void debug(Object message) {
        super.debug(getMessage(message));
    }
    @Override
    public void error(Object message) {
        super.error(getMessage(message));
    }
    @Override
    public void fatal(Object message) {
        super.fatal(getMessage(message));
    }
    @Override
    public void info(Object message) {
        super.info(getMessage(message));
    }
    @Override
    public void warn(Object message) {
        super.warn(getMessage(message));
    }
}

, но!в журналах я вижу класс-оболочку

все журналы печатаются как

2011-09-08 10: 45: 49,359 DEBUG MyLogger (35) - Test1Мой текст

Что мне делать, чтобы в файле журнала отображались классы (с номером строки), вызывающие мой регистратор?

Ответы [ 2 ]

3 голосов
/ 09 декабря 2013

Я знаю, что это старый вопрос, но я хотел бы поделиться хорошим решением, которое я нашел:

Добавьте FQCN в свой класс, вызовите метод Logger.log и передайте его в свой FQCN следующим образом:*

public class MyLogger extends Logger{
    private static String FQCN = MyLogger.class.getName();
    ...

    @Override
    public void debug(Object message) {
        super.log(FQCN, org.apache.log4j.Level.DEBUG,message, null);
    }


    @Override
    public void debug(Object message,Throwable t) {
        super.log(FQCN, org.apache.log4j.Level.DEBUG,message, t);
    }
}

(то же самое будет работать для создания оболочки ...)

0 голосов
/ 08 сентября 2011

В вашем файле log4j.properties удалите спецификатор %l из строки, которая выглядит примерно так:

log4j.appender.A1.layout.ConversionPattern=<...>

ConversionPattern может быть PatternLayout или что-то еще.Это предотвратит отображение полностью определенного имени класса вызова и номера строки.

Более подробную информацию о спецификаторах можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...