Last active
September 27, 2018 14:39
-
-
Save saveshodhan/126f52fa2250c10f7a0633d38f68ae79 to your computer and use it in GitHub Desktop.
Python logging configuration
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 logging.handlers | |
from functools import wraps | |
LOGGER_NAME = "APPLOGGER" | |
LOGGER_HANDLER_NAME = "APPHANDLER" | |
LOGGER_FILENAME = "log.out" | |
LOGGER_FORMATTER = "[%(asctime)s] %(levelname)s : %(user)s : %(funcName)s : %(message)s" | |
LOGGER_DATEFMT = "%Y-%m-%d %H:%M:%S" | |
LOGGER_USER = "app" | |
def make_logger(): | |
""" make and return the logger instance """ | |
formatter = logging.Formatter(LOGGER_FORMATTER, LOGGER_DATEFMT) | |
handler = logging.handlers.RotatingFileHandler(LOGGER_FILENAME, maxBytes=200000, backupCount=50) | |
handler.setFormatter(formatter) | |
handler.setLevel(logging.DEBUG) | |
handler.name = LOGGER_HANDLER_NAME | |
logger = logging.getLogger(LOGGER_NAME) | |
logger.addHandler(handler) | |
logger.setLevel(logging.DEBUG) | |
logger.addFilter(DefaultUserLoggingFilter()) | |
return logger | |
def log_this(f): | |
""" decorater to implement the default app logger in case no logger is passed """ | |
@wraps(f) | |
def decorated(*args, **kwargs): | |
if "logger" in kwargs and kwargs["logger"]: | |
pass | |
else: | |
kwargs["logger"] = logging.getLogger(LOGGER_NAME) | |
return f(*args, **kwargs) | |
return decorated | |
class DefaultUserLoggingFilter(logging.Filter): | |
""" Create a custom filter to accept `user`. | |
if no `user` is passed, consider a default value | |
""" | |
def filter(self, log_record): | |
if hasattr(log_record, "user") and log_record.user: | |
return True | |
log_record.user = LOGGER_USER | |
return True | |
#################################################################### | |
# and somewhere in this realm, a service is exposed to the Universe # | |
#################################################################### | |
@log_this | |
def some_service(foo, bar, user=None, logger=None): | |
logger.info((foo, bar, user), extra={"user":user}) | |
if __name__ == "__main__": | |
l = make_logger() | |
l.info("Test message with default user") | |
l.info("Test message with custom user", extra={"user":"saveshodhan"}) | |
some_service("foo", "bar") | |
some_service("foo", "bar", "saveshodhan") | |
########## | |
# OUTPUT # | |
########## | |
""" | |
[2018-08-31 12:01:30] INFO : app : <module> : Test message with default user | |
[2018-08-31 12:01:30] INFO : saveshodhan : <module> : Test message with custom user | |
[2018-08-31 12:01:30] INFO : app : some_service : ('foo', 'bar', None) | |
[2018-08-31 12:01:30] INFO : saveshodhan : some_service : ('foo', 'bar', 'saveshodhan') | |
""" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
To check if the logger exists (along with the handler set):