sopel/logger.py
2017-11-22 19:26:40 -05:00

56 lines
1.8 KiB
Python

# coding=utf-8
from __future__ import unicode_literals, absolute_import, print_function, division
import logging
class IrcLoggingHandler(logging.Handler):
def __init__(self, bot, level):
super(IrcLoggingHandler, self).__init__(level)
self._bot = bot
self._channel = bot.config.core.logging_channel
def emit(self, record):
try:
msg = self.format(record)
self._bot.msg(self._channel, msg)
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
class ChannelOutputFormatter(logging.Formatter):
def __init__(self):
super(ChannelOutputFormatter, self).__init__(
fmt='[%(filename)s] %(msg)s'
)
def formatException(self, exc_info):
# logging will through a newline between the message and this, but
# that's fine because Sopel will strip it back out anyway
return ' - ' + repr(exc_info[1])
def setup_logging(bot):
level = bot.config.core.logging_level or 'WARNING'
logging.basicConfig(level=level)
logger = logging.getLogger('sopel')
if bot.config.core.logging_channel:
handler = IrcLoggingHandler(bot, level)
handler.setFormatter(ChannelOutputFormatter())
logger.addHandler(handler)
def get_logger(name=None):
"""Return a logger for a module, if the name is given.
This is equivalent to `logging.getLogger('sopel.modules.' + name)` when
name is given, and `logging.getLogger('sopel')` when it is not. The latter
case is intended for use in Sopel's core; modules should call
`get_logger(__name__)` to get a logger."""
if name:
return logging.getLogger('sopel.modules.' + name)
else:
return logging.getLogger('sopel')