Как изменить уровни ведения журнала / настройки клиента Kafka? - PullRequest
0 голосов
/ 01 апреля 2020

Я использую простой Java проект для запуска (без фреймворка) производителя и потребителя Kafka.

Я пытаюсь контролировать журналы, генерируемые кодом KafkaProducer и KafkaConsumer и Я не могу повлиять на это, используя конфигурацию log4j.properties:

log4j.rootLogger=ERROR,stdout

log4j.logger.kafka=ERROR,stdout
log4j.logger.org.apache.kafka.clients.producer.ProducerConfig=ERROR,stdout
log4j.logger.org.apache.kafka.common.utils.AppInfoParser=ERROR,stdout
log4j.logger.org.apache.kafka.clients.consumer.internals.AbstractCoordinator=ERROR,stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d] %p %m (%c)%n

Тем не менее я получаю вывод журнала, как показано ниже, независимо от настроек, которые я предоставляю в файле log4j.properties:

[main] INFO org.apache.kafka.clients.producer.ProducerConfig - ProducerConfig values:
...
[main] INFO org.apache.kafka.clients.producer.ProducerConfig - ProducerConfig values:
...
[main] INFO org.apache.kafka.clients.producer.ProducerConfig - ProducerConfig values:
...
[main] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator - [Consumer clientId=UM00160, groupId=string-group] (Re-)joining group

Как я могу контролировать ведение журнала клиентской библиотеки Kafka? Чего мне не хватает, чтобы связать мой log4j.properties файл с логированием клиентской библиотеки Kafka? Чтобы не спамить вывод, я должен запустить тест Maven, используя: mvn test 2> /dev/null. Могу ли я настроить это через log4j.properties.

Контекст:

У меня есть следующие соответствующие файлы:

── test
   ├── java
   │   └── com
   │       └── example
   │           ├── PropertyReader.java
   │           └── strings
   │               └── TestKafkaStringValues.java
   └── resources
       ├── application.properties
       └── log4j.properties

И я пытаюсь чтобы запустить оба TestKafkaStringValues.java, используя подключаемый модуль Maven surefire (mvn test) или подключаемый модуль Eclipse JUnit (эквивалентный java ...).

Для уверенного использования в Maven pom.xml используется следующая конфигурация:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <systemPropertyVariables>
            <log4j.configuration>file:log4j.properties</log4j.configuration>
        </systemPropertyVariables>
    </configuration>
</plugin>

и для JUnit я использую следующий Java VM аргумент: -Dlog4j.configuration=log4j.properties.

Я также пытался в обоих случаях использовать абсолютный путь к log4j.properties. Все еще не работает.

Вы можете увидеть полный код здесь .

1 Ответ

0 голосов
/ 01 апреля 2020

Проблема в приведенном выше коде заключалась в том, что зависимости времени выполнения Maven (фактическая реализация ведения журнала Log4j отсутствовала). В pom была предоставлена ​​реализация ведения журнала slf4j-simple. Эта реализация:

  • может печатать журналы Kafka на стандартный вывод
  • НЕ способен понять свойства log4j.properties или -Dlog4j.*.

Следовательно , однажды пришлось бы включить в реализацию Log4J. Здесь можно было бы выбрать Log4j 1.x (Конец срока службы) или Log4j2 .

При следующей конфигурации можно иметь очень комплексный / детальный контроль над ведением журнала (включая клиентов Kafka).

В pom.xml:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.13.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.13.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.13.1</version>
    <scope>test</scope>
</dependency>

В то время как log4j-api и log4j-core являются минимальными требованиями, которые вы бы предъявляли нужно. Чтобы Log4j2 мог управлять / настраивать также библиотеки / компоненты, написанные поверх SLF4J (а клиент Kafka - это такая библиотека), вам нужно добавить 3-ю зависимость: log4j-slf4j-impl.

ПРИМЕЧАНИЕ: Обратите внимание, что для библиотек, использующих SLF4J 1.8.x и выше, вам понадобится другая версия этого адаптера Log4j-SLF4J. См. для получения дополнительной информации .

Теперь, что касается настройки ведения журнала, Log4j2 автоматически загружает файлы конфигурации и находит их, автоматически выполняя поиск в нескольких местах. .

Если вы поместите следующий файл log4j2.properties в classpath ресурса (в src/java/resources/ для основного кода и в src/test/resource для тестового кода), вы получите желаемый результат:

rootLogger.level = info
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT

appenders = stdout

appender.stdout.name = STDOUT
appender.stdout.type = Console
appender.stdout.layout.type = PatternLayout
appender.stdout.layout.pattern =%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%t] %c - %m%n

loggers = kafka, kafka-consumer

logger.kafka.name = org.apache.kafka
logger.kafka.level = warn

logger.kafka-consumer.name = org.apache.kafka.clients.consumer
logger.kafka-consumer.level = info

В приведенном выше примере вся запись ведется в stdout и: * root регистратор ведет запись info и выше * все org.apache.kafka журналы регистрации с префиксами warn и выше * все org.apache.kafka.clients.consumer с регистраторами с префиксом info и выше

Вот некоторые дополнительные наблюдения при использовании Log4j2:

  • , если вам нужна конфигурация JSON или YAML, вам нужны дополнительные зависимости
  • плагин JUnit в Eclipse автоматически завершит работу без вывода, если конфигурация Log4j неверна. Вывод mvn покажет вам ошибку.
...