diff --git a/coremods/control.py b/coremods/control.py index 7a446de..0482763 100644 --- a/coremods/control.py +++ b/coremods/control.py @@ -5,7 +5,7 @@ import signal import os from pylinkirc import world, utils, conf, classes -from pylinkirc.log import log +from pylinkirc.log import log, makeFileLogger, stopFileLoggers def remove_network(ircobj): """Removes a network object from the pool.""" @@ -47,6 +47,14 @@ def _rehash(): new_conf = conf.loadConf(fname, errors_fatal=False) new_conf = conf.validateConf(new_conf) conf.conf = new_conf + + # Reset any file logger options. + stopFileLoggers() + files = new_conf['logging'].get('files') + if files: + for filename, config in files.items(): + makeFileLogger(filename, config.get('loglevel')) + for network, ircobj in world.networkobjects.copy().items(): # Server was removed from the config file, disconnect them. log.debug('rehash: checking if %r is in new conf still.', network) diff --git a/log.py b/log.py index ec1054f..def1cff 100644 --- a/log.py +++ b/log.py @@ -7,12 +7,16 @@ access the global logger object by importing "log" from this module """ import logging +import logging.handlers import sys import os from . import world from .conf import conf, confname +# Stores a list of active file loggers. +fileloggers = [] + stdout_level = conf['logging'].get('stdout') or 'INFO' logdir = os.path.join(os.getcwd(), 'log') @@ -43,7 +47,8 @@ def makeFileLogger(filename, level=None): # PyLink instances from overwriting each others' log files. target = os.path.join(logdir, '%s-%s.log' % (confname, filename)) - filelogger = logging.FileHandler(target, mode='w') + # TODO: configurable values here + filelogger = logging.handlers.RotatingFileHandler(target, maxBytes=52428800, backupCount=5) filelogger.setFormatter(logformatter) # If no log level is specified, use the same one as STDOUT. @@ -51,9 +56,21 @@ def makeFileLogger(filename, level=None): filelogger.setLevel(level) log.addHandler(filelogger) + global fileloggers + fileloggers.append(filelogger) return filelogger +def stopFileLoggers(): + """ + De-initializes all file loggers. + """ + global fileloggers + for handler in fileloggers.copy(): + handler.close() + log.removeHandler(handler) + fileloggers.remove(handler) + # Set up file logging now, creating a file logger for each block. files = conf['logging'].get('files') if files: