如何在 Windows 7 上启用 Mosquitto 代理的详细日志记录?

物联网 MQTT 蚊子 微软Windows
2021-05-29 00:48:14

我有一个以前的问题,为了更接近解决方案,我想在 Windows 7 上启用 Mosquitto 代理登录。

最初我手动启动了代理,如下所示:

mosquitto -p 1883 -v

-v表示详细的控制台日志记录。但这并没有提供足够的信息,只有在遇到我的问题时才提供以下行:

1486293976: Socket error on client <unknown>, disconnecting.

我已尝试执行此答案中描述的操作这是配置文件的日志记录部分:

# Note that if the broker is running as a Windows service it will default to
# "log_dest none" and neither stdout nor stderr logging is available.
# Use "log_dest none" if you wish to disable logging.
log_dest stdout

# If using syslog logging (not on Windows), messages will be logged to the
# "daemon" facility by default. Use the log_facility option to choose which of
# local0 to local7 to log to instead. The option value should be an integer
# value, e.g. "log_facility 5" to use local5.
#log_facility

# Types of messages to log. Use multiple log_type lines for logging
# multiple types of messages.
# Possible types are: debug, error, warning, notice, information, 
# none, subscribe, unsubscribe, websockets, all.
# Note that debug type messages are for decoding the incoming/outgoing
# network packets. They are not logged in "topics".
log_type error
log_type warning
log_type notice
log_type information

# Change the websockets logging level. This is a global option, it is not
# possible to set per listener. This is an integer that is interpreted by
# libwebsockets as a bit mask for its lws_log_levels enum. See the
# libwebsockets documentation for more details. "log_type websockets" must also
# be enabled.
#websockets_log_level 0

# If set to true, client connection and disconnection messages will be included
# in the log.
connection_messages true

# If set to true, add a timestamp value to each log message.
log_timestamp true

在这种情况下,我按如下方式启动了代理:

mosquitto -p 1883

-v选项将使用默认配置覆盖配置文件,所以我忽略了它。但是我在控制台上看不到日志记录。


而不是stdout我尝试登录到一个文件,并更改配置如下:

log_dest file d:\mosquitto.txt

我手动创建了该文件并以相同的方式启动了代理,但无济于事。


如果我不使用该-v选项,则不会收到任何日志消息应该如何正确操作?

4个回答

这就是我所做的。以下脚本保存为timestampLog.vbs:

Dim str
Do While Not WScript.StdIn.AtEndOfStream
  str = WScript.StdIn.ReadLine
  WScript.StdErr.WriteLine "[" & now & "]" & str
Loop

然后我从命令行运行它:

C:\Program Files\mosquitto>mosquitto_sub -t +/# -v | cscript //nologo timestampLog.vbs 2> C:\*USER*\Desktop\logfile.txt

您可能想要更改 mosquitto 文件夹的路径并将“logfile.txt”路径更改为您想要的任何路径。

如果这是您正在寻找的内容,我不知道,但其他人可能会喜欢此处提供的解决方案。打破命令行:

C:\Program Files\mosquitto> 是 Mosquitto 的本地文件夹

mosquitto_sub 是用来监听broker的.exe文件

-t +/#“-t”是给.exe文件提供信息来收听+/#的t opic,这是来自客户端的所有主题。“#”表示所有主题,甚至是经纪人创建的主题。\$SYS/#只会监听代理主题。可以有多个 -t (我认为)。

-v 是为 .exe 文件提供详细输出主题的信息,即还输出主题本身(不仅是它的值)。

| 是将第一个命令通过管道传输到脚本命令中。

cscript //nologo timestampLog.vbs就是用我们之前写的vbs脚本执行cscript.exe。 //nologo是告诉命令行提示符将 cscript.exe 输出信息输出到外部文件而不是提示符本身。

2> 告诉命令行提示符输出“StdErr”(这是我们告诉脚本将所有消息汇集到 .vbs 文件中的内容)。

C:\*USER*\Desktop\logfile.txt是输出的路径和文件名。您可能会考虑使用 .log 或其他格式来代替 .txt。

这个问题答案如何在 Windows 上运行的 Mosquitto 上启用 WebSockets?其实也回答了这个问题。

事实证明,必须在命令行中明确添加 Mosquitto 的配置文件。

当您从命令行运行 mosquitto 时,您必须使用 -c 选项明确指向配置文件

mosquitto -v -c /path/to/mosquitto.conf

在此之后,我能够获得有关套接字错误事件等的其他信息。

1489438223:mosquitto 版本 1.4.10(构建日期 24/08/2016 21:03:24.73)开始

1489438223:从 mosquitto.conf 加载的配置。

1489438223:在端口 1883 上打开 ipv6 侦听套接字。

1489438223:错误: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

1489438341:mosquitto 版本 1.4.10(构建日期 24/08/2016 21:03:24.73)开始

1489438341:从 mosquitto.conf 加载的配置。

1489438341:在端口 1883 上打开 ipv6 侦听套接字。

1489438341:在端口 1883 上打开 ipv4 侦听套接字。

1489438363:来自 192.168.1.4 的新连接在端口 1883 上。

1489438363:新客户端从 192.168.1.4 以 root.1489438369381(c1、k60、u'phone')连接。

1489438363:发送 CONNACK 到 root.1489438369381 (0, 0)

1489438363:收到来自 root.1489438369381 的订阅

1489438363:房间/湿度(QoS 1)

1489438363:root.1489438369381 1室/湿度

1489438363:发送 > SUBACK 到 root.1489438369381

1489438453:客户端 root.1489438369381 已超过超时,断开连接。

1489438453:客户端 root.1489438369381 上的套接字错误,断开连接。

  1. 日志负载

    如果要记录PUBLISH消息payload,这里我在mosquitto v1.5.3源中添加custome log:

    来源在 Git Hub 上

    //只显示ASCII有效载荷,二进制数据可能会破坏终端。

  2. mosquitto.conf 中的用法:

    日志类型有效载荷

  3. 结果

    日志变成:

    1542293777: Received PUBLISH from client_20454 (d0, q0, r0, m0, '$rpc/device1/client_20454/25MhY4xUwiMZIuytfb89Vjrh4QU=/req', ... (64 bytes))
    1542293777: > payload: '{"method":"ServerExposed.Ping","params":[{"Num":20454}],"id":0}'
    1542293777: Sending PUBLISH to device1 (d0, q0, r0, m0, '$rpc/device1/client_20454/25MhY4xUwiMZIuytfb89Vjrh4QU=/req', ... (64 bytes))
    
    1542293777: Received PUBLISH from device1 (d0, q0, r0, m0, '$rpc/device1/client_20454/25MhY4xUwiMZIuytfb89Vjrh4QU=/res', ... (57 bytes))
    1542293777: > payload: '{"id":0,"result":{"Done":true,"Num":20454},"error":null}'
    1542293777: Sending PUBLISH to client_20454 (d0, q0, r0, m0, '$rpc/device1/client_20454/25MhY4xUwiMZIuytfb89Vjrh4QU=/res', ... (57 bytes))
    

我不久前发现了这个,但我无法归因于原作者。适用于现有日志,但不能使用此解决方案“tail -f”:

sudo cat /var/log/mosquitto/mosquitto.log | grep -v datab|perl -pe 's/(\d+)/localtime($1)/e'

在 linux 上使用它,但应该在 WSL/cygwin 上工作。