Skip to content

Commit

Permalink
🐛⚡💡 fix: filtering log records in log file handlers
Browse files Browse the repository at this point in the history
Added
Introduced LoggingLevelFilter class to filter log records based on their logging level.
Includes comprehensive docstrings for Filter Class that explains the filtering logic.
Ensures that log records are written only to their respective log files, preventing higher-level logs from appearing in lower-level files.

Updated
Modified the logging configuration in conf to apply the LoggingLevelFilter to each file handler.
Updated the handlers dictionary to include the newly created filter for each log level.
Introduced a filters dictionary in the logging configuration to manage the filters for each log level.
Ensured that each log level's handler is correctly associated with its corresponding filter.
Closes #4
  • Loading branch information
MEHRSHAD-MIRSHEKARY committed Aug 17, 2024
1 parent 941b5f0 commit 9fdf063
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 0 deletions.
Empty file.
38 changes: 38 additions & 0 deletions django_logging/filters/level_filter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import logging


class LoggingLevelFilter(logging.Filter):
"""
Filters log records based on their logging level.
This filter is used to prevent log records from being written to log files
intended for lower log levels. For example, if we have separate log
files for DEBUG, INFO, WARNING, and ERROR levels, this filter ensures that
a log record with level ERROR is only written to the ERROR log file, and not
to the DEBUG, INFO or WARNING log files.
"""

def __init__(self, logging_level: int):
"""
Initializes a LoggingLevelFilter instance.
Args:
logging_level: The logging level to filter on (e.g. logging.DEBUG, logging.INFO, etc.).
Returns:
None
"""
super().__init__()
self.logging_level = logging_level

def filter(self, record: logging.LogRecord) -> bool:
"""
Filters a log record based on its level.
Args:
record: The log record to filter.
Returns:
True if the log record's level matches the specified logging level, False otherwise.
"""
return record.levelno == self.logging_level
12 changes: 12 additions & 0 deletions django_logging/settings/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import os
from typing import List, Dict, Optional

from django_logging.filters.level_filter import LoggingLevelFilter


class LogConfig:
"""
Expand Down Expand Up @@ -67,6 +69,7 @@ def set_conf(self) -> None:
"filename": log_file,
"formatter": "default",
"level": level,
"filters": [level.lower()]
}
for level, log_file in self.log_files.items()
}
Expand All @@ -76,6 +79,14 @@ def set_conf(self) -> None:
"level": "DEBUG",
}

filters = {
level.lower(): {
"()": LoggingLevelFilter,
"logging_level": getattr(logging, level),
}
for level in self.log_config.log_levels
}

loggers = {
level.lower(): {
"level": level,
Expand All @@ -88,6 +99,7 @@ def set_conf(self) -> None:
config = {
"version": 1,
"handlers": handlers,
"filters": filters,
"loggers": loggers,
"root": {"level": "DEBUG", "handlers": list(handlers.keys())},
"disable_existing_loggers": False,
Expand Down

0 comments on commit 9fdf063

Please sign in to comment.