
JÀtkan oma juttu sellest, kuidas sÔbrustada Exchange'i ja ELK-i (algus ). Tuletan meelde, et see kombinatsioon suudab kindlalt töödelda vÀga suurt hulka logisid. Sel korral rÀÀgime, kuidas seadistada Exchange'i koostööd Logstash'i ja Kibana komponentidega.
Logstash'i kasutatakse ELK-hunnikus logide intelligentseks töötlemiseks ja nende ettevalmistamiseks Elasticus dokumentide kujul, mille pÔhjal on mugav luua erinevaid visualiseeringuid Kibanas.
Installeerimine
Koosneb kahest etapist:
- OpenJDK paketi installimine ja seadistamine.
- Logstash paketi installimine ja seadistamine.
OpenJDK paketi installimine ja seadistamine
OpenJDK paketi tuleb alla laadida ja lahti pakkida kindlasse katalooge. SeejĂ€rel tuleb selle katalooge tee lisada Windowsi operatsioonisĂŒsteemi muutujatesse $env:Path ja $env:JAVA_HOME:


Kontrollime Java versiooni:
PS C:<; java -version
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)
Logstash paketi installimine ja seadistamine
Laadige alla Logstash'i jaotise arhiivifail . Arhiiv tuleb lahti pakkida ketta juurtesse. Ei tasu lahti pakkida kausta C:Program Files , Logstash keeldub Ôigesti kÀivitumast. SeejÀrel tuleb faili lisada jvm.options Java protsessi mÀlu mÀÀramiseks vajalikud parameetrid. Soovitan mÀÀrata pool serveri RAM-ist. Kui serveril on 16 GB RAM-i, siis vaikimisi parameetrid:
-Xms1g
-Xmx1g
tuleb asendada:
-Xms8g
-Xmx8g
Lisaks on mÔistlik kommentaariks mÀrkida rida -XX:+UseConcMarkSweepGC. Rohkem selle kohta . JÀrgmine samm on vaikimisi konfigureerimine failis logstash.conf:
input {
stdin{}
}
filter {
}
output {
stdout {
codec => "rubydebug"
}
}
Selle konfiguratsiooni kasutamisel loeb Logstash andmeid konsoolist, lĂ€bib tĂŒhja filtri ja tagastab andmed konsooli. Selle konfiguratsiooniga saab kontrollida Logstashi töövĂ”imet. Selleks kĂ€ivitame selle interaktiivses reĆŸiimis:
PS C:...bin> .logstash.bat -f .logstash.conf
...
[2019-12-19T11:15:27,769][INFO ][logstash.javapipeline ][main] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[2019-12-19T11:15:27,847][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2019-12-19T11:15:28,113][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
Logstash kÀivitati edukalt pordil 9600.
Installeerimise viimane samm: Logstashi kÀitamine Windowsi teenusena. Seda saab teha nÀiteks paketi abil :
PS C:...bin> .nssm.exe install logstash
Teenus "logstash" on edukalt installitud!
Katastroofitaluvus
Logide sÀilitamine edastamise ajal algserverist on tagatud Pikaajaliste Ridade mehhanismiga.
Kuidas see töötab
Ridade asukoha skeem logide töötlemise protsessi jooksul: input â queue â filter + output.
Input plugin saab andmeid logi allikast, salvestab need jÀrjekorda ja saadab allikatele andmete vastuvÔtmise kinnituse.
JÀrjekorrast saadetud sÔnumid töötleb Logstash, need lÀbivad filtri ja output plugina. Kui output annab logi edastamise kinnituse, kustutab Logstash töötlenud logi jÀrjekorrast. Kui Logstash peatub, jÀÀvad kÔik töötlemata sÔnumid ja sÔnumid, mille kohta ei ole saadud kinnitust edastamisest, jÀrjekorda ning Logstash jÀtkab nende töötlemist jÀrgmise kÀivitamise ajal.
Seadistamine
Reguleeritakse failis C:Logstashconfiglogstash.yml:
queue.type: (vĂ”imalikud vÀÀrtused âpersistedjamemory (vaikimisi)).path.queue: (tee kausta, kus asuvad jĂ€rjekorra failid, mis vaikimisi asuvad C:Logstashqueue-s).queue.page_capacity: (jĂ€rjekorra maksimaalne lehekĂŒlje suurus; vaikimisi vÀÀrtus â 64mb).queue.drain: (true/false â aktiveerib/deaktiveerib jĂ€rjekorra töötlemise peatamise Logstash'i sulgemisel. Soovitame mitte aktiveerida, kuna see mĂ”jutab serveri sulgemise kiirus).queue.max_events: (maximaalne sĂŒndmuste arv jĂ€rjekorras, vaikimisi â 0 (piiramatu)).queue.max_bytes: (maximaalne jĂ€rjekorra suurus baitides, vaikimisi â 1024mb (1gb)).
Kui on seadistatud queue.max_events ja queue.max_bytes, siis sĂ”numite vastuvĂ”tt jĂ€rjekorda lĂ”petatakse, kui saavutatakse ĂŒkskĂ”ik millise nende seadistuste vÀÀrtus. Rohkem teavet Persistent Queues kohta on kirjutatud .
NÀide osast logstash.yml failist, mis vastutab jÀrjekorra seadistamise eest:
queue.type: persisted
queue.max_bytes: 10gb
Seadistamine
Logstash'i konfiguratsioon koosneb tavaliselt kolmest osast, mis vastutavad erinevate etappide eest sissetulevate logide töötlemisel: vastuvĂ”tt (input sektsioon), parsimine (filter sektsioon) ja saatmine Elasticusse (output sektsioon). Allpool vaatleme neid igaĂŒht lĂ€hemalt.
Sisend
VastuvÔtame toorandmeid filebeat'i agentidelt. Just selle plugina mÀÀrame input sektsioonis:
input {
beats {
port => 5044
}
}
PĂ€rast sellist seadistust hakkab Logstash kuulama porti 5044 ning töötleb logisid vastavalt filtri sektsiooni seadistustele. Vajadusel saab filebiti logide vastuvĂ”tukanali ĂŒmber pakkida SSL-iga. Plugin beats seadistuste kohta on rohkem teavet. .
Filtreerimine
KÔik Exchange'i genereeritud huvitavad tekstilogid on csv-formaadis ning logifailis on kirjeldatud vÀljad. Csv-kandjate parsimiseks pakub Logstash kolme pluginat: , csv ja grok. Esimene on kÔige , kuid suudab parsimisega hakkama saada vaid kÔige lihtsamate logidega.
NÀiteks jagab see jÀrgmise kirje kaheks (sisevÀlja koma tÔttu), mistÔttu logi tÔlgendatakse valesti:
âŠ,"MDB:GUID1, Mailbox:GUID2, Event:526545791, MessageClass:IPM.Note, CreationTime:2020-05-15T12:01:56.457Z, ClientType:MOMT, SubmissionAssistant:MailboxTransportSubmissionEmailAssistant",âŠ
Seda saab kasutada nÀiteks IIS-i logide parsimiseks. Sel juhul vÔib filtri sektsioon vÀlja nÀha jÀrgmiselt:
filter {
if "IIS" in [tags] {
dissect {
mapping => {
"message" => "%{date} %{time} %{s-ip} %{cs-method} %{cs-uri-stem} %{cs-uri-query} %{s-port} %{cs-username} %{c-ip} %{cs(User-Agent)} %{cs(Referer)} %{sc-status} %{sc-substatus} %{sc-win32-status} %{time-taken}"
}
remove_field => ["message"]
add_field => { "application" => "exchange" }
}
}
}
Logstashi konfiguratsioon vÔimaldab kasutada , seetÔttu saame dissect pluginasse suunata ainult logid, mis on mÀrgistatud filebeat sildiga IIS. Pluginas seome vÀljaannete vÀÀrtused nende nimedega, eemaldame algse vÀlja message, mis sisaldas logi kirjet, ning saame lisada omavolilise vÀljundi, mis vÔib nÀiteks sisaldada rakenduse nime, mille logisid kogume.
Juhul, kui tegeleme jÀlgimislogidega, on parim kasutada csv pluginat, mis oskab korrektselt töödelda keerulisi vÀlju:
filter {
if "Tracking" in [tags] {
csv {
columns => ["date-time","client-ip","client-hostname","server-ip","server-hostname","source-context","connector-id","source","event-id","internal-message-id","message-id","network-message-id","recipient-address","recipient-status","total-bytes","recipient-count","related-recipient-address","reference","message-subject","sender-address","return-path","message-info","directionality","tenant-id","original-client-ip","original-server-ip","custom-data","transport-traffic-type","log-id","schema-version"]
remove_field => ["message", "tenant-id", "schema-version"]
add_field => { "application" => "exchange" }
}
}
Pluginas seome vÀljaannete vÀÀrtused nende nimedega, eemaldame algse vÀlja message (ja ka vÀljad tenant-id ja schema-version), mis sisaldas logi sissekannet ning saame lisada suvalise vÀlja, mis nÀiteks sisaldab rakenduse nime, millest kogume logisid.
Filtreerimise etapi vÀljundis saame dokumendid, mis on esimeses lÀhenemises valmis visualiseerimiseks Kibanas. Meil puudub veel jÀrgnev:
- Numbrilised vÀljad tuvastatakse tekstina, mis ei vÔimalda nendega tehingute tegemist. EelkÔige vÀljadel
time-takenIIS logist ning ka vÀljadelrecipient-countjatotal-bitesTracking logis. - Dokumendi standardne ajatempleeritud ei sisalda logi töötlemise aega, vaid serveripoolse salvestamise aega.
- VĂ€li
recipient-addressnĂ€eb vĂ€lja ĂŒhe ahelana, mis ei vĂ”imalda meil analĂŒĂŒsi lĂ€bi viia e-kirjade saajate arvu peale.
On aeg lisada logitöötlusprotsessi veidi vÔlu.
Numbriliste vÀljade konverteerimine
Dissect pluginal on valik convert_datatype, mida saab kasutada tekstivÀlja konverteerimiseks numbriliseks vorminguks. NÀiteks nii:
dissect {
âŠ
convert_datatype => { "time-taken" => "int" }
âŠ
}
Oluline on meeles pidada, et see meetod sobib ainult juhul, kui vÀli sisaldab kindlasti stringi. Null-vÀÀrtusi vÀljadest see meetod ei töötle ja pÔhjustab erandi.
JĂ€lgimislogide jaoks ei ole sarnast konverteerimismeetodit parem kasutada, kuna vĂ€ljad vĂ”ivad olla tĂŒhjad. recipient-count ja total-bites Nende vĂ€ljade konverteerimiseks on parem kasutada pistikprogrammi. :
mutate {
convert => [ "total-bytes", "integer" ]
convert => [ "recipient-count", "integer" ]
}
recipient_address jagamine eraldi saajateks.
Seda ĂŒlesannet saab samuti lahendada pistikprogrammi mutate abil:
mutate {
split => ["recipient_address", ";"]
}
Muudame timestamp'i.
JĂ€lgimislogide puhul lahendab ĂŒlesande vĂ€ga lihtsalt pistikprogramm , mis aitab sisestada vajalikku kuupĂ€eva ja aega timestamp vĂ€ljast. date-time:
date {
match => [ "date-time", "ISO8601" ]
timezone => "Europe/Moscow"
remove_field => [ "date-time" ]
}
IIS logide puhul peame ĂŒhendama vĂ€ljade andmed date ja aeg pistikprogrammi mutate abil, mÀÀrama soovitud ajatsooni ja paigutama selle ajatempli timestamp pistikprogrammi date abil:
mutate {
add_field => { "data-time" => "%{date} %{time}" }
remove_field => [ "date", "time" ]
}
date {
match => [ "data-time", "YYYY-MM-dd HH:mm:ss" ]
timezone => "UTC"
remove_field => [ "data-time" ]
}
VĂ€ljund
VÀljund sektsioon on mÔeldud töödeldud logide saatmiseks logide vastuvÔtjana. Otsese saatmise korral Elasticusse kasutatakse pistikprogrammi , kus mÀÀratakse serveri aadress ja indeksi nime mall saatmiseks genereeritud dokumendile:
output {
elasticsearch {
hosts => ["127.0.0.1:9200", "127.0.0.2:9200"]
manage_template => false
index => "Exchange-%{+YYYY.MM.dd}"
}
}
LÔplik konfiguratsioon
LÔplik konfiguratsioon nÀeb vÀlja jÀrgmiselt:
input {
beats {
port => 5044
}
}
filter {
if "IIS" in [tags] {
dissect {
mapping => {
"message" => "%{date} %{time} %{s-ip} %{cs-method} %{cs-uri-stem} %{cs-uri-query} %{s-port} %{cs-username} %{c-ip} %{cs(User-Agent)} %{cs(Referer)} %{sc-status} %{sc-substatus} %{sc-win32-status} %{time-taken}"
}
remove_field => ["message"]
add_field => { "application" => "exchange" }
convert_datatype => { "time-taken" => "int" }
}
mutate {
add_field => { "data-time" => "%{date} %{time}" }
remove_field => [ "date", "time" ]
}
date {
match => [ "data-time", "YYYY-MM-dd HH:mm:ss" ]
timezone => "UTC"
remove_field => [ "data-time" ]
}
}
if "Tracking" in [tags] {
csv {
columns => ["date-time","client-ip","client-hostname","server-ip","server-hostname","source-context","connector-id","source","event-id","internal-message-id","message-id","network-message-id","recipient-address","recipient-status","total-bytes","recipient-count","related-recipient-address","reference","message-subject","sender-address","return-path","message-info","directionality","tenant-id","original-client-ip","original-server-ip","custom-data","transport-traffic-type","log-id","schema-version"]
remove_field => ["message", "tenant-id", "schema-version"]
add_field => { "application" => "exchange" }
}
mutate {
convert => [ "total-bytes", "integer" ]
convert => [ "recipient-count", "integer" ]
split => ["recipient_address", ";"]
}
date {
match => [ "date-time", "ISO8601" ]
timezone => "Europe/Moscow"
remove_field => [ "date-time" ]
}
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200", "127.0.0.2:9200"]
manage_template => false
index => "Exchange-%{+YYYY.MM.dd}"
}
}
Kasulikud lingid:
Allikas: habr.com
