Logging Context Manager in Python

These default to a StreamHandler which writes to sys.stderr, logging.ERROR and 100 respectively.
Heres the script:
import logging
from logging.handlers import MemoryHandler
import sys

logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

def log_if_errors(logger, target_handler=None, flush_level=None, capacity=None):
if target_handler is None:
# Let’s create a new StreamHandler to handle our logging needs. We’ll call it “target_handler” and set it as the default handler for now.
target_handler = logging.StreamHandler()
if flush_level is None:
# Whoa, hold up there, partner! Let’s make sure we don’t forget to flush our logs every time an error occurs. We’ll call this level “flush_level” and set it to ERROR for now.
flush_level = logging.ERROR
if capacity is None:
# Alrighty then, let’s create a MemoryHandler with a default capacity of 100 logs before flushing them out. We’ll call this “capacity”.
capacity = 100
handler = MemoryHandler(capacity, flushLevel=flush_level, target=target_handler)

def decorator(fn):
# Alrighty then, let’s create a wrapper function for our decorated function. This will add the MemoryHandler to our logger and handle any errors that occur during execution.
def wrapper(*args, **kwargs):
logger.addHandler(handler)
try:
return fn(*args, **kwargs)
except Exception:
# If an error occurs, let’s log it with the exception() method and raise the error again to propagate up the stack trace.
logger.exception(‘Call failed’)
raise
finally:
# After our function has finished executing (whether successfully or not), we need to flush any remaining logs in memory and remove the MemoryHandler from our logger.
super(MemoryHandler, handler).flush()
logger.removeHandler(handler)
return wrapper

return decorator

def write_line(s):
# Let’s create a new function to handle writing lines of text to our standard error stream (sys.stderr). We’ll call it “write_line” and pass in the string we want to print as an argument.
sys.stderr.write(‘%s\n’ % s)

file_path: downloaded/example.txt

These default to a StreamHandler which writes to sys.stderr, logging.ERROR and 100 respectively.

Here’s the script:

import logging
from logging.handlers import MemoryHandler
import sys

logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

def log_if_errors(logger, target_handler=None, flush_level=None, capacity=None):
if target_handler is None:
# Let’s create a new StreamHandler to handle our logging needs. We’ll call it “target_handler” and set it as the default handler for now.
target_handler = logging.StreamHandler()
if flush_level is None:
# Whoa, hold up there, partner! Let’s make sure we don’t forget to flush our logs every time an error occurs. We’ll call this level “flush_level” and set it to ERROR for now.

SICORPS