#java #log4j #log4j2
#java #log4j #log4j2
Вопрос:
Используя log4j2, я хочу заменить некоторые строки в сообщении журнала (скажем, заменить foo на bar). В конфигурации xml я могу использовать следующую конфигурацию, и она работает.
<Appenders>
<Console name="A1" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss}] %m%n">
<replace regex = "foo" replacement="bar"/>
</PatternLayout>
</Console>
</Appenders>
Но вместо использования XML я должен использовать файл свойств в своем проекте, поэтому я попробовал что-то вроде
appender.A1.type = Console
appender.A1.name = A1
appender.A1.layout.type = PatternLayout
appender.A1.layout.pattern = [%d{HH:mm:ss}] %m%n
# Probably BAD code begin
appender.A1.layout.replace.regex = foo
appender.A1.layout.replace.replacement = bar
# Probably BAD code end
И я получил ошибку типа:
Exception in thread "main" org.apache.logging.log4j.core.config.ConfigurationException: No type attribute provided for component replace
at org.apache.logging.log4j.core.config.properties.PropertiesConfigurationBuilder.createComponent(PropertiesConfigurationBuilder.java:334)
...
Как я могу представить замену в файле свойств и в log4j2, возможно ли преобразовать все в конфигурации xml в конфигурацию свойств?
Я использую log4j-api-2.14.0.jar и log4j-core-2.14.0.jar .
Заранее спасибо!
РЕДАКТИРОВАТЬ: я тоже пробовал replace{pattern}{regex}{substitution}
раньше. И я думаю, что это отличается от параметра замены. Допустим, шаблон
appender.A1.layout.pattern = [%d{HH:mm:ss}][%C::%M] %replace{%m}{foo}{bar}%n
И я получу
[09:28:07][com.foo.MyApp::main] 111 bar 222
но то, что я хочу получить, это
[09:28:07][com.bar.MyApp::main] 111 bar 222
Используя приведенную выше конфигурацию XML, я могу получить правильный результат, но я не знаю, как преобразовать его в конфигурацию свойств.
Ответ №1:
Для замены регулярных выражений используйте replace{pattern}{regex}{substitution}
шаблон. appender.A1.layout.replace.*
необходимо удалить.
appender.A1.type = Console
appender.A1.name = A1
appender.A1.layout.type = PatternLayout
appender.A1.layout.pattern = [%d{HH:mm:ss}] %replace{%m}{foo}{bar}%n
# whole line
appender.A1.layout.pattern = %replace{[%d{HH:mm:ss}] %m%n}{foo}{bar}
Для получения дополнительной информации
заменить{шаблон}{регулярное выражение}{подстановка}
Заменяет вхождения ‘regex’, регулярного выражения, его заменой ‘substitution’ в строке, полученной в результате вычисления шаблона. Например, «%replace {%msg} {s} {}» удалит все пробелы, содержащиеся в сообщении о событии.
Шаблон может быть сколь угодно сложным и, в частности, может содержать несколько ключевых слов преобразования. Например, «%replace {%logger %msg} {.} {/}» заменит все точки в регистраторе или сообщение о событии косой чертой.
Комментарии:
1. Спасибо, я пробовал это раньше, но я думаю, что это отличается от параметра replace, он может заменить только строку в сообщении о событии, но не весь журнал, поэтому имя пакета не может быть заменено. Пожалуйста, посмотрите мой обновленный пост.
2. Привет @MagicRain вы можете добавить целое событие журнала в качестве параметра. Я обновил свой ответ, вы можете проверить этот
whole line
параметр. Вы можете использовать множество альтернатив, например%replace{%C %m}{foo}{bar}%n
, не только один элемент.