mirror of
https://github.com/jlu5/PyLink.git
synced 2024-11-01 01:09:22 +01:00
Initial experimental support for logging to channels (#83)
Doesn't support rehashing and all that yet.
This commit is contained in:
parent
4b939ea641
commit
14efb27fe8
28
classes.py
28
classes.py
@ -17,7 +17,7 @@ from collections import defaultdict
|
|||||||
import hashlib
|
import hashlib
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
|
|
||||||
from log import log
|
from log import *
|
||||||
import world
|
import world
|
||||||
import utils
|
import utils
|
||||||
|
|
||||||
@ -37,6 +37,7 @@ class Irc():
|
|||||||
(a string), the name of the protocol module to use for this connection,
|
(a string), the name of the protocol module to use for this connection,
|
||||||
and a configuration object.
|
and a configuration object.
|
||||||
"""
|
"""
|
||||||
|
self.loghandler = None
|
||||||
self.name = netname.lower()
|
self.name = netname.lower()
|
||||||
self.conf = conf
|
self.conf = conf
|
||||||
self.serverdata = conf['servers'][netname]
|
self.serverdata = conf['servers'][netname]
|
||||||
@ -60,6 +61,23 @@ class Irc():
|
|||||||
self.connection_thread.start()
|
self.connection_thread.start()
|
||||||
self.pingTimer = None
|
self.pingTimer = None
|
||||||
|
|
||||||
|
def logSetup(self):
|
||||||
|
"""
|
||||||
|
Initializes any channel loggers defined for the current network.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
channels = self.conf['logging']['channels'][self.name]
|
||||||
|
except KeyError: # Not set up; just ignore.
|
||||||
|
return
|
||||||
|
|
||||||
|
log.debug('(%s) Setting up channel logging to channels %r', self.name,
|
||||||
|
channels)
|
||||||
|
if channels and not self.loghandler:
|
||||||
|
# Only create a handler if we have channels to log to, and one
|
||||||
|
# doesn't already exist.
|
||||||
|
self.loghandler = PyLinkChannelLogger(self, channels)
|
||||||
|
log.addHandler(self.loghandler)
|
||||||
|
|
||||||
def initVars(self):
|
def initVars(self):
|
||||||
"""
|
"""
|
||||||
(Re)sets an IRC object to its default state. This should be called when
|
(Re)sets an IRC object to its default state. This should be called when
|
||||||
@ -128,6 +146,9 @@ class Irc():
|
|||||||
self.uplink = None
|
self.uplink = None
|
||||||
self.start_ts = int(time.time())
|
self.start_ts = int(time.time())
|
||||||
|
|
||||||
|
# Set up channel logging for the network
|
||||||
|
self.logSetup()
|
||||||
|
|
||||||
def connect(self):
|
def connect(self):
|
||||||
"""
|
"""
|
||||||
Runs the connect loop for the IRC object. This is usually called by
|
Runs the connect loop for the IRC object. This is usually called by
|
||||||
@ -254,6 +275,11 @@ class Irc():
|
|||||||
log.debug('(%s) _disconnect: Setting self.aborted to True.', self.name)
|
log.debug('(%s) _disconnect: Setting self.aborted to True.', self.name)
|
||||||
self.aborted.set()
|
self.aborted.set()
|
||||||
|
|
||||||
|
if self.loghandler is not None:
|
||||||
|
log.debug('(%s) Removing channel logging handler due to disconnect.', self.name)
|
||||||
|
log.removeHandler(self.loghandler)
|
||||||
|
self.loghandler = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
log.debug('(%s) _disconnect: Shutting down and closing socket.', self.name)
|
log.debug('(%s) _disconnect: Shutting down and closing socket.', self.name)
|
||||||
self.socket.shutdown(socket.SHUT_RDWR)
|
self.socket.shutdown(socket.SHUT_RDWR)
|
||||||
|
@ -30,6 +30,15 @@ login:
|
|||||||
user: admin
|
user: admin
|
||||||
password: changeme
|
password: changeme
|
||||||
|
|
||||||
|
logging:
|
||||||
|
# This configuration block defines channels that PyLink can log to.
|
||||||
|
|
||||||
|
# Note: DEBUG logging is not supported here: any log level settings below
|
||||||
|
# INFO be automatically raised to INFO.
|
||||||
|
channels:
|
||||||
|
inspnet:
|
||||||
|
- "#services"
|
||||||
|
|
||||||
servers:
|
servers:
|
||||||
inspnet:
|
inspnet:
|
||||||
# Server IP, port, and passwords
|
# Server IP, port, and passwords
|
||||||
|
30
log.py
30
log.py
@ -35,3 +35,33 @@ logfile.setFormatter(logformat)
|
|||||||
global log
|
global log
|
||||||
log = logging.getLogger()
|
log = logging.getLogger()
|
||||||
log.addHandler(logfile)
|
log.addHandler(logfile)
|
||||||
|
|
||||||
|
class PyLinkChannelLogger(logging.Handler):
|
||||||
|
"""
|
||||||
|
Log handler to log to channels in PyLink.
|
||||||
|
"""
|
||||||
|
def __init__(self, irc, channels):
|
||||||
|
super(PyLinkChannelLogger, self).__init__()
|
||||||
|
self.irc = irc
|
||||||
|
self.channels = channels
|
||||||
|
|
||||||
|
# Use a slightly simpler message formatter - logging to IRC doesn't need
|
||||||
|
# logging the time.
|
||||||
|
formatter = logging.Formatter('[%(levelname)s] %(message)s')
|
||||||
|
self.setFormatter(formatter)
|
||||||
|
|
||||||
|
# Log level has to be at least 20 (INFO) to prevent loops due
|
||||||
|
# to outgoing messages being logged
|
||||||
|
loglevel = max(log.getEffectiveLevel(), 20)
|
||||||
|
self.setLevel(loglevel)
|
||||||
|
|
||||||
|
def emit(self, record):
|
||||||
|
"""
|
||||||
|
Logs a record to the configured channels for the network given.
|
||||||
|
"""
|
||||||
|
# Only start logging if we're finished bursting
|
||||||
|
if hasattr(self.irc, 'pseudoclient') and self.irc.connected.is_set():
|
||||||
|
msg = self.format(record)
|
||||||
|
for channel in self.channels:
|
||||||
|
self.irc.msg(channel, msg)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user