启动Mosquitto后,我们可以看到Mosquitto的启动日志:

1515307521: mosquitto version 1.4.12 (build date 2017-06-01 13:03:46+0000) starting
1515307521: Config loaded from /mosquitto/conf/mosquitto.conf.
1515307521: Opening ipv4 listen socket on port 1883.
1515307521: Opening ipv6 listen socket on port 1883.

Mosquitto服务器的日志格式:第一列数字(例如1515307521)表示该条日志打印的Unix时间戳;第二列则是具体的日志信息。根据启动日志的最后两行信息,我们可以很清楚地知道,我们所启动的Mosquitto服务器正在监听的TCP端口为1883,这是Mosquitto服务器默认监听的TCP端口。

客户端建立连接、订阅消息的日志

现在使用MQTT客户端连接Mosquitto服务器(1883端口)并向服务器发起消息订阅,正常情况下我们可以看到Mosquitto服务器输出的日志如下所示:

1515309375: New connection from 172.17.0.1 on port 1883.
1515309375: New client connected from 172.17.0.1 as mqtt-client-NWq09wrg (c0, k60).
1515309375: Sending CONNACK to mqtt-client-NWq09wrg (0, 0)
1515309375: Received SUBSCRIBE from mqtt-client-NWq09wrg
1515309375: topic/sub/test (QoS 2)
1515309375: mqtt-client-NWq09wrg 2 topic/sub/test
1515309375: Sending SUBACK to mqtt-client-NWq09wrg

第1行日志表示MQTT客户端成功与Mosquitto服务器建立TCP连接,客户端IP为 172.17.0.1,连接TCP端口为1883。

第2行日志显示了MQTT客户端向Mosquitto服务器提交建立连接的请求(客户端调用connect接口)。日志中包含了客户端请求建立连接的一些参数,如:

  • mqtt-client-NWq09wrg —— 表示客户端ID(clientId)
  • c0 —— 表示客户端将cleanSession标识设置为false,即不清除session
  • k60 —— 表示客户端将keep alive设置为60秒,即MQTT客户端与Mosquitto服务器的心跳时间间隔为60秒

第3行日志表示Mosquitto服务器接受了客户端的建立连接请求,并向客户端返回建立连接请求的响应。

第4~5行日志表示Mosquitto服务器收到了来自客户端mqtt-client-NWq09wrg订阅消息的请求,订阅的消息主题为topic/sub/test,消息质量为QoS 2。

第6~7行日志表示Mosquitto服务器接受了客户端的消息订阅请求,并向客户端返回订阅请求的响应。

特别注意:Mosquitto服务器不允许有多个客户端同时使用同一个客户端ID(clientId)与其保持连接,如果有多个客户端使用了同一个客户端ID来与Mosquitto建立连接,Mosquitto服务器只保留最新的一个客户端连接并关闭旧的连接。具体日志如下所示:2~4行即为Mosquitto服务器关闭旧连接,接受新连接的过程。

1515314560: New connection from 172.17.0.1 on port 1883.
1515314560: Client mqtt-client-NWq09wrg already connected, closing old connection.
1515314560: Client mqtt-client-NWq09wrg disconnected.
1515314560: New client connected from 172.17.0.1 as mqtt-client-NWq09wrg (c1, k60).
1515314560: Sending CONNACK to mqtt-client-NWq09wrg (0, 0)
1515314560: Received SUBSCRIBE from mqtt-client-NWq09wrg
1515314560: topic/sub/test (QoS 2)
1515314560: mqtt-client-NWq09wrg 2 topic/sub/test
1515314560: Sending SUBACK to mqtt-client-NWq09wrg

客户端与Mosquitto保持心跳的日志

MQTT客户端成功与Mosquitto服务器建立连接后,会按照连接时设置的keep alive时间间隔定时向服务器发送心跳请求数据包——PINGREQ;服务器收到客户端的心跳请求数据包后,正常情况下会向客户端回复心跳响应数据包——PINGRESP。心跳日志如下所示:

1515313742: Received PINGREQ from mqtt-client-NWq09wrg
1515313742: Sending PINGRESP to mqtt-client-NWq09wrg

客户端主动取消订阅、断开连接的日志

MQTT客户端分别调用unsubscribe接口和disconnect接口来向服务器发送取消消息主题订阅的请求(UNSUBSCRIBE)和请求断开与服务器连接的请求(DISCONNECT)时,Mosquitto服务器输出的日志如下所示:

1515315086: Received UNSUBSCRIBE from mqtt-client-NWq09wrg
1515315086: topic/sub/test
1515315086: mqtt-client-NWq09wrg topic/sub/test
1515315086: Received DISCONNECT from mqtt-client-NWq09wrg
1515315086: Client mqtt-client-NWq09wrg disconnected.

发布消息的日志

MQTT客户端调用publish接口向Mosquitto服务器发布消息(使用QoS 2),服务器输出的日志如下所示:

1515317711: Received PUBLISH from mqtt-client-NWq09wrg (d0, q2, r0, m1, 'topic/pub/test', ... (62 bytes))
1515317711: Sending PUBREC to mqtt-client-NWq09wrg (Mid: 1)
1515317711: Received PUBREL from mqtt-client-NWq09wrg (Mid: 1)
1515317711: Sending PUBCOMP to mqtt-client-NWq09wrg (Mid: 1)

QoS 2为MQTT协议最高等级的消息服务质量,这意味着每条发布的消息都会先存储在发送方和接收方本地,直到已处理此消息为止。消息的发送方和接收方通过一系列的来回握手的过程来确认消息是否已经被成功处理,以上的日志就表示着这个握手的过程:

第1行日志:表示Mosquitto服务器接收到了客户端mqtt-client-NWq09wrg发布的消息,日志包含了一些与发布的消息相关的参数:

  • d —— 表示MQTT协议报头的DUP字段
  • q —— 表示MQTT的消息服务质量QoS,这里q2即所发布消息的QoS为2
  • r —— 表示MQTT的retain标识
  • m —— 表示消息ID(messageId:MQTT发布的每条消息都有一个唯一的messageId,亦即Mid),这里所发布消息的ID为1
  • topic/pub/test —— 所发布消息的主题
  • (62 bytes) —— 表示所发布消息的大小,单位字节

第2行日志:表示Mosquitto服务器向客户端(消息发布方)回复收到发布消息的响应(PUBREC),告诉客户端此条消息已经成功收到并暂时缓存在Mosquitto服务器本地。

第3行日志:表示客户端成功收到服务器的发布消息响应(PUBREC),并向Mosquitto服务器发起释放消息的请求(PUBREL)。
第4行日志:表示Mosquitto服务器收到客户端的释放消息请求(PUBREL)后,向客户端返回消息成功发布的响应(PUBCOMP),客户端收到此响应后,才会认为该条消息成功发布并删除该条消息的本地缓存。

对于QoS为2的消息,其发布过程都会经历以上四个阶段:消息预发布(PUBLISH)-> 消息预发布确认(PUBREC)-> 消息释放(PUBREL)-> 消息成功发布(PUBCOMP);而对于QoS0或QoS1的消息,其发布过程则比较简单,没有这么复杂的过程,所以QoS2的消息是最耗时也是最耗资源的。

客户端连接超时,服务器主动清除连接信息

1403336671: Client 33303A33393A3236003V0 has exceeded timeout, disconnecting.

客户端Socket异常时的日志

终止客户端程序(异常网络断开),服务器将提示:Socket Error

1403337602: Socket error on client 351BBJKFX62C1, disconnecting.
1403337602: Socket error on client 351BBJKFX62C0, disconnecting.

Mosquitto服务器的日志分析的更多相关文章

  1. Linux服务器access_log日志分析及配置详解(二)

    默认nginx / Linux日志在哪个文件夹? 一般在 xxx.xxx.xxxx.com/home/admin 路径下面的error.log文件和access.log文件error_log logs ...

  2. Linux服务器access_log日志分析及配置详解(一)

    nginx的log日志分为access log 和 error log 其中access log 记录了哪些用户,哪些页面以及用户浏览器.ip和其他的访问信息 error log 则是记录服务器错误日 ...

  3. Hybris服务器启动日志分析

    build文件检测,使用b2c_acc recipit启动服务器:/home/jerrywang/Hybris/installer/recipes/b2c_acc/build.gradle The T ...

  4. Eventlog Analyzer日志管理系统、日志分析工具、日志服务器的功能及作用

    Eventlog Analyzer日志管理系统.日志分析工具.日志服务器的功能及作用 Eventlog Analyzer是用来分析和审计系统及事件日志的管理软件,能够对全网范围内的主机.服务器.网络设 ...

  5. 网站运维之 使用IIS日志分析器1.03.exe进行IIS服务器日志分析

    引言 对于网站运维是一个比较要细心有耐心的工作,当一个网站从开发到上线后,后期的维护也很关键,特别是对于引流的网站来说更是至关重要. 对于网站运维的内容大致可以分为: SEO流量监控方面:风险防控:访 ...

  6. nginx高性能WEB服务器系列之八--nginx日志分析与切割

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  7. 【转】gc日志分析工具

    性能测试排查定位问题,分析调优过程中,会遇到要分析gc日志,人肉分析gc日志有时比较困难,相关图形化或命令行工具可以有效地帮助辅助分析. Gc日志参数 通过在tomcat启动脚本中添加相关参数生成gc ...

  8. ELK+Kafka集群日志分析系统

    ELK+Kafka集群分析系统部署 因为是自己本地写好的word文档复制进来的.格式有些出入还望体谅.如有错误请回复.谢谢! 一. 系统介绍 2 二. 版本说明 3 三. 服务部署 3 1) JDK部 ...

  9. Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

    网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例 ...

随机推荐

  1. [LeetCode]121、122、309 买股票的最佳时机系列问题(DP)

    121.买卖股票的最佳时机 题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意 ...

  2. python字符串和列表小案例

    python 目录 python 一.字符串 1.给定一个字符串,利用切片将字符串反转 2.给定一个字符串,将空格替换为逗号 3.给定一个字符串,大写改为小写 4.str = '' ,li = ['l ...

  3. 阿里服务器docker部署

    首先本人是购买的阿里云服务器,虽然是1g的内存,不过部署一些项目还是没问题的,学生也有一个优惠服务器,好像是70多2g内存的,还是很舒服的,学生党可以试着部署一下,下面呢我就说一下我自己部署的步骤: ...

  4. ams入门了解

    另一篇介绍文  https://www.cnblogs.com/clds/p/4985893.html 转载自https://www.cnblogs.com/onlysun/p/4533798.htm ...

  5. hystrix文档翻译之插件

    插件 可以通过实现插件来改变Hystrix的行为.可以通过HystrixPlugins来注册自定义插件,这些插件会被应用到HystrixCommand,HystrixObservableCommand ...

  6. python爬取新浪财经

    我们来获取这里的title和url然后再获取这里面url的编辑作者 可以看到右边的几个就对应的左边不同的div .m-p1-mb2-list.m-list-container ul li a impo ...

  7. 一个提高N倍系统新能的编程点,却总是被普通开发们遗忘

    位运算这个概念并不陌生,大多数程序员在进入这个领域的时候或多或少都接触过位运算,估计当时都写过不少练习题的. 位运算本身不难,困难的是大家没有学会在系统设计时用上它,提高系统性能,增加你的不可替代性. ...

  8. 手把手教你在容器服务 TKE 上使用 LB 直通 Pod

    什么是 LB 直通 Pod ? Kubernetes 官方提供了 NodePort 类型的 Service,即给所有节点开一个相同端口用于暴露这个 Service,大多云上 LoadBalancer ...

  9. 刷题[安恒DASCTF2020四月春季赛]Ez unserialize

    解题思路 打开直接源码,没别的,审就完事了 代码审计 <?php show_source("index.php"); function write($data) { retu ...

  10. PHP:文件包含漏洞

    简单记录一些文件包含漏洞的常用方法 产生原因: 文件包含漏洞的产生原因是在通过引入文件时,由于传入的文件名没有经过合理的校验,或者校检被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意 ...