Skip to content

Instantly share code, notes, and snippets.

@saveshodhan
Last active September 27, 2018 14:39
Show Gist options
  • Save saveshodhan/126f52fa2250c10f7a0633d38f68ae79 to your computer and use it in GitHub Desktop.
Save saveshodhan/126f52fa2250c10f7a0633d38f68ae79 to your computer and use it in GitHub Desktop.
Python logging configuration
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')
"""
@saveshodhan
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment