Skip to content

Commit a6baf60

Browse files
committed
add MQTT handler example
1 parent ebf01e1 commit a6baf60

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

examples/logging_mqtt_handler.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"""
2+
Demonstrate how to use a single logger to emit log records to
3+
both console and MQTT broker, in this case Adafruit IO.
4+
"""
5+
6+
import json
7+
import socket
8+
import ssl
9+
10+
import adafruit_logging as logging
11+
import adafruit_minimqtt.adafruit_minimqtt as MQTT
12+
13+
from mqtt_handler import MQTTHandler
14+
15+
logger = logging.getLogger(__name__)
16+
17+
broker = "io.adafruit.com"
18+
port = 8883
19+
username = "Adafruit_IO_username"
20+
password = "Adafruit_IO_key"
21+
feedname = "Adafruit_feed_name"
22+
mqtt_topic = f"{username}/feeds/{feedname}"
23+
mqtt_client = MQTT.MQTT(
24+
broker=broker,
25+
port=port,
26+
username=username,
27+
password=password,
28+
socket_pool=socket,
29+
ssl_context=ssl.create_default_context(),
30+
)
31+
mqtt_client.connect()
32+
mqtt_handler = MQTTHandler(mqtt_client, mqtt_topic)
33+
print("adding MQTT handler")
34+
logger.addHandler(mqtt_handler)
35+
36+
stream_handler = logging.StreamHandler()
37+
print("adding Stream handler")
38+
logger.addHandler(stream_handler)
39+
40+
data = "foo bar"
41+
print("logging begins !")
42+
# This should emit both to the console as well as to the MQTT broker.
43+
logger.warning(json.dumps(data))

examples/mqtt_handler.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"""
2+
MQTT logging handler - log records will be published as MQTT messages
3+
"""
4+
5+
import adafruit_minimqtt.adafruit_minimqtt as MQTT
6+
# adafruit_logging defines log levels dynamically.
7+
# pylint: disable=no-name-in-module
8+
from adafruit_logging import NOTSET, Handler, LogRecord
9+
10+
11+
class MQTTHandler(Handler):
12+
"""
13+
Log handler that emits log records as MQTT PUBLISH messages.
14+
"""
15+
def __init__(self, mqtt_client: MQTT.MQTT, topic: str) -> None:
16+
"""
17+
Assumes that the MQTT client object is already connected.
18+
"""
19+
super().__init__()
20+
21+
self._mqtt_client = mqtt_client
22+
self._topic = topic
23+
24+
# To make it work also in CPython.
25+
self.level = NOTSET
26+
27+
def emit(self, record: LogRecord) -> None:
28+
"""
29+
Publish message from the LogRecord to the MQTT broker.
30+
"""
31+
self._mqtt_client.publish(self._topic, record.msg)
32+
33+
# To make this work also in CPython's logging.
34+
def handle(self, record: LogRecord) -> None:
35+
"""
36+
Handle the log record. Here, it means just emit.
37+
"""
38+
self.emit(record)

0 commit comments

Comments
 (0)