Skip to content

Commit 068c585

Browse files
committed
fold MQTTHandler to logging_mqtt_handler.py
1 parent 722fef9 commit 068c585

File tree

2 files changed

+76
-76
lines changed

2 files changed

+76
-76
lines changed

examples/logging_mqtt_handler.py

Lines changed: 76 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,36 +10,82 @@
1010
import ssl
1111

1212
import adafruit_minimqtt.adafruit_minimqtt as MQTT
13-
from mqtt_handler import MQTTHandler
1413

1514
import adafruit_logging as logging
15+
# adafruit_logging defines log levels dynamically.
16+
# pylint: disable=no-name-in-module
17+
from adafruit_logging import NOTSET, Handler, LogRecord
1618

17-
logger = logging.getLogger(__name__)
18-
19-
broker = "io.adafruit.com"
20-
port = 8883
21-
username = "Adafruit_IO_username"
22-
password = "Adafruit_IO_key"
23-
feedname = "Adafruit_feed_name"
24-
mqtt_topic = f"{username}/feeds/{feedname}"
25-
mqtt_client = MQTT.MQTT(
26-
broker=broker,
27-
port=port,
28-
username=username,
29-
password=password,
30-
socket_pool=socket,
31-
ssl_context=ssl.create_default_context(),
32-
)
33-
mqtt_client.connect()
34-
mqtt_handler = MQTTHandler(mqtt_client, mqtt_topic)
35-
print("adding MQTT handler")
36-
logger.addHandler(mqtt_handler)
37-
38-
stream_handler = logging.StreamHandler()
39-
print("adding Stream handler")
40-
logger.addHandler(stream_handler)
41-
42-
data = "foo bar"
43-
print("logging begins !")
44-
# This should emit both to the console as well as to the MQTT broker.
45-
logger.warning(json.dumps(data))
19+
20+
class MQTTHandler(Handler):
21+
"""
22+
Log handler that emits log records as MQTT PUBLISH messages.
23+
"""
24+
25+
def __init__(self, mqtt_client: MQTT.MQTT, topic: str) -> None:
26+
"""
27+
Assumes that the MQTT client object is already connected.
28+
"""
29+
super().__init__()
30+
31+
self._mqtt_client = mqtt_client
32+
self._topic = topic
33+
34+
# To make it work also in CPython.
35+
self.level = NOTSET
36+
37+
def emit(self, record: LogRecord) -> None:
38+
"""
39+
Publish message from the LogRecord to the MQTT broker, if connected.
40+
"""
41+
try:
42+
if self._mqtt_client.is_connected():
43+
self._mqtt_client.publish(self._topic, record.msg)
44+
except MQTT.MMQTTException:
45+
pass
46+
47+
# To make this work also in CPython's logging.
48+
def handle(self, record: LogRecord) -> None:
49+
"""
50+
Handle the log record. Here, it means just emit.
51+
"""
52+
self.emit(record)
53+
54+
55+
def main():
56+
"""
57+
Demonstrate how to use MQTT log handler.
58+
"""
59+
logger = logging.getLogger(__name__)
60+
61+
broker = "io.adafruit.com"
62+
port = 8883
63+
username = "Adafruit_IO_username"
64+
password = "Adafruit_IO_key"
65+
feedname = "Adafruit_feed_name"
66+
mqtt_topic = f"{username}/feeds/{feedname}"
67+
mqtt_client = MQTT.MQTT(
68+
broker=broker,
69+
port=port,
70+
username=username,
71+
password=password,
72+
socket_pool=socket,
73+
ssl_context=ssl.create_default_context(),
74+
)
75+
mqtt_client.connect()
76+
mqtt_handler = MQTTHandler(mqtt_client, mqtt_topic)
77+
print("adding MQTT handler")
78+
logger.addHandler(mqtt_handler)
79+
80+
stream_handler = logging.StreamHandler()
81+
print("adding Stream handler")
82+
logger.addHandler(stream_handler)
83+
84+
data = "foo bar"
85+
print("logging begins !")
86+
# This should emit both to the console as well as to the MQTT broker.
87+
logger.warning(json.dumps(data))
88+
89+
90+
if __name__ == "__main__":
91+
main()

examples/mqtt_handler.py

Lines changed: 0 additions & 46 deletions
This file was deleted.

0 commit comments

Comments
 (0)