Динамическое управление уровнем логирования в 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.
Важно: