Как настраивать правильно логгирование в Python?

Как правильно настраивать логгирование для Python библиотеки, чтобы не было огромного падения прозводительности? Стоит ли вообще использовать логирование, если я пишу Python библиотеку? Криптографические алгоритмы обычно требуют максималльной производительности, но логгирование упрощает разработку в разы.

Вот я написал такую настройку, начитавшись про очередь сообщений и буфферизацию, но при таких параметрах производительность в коде падает на 80% где-то (я понимаю, что из-за IO, но 80% уж очень много). Первоначальные настройки брал отсюда

В моем понимании, все debug должны отправляться в файл, чтобы можно было дебажить код. В ином случае смысл тогда логирования? Логгирование получается стоит использовать, если пишу GUI какой-нибудь, микросервис и т.п?

Вот функция для настройки логгера:


import atexit
import json
import logging
import logging.config
import logging.handlers
import pathlib
import queue

def setup_logger() -> None:
    project_root = next(
        p for p in pathlib.Path(__file__).parents if p.parts[-1] == 'python-rsa'
    )

    log_folder = project_root / "logs"
    log_folder.mkdir(exist_ok=True)

    with open(project_root / "rsa/core/config/logger_config.json", "r") as f_in:
        config = json.load(f_in)

    for handler in config.get("handlers", {}).values():
        if "filename" in handler:
            handler["filename"] = str(log_folder / pathlib.Path(handler["filename"]).name)

    logging.config.dictConfig(config)

    log_queue = queue.Queue(-1)

    queue_handler = logging.handlers.QueueHandler(log_queue)
    logger.addHandler(queue_handler)

    file_handler = config["handlers"]["file"]
    stderr_handler = config["handlers"]["stderr"]

    listener = logging.handlers.QueueListener(log_queue, file_handler, stderr_handler)
    listener.start()

    def cleanup():
        try:
            listener.stop()
        except Exception as e:
            logger.error("Error stopping QueueListener: %s", e)
        finally:
            queue_handler.close()
            for handler in logger.handlers:
                handler.close()

    atexit.register(cleanup)

    logger.debug("logger is configured")

Json файл, в котором я попытался вынести основные параметры:

{
  "version": 1,
  "disable_existing_loggers": false,
  "formatters": {
    "simple": {
      "format": "[%(levelname)s|%(module)s|L%(lineno)d] %(asctime)s: %(message)s",
      "datefmt": "%Y-%m-%dT%H:%M:%S%z"
    }
  },
  "handlers": {
    "stderr": {
      "class": "logging.StreamHandler",
      "level": "WARNING",
      "formatter": "simple",
      "stream": "ext://sys.stderr"
    },
    "file": {
      "class": "concurrent_log_handler.ConcurrentRotatingFileHandler",
      "level": "DEBUG",
      "formatter": "simple",
      "filename": "logs/debug-info.log",
      "maxBytes": 10000,
      "backupCount": 3
    }
  },
  "loggers": {
    "root": {
      "level": "DEBUG",
      "handlers": [
        "stderr",
        "file"
      ]
    }
  },
  "buffering_handler": {
    "buffer_size": 100
  }
}


Ответы (0 шт):