Динамическое управление уровнем логирования в Python можно реализовать несколькими способами:
logging.config.fileConfig или logging.config.dictConfig, можно загружать настройки логирования из файла (например, YAML или JSON).  При изменении файла можно перезагрузить конфигурацию, изменив уровень логирования.logging.getLogger("my_logger").setLevel(logging.DEBUG).Выбор метода зависит от сложности приложения и требований к управлению.
Управление уровнем логирования динамически в Python – это важная задача для отладки и мониторинга приложения в реальном времени. Вот несколько подходов, которые можно использовать:
Один из наиболее распространенных и рекомендуемых способов - это загрузка конфигурации логирования из внешнего файла (например, YAML, JSON, INI).  Python модуль logging.config позволяет парсить эти файлы и настраивать логирование.  Преимущество этого метода в том, что изменения в уровне логирования не требуют перезапуска приложения.
Пример использования YAML файла (logging_config.yaml):
version: 1
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
  file_handler:
    class: logging.FileHandler
    level: INFO
    formatter: simple
    filename: application.log
root:
  level: INFO
  handlers: [console, file_handler]
disable_existing_loggers: False
      Код Python для загрузки конфигурации:
import logging
import logging.config
import yaml
def setup_logging(default_path='logging_config.yaml', default_level=logging.INFO, env_key='LOG_CFG'):
    """Setup logging configuration"""
    path = default_path
    value = os.getenv(env_key, None)
    if value:
        path = value
    if os.path.exists(path):
        with open(path, 'rt') as f:
            try:
                config = yaml.safe_load(f.read())
                logging.config.dictConfig(config)
            except Exception as e:
                print(f"Error loading logging configuration: {e}")
                logging.basicConfig(level=default_level)
    else:
        logging.basicConfig(level=default_level)
if __name__ == '__main__':
    import os
    setup_logging()
    logger = logging.getLogger(__name__)
    logger.debug("This is a debug message")
    logger.info("This is an info message")
    logger.warning("This is a warning message")
    logger.error("This is an error message")
    logger.critical("This is a critical message")
      Чтобы изменить уровень логирования, нужно просто изменить значение level в файле конфигурации и, при необходимости, перезагрузить конфигурацию (например, с помощью сигнала SIGHUP, обработанного приложением).
Можно определить переменную окружения, которая будет определять уровень логирования. При запуске приложения, уровень логирования будет установлен в соответствии со значением этой переменной.
import logging
import os
def set_log_level_from_env():
    log_level_str = os.getenv("LOG_LEVEL", "INFO").upper()
    try:
        log_level = getattr(logging, log_level_str)
    except AttributeError:
        log_level = logging.INFO # Default to INFO if invalid
        print(f"Invalid LOG_LEVEL: {log_level_str}.  Using INFO.")
    logging.basicConfig(level=log_level)
if __name__ == '__main__':
    set_log_level_from_env()
    logger = logging.getLogger(__name__)
    logger.debug("This is a debug message")
    logger.info("This is an info message")
      Запуск приложения с нужным уровнем логирования:
LOG_LEVEL=DEBUG python your_script.pyЕсли приложение предоставляет API (например, с использованием Flask или FastAPI), можно создать endpoint, который будет принимать запрос с новым уровнем логирования и динамически его устанавливать. Это позволяет изменять уровень логирования "на лету" без перезапуска приложения.
from flask import Flask, request
import logging
app = Flask(__name__)
logging.basicConfig(level=logging.INFO)  # Initial level
logger = logging.getLogger(__name__)
@app.route('/set_log_level', methods=['POST'])
def set_log_level():
    level = request.form.get('level', 'INFO').upper()
    try:
        log_level = getattr(logging, level)
        logging.getLogger().setLevel(log_level)  # Set level for root logger
        return f"Log level set to {level}", 200
    except AttributeError:
        return "Invalid log level", 400
if __name__ == '__main__':
    app.run(debug=True)
      Запрос к API для изменения уровня логирования:
curl -X POST -d "level=DEBUG" http://localhost:5000/set_log_levelМожно интегрировать приложение с системой мониторинга, которая позволит не только собирать логи, но и динамически управлять уровнем логирования на основе заданных правил или по требованию оператора. Например, можно написать скрипт, который изменяет конфигурацию логирования приложения (через файл конфигурации или API), реагируя на оповещения от Prometheus.
Важно: