Как настраивать правильно логгирование в 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
}
}