2014-09-15 2 views
3

Документация org.apache.logging.log4j.Logger говоритЧто MessageFactory по умолчанию для Log4J

/** 
    * Logs a message with parameters at the given level. 
    * 
    * @param level the logging level 
    * @param message the message to log; the format depends on the message factory. 
    * @param params parameters to the message. 
    * @see #getMessageFactory() 
    */ 
    void log(Level level, String message, Object... params); 

Но:

  1. Какой MessageFactory используется, когда я установить любой?
  2. В каком формате сообщений используется завод по умолчанию?
  3. Как я могу установить свою собственную фабрику в случае, если завод по умолчанию не может делать то, что мне нужно?

Update:

Пожалуйста, добавьте имена классов и имена XML элементов к ответу. Очень сложно найти что-либо о Log4J 2.x в Google без правильных условий поиска.

ответ

8
  1. Если вы не настроили фабрику сообщений, по умолчанию используется ParameterizedMessageFactory.
  2. По умолчанию log4j использует сообщение фабрику для параметризованных сообщений, так что вы можете сделать logger.warn("hello {}", user.getName());
  3. Вы можете установить свой собственный завод по телефону LogManager.getLogger(name, messageFactory), когда вы получаете регистратор.

Если вы хотите использовать параметры типа String.format (формат System.out.printf), вы должны использовать LogManager.getLogger(MyClass.class, new StringFormatterMessageFactory()) для получения регистратора.

Если ваше наиболее распространенное использование - это параметризованные сообщения (формат {}), но если вы иногда хотите больше контролировать выходной формат, предоставляемый форматированием строк, вы можете объявить свой логгер нормально (поэтому он использует {} параметризованный сообщений) и используйте методы Logger.printf.

Пример:

class MyClass { 
    private static Logger logger = LogManager.getLogger(MyClass.class); 

    public void someMethod() { 
     // use printf here to precisely control the number of digits displayed 
     logger.printf(Level.INFO, "pi: %.5f", Math.PI); 
    } 
} 

Это все в коде. Конфигурация (XML или иное) не задействована.

+0

Я беру это то, что класс по умолчанию MessageFactory не определен официально. И ответ (например, какой XML-элемент) на пункт 3 был бы приятным. Если вы знаете имя, это делает Google намного проще. – Martin

+0

Я был вдали от своего ПК и ответил на свой iPhone, поэтому извините за неточный ответ. Я думаю, у него была вся информация, которую вы просили (включая пункт 3), но теперь я добавлю имена классов. Конфигурация (XML или иначе) не вступает в игру здесь. –

+0

Спасибо. Нет XML - это объясняет, почему я ничего не нашел. Но printf сделает трюк для меня. Все мои проблемы решены. – Martin

0

1) Какой MessageFactory используется, когда я его установил?

Использование подсказки @Remko Popma Я расскажу, что фабрика сообщений по умолчанию - org.apache.logging.log4j.message.ParameterizedMessageFactory.

2) В каком формате сообщений используется завод по умолчанию?

Синтаксис {}, который также использует.

3) Как я могу установить свою собственную фабрику в случае, если завод по умолчанию не может делать то, что мне нужно?

Пока не известно.

1

Эта тема уже около одного года, но, возможно, я могу помочь некоторым парням, потому что у меня была такая же проблема, и я узнал, как настроить свой собственный MessageFactory по умолчанию. Это немного сложно, может быть, кто-то еще знает лучший способ, не создавая так много классов.Но для меня это работает:

  1. Создайте свой собственный MessageFactory (простираться от AbstractMessageFactory или просто использовать интерфейс MessageFactory)
  2. Создать новую LoggerContext (простираться от LoggerContext класса или использовать интерфейс LoggerContext
    • Переопределить newInstance(LoggerContext, String, MessageFactory) и вернуть ранее определенный MessageFactory, если аргумент messageFactory: null
  3. Создайте новый ContextSelector (от ClassLoaderContextSelector или просто используйте интерфейс ContextSelector).
    • Override метод createContext (String, URI) и возвращает новый экземпляр вашей ранее определен LoggerContext
  4. Создайте файл log4j.component.properties в вашем пути к классам и установите свойство Log4jContextSelector в полностью высококвалифицированного-имя ваш на шаге 3 создан contextSelector
    • Альтернатива: не создавать файл, просто установите системное свойство Log4jContextSelector к FQN

Некоторые примеры кода (без каких-либо комментариев):

MessageFactory:

public final class OwnMessageFactory extends AbstractMessageFactory 
{ 
    public static final OwnMessageFactory INSTANCE = new OwnMessageFactory(); 

    @Override 
    public Message newMessage(final String message, final Object... params) 
    { 
    return new OwnDataMessage(message, params); 
    } 
} 

LoggerContext:

public class OwnLoggerContext extends LoggerContext 
{ 
    // constructors 

    protected Logger newInstance(final LoggerContext ctx, final String name, MessageFactory messageFactory) 
    { 
    if (null == messageFactory) 
     messageFactory = OwnMessageFactory.INSTANCE; 

    return super.newInstance(ctx, name, messageFactory); 
    } 

} 

ContextSelector:

public class OwnContextSelector extends ClassLoaderContextSelector 
{ 

    @Override 
    protected LoggerContext createContext(String name, URI configLocation) 
    { 
    return new OwnLoggerContext(name, null, configLocation); 
    } 

} 

log4j2.component.properties:

Log4jContextSelector=com.example.OwnContextSelector 
Смежные вопросы