src/log.py: Seriously simplify the handling of different logging levels for log and log.stdout by setting the level on the different handlers ranther than the logging object itself.

This commit is contained in:
James Vega 2006-10-05 18:54:37 +00:00
parent 664f56a92f
commit 6c13f55ab4
1 changed files with 43 additions and 60 deletions

View File

@ -115,7 +115,7 @@ class StdoutStreamHandler(logging.StreamHandler):
def disable(self): def disable(self):
self.setLevel(sys.maxint) # Just in case. self.setLevel(sys.maxint) # Just in case.
_stdoutLogger.removeHandler(self) _logger.removeHandler(self)
logging._acquireLock() logging._acquireLock()
try: try:
del logging._handlers[self] del logging._handlers[self]
@ -169,30 +169,38 @@ class ColorizedFormatter(Formatter):
else: else:
return Formatter.format(self, record, *args, **kwargs) return Formatter.format(self, record, *args, **kwargs)
conf.registerGlobalValue(conf.supybot.directories, 'log',
conf.Directory('logs', """Determines what directory the bot will store its
logfiles in."""))
_logDir = conf.supybot.directories.log()
if not os.path.exists(_logDir):
os.mkdir(_logDir, 0755)
pluginLogDir = os.path.join(_logDir, 'plugins')
if not os.path.exists(pluginLogDir):
os.mkdir(pluginLogDir, 0755)
try:
messagesLogFilename = os.path.join(_logDir, 'messages.log')
_handler = BetterFileHandler(messagesLogFilename)
except EnvironmentError, e:
raise SystemExit, \
'Error opening messages logfile (%s). ' \
'Generally, this is because you are running Supybot in a directory ' \
'you don\'t have permissions to add files in, or you\'re running ' \
'Supybot as a different user than you normal do. The original ' \
'error was: %s' % (messagesLogFilename, utils.gen.exnToString(e))
# These are public. # These are public.
formatter = Formatter('NEVER SEEN; IF YOU SEE THIS, FILE A BUG!') formatter = Formatter('NEVER SEEN; IF YOU SEE THIS, FILE A BUG!')
pluginFormatter = PluginFormatter('NEVER SEEN; IF YOU SEE THIS, FILE A BUG!') pluginFormatter = PluginFormatter('NEVER SEEN; IF YOU SEE THIS, FILE A BUG!')
class MultiLogger(object):
def __init__(self, loggers):
self.loggers = loggers
def __getattr__(self, attr):
def f(*args, **kwargs):
for logger in self.loggers:
getattr(logger, attr)(*args, **kwargs)
if attr in ('debug', 'info', 'warning', 'error', 'critical',
'exception', 'log'):
return f
else:
raise AttributeError('%r object has no attribute %r' %
(self.__class__.__name__, attr))
# These are not. # These are not.
logging.setLoggerClass(Logger) logging.setLoggerClass(Logger)
_logger = logging.getLogger('supybot') _logger = logging.getLogger('supybot')
_stdoutLogger = logging.getLogger('supybotStdout') _stdoutHandler = StdoutStreamHandler(sys.stdout)
_multiLogger = MultiLogger((_logger, _stdoutLogger))
class ValidLogLevel(registry.String): class ValidLogLevel(registry.String):
"""Invalid log level.""" """Invalid log level."""
@ -223,18 +231,14 @@ class LogLevel(ValidLogLevel):
ERROR, or CRITICAL.""" ERROR, or CRITICAL."""
def setValue(self, v): def setValue(self, v):
ValidLogLevel.setValue(self, v) ValidLogLevel.setValue(self, v)
_logger.setLevel(self.value) # _logger defined later. _handler.setLevel(self.value)
class StdoutLogLevel(ValidLogLevel): class StdoutLogLevel(ValidLogLevel):
"""Invalid log level. Value must be either DEBUG, INFO, WARNING, """Invalid log level. Value must be either DEBUG, INFO, WARNING,
ERROR, or CRITICAL.""" ERROR, or CRITICAL."""
def setValue(self, v): def setValue(self, v):
ValidLogLevel.setValue(self, v) ValidLogLevel.setValue(self, v)
_stdoutLogger.setLevel(self.value) # _stdoutLogger defined later. _stdoutHandler.setLevel(self.value)
conf.registerGlobalValue(conf.supybot.directories, 'log',
conf.Directory('logs', """Determines what directory the bot will store its
logfiles in."""))
conf.registerGroup(conf.supybot, 'log') conf.registerGroup(conf.supybot, 'log')
conf.registerGlobalValue(conf.supybot.log, 'format', conf.registerGlobalValue(conf.supybot.log, 'format',
@ -291,12 +295,12 @@ conf.registerGlobalValue(conf.supybot.log.plugins, 'format',
# These just make things easier. # These just make things easier.
debug = _multiLogger.debug debug = _logger.debug
info = _multiLogger.info info = _logger.info
warning = _multiLogger.warning warning = _logger.warning
error = _multiLogger.error error = _logger.error
critical = _multiLogger.critical critical = _logger.critical
exception = _multiLogger.exception exception = _logger.exception
# These were just begging to be replaced. # These were just begging to be replaced.
registry.error = error registry.error = error
@ -311,7 +315,7 @@ ircutils.debug = debug
def getPluginLogger(name): def getPluginLogger(name):
if not conf.supybot.log.plugins.individualLogfiles(): if not conf.supybot.log.plugins.individualLogfiles():
return _multiLogger return _logger
log = logging.getLogger('supybot.plugins.%s' % name) log = logging.getLogger('supybot.plugins.%s' % name)
if not log.handlers: if not log.handlers:
filename = os.path.join(pluginLogDir, '%s.log' % name) filename = os.path.join(pluginLogDir, '%s.log' % name)
@ -370,46 +374,25 @@ class MetaFirewall(type):
#return type.__new__(cls, name, bases, dict) #return type.__new__(cls, name, bases, dict)
_logDir = conf.supybot.directories.log()
if not os.path.exists(_logDir):
os.mkdir(_logDir, 0755)
pluginLogDir = os.path.join(_logDir, 'plugins')
if not os.path.exists(pluginLogDir):
os.mkdir(pluginLogDir, 0755)
try:
messagesLogFilename = os.path.join(_logDir, 'messages.log')
_handler = BetterFileHandler(messagesLogFilename)
except EnvironmentError, e:
raise SystemExit, \
'Error opening messages logfile (%s). ' \
'Generally, this is because you are running Supybot in a directory ' \
'you don\'t have permissions to add files in, or you\'re running ' \
'Supybot as a different user than you normal do. The original ' \
'error was: %s' % (messagesLogFilename, utils.gen.exnToString(e))
_handler.setFormatter(formatter)
_handler.setLevel(-1)
class PluginLogFilter(logging.Filter): class PluginLogFilter(logging.Filter):
def filter(self, record): def filter(self, record):
if conf.supybot.log.plugins.individualLogfiles(): if conf.supybot.log.plugins.individualLogfiles():
if record.name.startswith('supybot.plugins'): if record.name.startswith('supybot.plugins'):
return False return False
return True return True
_handler.setFormatter(formatter)
_handler.addFilter(PluginLogFilter()) _handler.addFilter(PluginLogFilter())
_handler.setLevel(conf.supybot.log.level())
_logger.addHandler(_handler) _logger.addHandler(_handler)
_logger.setLevel(conf.supybot.log.level()) _logger.setLevel(-1)
_stdoutFormatter = ColorizedFormatter('IF YOU SEE THIS, FILE A BUG!')
_stdoutHandler.setFormatter(_stdoutFormatter)
_stdoutHandler.setLevel(conf.supybot.log.stdout.level())
if not conf.daemonized: if not conf.daemonized:
_stdoutHandler = StdoutStreamHandler(sys.stdout) _logger.addHandler(_stdoutHandler)
_stdoutFormatter = ColorizedFormatter('IF YOU SEE THIS, FILE A BUG!')
_stdoutHandler.setFormatter(_stdoutFormatter)
_stdoutHandler.setLevel(-1)
_stdoutHandler.addFilter(PluginLogFilter())
_stdoutLogger.addHandler(_stdoutHandler)
_stdoutLogger.setLevel(conf.supybot.log.stdout.level())
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: