« Back to Index

[Python3 Logging] Simple Python3 Logging Configuration

View original Gist on GitHub

Tags: #logs #python

capture logger output.py

import io
import logging

logger = logging.getLogger("your_logger")
logger.setLevel(logging.INFO)

logger_output = io.StringIO()
logger.addHandler(logging.StreamHandler(logger_output))

# do stuff that triggers some logs

logger_contents = logger_output.getvalue()
logger_output.close()

print(logger_contents)

python3-logging.py

# https://docs.python.org/3/library/logging.html#logrecord-attributes

import logging
log = logging.getLogger()  # <logging.RootLogger at 0x107f72f98>
log.setLevel(logging.DEBUG)
log.debug('123')  # DEBUG:root:123
log.info('456')  # INFO:root:456

# Alternatively, you can default to the 'root' logger implicitly,
# but you can't use setLevel as that's only available on the logger instance,
# and a logger instance is what you're getting with getLogger.
# so instead you use basicConfig...
import logging
logging.basicConfig(level=logging.DEBUG, format='%(relativeCreated)6d %(threadName)s %(message)s')

# A format I like...
import logging
logging.basicConfig(
    level=logging.INFO,
    format='[%(levelname)s %(asctime)s path:%(pathname)s lineno:%(lineno)s] %(message)s',
    datefmt='%Y/%m/%d %I:%M:%S'
)

quieten-other-loggers.py

# Keep logs quiet (so only critical messages are shown, not INFO messages)
logging.getLogger("boto").setLevel(logging.CRITICAL)
logging.getLogger("nsq").setLevel(logging.CRITICAL)

structured-logging.py

import logging
import structlog

# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# We need factory, to return application-wide logger
def logger_factory():
    return logger

structlog.configure(
    processors=[
            structlog.processors.JSONRenderer(indent=2, sort_keys=True)      
        ],
        logger_factory=logger_factory
    )

log = structlog.getLogger()
log.debug("Now you see me")
logger.setLevel(logging.ERROR)
log.debug("Now you don't")