
Jag fortsÀtter min berÀttelse om hur man förenar Exchange och ELK (början ). Jag pÄminner om att denna kombination kan utan tvekan hantera en mycket stor mÀngd loggar. Denna gÄng kommer vi att diskutera hur man stÀller in Exchange med komponenterna Logstash och Kibana.
Logstash i ELK-stacken anvÀnds för intelligent logghantering och förberedelse av loggar för lagring i Elastic i form av dokument, vilket gör det lÀttare att skapa olika visualiseringar i Kibana.
Installation
BestÄr av tvÄ steg:
- Installation och konfiguration av paketet OpenJDK.
- Installation och konfiguration av paketet Logstash.
Installation och konfiguration av paketet OpenJDK
Paketet OpenJDK mÄste laddas ner och packas upp i en viss katalog. Sedan behöver sökvÀgen till denna katalog lÀggas till i $env:Path och $env:JAVA_HOME variablerna i Windows-operativsystemet:


LÄt oss kontrollera Java-versionen:
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)
Installation och konfiguration av paketet Logstash
Ladda ner arkivfilen med Logstash-distributionen . Arkivet bör packas upp i roten av disken. Det Àr inte bra att packa upp i en mapp C:Program Files , Logstash vÀgrar att starta ordentligt. Sedan mÄste du justera filen jvm.options , som ansvarar för minnesallokering för Java-processen. Jag rekommenderar att ange hÀlften av serverns RAM. Om den har 16 GB RAM, bör standardnycklarna vara:
-Xms1g
-Xmx1g
mÄste bytas ut mot:
-Xms8g
-Xmx8g
Dessutom Àr det rimligt att kommentera raden -XX:+UseConcMarkSweepGC. Mer om detta . NÀsta steg Àr att skapa en standardkonfiguration i filen logstash.conf:
input {
stdin{}
}
filter {
}
output {
stdout {
codec => "rubydebug"
}
}
Med denna konfiguration lÀser Logstash data frÄn konsolen, passerar genom en tom filter och skriver ut tillbaka till konsolen. AnvÀndning av denna konfiguration gör det möjligt att kontrollera Logstash-funktionaliteten. För att göra detta, kör vi den i interaktivt lÀge:
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 har framgÄngsrikt startat pÄ port 9600.
Det sista steget i installationen: starta Logstash som en Windows-tjÀnst. Detta kan göras till exempel med hjÀlp av paketet :
PS C:...bin> .nssm.exe install logstash
TjÀnsten "logstash" harinstallerats framgÄngsrikt!
Fel-tolerans
Skydd av loggar vid överföring frÄn den ursprungliga servern sÀkerstÀlls genom mekanismen för Persistent Queues.
Hur det fungerar
Schemat för placering av köer i processen för logghantering: input â queue â filter + output.
Input-plugin tar emot data frÄn loggkÀllan, skriver dem till kön och skickar en bekrÀftelse pÄ mottagandet av data till kÀllan.
Meddelanden frÄn kön bearbetas av Logstash, gÄr igenom en filter och output-plugin. NÀr bekrÀftelsen pÄ att loggen har skickats tas emot frÄn output tar Logstash bort den bearbetade loggen frÄn kön. Om Logstash stoppas sÄ förblir alla obehandlade meddelanden och meddelanden utan bekrÀftelse om skickande kvar i kön, och Logstash kommer att fortsÀtta bearbeta dem vid nÀsta start.
InstÀllning
Regleras med nycklar i filen C:Logstashconfiglogstash.yml:
queue.type: (möjliga vĂ€rden âpersistedochmemory (standard)).path.queue: (sökvĂ€g till mappen med köfiler, som som standard lagras i C:Logstashqueue).queue.page_capacity: (maximal storlek pĂ„ kö-sidan, standardvĂ€rdet Ă€r 64mb).queue.drain: (true/false â aktiverar/deaktiverar stopp av köbehandling innan Logstash stĂ€ngs. Jag rekommenderar inte att aktivera detta, eftersom det direkt pĂ„verkar hastigheten pĂ„ serveravstĂ€ngning).queue.max_events: (maximalt antal hĂ€ndelser i kön, standardvĂ€rdet Ă€r 0 (obegrĂ€nsat)).queue.max_bytes: (maximal storlek pĂ„ kön i byte, standardvĂ€rdet Ă€r 1024mb (1gb)).
Om de Àr instÀllda queue.max_events och queue.max_bytes, kommer meddelanden att sluta tas emot i kön nÀr nÄgot av dessa vÀrden nÄs. Mer information om Persistent Queues finns i .
Exempel pÄ en del av logstash.yml som ansvarar för köinstÀllningen:
queue.type: persisted
queue.max_bytes: 10gb
InstÀllning
Logstash-konfigurationen bestÄr vanligtvis av tre delar som ansvarar för olika faser av bearbetningen av inkommande loggar: mottagande (input-sektion), parsning (filter-sektion) och utskick till Elastic (output-sektion). Nedan kommer vi att titta nÀrmare pÄ varje del.
Input
Vi tar emot den inkommande strömmen med rÄa loggar frÄn Filebeat-agenter. Det Àr just denna plugin vi anger i input-sektionen:
input {
beats {
port => 5044
}
}
Med denna instÀllning börjar Logstash att lyssna pÄ port 5044, och vid mottagande av loggar bearbetas de enligt instÀllningarna i filter-sektionen. Vid behov kan loggkanalen frÄn Filebeat sÀkras med SSL. Mer information om instÀllningarna för Beats-plugin finns beskrivet. .
Filter
Alla intressanta textloggar som genereras av Exchange har csv-format med de fÀlt som beskrivs i sjÀlva loggfilerna. För att parsa csv-poster erbjuder Logstash oss tre plugins: , csv och grok. Den första Àr den mest , men klarar bara av att parsa de enklaste loggarna.
Till exempel kommer följande post att delas upp i tvÄ (pÄ grund av nÀrvaron av ett kommatecken inuti fÀltet), vilket kommer att göra att loggen parsas fel:
âŠ,"MDB:GUID1, Mailbox:GUID2, Event:526545791, MessageClass:IPM.Note, CreationTime:2020-05-15T12:01:56.457Z, ClientType:MOMT, SubmissionAssistant:MailboxTransportSubmissionEmailAssistant",âŠ
Den kan anvÀndas vid parning av loggar, till exempel frÄn IIS. I detta fall kan filtersektionen se ut pÄ följande sÀtt:
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" }
}
}
}
Konfigurationen av Logstash gör att vi kan anvÀnda , dÀrför kan vi i dissect-pluginet rikta oss enbart till loggar som har mÀrkts med filebeat-taggen IIS. Inuti pluginet mappar vi fÀltvÀrden med deras namn, tar bort det ursprungliga fÀltet meddelande, som innehöll posten frÄn loggen, och vi kan lÀgga till ett valfritt fÀlt som till exempel kan innehÄlla namnet pÄ applikationen frÄn vilken vi samlar loggar.
NÀr det gÀller spÄrningsloggar Àr det bÀttre att anvÀnda csv-pluginet, den kan korrekt hantera komplexa fÀlt:
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" }
}
}
}
Inuti pluginet mappar vi fÀltvÀrden med deras namn, tar bort det ursprungliga fÀltet meddelande (och Àven fÀltet tenant-id och schema-version), som innehöll posten frÄn loggen, och vi kan lÀgga till ett valfritt fÀlt som kan innehÄlla namnet pÄ applikationen frÄn vilken vi samlar loggar.
Vid utgÄngen av filtersteget kommer vi att fÄ dokument som i grova drag Àr klara för visualisering i Kibana. Det vi saknar Àr följande:
- Numeriska fÀlt kommer att tolkas som text, vilket hindrar operationer pÄ dem. NÀmligen fÀlten
time-takenfrÄn IIS-loggen, samt fÀltenrecipient-countochtotal-bitesfrÄn Tracking-loggen. - Den standard tidsstÀmpeln för dokumentet kommer att innehÄlla tiden för behandling av loggen, inte tiden för registreringen pÄ serversidan.
- FĂ€ltet
recipient-addresskommer att se ut som en enda struktur, vilket gör det omöjligt att genomföra analys med rÀkning av e-postmottagare.
Det Àr dags att lÀgga till lite magi i processen för logghantering.
Konvertering av numeriska fÀlt
Pluginet dissect har en option convert_datatype, som kan anvÀndas för att konvertera textfÀlt till digitalt format. Till exempel sÄ hÀr:
dissect {
âŠ
convert_datatype => { "time-taken" => "int" }
âŠ
}
Det Àr vÀrt att komma ihÄg att denna metod endast fungerar om fÀltet sÀkerligen innehÄller en strÀng. Null-vÀrden i fÀlten hanteras inte av denna option och ger ett undantag.
För tracking-loggar Àr det bÀst att inte anvÀnda den motsvarande metoden convert, eftersom fÀlten recipient-count och total-bites kan vara tomma. För att konvertera dessa fÀlt Àr det bÀttre att anvÀnda pluginet :
mutate {
convert => [ "total-bytes", "integer" ]
convert => [ "recipient-count", "integer" ]
}
Uppdelning av recipient_address i individuella mottagare
Denna uppgift kan ocksÄ lösas med hjÀlp av pluginet mutate:
mutate {
split => ["recipient_address", ";"]
}
Ăndra timestamp
I fallet med tracking-loggar Àr uppgiften mycket enkel att lösa med pluginet , som hjÀlper till att skriva in datum och tid i rÀtt format frÄn fÀltet timestamp date-time date { match => [ "date-time", "ISO8601" ] timezone => "Europe/Moscow" remove_field => [ "date-time" ] }:
I fallet med IIS-loggar mÄste vi slÄ samman data i fÀlten
med hjÀlp av pluginet mutate, ange vÄr önskade tidszon och placera denna tidsstÀmpel i date och time med hjÀlp av pluginet date: timestamp 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" ] }
Output-sektionen anvÀnds för att skicka de bearbetade loggarna till loggmottagaren. Vid direkt sÀndning till Elastic anvÀnds pluginet
Output
elasticsearch output { elasticsearch { hosts => ["127.0.0.1:9200", "127.0.0.2:9200"] manage_template => false index => "Exchange-%{+YYYY.MM.dd}" } }
Slutlig konfiguration
Den slutliga konfigurationen kommer att se ut pÄ följande sÀtt:
Slutlig konfiguration
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}"
}
}
Nyttiga lÀnkar:
KĂ€lla: habr.com
