Tony Zeljkovic
08/29/2023, 2:01 PMSanz Al
08/29/2023, 2:59 PMprefect config set PREFECT_LOGGING_EXTRA_LOGGERS="flow-logger"
prefect config set PREFECT_LOGGING_LEVEL="WARNING"
And then, in your flows:
from logging import getLogger
log = getLogger("flow-logger")
log.setLevel("INFO")
Tony Zeljkovic
08/29/2023, 3:11 PMSanz Al
08/29/2023, 3:19 PMTony Zeljkovic
08/29/2023, 3:36 PMimport logging
import functools
class BaseFilter(logging.Filter):
"""
Base class for filters. Filters are used to filter out log messages of specific loggers.
Check documentation for more config details: <https://docs.python.org/3/library/logging.html#logging.Filter>
The default behavior is to filter out all log messages that contain any of the strings in the list except when logging level is set to DEBUG.
attributes:
strings_to_filter: list of SUBstrings to filter out. This means that any log message that contains any of the strings in the list will be filtered out.
loggers_to_filter: list of loggers to filter these messages from.
"""
def __init__(self, strings_to_filter=None):
super().__init__()
if strings_to_filter is None:
self.strings_to_filter = []
else:
self.strings_to_filter = [string.lower() for string in strings_to_filter]
def filter(self, rec):
# If logging level is set to DEBUG, do not filter
if rec.levelno == logging.DEBUG:
return True
msg = str(rec.msg) # Convert to string to be safe
return not any(string in msg.lower() for string in self.strings_to_filter)
def log_filter(filters=None):
""" Decorator to apply filters to loggers. To be applied to either a flow or a task.
Args:
filters: list of filter classes to apply. Each filter class must inherit from BaseFilter.
"""
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
if filters is not None:
for filter_class in filters:
for logger_name in filter_class().loggers_to_filter:
logging.getLogger(logger_name).addFilter(filter_class())
return func(*args, **kwargs)
return wrapper
return decorator
Tony Zeljkovic
08/29/2023, 3:38 PMSanz Al
08/29/2023, 3:40 PMIdan
09/20/2023, 1:12 PMTony Zeljkovic
09/20/2023, 4:13 PMTony Zeljkovic
09/20/2023, 4:13 PMIdan
09/20/2023, 4:18 PMTony Zeljkovic
09/20/2023, 5:05 PM