diff src/core/log.py @ 994:652c01ca69b1

core (log): configuration and environment variables are now checked for log level and colors: - variable change logs behaviour, so far only level and colors are implemented - configuration use log_[name], for example you can put log_level=debug in sat.conf (section [DEFAULT]) to see all levels - environment variables use SAT_LOG_[NAME]: e.g. SAT_LOG_LEVEL=debug - colors can be true, false or force to force colors even if stdout is not a tty
author Goffi <goffi@goffi.org>
date Sat, 19 Apr 2014 20:11:23 +0200
parents f51a1895275c
children b4af31a8a4f2
line wrap: on
line diff
--- a/src/core/log.py	Sat Apr 19 19:19:19 2014 +0200
+++ b/src/core/log.py	Sat Apr 19 20:11:23 2014 +0200
@@ -106,7 +106,7 @@
     else:
         root_logger.warning(u"Handler already set on root logger")
 
-def configure(backend=C.LOG_BACKEND_STANDARD):
+def configure(backend=C.LOG_BACKEND_STANDARD, **options):
     """Configure logging bejaviour
     @param backend: can be:
         C.LOG_BACKEND_STANDARD: use standard logging module
@@ -130,7 +130,7 @@
         global error
         global critical
         import logging
-        _configureStdLogging(logging, colors=True)
+        _configureStdLogging(logging, **options)
         getLogger = logging.getLogger
         debug = logging.debug
         info = logging.info
@@ -144,6 +144,47 @@
     else:
         raise ValueError("unknown backend")
 
+def _parseOptions(options):
+    """Parse string options as given in conf or environment variable, and return expected python value
+
+    @param options (dict): options with (key: name, value: string value)
+    """
+    if 'colors' in options:
+        if options['colors'].lower() in ('1', 'true'):
+            options['colors'] = True
+        elif options['colors'] == 'force':
+            options['colors'] = True
+            options['force_colors'] = True
+        else:
+            options['colors'] = False
+    if 'level' in options:
+        level = options['level'].upper()
+        if level not in ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'):
+            level = 'INFO'
+        options['level'] = level
+
+def satConfigure(backend=C.LOG_BACKEND_TWISTED):
+    """Configure logging system for SàT, can be used by frontends
+
+    logs conf is read in SàT conf, then in environment variables. It must be done before Memory init
+    """
+    import ConfigParser
+    import os
+    to_get = (C.LOG_OPT_COLORS, C.LOG_OPT_LEVEL)
+    log_conf = {}
+    config = ConfigParser.SafeConfigParser()
+    config.read(C.CONFIG_FILES)
+    for opt_name, opt_default in to_get:
+        try:
+            log_conf[opt_name] = os.environ[''.join((C.ENV_PREFIX, C.LOG_OPT_PREFIX.upper(), opt_name.upper()))]
+        except KeyError:
+            try:
+                log_conf[opt_name] = config.get('DEFAULT', C.LOG_OPT_PREFIX + opt_name)
+            except ConfigParser.NoOptionError:
+                log_conf[opt_name] = opt_default
+
+    _parseOptions(log_conf)
+    configure(backend, **log_conf)
 
 def getLogger(name=C.LOG_BASE_LOGGER):
     return _loggers.setdefault(name, Logger(name))