【问题标题】:How forward org.eclipse.paho.client.mqttv3.logging.Logger to my logs如何将 org.eclipse.paho.client.mqttv3.logging.Logger 转发到我的日志
【发布时间】:2021-03-05 02:54:19
【问题描述】:

我在我的 tomcat9 服务中使用 AWS IoT 库

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-iot-device-sdk-java</artifactId>
    <version>1.3.7</version>
</dependency>

我想知道是否可以将 org.eclipse.paho.client.mqttv3.logging.Logger 的所有日志打印到我的日志文件/控制台中?所有的跟踪日志都是这样的:

//@TRACE 603=clearState
log.fine(CLASS_NAME, methodName,">");

我该怎么做?

更新 - 我的代码:

Service.java

static {
  MyManager manager = new MyManager();
}

MyManager.java

public MyManager() {
  iotClient = new AWSIotMqttClient(Configuration.IOT_CLIENT_ENDPOINT,
                    deviceId,
                    keyStore,
                    keystorePass);
    
  iotClient.setKeepAliveInterval(30000); //30 seconds       
  iotClient.connect();
}

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Configuration status="warn">
    <Properties>
        <Property name="basePath">${sys:catalina.base}/logs</Property>
    </Properties>
 
    <Appenders>
        <RollingFile name="fileLogger" fileName="${basePath}/app-info.log" filePattern="${basePath}/app-info-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
 
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug" additivity="false">
            <appender-ref ref="console" />
            <appender-ref ref="fileLogger" level="info" />
        </Root>
    </Loggers>
</Configuration>

例如我感兴趣的日志: 由于iotClient.setKeepAliveInterval(30000) 这一行,iot 客户端在org.eclipse.paho.client.mqttv3.internal.ClientState#checkForActivity 中每 30 秒发送一次 ping 请求,我想在此过程中获取所有日志。

谢谢。

【问题讨论】:

  • 您在应用程序中使用的日志库是什么?
  • 我的服务使用的是Log4j2
  • 是使用 SL4J 还是普通的 Log4j2 ?
  • 与SL4J一起

标签: java logging mqtt aws-iot levels


【解决方案1】:

您将 Log4j2 与 SL4J 一起使用,但默认情况下 Eclipse MQTT 使用 JUL logging,因此您也需要 log4j-jul 依赖项。 此外,您可能需要设置以下属性-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager 一旦你有了这些,你就可以为适当的包配置日志级别——例如

<Logger name="org.eclipse.paho.client.mqttv3"  level="FINE" />

在我的测试程序中,当我按上述方式进行配置时 - 我可以看到如下跟踪/精细级别日志

2021-03-01 13:05:45,825 SimpleAsyncTaskExecutor-1 TRACE Call to LogManager.getLogger(org.eclipse.paho.client.mqttv3.internal.Token)
2021-03-01 13:05:46,138 SimpleAsyncTaskExecutor-1 TRACE Call to LogManager.getLogger(org.eclipse.paho.client.mqttv3.internal.Token)

***********************************************************************
Message Arrived at Time: 2021-03-01 13:05:46.137  Topic: testTopic  Message: retain
***********************************************************************

下面是我的 Log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout
                pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
    </Appenders>
    
    <Logger name="org.eclipse.paho.client.mqttv3"  level="FINE" />
    
    <Loggers>
        <Root level="INFO" additivity="false">
            <AppenderRef ref="console" />
        </Root>
    </Loggers>
</Configuration>

更新:虽然我的代码不使用 AWS IOT 库,但我正在从我的代码(它使用 MQTT 客户端库)连接到测试 MQTT 服务器,并且当我通过 keep-alive 间隔时2 秒并将日志置于 trace/fine - 我可以在日志中看到 ping 消息,如下所示

2021-03-05 00:19:08,782 MQTT Ping: demoClient1 TRACE Call to LogManager.getLogger(org.eclipse.paho.client.mqttv3.internal.Token)
2021-03-05 00:19:10,692 SimpleAsyncTaskExecutor-1 TRACE Call to LogManager.getLogger(org.eclipse.paho.client.mqttv3.internal.Token)
2021-03-05 00:19:10,802 MQTT Ping: demoClient1 TRACE Call to LogManager.getLogger(org.eclipse.paho.client.mqttv3.internal.Token)
2021-03-05 00:19:12,712 SimpleAsyncTaskExecutor-1 TRACE Call to LogManager.getLogger(org.eclipse.paho.client.mqttv3.internal.Token)
2021-03-05 00:19:12,812 MQTT Ping: demoClient1 TRACE Call to LogManager.getLogger(org.eclipse.paho.client.mqttv3.internal.Token)
2021-03-05 00:19:14,702 SimpleAsyncTaskExecutor-1 TRACE Call to LogManager.getLogger(org.eclipse.paho.client.mqttv3.internal.Token)
2021-03-05 00:19:14,822 MQTT Ping: demoClient1 TRACE Call to LogManager.getLogger(org.eclipse.paho.client.mqttv3.internal.Token)

【讨论】:

  • 1.我需要在哪里添加这个:? 2.对于这个Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager我可以使用System.setProperty吗?
  • 这应该在你的日志配置文件中——通常命名为 log4j2.xml 并放在类路径中。对于基于 maven 的项目 - 通常位置是 src/main/resources。对于管理器,您可以在程序或 tomcat 启动脚本中的 java_opts 中传递它。您也可以尝试通过 System.setProperty 进行设置,但您需要尝试一下。
  • 它对我不起作用。你能发布你的 log4j2.xml 吗?我正在使用带有 log4j2 的 tomcat。
  • 你能在 github 上发布你的最小可行代码吗(删除任何额外或敏感的代码)。由于您的问题仅与日志记录有关,因此您应该能够这样做。
  • @Rougher - 查看我更新后的答案,其中来自 mqtt 客户端库的 ping 日志正在控制台中打印。
猜你喜欢
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2021-06-21
  • 2017-09-07
  • 2014-05-25
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
相关资源
最近更新 更多