Ах, логи — цифровой эквивалент того самого друга, который никогда не замолкает. Но в отличие от вашего болтливого приятеля, эти записи хранят ключи к пониманию самых сокровенных тайн вашей системы. Давайте превратим этот поток данных в полезную информацию, хорошо?
Проектирование вашего логохранилища
Каждому хорошему сражению нужна стратегия. Вот как наши гладиаторы-логи будут бороться за ясность:
Наша трёхкомпонентная система защиты:
- Fluentd: неутомимый писец, собирающий каждый шепот в системе.
- Elasticsearch: Александрийская библиотека для структурированного хранения журналов.
- Kibana: наше хрустальное ша́ры, раскрывающее закономерности в хаосе.
Настройка Fluentd: от новичка до профи
Давайте настроим нашего самурая данных. Создайте /etc/fluentd/fluentd.conf
:
<source>
@type tail
path /var/log/app/*.log
pos_file /var/log/fluentd/app.log.pos
tag app.logs
<parse>
@type json
time_key timestamp
</parse>
</source>
<filter app.logs>
@type grep
<exclude>
key message
pattern /healthcheck/
</exclude>
</filter>
<match app.logs>
@type copy
<store>
@type elasticsearch
host elasticsearch.local
port 9200
logstash_format true
flush_interval 5s
</store>
<store>
@type s3
aws_key_id "#{ENV['AWS_KEY']}"
aws_sec_key "#{ENV['AWS_SECRET']}"
s3_bucket backup-logs
path logs/
time_slice_format %Y/%m/%d
</store>
</match>
Совет от профессионала: относитесь к конфигурации YAML как к первому свиданию — незначительные ошибки отступов приводят к катастрофическим сбоям!
Настройка Elasticsearch: выход за пределы настроек по умолчанию
Давайте заставим наш поисковый сервер мурлыкать, как довольный кот. Добавьте следующее в elasticsearch.yml
:
thread_pool.search.queue_size: 1000
indices.query.bool.max_clause_count: 4096
cluster.routing.allocation.disk.threshold_enabled: true
Частые ошибки, которых следует избегать:
- «Уби́йца Оом» (недостаточный объём кучи JVM)
- Синдром «взрыва индекса» (реализуйте политики ILM)
- Конфликты типов сопоставления (определите строгие шаблоны)
Kibana Кунг-фу: мастерство визуализации
Превратите необработанные данные в полезную информацию с помощью следующих конфигураций Lens:
{
"visualization": {
"type": "lens",
"aggs": [{
"type": "count",
"schema": "metric"
}, {
"type": "date_histogram",
"schema": "segment",
"params": {
"field": "@timestamp",
"interval": "auto"
}
}]
}
}
Проницательный совет: называйте свои панели инструментов как альбомы метал-групп — «Апокалипсис ошибок» работает лучше, чем «Журналы серверов 03».
Продвинутые боевые тактики
Ритуал ротации журналов:
# Создайте страховочную сеть на 2 ГБ
buffer_path: /var/log/fluentd/buffer/
chunk_limit_size: 32m
total_limit_size: 2G
queue_length_limit: 256
Протокол рукопожатия SSL:
<transport tls>
cert_path /etc/ssl/certs/fluentd.crt
private_key_path /etc/ssl/private/fluentd.key
client_cert_auth true
</transport>
Великая война фильтров:
<filter **>
@type record_transformer
enable_ruby true
<record>
hostname "#{Socket.gethostname}"
service_type ${tag_parts}
log_hero "Конфигурация Maxim's Fluentd v2.1"
</record>
</filter>
Помните: хорошо продуманная система журналирования подобна хорошему водопроводу — вы замечаете её только тогда, когда она перестаёт работать. Реализуйте эти шаблоны, и вы будете пить мохито на пляже, пока ваши журналы усердно организуются сами собой. Только не забудьте отправить мне открытку с того тропического отдыха, которому я косвенно помог вам достичь!
Теперь идите и покорите свой хаос журналов — пусть ваши кластеры будут зелёными, ваши запросы быстрыми, а ваш почтовый ящик с оповещениями пустым. Просто помните: с большой силой журналирования приходит большая ответственность… создавать потрясающие панели инструментов!