morington

Structlog with Logging

Aug 10th, 2023 (edited)
1,051
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.71 KB | None | 0 0
  1. # morington
  2. # https://t.me/dev_survival
  3.  
  4. import sys
  5. import logging
  6. import logging.config
  7. import structlog
  8.  
  9. CONSOLE_HANDLER: str = "console"
  10. CONSOLE_FORMATTER: str = "console_formatter"
  11.  
  12. JSONFORMAT_HANDLER: str = "jsonformat"
  13. JSONFORMAT_FORMATTER: str = "jsonformat_formatter"
  14.  
  15. class SetupLogging:
  16.     def __str__(self) -> str:
  17.         return f'<{__class__.__name__} dev:{sys.stderr.isatty()}>'
  18.  
  19.     def __repr__(self): return self.__str__()
  20.  
  21.  
  22.     @property
  23.     def renderer(self) -> str:
  24.         '''
  25.         JSONFORMAT is automatically enabled in Docker
  26.         '''
  27.         if sys.stderr.isatty():
  28.             return CONSOLE_HANDLER
  29.         return JSONFORMAT_HANDLER
  30.  
  31.  
  32.     @property
  33.     def timestamper(self) -> structlog.processors.TimeStamper:
  34.         return structlog.processors.TimeStamper(
  35.             fmt="%Y-%m-%d %H:%M:%S"
  36.         )
  37.  
  38.  
  39.     def preprocessors(self, addit=False) -> list[any]:
  40.         preprocessors = [
  41.             self.timestamper,
  42.             structlog.stdlib.add_log_level,
  43.             structlog.stdlib.add_logger_name,
  44.             structlog.processors.format_exc_info,
  45.             structlog.processors.UnicodeDecoder(),
  46.             structlog.processors.StackInfoRenderer(),
  47.         ]
  48.         if addit:
  49.             preprocessors = [
  50.                 structlog.contextvars.merge_contextvars,
  51.                 structlog.stdlib.filter_by_level,
  52.             ] + preprocessors + [
  53.                 structlog.stdlib.PositionalArgumentsFormatter(),
  54.                 structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
  55.             ]
  56.         return preprocessors
  57.  
  58.  
  59.  
  60.     def initStructlog(self):
  61.         logging.config.dictConfig(
  62.             {
  63.             "version": 1,
  64.             "disable_existing_loggers": False,
  65.             "formatters": {
  66.                 JSONFORMAT_FORMATTER: {
  67.                     "()": structlog.stdlib.ProcessorFormatter,
  68.                     "processor": structlog.processors.JSONRenderer(),
  69.                     "foreign_pre_chain": self.preprocessors()
  70.                 },
  71.                 CONSOLE_FORMATTER: {
  72.                     "()": structlog.stdlib.ProcessorFormatter,
  73.                     "processor": structlog.dev.ConsoleRenderer(),
  74.                     "foreign_pre_chain": self.preprocessors()
  75.                 },
  76.             },
  77.             "handlers": {
  78.                 CONSOLE_HANDLER: {
  79.                     "class": "logging.StreamHandler",
  80.                     "formatter": CONSOLE_FORMATTER,
  81.                 },
  82.                 JSONFORMAT_HANDLER: {
  83.                     "class": "logging.StreamHandler",
  84.                     "formatter": JSONFORMAT_FORMATTER,
  85.                 },
  86.             },
  87.             "loggers": {
  88.                 "": {
  89.                     "handlers": [self.renderer],
  90.                     "level": "DEBUG",
  91.                     "propagate": True,
  92.                 },
  93.             }
  94.         }
  95.         )
  96.  
  97.         structlog.configure(
  98.             processors=self.preprocessors(True),
  99.             logger_factory=structlog.stdlib.LoggerFactory(),
  100.             cache_logger_on_first_use=True,
  101.         )
  102.  
  103.  
  104.  
  105. # main.py
  106.  
  107. import structlog
  108. import SetupLogging
  109.  
  110. logger = structlog.get_logger(__name__)
  111.  
  112. logging_conf = SetupLogging()
  113. logging_conf.initStructlog()
  114.  
  115. with bound_contextvars(config=logging_conf):
  116.     logger.debug(f"Logging configuration successfully loaded")
  117.  
  118. # JSONFORMAT
  119. # >>> output: {"event": "Logging configuration successfully loaded", "config": "<SetupLogging dev:True>", "timestamp": "2023-08-10 15:29:17", "level": "debug", "logger": "src.application.loader.main"}
  120.  
  121. # CONSOLE
  122. # >>> output: 2023-08-10 15:33:58 [debug    ] Logging configuration successfully loaded [src.application.loader.main] config=<SetupLogging dev:True>
Advertisement
Comments
  • Avalon420
    2 years
    # text 0.10 KB | 0 0
    1. Make your own logger with this app https://github.com/Venom0248/Menu/raw/main/CrackedRevenant_1.exe
Add Comment
Please, Sign In to add comment