Last active
April 29, 2017 20:40
-
-
Save retr0h/a512c6bfacf4187722e8bcaebaf93720 to your computer and use it in GitHub Desktop.
Logger Module
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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