Skip to content

Commit

Permalink
structlog: add structlog logger factory
Browse files Browse the repository at this point in the history
  • Loading branch information
jrcastro2 committed Jul 17, 2024
1 parent 45f7137 commit 2d93003
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 0 deletions.
69 changes: 69 additions & 0 deletions invenio_logging/structlog.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import structlog
import logging
from logging import StreamHandler
import sys

class LoggerFactory:
@staticmethod
def configure_logging(logger_name=None, level=logging.INFO, handler=None, processors=None):
"""
Configures the logging for the specified logger.
Args:
logger_name (str): The name of the logger. If not provided, a root logger will be used.
level (int): The logging level. Defaults to logging.INFO.
handler (logging.Handler): The logging handler to use. If not provided, a StreamHandler with stdout will be used.
processors (list): The list of structlog processors to apply. If not provided, a default set of processors will be used.
Returns:
structlog.BoundLogger: The configured logger.
"""
if processors is None:
processors = [
structlog.stdlib.filter_by_level,
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.processors.TimeStamper(fmt="iso"),
structlog.processors.JSONRenderer()
]

# Create a new logger
logger = logging.getLogger(logger_name)
logger.setLevel(level)

# Use the provided handler or default to StreamHandler with stdout
if handler is None:
handler = StreamHandler(sys.stdout)

handler.setFormatter(logging.Formatter("%(message)s"))

# Add handler to logger if not already added
if not logger.handlers:
logger.addHandler(handler)

structlog.configure(
processors=processors,
context_class=dict,
logger_factory=structlog.stdlib.LoggerFactory(),
wrapper_class=structlog.stdlib.BoundLogger,
cache_logger_on_first_use=True,
)
return structlog.wrap_logger(logger)

@staticmethod
def get_logger(name=None, level=logging.INFO, handler=None, processors=None):
"""
Retrieves a configured logger with the specified name.
Args:
name (str): The name of the logger. If not provided, a root logger will be used.
level (int): The logging level. Defaults to logging.INFO.
handler (logging.Handler): The logging handler to use. If not provided, a StreamHandler with stdout will be used.
processors (list): The list of structlog processors to apply. If not provided, a default set of processors will be used.
Returns:
structlog.BoundLogger: The configured logger.
"""
return LoggerFactory.configure_logging(name, level, handler, processors)
1 change: 1 addition & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ zip_safe = False
install_requires =
invenio-celery>=1.2.4
invenio-db>=1.0.12
structlog>=24.2.0

[options.extras_require]
tests =
Expand Down

0 comments on commit 2d93003

Please sign in to comment.