首页 > 解决方案 > 试图覆盖 vert.x 使用的 JUL 记录器

问题描述

我想使用 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" );
    }
....
}

然后我从这个verticle部署我的HttpVerticle,在HTTP verticle中,我尝试使用参数化语句,但这些语句不起作用。所以我添加了几个日志语句来显示正在使用的记录器委托,以及系统属性:

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

对于字母“b”的传入消息:

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

我尝试在 pom.xml 文件和命令行中使用 -D 参数设置系统属性。

这是 vert.x 3.5.3

关于我忘记做什么的任何想法?

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

编辑:从评论线程中捕获要点。

  1. 无法在 verticle 中设置系统属性,因为 vert.x JUL 记录器在主 verticle 之前启动。
  2. 使用 vertx 插件运行代码时,无法在 pom.xml 中设置 ...。mvn vertx 插件必须在 vertx 初始化后被调用。
  3. 似乎可以覆盖 JUL 记录器的唯一方法是命令行,使用 -D vargs。
  4. 不要忘记在 -jar 开关之前设置 vargs,即 $ java -Dx=y -jar jarname.jar

标签: vert.xvertx-verticle

解决方案


如果使用命令行启动,可以使用-Dvertx.logger-delegate-factory-class-name=io.vertx.core.logging.Log4j2LogDelegateFactory. 这是最简单的。

当然也可以直接在代码中通过System.setProperty进行设置,和-D设置一样,但是必须在LoggerFactory初始化之前进行。显然你在 Verticle 子类中的代码必须在 Vertx 初始化成功后执行。LoggerFactory 已经初始化。


推荐阅读