Сдружаваме ELK и Exchange. Част 1

Сдружаваме ELK и Exchange. Част 1

Започвам поредица статии, в които искам да споделя опита си в свързването на Exchange и ELK. Тази стек система ще помогне за обработката на големи обеми логове, без да се налага да се питаме при какъв размер обичайната логираща техника ще спре да ни помага. Нека се запознаем с новия участник в обработката на логове.

Exchange разполага с достатъчно сложна система за логиране. Най-търсените логове са логовете за проследяване, които следят стъпка по стъпка конкретно съобщение в пощенската система; логовете на уеб сървъра, които проследяват всяка нова сесия на потребител в системата, и логовете на конкретни уеб приложения с различна степен на детайлност на сесията. Освен това Exchange може да съхранява сурови логове на протоколите smtp, imap и pop3.

Какви инструменти можем да използваме за работа с логовете:

  • Вградената команда Get-MessageTrackingLog: удобно обработва логовете за проследяване;
  • Утилитата logparser: за логиране използва псевдо-SQL език за търсене и работи доста бързо;
  • Външен SQL сървър: за много специфични случаи (например, анализ на данни за дълги периоди от време).

Всичко това работи добре, когато имаме няколко сървъра и обемът на обработваните логове е в десетки или стотици гигабайти. А какво, ако броят на сървърите е десетки, а размерът на логовете е над един терабайт? Тази схема вероятно започва да се срива.

И ето какво се случва: Get-MessageTrackingLog започва да прекъсва по таймаут, logparser достига лимита на 32-битната архитектура, а експортирането в SQL сървъра се проваля в най-неподходящия момент, без да обработи многоредовия exception от услугата.

Тук на сцената излиза нов играч - стекът ELK, който е специално проектиран за жонглиране с огромни обеми логове в разумни срокове и с приемливо потребление на ресурси.

В първата част ще разкажа подробно, как да свържем filebeat, който е част от стека ELK — отговаря за четенето и изпращането на обикновени текстови файлове, в които различни приложения записват своите логове. В следващите статии ще се спрем по-подробно на компонентите Logstash и Kibana.

Инсталиране

И така, архивният файл на агента filebeat може да бъде изтеглен от този сайт.

Ние ще извършим инсталирането с просто разархивиране на съдържанието на zip файла. Например, в c:Program Filesfilebeat. След това е необходимо да стартираме PowerShell скрипта install-service-filebeat.ps1, който идва в комплект, за инсталиране на услугата filebeat.

Сега сме готови да започнем да настройваме конфигурационния файл.

Отказоустойчивост

Filebeat осигурява доставка на логовете в системата за събиране на логове. Това се реализира чрез поддържане на регистър на записите в лог файловете. В регистъра се съхранява информация за записите, които са прочетени от лог файловете, и се отбелязват конкретни записи, които са успели да бъдат доставени на целевото място.

Ако някой запис не може да бъде доставен, filebeat ще се опитва да го изпрати отново, докато не получи потвърждение за доставката от получаващата система или оригиналният лог файл не бъде изтрит в процеса на ротация.

При рестартиране на услугата filebeat ще прочита от регистъра информация за последните прочетени и доставени записи и ще чете записи от лог файловете, основавайки се на информацията в регистъра.

Това позволява минимизиране на риска от загуба на информация за логовете, които трябва да бъдат изпратени на сървърите elasticlogstash, в процеса на непредвидени сривове и изпълнение на операции по техническо обслужване на сървърите.

Повече за това можете да прочетете в документацията в параграфите: Как filebeat поддържа състоянието на файловете и Как filebeat осигурява доставка поне веднъж?

Настройка

Цялата настройка се извършва в конфигурационния файл с формат yml, който е разделен на няколко секции. Нека разгледаме някои от тях, които участват в процеса на събиране на логове от сървърите Exchange.

Блок за обработка на логовете

Блокът за обработка на логовете започва с полето:

filebeat.inputs:

Ще използваме общ инструмент за събиране на логове:

- type: log

След това указваме статус (включен) и пътищата до папката с логовете. Например, в случая с логовете на IIS настройките могат да бъдат следните:

    enabled: true
    paths:
	- C:inetpublogsLogFilesW3SVC1*.log
	- C:inetpublogsLogFilesW3SVC2*.log

Още една важна настройка: как filebeat трябва да чете многострочни записи. По подразбиране filebeat счита, че една линия от лог файла е едно записване. Това работи добре, докато нямаме лог записи, свързани с неправилната работа на услугата. В този случай, изключенията могат да се състоят от няколко линии. Следователно filebeat трябва да счете многострочното записване като едно, ако следващата линия започва с дата. Форматът на записите в логовете на Exchange е такъв: всяко ново записване в лог файла започва с дата. В конфигурацията това условие изглежда така:

multiline:
	pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
	negate: true
	match: after

Има смисъл да добавите тагове в изпратеното записване, например:

  tags: ['IIS', 'ex-srv1']

И не забравяйте да изключите от обработка редовете, започващи с хеш символ:

  exclude_lines: ['^#']

Така блокът за четене на логовете ще изглежда по следния начин:

filebeat.inputs:
- type: log
  enabled: true
  paths:
	- C:inetpublogsLogFilesW3SVC1*.log
	- C:inetpublogsLogFilesW3SVC2*.log
  multiline:
	pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
	negate: true
	match: after
  tags: ['IIS', 'ex-srv1']
  exclude_lines: ['^#']

Блок за изпращане на логове

Отделните записи в лог файла filebeat се изпращат като JSON обект, в който конкретният запис от логовете се съдържа в едно единствено поле message. Ако искаме да работим с тази информация, необходимо е предварително да разпарсираме това поле на отделни полета. Може да се направи това, например, в logstash. Той ще служи като получател на записите от filebeat. Ето как може да изглежда в конфигурационния файл на filebeat:

output.logstash:
  hosts: ["logstash1.domain.com:5044"]

Ако серверите са повече, то за тях може да се включи балансировка: тогава filebeat ще изпраща логовете не на първия наличен сервер от списъка, а ще разпределя изпращаните логове между няколко сървъра:

hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true 

Filebeat при обработка на логовете в изпратения JSON, освен записа на логовете, който се съдържа в полето message, добавя известно количество метаданни, които влияят на размера на документа, попадащ в elastic. Изборно може да се изключат тези метаданни от изпращане. Това става в блока processor с помощта на процесора drop_fields. Може да изключите, например, следните полета:

processors:
- drop_fields:
	fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]

С избора на изключаемите полета трябва да се подходи внимателно, защото част от тях може да се използва отстрани на elastic за изграждане на индекси.

Така блокът за изпращане на логове ще изглежда по следния начин:

output.logstash:
  hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true
 
processors:
- drop_fields:
	fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]

Настройки за регистриране на filebeat

Има смисъл да зададете следните настройки за регистриране:

  • Ниво на регистриране info;
  • Записвайте логовете в файлове, разположени по подразбиране (папка logs, в директорията на инсталация на filebeat);
  • Име на файла на логовете — filebeat;
  • Съхранявайте последните 10 файла на логовете;
  • Започнете ротация при достигане на размер 1Мб.

Финалният блок за настройка на логовете ще изглежда така:

logging.level: info
logging.to_files: true
logging.files:
  name: filebeat
  keepfiles: 10
  rotateeverybytes: 1048576

Крайна конфигурация

Събрахме конфигурацията и сега тя изглежда по следния начин:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - C:inetpublogsLogFilesW3SVC1*.log
    - C:inetpublogsLogFilesW3SVC2*.log
  multiline:
    pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
    negate: true
    match: after
  tags: ['IIS', 'ex-srv1']
  exclude_lines: ['^#']
 
output.logstash:
  hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true
 
processors:
- drop_fields:
    fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]
 
logging.level: info
logging.to_files: true
logging.files:
  name: filebeat
  keepfiles: 10
  rotateeverybytes: 1048576

Важно е да се разбере, че форматът на файла за конфигурация е yml. Следователно е важно точно да се задават интервали и знаци за минус.

Filebeat може да проверява файла за конфигурация и ако синтаксисът съдържа грешки, ще посочи в кой ред и на кое място в реда синтаксисът е неправилен. Проверяването се извършва по следния начин:

.filebeat.exe test config

Освен това filebeat може да проверява мрежовата достъпност на получателя на логове. Проверка се стартира по следния начин:

.filebeat.exe test output

В следващите части ще разкажа за свързването и взаимовръзката между Exchange и компонентите Logstash и Kibana.

Полезни връзки

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster