Source code for opsas.utils.SlackLogHandler
from logging import Handler
from opsas.utils.HttpSession import HttpSession
class SlackMessager(HttpSession):
def __init__(self, logger, token, channel):
super().__init__(logger, endpoint='https://slack.com/api')
self.session.headers.setdefault('Authorization', 'Bearer ' + token)
self.session.headers.setdefault('Content-Type', 'application/json')
self.channel = channel
def post_payload(self, payload):
response = self.request_conn(method='post', path='/chat.postMessage', data=payload).json()
self.logger.info(response)
return response
def send_text_message(self, message):
payload = {
'channel': self.channel,
'text': message,
'type': 'text'
}
return self.post_payload(payload)
def send_message(self, message, infolevel="debug", thread_ts=None):
payload = self.make_payload(message, infolevel, thread_ts=thread_ts)
return self.post_payload(payload)
def create_thread(self, name):
response = self.send_text_message(name)
return response['ts']
def make_payload(self, message, loglevel, thread_ts=None):
self.logger.debug(loglevel)
payload = {
'channel': self.channel,
'blocks': [
{
"type": "context",
"elements": [
{
"type": "image",
"image_url": f"http://img.justcalm.ink/{loglevel}.png",
"alt_text": f"{loglevel} icon"
},
{
"type": "mrkdwn",
"text": message
}
]
}
]
}
if thread_ts is not None:
payload['thread_ts'] = thread_ts
return payload
[docs]class SlackLogHandler(Handler):
"""SlackLogHandler for python logging.logger object
Parameters
-----------
token: str
slack app oauth token
channel: str
slack channel name
logger: logging.logger,optional
logger object for logging logs when slackloghandler,
Note
--------
This slacklog handler used slack app to sendmessage.
Create a slack app and follower guides to allow it to connect and chat in channel https://api.slack.com/apps?new_app=1.
Examples
---------
>>> import logging
>>> logger = logging.getLogger('slack')
>>> logging.basicConfig()
>>> slackLogHandler = SlackLogHandler(channel='test',token='xxx')
>>> logger.addHandler(slackLogHandler)
>>> logger.info("info")
>>> logger.warning("warnning")
>>> import logging
>>> logging.basicConfig()
>>> logger = logging.getLogger("slack")
>>> slackLogHandler = SlackLogHandler(channel='test',token='xxx')
>>> slackLogHandler.create_session('testDialog')
>>> logger.addHandler(slackLogHandler)
>>> logger.warning('warining')
"""
_thread_ts_list = {}
def __init__(self, token, channel, logger=None):
super().__init__()
self.bot = SlackMessager(token=token, channel=channel, logger=logger)
[docs] def create_session(self, name):
"""
By default,logs were send to slack channel directly.
Can also start a dialog in slack channel and all logs send as reply to this message
Parameters
----------
name: str
dialog name
Return
---------
None
"""
self._thread_ts_list[name] = self.bot.create_thread(name)
def emit(self, record):
msg = self.format(record)
thread_name = record.name
thread_ts = self._thread_ts_list.get(thread_name, None)
return self.bot.send_message(message=msg, infolevel=record.levelname.lower(), thread_ts=thread_ts)