diff --git a/conf.py b/conf.py index 1545f2e..487c443 100644 --- a/conf.py +++ b/conf.py @@ -12,6 +12,7 @@ except ImportError: import sys import os.path +import logging from collections import defaultdict from . import world @@ -53,6 +54,12 @@ def validate(condition, errmsg): if not condition: raise ConfigValidationError(errmsg) +def _log(level, text, *args, logger=None, **kwargs): + if logger: + logger.log(level, text, *args, **kwargs) + else: + world.log_queue.append((level, text)) + def validateConf(conf, logger=None): """Validates a parsed configuration dict.""" validate(type(conf) == dict, @@ -60,14 +67,8 @@ def validateConf(conf, logger=None): % type(conf).__name__) if 'pylink' in conf and 'bot' in conf: - e = ("Since PyLink 1.2, the 'pylink:' and 'bot:' configuration sections have been condensed " + _log(logging.WARNING, "Since PyLink 1.2, the 'pylink:' and 'bot:' configuration sections have been condensed " "into one. You should merge any options under these sections into one 'pylink:' block.") - if logger: - logger.warning(e) - else: - # FIXME: we need a better fallback when log isn't available on first - # start. - print('WARNING: %s' % e) new_block = conf['bot'].copy() new_block.update(conf['pylink']) @@ -84,14 +85,8 @@ def validateConf(conf, logger=None): # Make sure at least one form of authentication is valid. # Also we'll warn them that login:user/login:password is deprecated if conf['login'].get('password') or conf['login'].get('user'): - e = "The 'login:user' and 'login:password' options are deprecated since PyLink 1.1. " \ - "Please switch to the new 'login:accounts' format as outlined in the example config." - if logger: - logger.warning(e) - else: - # FIXME: we need a better fallback when log isn't available on first - # start. - print('WARNING: %s' % e) + _log(logging.WARNING, "The 'login:user' and 'login:password' options are deprecated since PyLink 1.1. " + "Please switch to the new 'login:accounts' format as outlined in the example config.") old_login_valid = type(conf['login'].get('password')) == type(conf['login'].get('user')) == str newlogins = conf['login'].get('accounts', {}) diff --git a/log.py b/log.py index 1651c27..deb057b 100644 --- a/log.py +++ b/log.py @@ -42,6 +42,13 @@ log.addHandler(world.stdout_handler) # the root logger. https://stackoverflow.com/questions/16624695 log.setLevel(1) +log.debug("log: Emptying log_queue") +# Process and empty the log queue +while world.log_queue: + level, text = world.log_queue.popleft() + log.log(level, text) +log.debug("log: Emptied log_queue") + def makeFileLogger(filename, level=None): """ Initializes a file logging target with the given filename and level. diff --git a/world.py b/world.py index a37de98..7e81d4e 100644 --- a/world.py +++ b/world.py @@ -2,7 +2,7 @@ world.py: Stores global variables for PyLink, including lists of active IRC objects and plugins. """ -from collections import defaultdict +from collections import defaultdict, deque import threading import time @@ -29,3 +29,7 @@ source = "https://github.com/GLolol/PyLink" # CHANGE THIS IF YOU'RE FORKING!! # Fallback hostname used in various places internally when hostname isn't configured. fallback_hostname = 'pylink.int' + +# Defines messages to be logged as soon as the log system is set up, for modules like conf that are +# initialized before log. This is processed (and then not used again) when the log module loads. +log_queue = deque()