filter можно использовать маркеры, например:
<MarkerFilter marker="FLOW" onMatch="ACCEPT" onMismatch="DENY"/>
Однако я пытаюсь направить сообщение на основе маркера, используя RoutingAppender. Я не хочу фильтровать одни и те же аргументы несколько раз в нескольких Appenders. Здесь мой пример конфигурации (yaml):
Routing:
name: ROUTING_APPENDER
Routes:
pattern: "$${ctx:marker}" #<-- How to use Marker here?
Route:
- key: MyRoutingKey
ref: MyCustomAppender
Документация предусматривает:
Шаблон оценивается по всем зарегистрированным Lookups и результат используется для выбора маршрута
Однако для маркеров не существует Lookup, то же самое для LogLevel. Можно добавить пользовательский MarkerValue или LogLevelValue в ThreadContextMap, но я не нашел решение действительно эффективным, оно дублирует известную информацию.
Не документировано или просто невозможно? Должен ли быть встроенный способ доступа к этим значениям в Lookup?
В документации для RoutingAppender показан поиск ThreadContext, но маршрутизация также может работать с другими поисковыми системами. Одна из идей - создать пользовательский поиск.
Пользовательский поиск реализуется как плагин log4j2. Чтобы помочь log4j2 найти ваш плагин, вы можете включить packages = "yourCustomPackage" в свой файл конфигурации. Ваш класс плагина должен находиться в пути к классам, поэтому log4j может его найти. Здесь код плагина для пользовательского поиска:
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;
@Plugin(name = "marker", category = "Lookup")
public class MarkerLookup implements StrLookup {
public String lookup(String key) {
return null
}
public String lookup(LogEvent event, String key) {
final Marker marker = event.getMarker();
return marker == null ? null : marker.getName();
}
}
И в файле конфигурации:
Routing:
name: ROUTING_APPENDER
Routes:
pattern: "$${marker:}"
Route:
- key: PERFORMANCE
ref: PERFORMANCE_APPENDER
- key: PAYLOAD
ref: PAYLOAD_APPENDER
- key: FATAL
ref: FATAL_APPENDER
- ref: APPLICATION_APPENDER #Default route
Кредиты разработчикам Log4j2 (https://issues.apache.org/jira/browse/LOG4J2-1015).
UPDATE. По их словам, он должен быть встроен в следующую версию (2.4). Поэтому после этого не нужно писать пользовательский плагин.