pip install sentry-sdk
). Настройте его с ключом API/DSN, предоставленным системой мониторинга.
sentry_sdk.capture_exception()
или middleware.
sentry_sdk.set_user()
, sentry_sdk.set_context()
или аналогичные методы.
logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
sentry_sdk.start_transaction()
).
Интеграция логирования Python с внешними системами мониторинга, такими как Sentry или ELK Stack, обычно включает в себя следующие этапы:
В первую очередь необходимо выбрать библиотеку, упрощающую отправку логов в систему мониторинга. Для Sentry часто используют библиотеку sentry-sdk
. Для ELK Stack можно использовать logging
модуль Python в связке с библиотеками для отправки логов в Elasticsearch (например, elasticsearch
) или Logstash (например, logstash-async
). Другой вариант - использование Filebeat для отправки лог файлов в Logstash или Elasticsearch.
Настраиваем стандартный logging
модуль Python. Это включает в себя определение уровней логирования (DEBUG, INFO, WARNING, ERROR, CRITICAL), форматеров (для структурирования логов) и обработчиков (handlers), которые будут отправлять логи в выбранную систему мониторинга.
Пример с sentry-sdk
:
import logging
import sentry_sdk
from sentry_sdk.integrations.logging import LoggingIntegration
sentry_logging = LoggingIntegration(
level=logging.INFO, # Capture info and above as breadcrumbs
event_level=logging.ERROR # Send errors as events
)
sentry_sdk.init(
dsn="YOUR_SENTRY_DSN", # Замените на ваш DSN
integrations=[sentry_logging]
)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO) # устанавливаем минимальный уровень логирования для logger
logger.info("Приложение запущено")
try:
1 / 0
except Exception as e:
logger.exception("Произошла ошибка!") # Отправит ошибку в Sentry
Пример с ELK Stack (отправка в Elasticsearch):
import logging
import logging.config
import json
from elasticsearch import Elasticsearch
class ElasticsearchHandler(logging.Handler):
def __init__(self, es_client, index_name):
super().__init__()
self.es_client = es_client
self.index_name = index_name
def emit(self, record):
log_entry = self.format(record)
try:
self.es_client.index(index=self.index_name, document=json.loads(log_entry))
except Exception as e:
print(f"Ошибка отправки лога в Elasticsearch: {e}")
# Настройка Elasticsearch клиента
es_client = Elasticsearch([{'host': 'localhost', 'port': 9200}]) # Замените на ваши настройки Elasticsearch
# Проверка подключения
if not es_client.ping():
raise ValueError("Не удалось подключиться к Elasticsearch!")
# Создание логгера
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# Создание обработчика Elasticsearch
es_handler = ElasticsearchHandler(es_client=es_client, index_name="python-logs")
# Форматирование логов
formatter = logging.Formatter('{"timestamp": "%(asctime)s", "level": "%(levelname)s", "name": "%(name)s", "message": "%(message)s"}')
es_handler.setFormatter(formatter)
# Добавление обработчика к логгеру
logger.addHandler(es_handler)
logger.info("Приложение запущено")
try:
1 / 0
except Exception as e:
logger.exception("Произошла ошибка!")
Очень важно настроить форматтеры так, чтобы они генерировали структурированные логи (например, в формате JSON). Это упрощает анализ и поиск логов в системах мониторинга.
В логи следует добавлять контекстную информацию, такую как ID пользователя, ID транзакции, ID запроса. Это значительно облегчает отладку и анализ проблем. В sentry-sdk
можно использовать sentry_sdk.set_user
, sentry_sdk.set_tag
и sentry_sdk.set_context
. Для ELK Stack контекст можно просто добавлять в сообщение лога или использовать `logging.extra`.
Пример с Sentry:
import sentry_sdk
sentry_sdk.set_user({"id": 123, "email": "user@example.com"})
sentry_sdk.set_tag("environment", "production")
sentry_sdk.set_context("release", {"version": "1.0.0"})
Обязательно протестируйте интеграцию, чтобы убедиться, что логи успешно отправляются в систему мониторинга и правильно отображаются.
Не забудьте обрабатывать исключения, возникающие при отправке логов, чтобы не допустить сбоя приложения из-за проблем с системой мониторинга.
Важно помнить, что конкретная реализация интеграции зависит от выбранной системы мониторинга и требований проекта.