3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-12-28 13:42:37 +01:00

core: rehashable file loggers with log rotation support

Closes #176. Closes #315.
This commit is contained in:
James Lu 2016-08-17 21:39:46 -07:00
parent 06ecc89603
commit 126a07bdf6
2 changed files with 27 additions and 2 deletions

View File

@ -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)

19
log.py
View File

@ -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: