# -*- coding: utf-8 -*-
-
-# Copyright (c) 2009, 2010, 2013 Jack Kaliko <kaliko@azylum.org>
+# Copyright (c) 2009, 2010, 2013, 2014, 2015 Jack Kaliko <kaliko@azylum.org>
#
# This file is part of sima
#
import logging
import sys
+from os import environ
+DEBUG = logging.DEBUG
+INFO = logging.INFO
+ERROR = logging.ERROR
LOG_FORMATS = {
+ DEBUG: '[{process}]{filename: >11}:{lineno: <3} {levelname: <7}: {message}',
+ INFO: '{levelname: <7}: {message}',
#logging.DEBUG: '{asctime} {filename}:{lineno}({funcName}) '
#'{levelname}: {message}',
- logging.DEBUG: '{asctime} {filename}:{lineno} {levelname}: {message}',
- logging.INFO: '{asctime} {levelname}: {message}',
}
DATE_FMT = "%Y-%m-%d %H:%M:%S"
+TRACE_LEVEL_NUM = 5
+logging.addLevelName(TRACE_LEVEL_NUM, 'TRACE')
+def trace(self, message, *args, **kwargs):
+ # Yes, logger takes its '*args' as 'args'.
+ if self.isEnabledFor(TRACE_LEVEL_NUM):
+ self._log(TRACE_LEVEL_NUM, message, args, **kwargs)
-class LevelFilter(logging.Filter):# Logging facility
- """
- Enable logging between two log level by filtering everything < level.
- """
-
- def __init__(self, filt_level):
- logging.Filter.__init__(self)
- self.level = filt_level
-
- def filter(self, record):
- """Defines loglevel"""
- return record.levelno <= self.level
+logging.Logger.trace = trace
-def set_logger(level='info', logfile=None, name='sima'):
+def set_logger(level='info', logfile=None):
"""
logger:
level: in debug, info, warning,…
- file: provides to log to file
-
+ logfile: file to log to
"""
- user_log_level = getattr(logging, level.upper())
- if user_log_level > logging.DEBUG:
- log_format = LOG_FORMATS.get(logging.INFO)
+ name = 'sima'
+ if environ.get('TRACE', False):
+ user_log_level = TRACE_LEVEL_NUM
else:
- log_format = LOG_FORMATS.get(logging.DEBUG)
- logg = logging.getLogger(name)
+ user_log_level = getattr(logging, level.upper())
+ if user_log_level > DEBUG:
+ log_format = LOG_FORMATS.get(INFO)
+ else:
+ log_format = LOG_FORMATS.get(DEBUG)
+ logger = logging.getLogger(name)
formatter = logging.Formatter(log_format, DATE_FMT, '{')
- logg.setLevel(user_log_level)
+ logger.setLevel(user_log_level)
+ filehdl = False
+ if logger.handlers:
+ for hdl in logger.handlers:
+ hdl.setFormatter(formatter)
+ if isinstance(hdl, logging.FileHandler):
+ filehdl = True
+ else:
+ logger.removeHandler(hdl)
+
if logfile:
+ if filehdl:
+ logger.handlers = []
+ # Add timestamp for file handler
+ log_format = '{0} {1}'.format('{asctime}', log_format)
+ formatter = logging.Formatter(log_format, DATE_FMT, '{')
# create file handler
fileh = logging.FileHandler(logfile)
- #fileh.setLevel(user_log_level)
fileh.setFormatter(formatter)
- logg.addHandler(fileh)
+ logger.addHandler(fileh)
else:
+ if filehdl:
+ logger.info('Not changing logging handlers, only updating formatter')
+ return
# create console handler with a specified log level (STDOUT)
couth = logging.StreamHandler(sys.stdout)
- #couth.setLevel(user_log_level)
- couth.addFilter(LevelFilter(logging.WARNING))
+ couth.addFilter(lambda record: record.levelno < ERROR)
# create console handler with warning log level (STDERR)
cerrh = logging.StreamHandler(sys.stderr)
- #cerrh.setLevel(logging.WARNING)
- cerrh.setLevel(logging.ERROR)
+ cerrh.setLevel(ERROR)
# add formatter to the handlers
cerrh.setFormatter(formatter)
couth.setFormatter(formatter)
# add the handlers to SIMA_LOGGER
- logg.addHandler(couth)
- logg.addHandler(cerrh)
+ logger.addHandler(couth)
+ logger.addHandler(cerrh) # Already added creating the handler‽ Still have to figure it out.
# VIM MODLINE
# vim: ai ts=4 sw=4 sts=4 expandtab