Source code for anyblok.logging

# This file is a part of the AnyBlok project
#
#    Copyright (C) 2014 Jean-Sebastien SUZANNE <[email protected]>
#
# This Source Code Form is subject to the terms of the Mozilla Public License,
# v. 2.0. If a copy of the MPL was not distributed with this file,You can
# obtain one at http://mozilla.org/MPL/2.0/.
import logging
from functools import wraps
from anyblok.environment import EnvironmentManager
from .common import function_name


BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, _N, DEFAULT = range(10)
RESET_SEQ = "\033[0m"
COLOR_SEQ = "\033[1;%dm"
COLOR_PATTERN = "%s%s%%s%s" % (COLOR_SEQ, COLOR_SEQ, RESET_SEQ)
LEVEL_COLOR_MAPPING = {
    logging.DEBUG: (BLUE, DEFAULT),
    logging.INFO: (GREEN, DEFAULT),
    logging.WARNING: (YELLOW, DEFAULT),
    logging.ERROR: (RED, DEFAULT),
    logging.CRITICAL: (WHITE, RED),
}


[docs]class consoleFormatter(logging.Formatter): """ Define the format for console logging """
[docs] def format(self, record): """ Add color to the message :param record: logging record instance :rtype: logging record formatted """ fg_color, bg_color = LEVEL_COLOR_MAPPING[record.levelno] record.levelname = COLOR_PATTERN % ( 30 + fg_color, 40 + bg_color, record.levelname) fg_color, bg_color = CYAN, DEFAULT record.database = COLOR_PATTERN % ( 30 + fg_color, 40 + bg_color, EnvironmentManager.get('db_name', 'No database')) return logging.Formatter.format(self, record)
[docs]class anyblokFormatter(logging.Formatter): """ Define the format for console logging """
[docs] def format(self, record): """ Add color to the message :param record: logging record instance :rtype: logging record formatted """ record.database = EnvironmentManager.get('db_name', 'No database') return logging.Formatter.format(self, record)
[docs]def log(logger, level='info', withargs=False): """ decorator to log the entry of a method There are 5 levels of logging * debug * info (default) * warning * error * critical example:: from logging import getLogger logger = getLogger(__name__) @log(logger) def foo(...): ... :param level: AnyBlok log level :param withargs: If True, add args and kwargs in the log message """ def wrapper(function): @wraps(function) def f(*args, **kwargs): if level == 'debug' or withargs: getattr(logger, level)("%s with args %r and kwargs %r" % ( function_name(function), args, kwargs)) else: getattr(logger, level)(function_name(function)) return function(*args, **kwargs) return f return wrapper