Добрый день.
Возникло желание для этих двух систем настроить долговременное хранение логов. Поиск готовых решений привел к некоторым результатам, но есть некоторые проблемы:
-
Squid. Он генерирует огромное, для нашей инфраструктуры, количество логов. Порядка 100ГБ в день в ежедневном индексе. Хотелось бы как-то их ужать, но не знаю как.
Из пришедших в голову вариантов было попытаться писать больше информации в один документ, возможно через multiline. Либо создавать под каждого пользователя свой индекс и всю информацию по пользователю писать туда. Но есть подозрение что если это и получится реализовать, то искать информацию будет очень сложно. -
Exchange. Я хотел бы вести логи журнала MessageTracking для 4 серверов. Они генерируют меньше логов, хотя объем тоже получается большой. Идея была распарсить лог через фильтр grok, затем вырезать лишние поля, в надежде что лог будет меньше и искать данные в индексах будет проще. Но надежды на простое решение разбились об регулярные выражения. Через grok debugger я вывел вот такую регулярку:
(%{TIMESTAMP_ISO8601:date_time}),,(%{HOSTNAME:client_hostname}),,(%{HOSTNAME:server_hostname}),(%{GREEDYDATA:source_context}),,(%{GREEDYDATA:connector_id}),(%{WORD:source}),(%{WORD:event_id}),<(%{GREEDYDATA:internal_message_id})>,(%{UUID:message_id}),(?<recipient_adress>[a-zA-Z0-9_.+=(%{NUMBER:total-bytes}):-]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*),(%{DATA:recipient_status}),(%{NUMBER:total_bytes}),(%{NUMBER:recipient_count}),,,(%{DATA:message_subject}),(?<sender_adress>[a-zA-Z0-9_.+=(%{NUMBER:total-bytes}):-]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*),(?<return_path>[a-zA-Z0-9_.+=(%{NUMBER:total-bytes}):-]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*),(%{GREEDYDATA:message_info})?,(%{WORD:directionality})?,(%{GREEDYDATA:tenant_id})
В дебаггере она отрабатывает идеально, но если вставлять это в конфиг фильтра logstash в таком виде
filter {
if "exchange" in [tags] {
grok {
match => {
"message" => "(%{TIMESTAMP_ISO8601:date_time}),,и далее до конца"
}
}
}
}
То logstash просто перестает принимать логи со всех серверов вообще. В логе filebeat появляются такие сообщения
ERROR pipeline/output.go:100 Failed to connect to backoff(async(tcp://10.0.215.141:5044)): dial tcp 10.0.215.141:5044: connectex: No connection could be made because the target machine actively refused it.
Если менять ту часть, где выделяется email, на (%{EMAILADDRESS:email}), то в дебаггере появляется ошибка Compile ERROR (причем судя по темам с названием grok EMAILADDRESS, проблема не только у меня). А в logstash логи приходят с тегом _grokparsefailure.
В logstash_plain.log есть такое:
[ERROR][logstash.javapipeline ] Pipeline aborted due to error {:pipeline_id=>"main", :exception=>#<RegexpError: empty range in char class
[ERROR][logstash.agent ] Failed to execute action {:id=>:main, :action_type=>LogStash::ConvergeResult::FailedAction, :message=>"Could not execute action: PipelineAction::Create<main>, action_result: false", :backtrace=>nil}
Проблема точно связана с %{EMAILLOCALPART}, но непонятно что с этим можно сделать. Регулярка до части с почтой отрабатывает в Logstash отлично и в ES приходит правильно.
Вопросы:
Возможно ли сделать с размером логов squid/exchange то, что хотелось бы или такой рост документов норма и нужно смириться?
В чем может быть ошибка регулярного выражения? Это проблема именно с логами Exchange или EMAILLOCALPART в таком виде не работает у всех?
Адеватно ли вообще собирать эти логи через ELK или я трачу время впустую?