Skip to content

Instantly share code, notes, and snippets.

@retr0h
Last active April 29, 2017 20:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save retr0h/a512c6bfacf4187722e8bcaebaf93720 to your computer and use it in GitHub Desktop.
Save retr0h/a512c6bfacf4187722e8bcaebaf93720 to your computer and use it in GitHub Desktop.
Logger Module
import logging
import os
import sys
import colorama
import sh
colorama.init(autoreset=True)
SUCCESS = 100
OUT = 101
class LogFilter(object):
"""
A custom log filter which excludes log messages above the logged
level.
"""
def __init__(self, level):
self.__level = level
def filter(self, logRecord): # pragma: no cover
# https://docs.python.org/3/library/logging.html#logrecord-attributes
return logRecord.levelno <= self.__level
class CustomLogger(logging.getLoggerClass()):
"""
A custom logging class which adds additional methods to the logger. These
methods serve as syntactic sugar for formatting log messages.
"""
def __init__(self, name, level=logging.NOTSET):
super(logging.getLoggerClass(), self).__init__(name, level)
logging.addLevelName(SUCCESS, 'SUCCESS')
logging.addLevelName(OUT, 'OUT')
def success(self, msg, *args, **kwargs):
if self.isEnabledFor(SUCCESS):
self._log(SUCCESS, msg, args, **kwargs)
def out(self, msg, *args, **kwargs):
if self.isEnabledFor(OUT):
self._log(OUT, msg, args, **kwargs)
class TrailingNewlineFormatter(logging.Formatter):
"""
A custom logging formatter which removes additional newlines from messages.
"""
def format(self, record):
if record.msg:
record.msg = record.msg.rstrip()
return super(TrailingNewlineFormatter, self).format(record)
def get_logger(name=None):
"""
Build a logger with the given name and returns the logger.
:param name: The name for the logger. This is usually the module
name, ``__name__``.
:return: logger object
"""
logging.setLoggerClass(CustomLogger)
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
logger.addHandler(_get_info_handler())
logger.addHandler(_get_out_handler())
logger.addHandler(_get_warn_handler())
logger.addHandler(_get_error_handler())
logger.addHandler(_get_critical_handler())
logger.addHandler(_get_success_handler())
logger.propagate = False
return logger
def _get_info_handler():
color = colorama.Fore.CYAN
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.INFO)
handler.addFilter(LogFilter(logging.INFO))
handler.setFormatter(
TrailingNewlineFormatter('--> {}%(message)s'.format(color)))
return handler
def _get_out_handler():
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(OUT)
handler.addFilter(LogFilter(OUT))
handler.setFormatter(TrailingNewlineFormatter(' %(message)s'))
return handler
def _get_warn_handler():
color = colorama.Fore.YELLOW
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.WARN)
handler.addFilter(LogFilter(logging.WARN))
handler.setFormatter(
TrailingNewlineFormatter('{}%(message)s'.format(color)))
return handler
def _get_error_handler():
color = colorama.Fore.RED
handler = logging.StreamHandler(sys.stderr)
handler.setLevel(logging.ERROR)
handler.addFilter(LogFilter(logging.ERROR))
handler.setFormatter(
TrailingNewlineFormatter('{}%(message)s'.format(color)))
return handler
def _get_critical_handler():
color = colorama.Fore.RED
handler = logging.StreamHandler(sys.stderr)
handler.setLevel(logging.CRITICAL)
handler.addFilter(LogFilter(logging.CRITICAL))
handler.setFormatter(
TrailingNewlineFormatter('{}ERROR: %(message)s'.format(color)))
return handler
def _get_success_handler():
color = colorama.Fore.GREEN
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(SUCCESS)
handler.addFilter(LogFilter(SUCCESS))
handler.setFormatter(
TrailingNewlineFormatter('{}%(message)s'.format(color)))
return handler
log = get_logger(name=__name__)
command = sh.tester.bake(_out=log.out, _err=log.error, _env=os.environ.copy())
command()
#!/usr/bin/env bash
while true; do
echo 'hi'
sleep 1
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment