Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将java记录器输出MQTT重定向到特定MQTT代理上的主题_Java_Logging_Mqtt_Iot - Fatal编程技术网

如何将java记录器输出MQTT重定向到特定MQTT代理上的主题

如何将java记录器输出MQTT重定向到特定MQTT代理上的主题,java,logging,mqtt,iot,Java,Logging,Mqtt,Iot,我有一个java程序在IOT设备上收集能量数据,它通过MQTT发送到节点RED,以便在流入时存储,并通过Grafana呈现。出于调试目的,我还通过MQTT将单独主题上的简单日志消息发送到Node RED。我可以通过SSH在我的物联网设备(一个RPi Zero W)上获得控制台,但它非常慢而且不可靠。我希望使用java系统记录器进行日志记录,但我希望将输出格式化为可读字符串或json,并发送到我在MQTT代理上指定的主题。 那么,是否有一个日志处理程序可用于执行此操作,或者我将如何编写一个日志处理

我有一个java程序在IOT设备上收集能量数据,它通过MQTT发送到节点RED,以便在流入时存储,并通过Grafana呈现。出于调试目的,我还通过MQTT将单独主题上的简单日志消息发送到Node RED。我可以通过SSH在我的物联网设备(一个RPi Zero W)上获得控制台,但它非常慢而且不可靠。我希望使用java系统记录器进行日志记录,但我希望将输出格式化为可读字符串或json,并发送到我在MQTT代理上指定的主题。 那么,是否有一个日志处理程序可用于执行此操作,或者我将如何编写一个日志处理程序

我当前的日志程序如下所示,它从共享的字符串队列中提取日志消息

public class PMLogger extends Thread
{
    String msg;
    LinkedBlockingQueue<String> loggingQ;

    public PMLogger(LinkedBlockingQueue<String> logQ)
    {
        this.loggingQ = logQ;
    }

    //
    // Runnable implementation
    //
    @Override
    public void run()
    {
        try {
            Thread.sleep(1000); // wait for publisher to be set up
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        MQTTHandler publisher = Main.getMqttHandler();
        String json;
        boolean exit = false;
        try {
            while (!(interrupted() || exit)) {
                msg = loggingQ.take();
                if (msg.equalsIgnoreCase("exit")) {
                    exit = true;
                } //poison pill
                json = "{\"Time\":" +
                        "\"" + Instant.now().toString() + "\"," +
                        "\"LogMsg\":" +
                        "\"" + msg + "\"}";
                publisher.logToBroker(json);
                Thread.sleep(10);
            }
        } catch (InterruptedException | NullPointerException e) {
            e.printStackTrace();
            exit = true;
        }
    }
}
公共类PMLogger扩展线程
{
串味精;
LinkedBlockingQueue loggingQ;
公共PMLogger(LinkedBlockingQueue logQ)
{
this.loggingQ=logQ;
}
//
//可运行的实现
//
@凌驾
公开募捐
{
试一试{
Thread.sleep(1000);//等待发布服务器设置
}捕捉(中断异常e){
e、 printStackTrace();
}
MQTTHandler publisher=Main.getMqttHandler();
字符串json;
布尔退出=假;
试一试{
而(!(中断()| |退出)){
msg=loggingQ.take();
如果(消息equalsIgnoreCase(“退出”)){
退出=真;
}//毒丸
json=“{\”时间\”:+
“\”“+Instant.now().toString()+”\“,”+
“\“LogMsg\”:”+
“\”“+msg+”\“}”;
publisher.logToBroker(json);
睡眠(10);
}
}捕获(InterruptedException | NullPointerException e){
e、 printStackTrace();
退出=真;
}
}
}

我发现在解释术语方面很有用,通读了这些术语之后,我相信我正在寻找一个与MQTT一起工作的appender,它是与java日志相关的任何东西的好选择,无需重新发明轮子。您可以使用任何想要的文件格式登录。

我不想要通过MQTTOk发送的文件,您可以通过SLF4J实现这一点。在阅读了SLF4J的介绍之后,它似乎被定位为面向其他日志系统的框架(尽管它确实有组成独立日志系统的组件)。我不需要它提供的隔离层,只需要一个新的appender。我希望使用标准记录器的前端,但使用MQQT处理程序重定向后端,所以这是正确的,谢谢