====== Fluentd ======
:!: Модуль Parse. RegExp
[[https://adminnotes.info/%D0%B1%D0%B5%D0%B7-%D1%80%D1%83%D0%B1%D1%80%D0%B8%D0%BA%D0%B8/%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-fluentd.html|Дока]]\\
В регулярном выражении должен быть хотя бы один именованный захват (? PATTERN)\\
* :!: Все выражение находится между слешами\\
* :!: Каждый блок в круглых скобках, вопрос, имя, как в прмиере выше\\
* :!: Между блоками просто пробел\\
* :!: Поле с форматом даты можно задачть специально, отдельной строкой\\
* :!: Полям можно типы данных указывать\\
Если в рег выражении есть захват с именем "time", его можно настроить с помощью "time_key" параметра, оно используется как время события. Вы можете указать формат времени в параметре "time_format"\\
@type regexp
expression /.../im
expression ^(?
{{:linux:elk-2.jpg?direct&600|}}\\
Парсер для многострочного варианта\\
Модуль "multiline" является аналогом "regexp" только для многострочного использования\\
[[https://docs.fluentd.org/parser/multiline|Дока]]\\
@type tail
@type multiline
format_firstline /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3}[ ]+.*/
format1 /^(?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3})[ ]+(?\[.*\]+) (?[^ ]+)[ ]+(?[^ ]+)[ ]+\-[ ]+(?.*)/
path C:\myapp\logs\myapp.log
pos_file C:\td-agent\pos\myapp.pos
tag myapp_log
:!: td-agent. Пример конфига агента для отправки в ELK
####
## Output descriptions:
##
@type tail
@type regexp
expression /^(?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3})[ ]+\[(?[^ ]+)\][ ]+(?[^ ]+)[ ]+(?[^ ]+)[ ]+\- (?.*)/
path C:\my_service\logs\my_service.log
pos_file C:\td-agent\pos\my_service.pos
tag my_service_log
@type record_modifier
host "2.2.2.0"
tag my_service
#
# @type grep
#
# key level
# pattern /info/i
#
#
@type elasticsearch
host 1.1.1.1
port 9200
logstash_format true
logstash_prefix my_service
user --
password --
reconnect_on_error true
reload_on_failure true
reload_connections false
log_es_400_reason true
request_timeout 15s
@type memory
chunk_limit_records 1000
chunk_limit_size 2M
queue_limit_length 100
queued_chunks_limit_size 200
overflow_action block
retry_max_interval 10
retry_randomize true
retry_max_times 3
flush_interval 5
flush_mode interval
flush_thread_count 5
Файл лежит в папке "etc/td-agent/config.d/"\\
а штатный конфиг, "td-agent.conf", содержит строку "@include config.d/*.conf"\\
# Скрипт для установки 4ой версии
$ curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent4.sh | sh
===== Конфигурация =====
-> ->
**Source** - информация об источнике данных\\
**Match** - информация о том куда передавать полученные данные\\
**Include** - информация о типах файлов\\
**System** - настройки системы\\
==== Source ====
Откуда брать данные. Для подключения источников есть разные плагины (например "type http" или "type forward"). Для каждого источника отдельный блок\\
Каждое событие передается маршрутизатору сообщений, каждое событие содержит "tag, time и record"\\
На основании "tag" принимается решение куда перенаправлять событие, а record содержит сами данные в формате json\\
==== Match ====
Указывается по какому признаку отбирать события для полседующей обработки, тоже используются спец плагины\\
Например:\\
#Берём события, помеченные тэгами "myapp.access"
#и сохраняем их в файле/var/log/fluent/access.%Y-%m-%d
#данные можно разбивать на порции с помощью опции time_slice_format.
type file
path /var/log/fluent/access
Есть ряд комбинаций по маске, звездочки, фигурные скобки\\
- символ * означает соответствие любой части тэга (если указать , то a.b будет соответствовать заданному условию, а a.b.c — нет);
- ** означает соответствие любому тэгу (если указать , то заданному условию будут соответствовать и a, и a.b., и a.b.c);
- {x, y, z} означает соответствие по крайней мере одному из тэгов, указанных в фигурных скобках (если указать , то а и b будут соответствовать заданному условию, а с — нет);
- фигурные скобки можно использоовать в сочетании с символами * и **, например: или *;
- означает соответствие тэгам a и b одновременно;
- означает соответствие тэгам a, a.b и a.b.c (первая часть) и b.d (вторая часть).
События матчатся друг за другом и похоже дальше не передаются, т.к. самые общие правила должны быть внизу\\
:!:Пример конфига
В таком подходе парсятся все логи в указанном расположении, а для разделения в матче задаем "service_name ${"#{tag_parts[3]}"}", это 3ий элемент в пути, тут будет имя папки\\
"logstash_prefix" указанный в ELK это префикс по которому будем отбирать в кибане\\
:!:Не забываем при мерже нескольких конфигов, что матчи с одинаковым именем могут пересекаться и не будет правильно работать, используется первый подходящий, дальше не идет\\
@type tail
format multiline
format_firstline /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}/
format1 /^(?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})[ ]+\[(?[^ ]+)?\][ ]+(?[^ ]+)[ ]+(?[^ ]+)[ ]+\- (?.*)/
time_format %F %T.%L
path "/opt/BIN/Service_*/log/my_service.log"
tag my_tag.*
read_from_head true
pos_file /var/log/td-agent/pos/FileMultiplicator.pos
refresh_interval 10s
rotate_wait 0s
emit_unmatched_lines true
@type grep
key level
pattern /ERROR/
@type record_modifier
host "#{Socket.gethostname}"
service_name ${"#{tag_parts[3]}"}
tag elkFM
@type elasticsearch
host 10.10.10.10
port 9100
logstash_format true
logstash_prefix my_prefix
user ====
password ====
reconnect_on_error true
reload_on_failure true
reload_connections false
@type memory
chunk_limit_size 12m
queue_limit_length 50
overflow_action block
retry_max_interval 10
retry_randomize true
retry_max_times 3
flush_interval 5
flush_mode interval
flush_thread_count 5