Эта тема уже около одного года, но, возможно, я могу помочь некоторым парням, потому что у меня была такая же проблема, и я узнал, как настроить свой собственный MessageFactory по умолчанию. Это немного сложно, может быть, кто-то еще знает лучший способ, не создавая так много классов.Но для меня это работает:
- Создайте свой собственный MessageFactory (простираться от
AbstractMessageFactory
или просто использовать интерфейс MessageFactory
)
- Создать новую LoggerContext (простираться от
LoggerContext
класса или использовать интерфейс LoggerContext
- Переопределить
newInstance(LoggerContext, String, MessageFactory)
и вернуть ранее определенный MessageFactory, если аргумент messageFactory
: null
- Создайте новый ContextSelector (от
ClassLoaderContextSelector
или просто используйте интерфейс ContextSelector
).
- Override метод createContext (String, URI) и возвращает новый экземпляр вашей ранее определен LoggerContext
- Создайте файл
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
Я беру это то, что класс по умолчанию MessageFactory не определен официально. И ответ (например, какой XML-элемент) на пункт 3 был бы приятным. Если вы знаете имя, это делает Google намного проще. – Martin
Я был вдали от своего ПК и ответил на свой iPhone, поэтому извините за неточный ответ. Я думаю, у него была вся информация, которую вы просили (включая пункт 3), но теперь я добавлю имена классов. Конфигурация (XML или иначе) не вступает в игру здесь. –
Спасибо. Нет XML - это объясняет, почему я ничего не нашел. Но printf сделает трюк для меня. Все мои проблемы решены. – Martin