👋 Привет! А как вы читаете логи?
Умение зайти на хост и отфильтровать логи через grep — обязанность любого уважающего себя инженера. Но если инфраструктура подросла, появились важные сервисы, — пора задуматься о централизованном логировании.
Если инфраструктура относительно небольшая, и вы, как и я, любите Grafana — отличным вариантом станет использование Loki.
📦 Как работает Loki: сбор и визуализация логов
1. Архитектура:
- Логи с серверов и приложений собирает агент Promtail.
- Promtail отправляет логи в Loki (обычно по порту 3100).
- Визуализация логов и построение графиков происходит в Grafana, которая интегрируется с Loki.
2. Как это работает:
- Promtail читает указанные лог-файлы и отправляет данные в Loki.
- Grafana подключается к Loki как к источнику данных — и вы можете просматривать логи, строить графики и делать алерты.
3. Плюсы такого подхода:
✅ Централизованный сбор логов.
✅ Гибрид между ELK и Prometheus: минимальное потребление ресурсов, легко масштабируется.
✅ Работает как с метриками, так и с сырыми логами, что удобно при отладке или расследованиях.
📌 Советы:
- Не забывайте настраивать лейблы — без них не получится нормально фильтровать логи в Grafana.
- Настраивайте отдельные scrape_configs для разных типов логов: системные, приложенческие, nginx, базы и т.д.
- Не открывайте Grafana без авторизации — логи могут содержать чувствительные данные.
👨💻 Личный опыт:
Нужны логи с подов в Kubernetes? Легко! Добавьте в ваш promtail следующую задачу:
- job_name: kubernetes-pods
static_configs:
- targets: ["localhost"]
labels:
node: "k3s_node"
__path__: /var/log/containers/*.log
level: info
pipeline_stages:
- cri: {}
relabel_configs:
- source_labels: ['__path__']
regex: '/var/log/containers/(?P<pod_name>[^_]+)_(?P<namespace>[^_]+)_(?P<container_name>[^-]+)-.+\.log'
target_label: 'pod'
replacement: '$1'
- source_labels: ['__path__']
regex: '/var/log/containers/(?P<pod_name>[^_]+)_(?P<namespace>[^_]+)_(?P<container_name>[^-]+)-.+\.log'
target_label: 'namespace'
replacement: '$2'
- source_labels: ['__path__']
regex: '/var/log/containers/(?P<pod_name>[^_]+)_(?P<namespace>[^_]+)_(?P<container_name>[^-]+)-.+\.log'
target_label: 'container'
replacement: '$3'
- action: replace
replacement: 'kubernetes-pods'
target_label: '__job__'
Теперь вы сможете легко отлавливать логи всех подов в вашем кластере!
Кстати, если хотите узнать как это все красиво визуализировать в Graphana, дайте знать в комментариях.
