Есть ли способ для маршрутизации журналов на основе маркера с RoutingAppender в Log4j2

1

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?

Теги:
logging
log4j2

1 ответ

2
Лучший ответ

В документации для 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). Поэтому после этого не нужно писать пользовательский плагин.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню