Шаблон маршрутизации Log4j2 - PullRequest
0 голосов
/ 16 января 2020

Мне нужно настроить log4j2 для обработки методов журнала с некоторым шаблоном, который может решить, какой файл журнала использовать для размещения сообщения журнала. Требования не разрешаются определять каждый раз, когда регистратор.

Все сообщения системного журнала перенаправляются в app-clutter.log

Теперь мне нужен шаблон, и я думаю, вспомогательный класс, который может определить, когда сообщение журнала перенаправления в app-errors.log или app-database.log. По умолчанию другие сообщения отправляются на root .log

Программистам следует использовать только некоторые API с несколькими методами

void logInfo(String message, Object... args);
void logDebug(String message, Object... args);
void logError(String message, Throwable e);

Ниже приведен текущий log4j2. xml config

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30">
  <Properties>
    <Property name="log-path">/home/app</Property>
  </Properties>
  <Filters>
    <AggregateDuplicatesFilter level="INFO" repetitionsRate="5" cacheSize="10000"/>
  </Filters>
  <Appenders>
    <RollingFile name="file_root" fileName="${log-path}/root.log"
      filePattern="${log-path}/root-%d{yyyy-MM-dd}.log" append="true" 
immediateFlush="false">
      <PatternLayout>
        <Pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5level %c{1} - %msg%n</Pattern>
      </PatternLayout>
    </RollingFile>
    <RollingFile name="file_app-database" fileName="${log-path}/app-database.log"
      filePattern="${log-path}/app-database-%d{yyyy-MM-dd}.log" append="true" 
immediateFlush="false">
      <PatternLayout>
        <Pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5level %c{1} - %msg%n</Pattern>
      </PatternLayout>
    </RollingFile>
    <RollingFile name="file_app-clutter" fileName="${log-path}/app-clutter.log"
      filePattern="${log-path}/app-clutter-%d{yyyy-MM-dd}.log" append="true" 
immediateFlush="false">
      <PatternLayout>
        <Pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5level %c{1} - %msg%n</Pattern>
      </PatternLayout>
    </RollingFile>
    <RollingFile name="file_app-errors" fileName="${log-path}/app-errors.log"
      filePattern="${log-path}/app-errors-%d{yyyy-MM-dd}.log" append="true" 
immediateFlush="false">
      <PatternLayout>
        <Pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5level %c{1} - %msg%n</Pattern>
      </PatternLayout>
    </RollingFile>    
  </Appenders>

  <Loggers>
    <AsyncLogger name="org.apache.zookeeper" level="INFO" additivity="false" 
includeLocation="true">
      <AppenderRef ref="file_app-clutter"/>
    </AsyncLogger>
    <AsyncLogger name="org.apache.kafka.clients.consumer.ConsumerConfig" level="INFO" 
additivity="false" includeLocation="true">
      <AppenderRef ref="file_app-clutter"/>
    </AsyncLogger>
    <AsyncLogger name="APP_ERROR" level="ERROR" additivity="false" includeLocation="true">
      <AppenderRef ref="file_app-errors"/>
    </AsyncLogger>
    <AsyncLogger name="APP_DATABASE" level="DEBUG" additivity="false" includeLocation="true">
      <AppenderRef ref="file_app-database"/>
    </AsyncLogger>

    <Root level="INFO">
      <AppenderRef ref="file_root"/>
    </Root>

  </Loggers>
</Configuration>

1 Ответ

1 голос
/ 16 января 2020

Ваш вопрос мне не понятен.

  1. Почему вы не используете Log4j 2 API вместо пользовательского API?

  2. Почему у вас есть регистраторы с именами ERROR и Database? При нормальных соглашениях о маршрутизации события из регистраторов приложений никогда не будут их использовать.

Обычный API ведения журнала будет выглядеть следующим образом:

public int welcome(String myFriend, Permissions permissions) {
    int rc = 0;
    logger.traceEntry("Saying hello to {}", myFriend);
    logger.debug("Registering permissions for {}, myFriend);
    logger.info("Successfully Welcomed {}", myFriend);
    return logger.traceExit(rc);
}

Ожидаемый способ сделать это чтобы добавить информацию в ваши события регистрации. Например, если вы хотите регистрировать операторы SQL, создайте маркер с именем SQL, а затем добавьте MarkerFilter, чтобы только операторы SQL направлялись соответствующему Appender. Если вы хотите, чтобы вызовы из Hibernate направлялись в определенный файл, настройте Logger для org.hibernate и перенаправьте все события из этого в соответствующий Appender. Если вы хотите, чтобы ошибки отправлялись только в указанный файл c, настройте для Appender (или Appender-Ref, в зависимости от случая) ThresholdFilter, который допускает только события ошибок.

Чтобы использовать маркер, вы сначала объявляете его с помощью

Marker sqlMarker = MarkerManager.getMarker("SQL");

затем в коде, который вы сделаете:

logger.info(sqlMarker, "SQL: {}", sqlStatement);

наконец, в конфигурации, которую вы включите:

<Logger name="com.mycorp" level="info">
  <Appender-Ref ref="file_app-database">
    <MarkerFilter marker="SQL" onMatch="ACCEPT" onMisMatch="DENY"/>
  </Appender-Ref>
  <Appender-Ref ref="file_app-errors" level="error"/>    
</Logger>

В этом примере конфигурации будут маршрутизироваться любые журналы с использованием регистратор, чье имя имеет префикс «com.mycorp», чей уровень - «info», «warn», «debug» или «fatal» », и который имеет маркер SQL для Appender базы данных file_app. Журнал событий на уровне error будет перенаправлен в file_app-errors Appender.

Без лучшего описания того, что вы пытаетесь достичь, я не могу предоставить пример конфигурации.

Более подробную информацию вы можете найти по адресу: Маркеры и Фильтры . Вы также можете найти информацию о том, как использовать Log4j 2, прочитав некоторые из этих статей и руководств .

...