Попытка переопределить регистратор JUL, используемый vert.x

Я хотел бы использовать Log4j2, и для этого я настраиваю свою MainVerticle с системными свойствами,

public class MainVerticle extends AbstractVerticle
{
    static {
        System.setProperty( "vertx.logger-delegate-factory-class-name",
                            "io.vertx.core.logging.Log4j2LogDelegateFactory" );
        System.setProperty( "log4j2.debug", "true" );
    }
....
}

Затем я развертываю свою HttpVerticle из этой статьи, а в HTTP-статье я пытаюсь использовать параметризованные операторы, которые не работают. Поэтому я добавил пару операторов ведения журнала, чтобы показать используемый делегат средства ведения журнала, а также системное свойство:

public class HttpServerVerticle extends AbstractVerticle
{
    private static final Logger LOGGER = LoggerFactory.getLogger( HttpServerVerticle.class );

    @Override
    public void start() throws Exception
    {
        LOGGER.info( System.getProperty( "vertx.logger-delegate-factory-class-name" ) );
        LOGGER.info( LOGGER.getDelegate().getClass().getName() );
        ....

И ниже в обработчике входящего сообщения я использую это:

LOGGER.info( "Chat message received: {}" + message.body(), message.body() );

Обратите внимание, что я добавляю message.body (), используя конкатенацию, чтобы доказать, что сообщение не является пустой строкой.

Вывод этих операторов журнала:

[INFO] Sep 24, 2018 2:46:09 AM ca.LinkEdTutoring.chat.http.HttpServerVerticle
[INFO] INFO: io.vertx.core.logging.Log4j2LogDelegateFactory
[INFO] Sep 24, 2018 2:46:09 AM ca.LinkEdTutoring.chat.http.HttpServerVerticle
[INFO] INFO: io.vertx.core.logging.JULLogDelegate

и для входящего сообщения на букву «Ъ»:

[INFO] INFO: Chat message received: {}b

Я пробовал установить системные свойства в файле pom.xml и в командной строке с аргументами -D.

Это с vert.x 3.5.3

Есть мысли о том, что я забыл сделать?

================

РЕДАКТИРОВАТЬ: захват основных моментов из цепочки комментариев.

  1. Невозможно установить системные свойства в вертикальной статье, потому что регистратор vert.x JUL запускается перед основной вертикалью.
  2. невозможно установить ... в pom.xml при запуске кода с плагином vertx. Плагин mvn vertx должен быть вызван после инициализации vertx.
  3. единственный способ переопределить регистратор JUL - это командная строка с использованием -D vargs.
  4. не забывайте, что vargs устанавливаются перед переключателем -jar, т.е. $ java -Dx = y -jar jarname.jar

person Robin Coe    schedule 24.09.2018    source источник
comment
Очень часто установка свойств системы в коде не работает, потому что к моменту выполнения статического кода система регистрации уже инициализирована. Хотя установка системного свойства с -D при запуске у меня работает.   -  person tsegismont    schedule 24.09.2018
comment
java -jar chatsrv-0.0.1-SNAPSHOT.jar -Dvertx.logger-delegate-factory-class-name = io.vertx.core.logging.Log4j2LogDelegateFactory -Dlog4j2.debug = true 25 сентября 2018 г. 00:51:14 ca.LinkEdTutoring.chat.MainVerticle   -  person Robin Coe    schedule 25.09.2018
comment
25 сентября 2018 г. 00:51:16 ca.LinkEdTutoring.chat.http.HttpServerVerticle INFO: io.vertx.core.logging.Log4j2LogDelegateFactory 25 сентября 2018 г. 00:51:16 ca.LinkEdTutoring.chat.httpServerVerticle : io.vertx.core.logging.JULLogDelegate 25 сентября 2018 г. 00:51:33 ca.LinkEdTutoring.chat.http.HttpServerVerticle INFO: Получено сообщение чата: {} chat   -  person Robin Coe    schedule 25.09.2018
comment
Я согласен с тем, что статический блок проигрывает в состоянии гонки на этапе инициализации ядра vertx. Хороший улов. К сожалению, такое же поведение с командной строкой.   -  person Robin Coe    schedule 25.09.2018
comment
Осознал свою ошибку с вызовом cli ... Я новичок ... вам нужно указать vargs ПЕРЕД переключателем -jar. Сейчас работает.   -  person Robin Coe    schedule 25.09.2018
comment
Кстати ... для тех, кто находится в той же ситуации, что и я, использование $ mvn vertx: run не позволяет вам устанавливать системные свойства в pom.xml для переопределения JUL. Кажется, единственный способ переопределить поведение журнала - это переключатель командной строки после упаковки jar.   -  person Robin Coe    schedule 25.09.2018


Ответы (1)


Если для запуска вы используете командную строку, вы можете настроить ее с помощью -Dvertx.logger-delegate-factory-class-name=io.vertx.core.logging.Log4j2LogDelegateFactory. Это самый простой способ.

Конечно, вы также можете установить его непосредственно в коде через System.setProperty, который совпадает с параметром -D, но это должно быть сделано до инициализации LoggerFactory. Очевидно, что ваш код в подклассе Verticle должен быть выполнен после успешной инициализации Vertx. LoggerFactory уже инициализирован.

person 严尚君    schedule 15.10.2018