НиС смС ΠΏΡ€ΠΈΡ˜Π°Ρ‚Π΅Π»ΠΈ со ELK ΠΈ Exchange. Π”Π΅Π» 2

НиС смС ΠΏΡ€ΠΈΡ˜Π°Ρ‚Π΅Π»ΠΈ со ELK ΠΈ Exchange. Π”Π΅Π» 2

Ја ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΡƒΠ²Π°ΠΌ ΠΌΠΎΡ˜Π°Ρ‚Π° ΠΏΡ€ΠΈΠΊΠ°Π·Π½Π° Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° сС Π΄Ρ€ΡƒΠΆΠ°Ρ‚ Exchange ΠΈ ELK (ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊ Ρ‚ΡƒΠΊΠ°). Π”ΠΎΠ·Π²ΠΎΠ»Π΅Ρ‚Π΅ ΠΌΠΈ Π΄Π° Π²Π΅ потсСтам Π΄Π΅ΠΊΠ° ΠΎΠ²Π°Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ˜Π° Π΅ способна Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΌΠ½ΠΎΠ³Ρƒ Π³ΠΎΠ»Π΅ΠΌ Π±Ρ€ΠΎΡ˜ Ρ‚Ρ€ΡƒΠΏΡ†ΠΈ Π±Π΅Π· Π΄Π²ΠΎΡƒΠΌΠ΅ΡšΠ΅. Овој ΠΏΠ°Ρ‚ ќС Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌΠ΅ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π½Π°Ρ‚Π΅Ρ€Π°Ρ‚Π΅ Exchange Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ со ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° Logstash ΠΈ Kibana.

Logstash Π²ΠΎ ΠΎΡŸΠ°ΠΊΠΎΡ‚ ELK сС користи Π·Π° ΠΈΠ½Ρ‚Π΅Π»ΠΈΠ³Π΅Π½Ρ‚Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Ρ‚Ρ€ΡƒΠΏΡ†ΠΈ ΠΈ Π½ΠΈΠ²Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π·Π° ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ Elastic Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ° Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈ, Π²Ρ€Π· основа Π½Π° ΠΊΠΎΠΈ Π΅ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ Π΄Π° сС Π³Ρ€Π°Π΄Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π²ΠΈΠ·ΡƒΠ΅Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎ Kibana.

Π˜Π½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π°

Π‘Π΅ состои ΠΎΠ΄ Π΄Π²Π΅ Ρ„Π°Π·ΠΈ:

  • Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ OpenJDK.
  • Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ Logstash.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ OpenJDK

ΠŸΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ OpenJDK ΠΌΠΎΡ€Π° Π΄Π° сС ΠΏΡ€Π΅Π·Π΅ΠΌΠ΅ ΠΈ ΠΎΡ‚ΠΏΠ°ΠΊΡƒΠ²Π° Π²ΠΎ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ. ΠŸΠΎΡ‚ΠΎΠ°, ΠΏΠ°Ρ‚Π΅ΠΊΠ°Ρ‚Π° Π΄ΠΎ овој Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ ΠΌΠΎΡ€Π° Π΄Π° сС внСсС Π²ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ $env:Path ΠΈ $env:JAVA_HOME Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΠΎΡ‚ систСм Windows:

НиС смС ΠΏΡ€ΠΈΡ˜Π°Ρ‚Π΅Π»ΠΈ со ELK ΠΈ Exchange. Π”Π΅Π» 2

НиС смС ΠΏΡ€ΠΈΡ˜Π°Ρ‚Π΅Π»ΠΈ со ELK ΠΈ Exchange. Π”Π΅Π» 2

АјдС Π΄Π° ја ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠ΅ Π²Π΅Ρ€Π·ΠΈΡ˜Π°Ρ‚Π° Π½Π° Java:

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

ΠŸΡ€Π΅Π·Π΅ΠΌΠ΅Ρ‚Π΅ ја архивската Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° со Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ†ΠΈΡ˜Π°Ρ‚Π° Logstash ΠΎΡ‚Ρ‚ΡƒΠΊΠ°. Архивата ΠΌΠΎΡ€Π° Π΄Π° сС ΠΎΡ‚ΠΏΠ°ΠΊΡƒΠ²Π° Π΄ΠΎ ΠΊΠΎΡ€Π΅Π½ΠΎΡ‚ Π½Π° дискот. ΠžΡ‚ΠΏΠ°ΠΊΡƒΠ²Π°Ρ˜Ρ‚Π΅ Π²ΠΎ ΠΏΠ°ΠΏΠΊΠ° C:Program Files НС Π²Ρ€Π΅Π΄ΠΈ, Logstash ќС ΠΎΠ΄Π±ΠΈΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ. ΠŸΠΎΡ‚ΠΎΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π²Π»Π΅Π·Π΅Ρ‚Π΅ Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° jvm.options ΠΏΠΎΠΏΡ€Π°Π²ΠΊΠΈ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π½ΠΈ Π·Π° Π΄ΠΎΠ΄Π΅Π»ΡƒΠ²Π°ΡšΠ΅ RAM ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° Π·Π° процСсот Јава. ΠŸΡ€Π΅ΠΏΠΎΡ€Π°Ρ‡ΡƒΠ²Π°ΠΌ Π΄Π° Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΠΎΠ΄ RAM ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π½Π° сСрвСрот. Ако ΠΈΠΌΠ° 16 GB RAM ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°, Ρ‚ΠΎΠ³Π°Ρˆ стандарднитС ΠΊΠΎΠΏΡ‡ΠΈΡšΠ° сС:

-Xms1g
-Xmx1g

ΠΌΠΎΡ€Π° Π΄Π° сС Π·Π°ΠΌΠ΅Π½ΠΈ со:

-Xms8g
-Xmx8g

ΠŸΠΎΠΊΡ€Π°Ρ˜ Ρ‚ΠΎΠ°, ΠΏΡ€Π΅ΠΏΠΎΡ€Π°Ρ‡Π»ΠΈΠ²ΠΎ Π΅ Π΄Π° сС ΠΊΠΎΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° -XX:+UseConcMarkSweepGC. ПовСќС Π·Π° ΠΎΠ²Π° Ρ‚ΡƒΠΊΠ°. Π‘Π»Π΅Π΄Π½ΠΈΠΎΡ‚ Ρ‡Π΅ΠΊΠΎΡ€ Π΅ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ стандардна ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° logstash.conf:

input {
 stdin{}
}
 
filter {
}
 
output {
 stdout {
 codec => "rubydebug"
 }
}

Π‘ΠΎ ΠΎΠ²Π°Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, Logstash Π³ΠΈ Ρ‡ΠΈΡ‚Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΎΠ΄ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°, Π³ΠΈ ΠΏΠΎΠΌΠΈΠ½ΡƒΠ²Π° Π½ΠΈΠ· ΠΏΡ€Π°Π·Π΅Π½ Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ ΠΈ Π³ΠΈ Π²Ρ€Π°ΡœΠ° Π½Π°Π·Π°Π΄ Π²ΠΎ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°. ΠšΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΎΠ²Π°Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ќС ја тСстира функционалноста Π½Π° Logstash. Π—Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΎΠ²Π°, ајдС Π΄Π° Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΠΈΠΌΠ΅ Π²ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ:

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 бСшС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ лансиран Π½Π° ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° 9600.

ΠŸΠΎΡΠ»Π΅Π΄Π½ΠΈΠΎΡ‚ Ρ‡Π΅ΠΊΠΎΡ€ Π·Π° ΠΈΠ½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π°: ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°Ρ˜Ρ‚Π΅ Π³ΠΎ Logstash ΠΊΠ°ΠΊΠΎ услуга Π½Π° Windows. Ова ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ НББМ:

PS C:...bin> .nssm.exe install logstash
Service "logstash" installed successfully!

Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ†ΠΈΡ˜Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ

БСзбСдноста Π½Π° Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈΡ‚Π΅ ΠΊΠΎΠ³Π° сС прСнСсуваат ΠΎΠ΄ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ сСрвСр Π΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½Π° со ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΡ‚ Π·Π° ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Π½ΠΈ Ρ€Π΅Π΄ΠΎΠ²ΠΈ.

Како Ρ€Π°Π±ΠΎΡ‚ΠΈ

РаспорСдот Π½Π° Ρ€Π΅Π΄ΠΈΡ†ΠΈΡ‚Π΅ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈΡ‚Π΅ Π΅: Π²Π»Π΅Π· β†’ Ρ€Π΅Π΄ΠΈΡ†Π° β†’ Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ + ΠΈΠ·Π»Π΅Π·.

Π’Π»Π΅Π·Π½ΠΈΠΎΡ‚ Π΄ΠΎΠ΄Π°Ρ‚ΠΎΠΊ ΠΏΡ€ΠΈΠΌΠ° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΎΠ΄ ΠΈΠ·Π²ΠΎΡ€ Π½Π° Π΄Π½Π΅Π²Π½ΠΈΠΊ, Π³ΠΈ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π° Π²ΠΎ Ρ€Π΅Π΄ΠΎΡ‚ ΠΈ ΠΈΡΠΏΡ€Π°ΡœΠ° ΠΏΠΎΡ‚Π²Ρ€Π΄Π° Π΄Π΅ΠΊΠ° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ сС ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈ Π΄ΠΎ ΠΈΠ·Π²ΠΎΡ€ΠΎΡ‚.

ΠŸΠΎΡ€Π°ΠΊΠΈΡ‚Π΅ ΠΎΠ΄ Ρ€Π΅Π΄ΠΎΡ‚ сС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π°Π°Ρ‚ ΠΎΠ΄ Logstash, ΠΏΠΎΠΌΠΈΠ½ΡƒΠ²Π°Π°Ρ‚ Π½ΠΈΠ· Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ ΠΈ ΠΈΠ·Π»Π΅Π·Π½ΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊ. Кога Π΄ΠΎΠ±ΠΈΠ²Π°Ρ‚Π΅ ΠΏΠΎΡ‚Π²Ρ€Π΄Π° ΠΎΠ΄ ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ Π΄Π΅ΠΊΠ° Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ‚ Π΅ испратСн, Logstash Π³ΠΎ отстранува ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΈΠΎΡ‚ Π΄Π½Π΅Π²Π½ΠΈΠΊ ΠΎΠ΄ Ρ€Π΅Π΄ΠΎΡ‚. Ако Logstash прСстанС, ситС Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΈ ΠΏΠΎΡ€Π°ΠΊΠΈ ΠΈ ΠΏΠΎΡ€Π°ΠΊΠΈ Π·Π° ΠΊΠΎΠΈ Π½Π΅ Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΡ‚Π²Ρ€Π΄Π° остануваат Π²ΠΎ Ρ€Π΅Π΄ΠΎΡ‚, Π° Logstash ќС ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈ Π΄Π° Π³ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π° слСдниот ΠΏΠ°Ρ‚ ΠΊΠΎΠ³Π° ќС Π·Π°ΠΏΠΎΡ‡Π½Π΅.

ΠΏΡ€ΠΈΠ»Π°Π³ΠΎΠ΄ΡƒΠ²Π°ΡšΠ΅

МоТС Π΄Π° сС ΠΏΡ€ΠΈΠ»Π°Π³ΠΎΠ΄ΠΈ со ΠΊΠΎΠΏΡ‡ΠΈΡšΠ° Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° C:Logstashconfiglogstash.yml:

  • queue.type: (ΠΌΠΎΠΆΠ½ΠΈ врСдности - persisted ΠΈ memory (default)).
  • path.queue: (ΠΏΠ°Ρ‚ Π΄ΠΎ ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° со Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π²ΠΎ Ρ€Π΅Π΄ΠΈΡ†Π°, ΠΊΠΎΠΈ стандардно сС Π·Π°Ρ‡ΡƒΠ²Π°Π½ΠΈ Π²ΠΎ C:Logstashqueue).
  • queue.page_capacity: (максималната Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° Π½Π° страницата Π½Π° Ρ€Π΅Π΄ΠΎΡ‚, стандардната врСдност Π΅ 64mb).
  • queue.drain: (Ρ‚ΠΎΡ‡Π½ΠΎ/Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΎ - ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π°/ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π·Π°ΠΏΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° Ρ€Π΅Π΄ΠΎΡ‚ ΠΏΡ€Π΅Π΄ Π΄Π° сС исклучи Logstash. НС ΠΏΡ€Π΅ΠΏΠΎΡ€Π°Ρ‡ΡƒΠ²Π°ΠΌ Π΄Π° Π³ΠΎ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈΡ‚Π΅, бидСјќи Ρ‚ΠΎΠ° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ќС влијаС Π½Π° Π±Ρ€Π·ΠΈΠ½Π°Ρ‚Π° Π½Π° ΠΈΡΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°ΡšΠ΅ Π½Π° сСрвСрот).
  • queue.max_events: (максималниот Π±Ρ€ΠΎΡ˜ Π½Π° настани Π²ΠΎ Ρ€Π΅Π΄ΠΎΡ‚, стандардно Π΅ 0 (Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ)).
  • queue.max_bytes: (максимална Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° Π½Π° Ρ€Π΅Π΄ΠΎΡ‚ Π²ΠΎ Π±Π°Ρ˜Ρ‚ΠΈ, стандардно - 1024mb (1gb)).

Ако Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ queue.max_events ΠΈ queue.max_bytes, Ρ‚ΠΎΠ³Π°Ρˆ ΠΏΠΎΡ€Π°ΠΊΠΈΡ‚Π΅ прСстануваат Π΄Π° сС ΠΏΡ€ΠΈΡ„Π°ΡœΠ°Π°Ρ‚ Π²ΠΎ Ρ€Π΅Π΄ΠΎΡ‚ ΠΊΠΎΠ³Π° ќС сС достигнС врСдноста Π½Π° која Π±ΠΈΠ»ΠΎ ΠΎΠ΄ ΠΎΠ²ΠΈΠ΅ поставки. Π”ΠΎΠ·Π½Π°Ρ˜Ρ‚Π΅ повСќС Π·Π° ΠŸΠΎΡΡ‚ΠΎΡ˜Π°Π½ΠΈΡ‚Π΅ Ρ€Π΅Π΄ΠΈΡ†ΠΈ Ρ‚ΡƒΠΊΠ°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Π΄Π΅Π»ΠΎΡ‚ ΠΎΠ΄ logstash.yml ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π΅Π½ Π·Π° ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ€Π΅Π΄ΠΎΡ‚:

queue.type: persisted
queue.max_bytes: 10gb

ΠΏΡ€ΠΈΠ»Π°Π³ΠΎΠ΄ΡƒΠ²Π°ΡšΠ΅

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Logstash ΠΎΠ±ΠΈΡ‡Π½ΠΎ сС состои ΠΎΠ΄ Ρ‚Ρ€ΠΈ Π΄Π΅Π»Π°, ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π½ΠΈ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ„Π°Π·ΠΈ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄ΠΎΡ˜Π΄ΠΎΠ²Π½ΠΈΡ‚Π΅ Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈ: ΠΏΡ€ΠΈΠΌΠ°ΡšΠ΅ (Π²Π»Π΅Π·Π΅Π½ Π΄Π΅Π»), ΠΏΠ°Ρ€ΡΠΈΡ€Π°ΡšΠ΅ (Π΄Π΅Π» Π·Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€) ΠΈ ΠΈΡΠΏΡ€Π°ΡœΠ°ΡšΠ΅ Π΄ΠΎ Elastic (ΠΈΠ·Π»Π΅Π·Π΅Π½ Π΄Π΅Π»). ΠŸΠΎΠ΄ΠΎΠ»Ρƒ ќС Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎΠ΄Π΅Ρ‚Π°Π»Π½ΠΎ сСкој ΠΎΠ΄ Π½ΠΈΠ².

ВнСсСтС

Π“ΠΎ Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ Π΄ΠΎΡ˜Π΄ΠΎΠ²Π½ΠΈΠΎΡ‚ прСнос со Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΈ Π»ΠΎΠ³ΠΎΠ²ΠΈ ΠΎΠ΄ Π°Π³Π΅Π½Ρ‚ΠΈΡ‚Π΅ Π·Π° Ρ„Π°Ρ˜Π»Π±ΠΈΡ‚. Π’ΠΎΠΊΠΌΡƒ овој ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊ Π³ΠΎ посочувамС Π²ΠΎ Π΄Π΅Π»ΠΎΡ‚ Π·Π° Π²Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅:

input {
  beats {
    port => 5044
  }
}

По ΠΎΠ²Π°Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, Logstash Π·Π°ΠΏΠΎΡ‡Π½ΡƒΠ²Π° Π΄Π° ја ΡΠ»ΡƒΡˆΠ° ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° 5044 ΠΈ ΠΊΠΎΠ³Π° ΠΏΡ€ΠΈΠΌΠ° Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈ, Π³ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π° спорСд поставкитС Π½Π° Π΄Π΅Π»ΠΎΡ‚ Π·Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ. Π”ΠΎΠΊΠΎΠ»ΠΊΡƒ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ Π·Π°Π²ΠΈΡ‚ΠΊΠ°Ρ‚Π΅ ΠΊΠ°Π½Π°Π»ΠΎΡ‚ Π·Π° ΠΏΡ€ΠΈΠΌΠ°ΡšΠ΅ Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈ ΠΎΠ΄ Π±ΠΈΡ‚ΠΎΡ‚ Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π²ΠΎ SSL. ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ˜Ρ‚Π΅ повСќС Π·Π° поставкитС Π½Π° Π΄ΠΎΠ΄Π°Ρ‚ΠΎΠΊΠΎΡ‚ Beats Ρ‚ΡƒΠΊΠ°.

Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ

Π‘ΠΈΡ‚Π΅ тСкстуални Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈ ΠΊΠΎΠΈ сС интСрСсни Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΡˆΡ‚ΠΎ Π³ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Exchange сС Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ csv со ΠΏΠΎΠ»ΠΈΡšΠ°Ρ‚Π° опишани Π²ΠΎ самата Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½Ρ†ΠΈΡ˜Π°. Π—Π° ΠΏΠ°Ρ€ΡΠΈΡ€Π°ΡšΠ΅ Π½Π° CSV записи, Logstash Π½ΠΈ Π½ΡƒΠ΄ΠΈ Ρ‚Ρ€ΠΈ ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΡ†ΠΈ: дисСцира, цсв ΠΈ Π³Ρ€ΠΎΠΊ. ΠŸΡ€Π²ΠΈΠΎΡ‚ Π΅ Π½Π°Ρ˜ΠΌΠ½ΠΎΠ³Ρƒ Π±Ρ€Π·Π°, Π½ΠΎ сС справува со ΠΏΠ°Ρ€ΡΠΈΡ€Π°ΡšΠ΅ само Π½Π° Π½Π°Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΈΡ‚Π΅ Π»ΠΎΠ³ΠΎΠ²ΠΈ.
На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ќС Π³ΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈ слСдниов запис Π½Π° Π΄Π²Π° (ΠΏΠΎΡ€Π°Π΄ΠΈ присуството Π½Π° Π·Π°ΠΏΠΈΡ€ΠΊΠ° Π²ΠΎ ΠΏΠΎΠ»Π΅Ρ‚ΠΎ), ΠΏΠΎΡ€Π°Π΄ΠΈ ΡˆΡ‚ΠΎ Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ‚ ќС сС Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎ:

…,"MDB:GUID1, Mailbox:GUID2, Event:526545791, MessageClass:IPM.Note, CreationTime:2020-05-15T12:01:56.457Z, ClientType:MOMT, SubmissionAssistant:MailboxTransportSubmissionEmailAssistant",…

МоТС Π΄Π° сС користи ΠΏΡ€ΠΈ ΠΏΠ°Ρ€ΡΠΈΡ€Π°ΡšΠ΅ Π½Π° Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, IIS. Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, Π΄Π΅Π»ΠΎΡ‚ Π·Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:

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" }
    }
  }
} 

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Logstash Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° користитС условни изјави, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΈΡΠΏΡ€Π°ΡœΠ°ΠΌΠ΅ само Π»ΠΎΠ³ΠΎΠ²ΠΈ ΠΊΠΎΠΈ Π±ΠΈΠ»Π΅ ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈ со ΠΎΠ·Π½Π°ΠΊΠ°Ρ‚Π° filebeat Π΄ΠΎ Π΄ΠΎΠ΄Π°Ρ‚ΠΎΠΊΠΎΡ‚ Π·Π° Ρ€Π°Π·Π΄Π΅Π»ΡƒΠ²Π°ΡšΠ΅ IIS. Π’Π½Π°Ρ‚Ρ€Π΅ Π²ΠΎ ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊΠΎΡ‚ Π³ΠΈ ΠΏΠΎΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΠΌΠ΅ врСдноститС Π½Π° ΠΏΠΎΠ»ΠΈΡšΠ°Ρ‚Π° со Π½ΠΈΠ²Π½ΠΈΡ‚Π΅ имиња, ΠΈΠ·Π±Ρ€ΠΈΡˆΠ΅Ρ‚Π΅ Π³ΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅ message, кој ΡΠΎΠ΄Ρ€ΠΆΠ΅ΡˆΠ΅ запис ΠΎΠ΄ Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ‚ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ приспособСно ΠΏΠΎΠ»Π΅ ΠΊΠΎΠ΅, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ќС Π³ΠΎ содрТи ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΎΠ΄ која собирамС Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈ.

Π’ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π° Π»ΠΎΠ³ΠΎΠ²ΠΈ Π·Π° слСдСњС, ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π΅ Π΄Π° сС користи ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊΠΎΡ‚ csv; Ρ‚ΠΎΡ˜ ΠΌΠΎΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π° слоТСни полиња:

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" }
    }
}

Π’Π½Π°Ρ‚Ρ€Π΅ Π²ΠΎ ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊΠΎΡ‚ Π³ΠΈ ΠΏΠΎΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΠΌΠ΅ врСдноститС Π½Π° ΠΏΠΎΠ»ΠΈΡšΠ°Ρ‚Π° со Π½ΠΈΠ²Π½ΠΈΡ‚Π΅ имиња, ΠΈΠ·Π±Ρ€ΠΈΡˆΠ΅Ρ‚Π΅ Π³ΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅ message (ΠΈ исто Ρ‚Π°ΠΊΠ° полиња tenant-id ΠΈ schema-version), кој ΡΠΎΠ΄Ρ€ΠΆΠ΅ΡˆΠ΅ запис ΠΎΠ΄ Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ‚ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ приспособСно ΠΏΠΎΠ»Π΅, ΠΊΠΎΠ΅, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ќС Π³ΠΎ содрТи ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΎΠ΄ која собирамС Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈ.

На ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ ΠΎΠ΄ Ρ„Π°Π·Π°Ρ‚Π° Π½Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΡšΠ΅, ќС Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈ Π²ΠΎ ΠΏΡ€Π²ΠΎ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΡƒΠ²Π°ΡšΠ΅, ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ Π·Π° Π²ΠΈΠ·ΡƒΠ΅Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π²ΠΎ Кибана. ЌС Π½ΠΈ нСдостасува слСдново:

  • НумСричкитС полиња ќС Π±ΠΈΠ΄Π°Ρ‚ ΠΏΡ€Π΅ΠΏΠΎΠ·Π½Π°Π΅Π½ΠΈ ΠΊΠ°ΠΊΠΎ тСкст, ΡˆΡ‚ΠΎ Π³ΠΈ спрСчува ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π½Π° Π½ΠΈΠ². ИмСно, ΠΏΠΎΠ»ΠΈΡšΠ°Ρ‚Π° time-taken Π”Π½Π΅Π²Π½ΠΈΠΊ Π½Π° IIS, ΠΊΠ°ΠΊΠΎ ΠΈ полиња recipient-count ΠΈ total-bites БлСдСњС Π½Π° Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈ.
  • Π‘Ρ‚Π°Π½Π΄Π°Ρ€Π΄Π½ΠΈΠΎΡ‚ врСмСнски ΠΏΠ΅Ρ‡Π°Ρ‚ Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΡ‚ ќС Π³ΠΎ содрТи Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΊΠΎΠ³Π° Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ‚ Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½, Π° Π½Π΅ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΊΠΎΠ³Π° Π΅ напишан Π½Π° страната Π½Π° сСрвСрот.
  • столб recipient-address ќС ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ Π΅Π΄Π½ΠΎ Π³Ρ€Π°Π΄ΠΈΠ»ΠΈΡˆΡ‚Π΅, ΠΊΠΎΠ΅ Π½Π΅ Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π° Π°Π½Π°Π»ΠΈΠ·Π° Π·Π° Π±Ρ€ΠΎΠ΅ΡšΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ°Ρ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° Π±ΡƒΠΊΠ²ΠΈΡ‚Π΅.

Π’Ρ€Π΅ΠΌΠ΅ Π΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΌΠ°Π»ΠΊΡƒ магија Π²ΠΎ процСсот Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈΡ‚Π΅.

ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π½ΡƒΠΌΠ΅Ρ€ΠΈΡ‡ΠΊΠΈ полиња

ΠŸΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊΠΎΡ‚ Π·Π° Π΄ΠΈΡΠ΅ΠΊΡ†ΠΈΡ˜Π° ΠΈΠΌΠ° ΠΎΠΏΡ†ΠΈΡ˜Π° convert_datatype, ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС користи Π·Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° тСкстуално ΠΏΠΎΠ»Π΅ Π²ΠΎ Π΄ΠΈΠ³ΠΈΡ‚Π°Π»Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Π°ΠΊΠ°:

dissect {
  …
  convert_datatype => { "time-taken" => "int" }
  …
}

Π’Ρ€Π΅Π΄ΠΈ Π΄Π° сС Π·Π°ΠΏΠ°ΠΌΠ΅Ρ‚ΠΈ Π΄Π΅ΠΊΠ° овој ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΅ ΠΏΠΎΠ³ΠΎΠ΄Π΅Π½ само Π°ΠΊΠΎ ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ‚ΠΈΠ²Π½ΠΎ ќС содрТи Π½ΠΈΠ·Π°. ΠžΠΏΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π° Null врСдности ΠΎΠ΄ ΠΏΠΎΠ»ΠΈΡšΠ°Ρ‚Π° ΠΈ Ρ„Ρ€Π»Π° исклучок.

Π—Π° слСдСњС Π½Π° Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈΡ‚Π΅, ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π΅ Π΄Π° Π½Π΅ сС користи сличСн ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°ΡšΠ΅, бидСјќи ΠΏΠΎΠ»ΠΈΡšΠ°Ρ‚Π° recipient-count ΠΈ total-bites ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΏΡ€Π°Π·Π½Π°. Π—Π° Π΄Π° Π³ΠΈ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°Ρ‚Π΅ ΠΎΠ²ΠΈΠ΅ полиња, ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π΅ Π΄Π° користитС ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊ ΠΌΡƒΡ‚ΠΈΡ€Π°Π°Ρ‚:

mutate {
  convert => [ "total-bytes", "integer" ]
  convert => [ "recipient-count", "integer" ]
}

ПодСлба Π½Π° recipient_address Π½Π° ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅Ρ‡Π½ΠΈ ΠΏΡ€ΠΈΠΌΠ°Ρ‡ΠΈ

Овој ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ€Π΅ΡˆΠΈ ΠΈ со помош Π½Π° ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊΠΎΡ‚ Π·Π° ΠΌΡƒΡ‚ΠΈΡ€Π°:

mutate {
  split => ["recipient_address", ";"]
}

ΠŸΡ€ΠΎΠΌΠ΅Π½Π° Π½Π° врСмСнскиот ΠΏΠ΅Ρ‡Π°Ρ‚

Π’ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π° Π»ΠΎΠ³ΠΎΠ²ΠΈ Π·Π° слСдСњС, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ ΠΌΠ½ΠΎΠ³Ρƒ лСсно сС Ρ€Π΅ΡˆΠ°Π²Π° со Π΄ΠΎΠ΄Π°Ρ‚ΠΎΠΊΠΎΡ‚ Π΄Π°Ρ‚ΡƒΠΌ, ΡˆΡ‚ΠΎ ќС Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°Ρ‚Π΅ Π½Π° Ρ‚Π΅Ρ€Π΅Π½ timestamp Π΄Π°Ρ‚ΡƒΠΌ ΠΈ Π²Ρ€Π΅ΠΌΠ΅ Π²ΠΎ Π±Π°Ρ€Π°Π½ΠΈΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΎΠ΄ ΠΏΠΎΠ»Π΅Ρ‚ΠΎ date-time:

date {
  match => [ "date-time", "ISO8601" ]
  timezone => "Europe/Moscow"
  remove_field => [ "date-time" ]
}

Π’ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π° Π»ΠΎΠ³ΠΎΠ²ΠΈ Π½Π° IIS, ќС Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΎΠ΄ Ρ‚Π΅Ρ€Π΅Π½ΠΎΡ‚ date ΠΈ time ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊΠΎΡ‚ Π·Π° ΠΌΡƒΡ‚ΠΈΡ€Π°, Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€Π°Ρ˜Ρ‚Π΅ ја врСмСнската Π·ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π½ΠΈ Ρ‚Ρ€Π΅Π±Π° ΠΈ ставСтС Π³ΠΎ овој врСмСнски ΠΏΠ΅Ρ‡Π°Ρ‚ Π²ΠΎ 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" ]
}

ΠΈΠ·Π»Π΅Π·

Π˜Π·Π»Π΅Π·Π½ΠΈΠΎΡ‚ Π΄Π΅Π» сС користи Π·Π° ΠΈΡΠΏΡ€Π°ΡœΠ°ΡšΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΈ Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈ Π΄ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΡ‚ Π·Π° Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈ. Π’ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π° ΠΈΡΠΏΡ€Π°ΡœΠ°ΡšΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π° Elastic, сС користи Π΄ΠΎΠ΄Π°Ρ‚ΠΎΠΊ СластичСн ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°Ρ‡, кој ја ΠΎΠ΄Ρ€Π΅Π΄ΡƒΠ²Π° адрСсата Π½Π° сСрвСрот ΠΈ ΠΎΠ±Ρ€Π°Π·Π΅Ρ†ΠΎΡ‚ Π·Π° ΠΈΠΌΠ΅ Π½Π° индСкс Π·Π° ΠΈΡΠΏΡ€Π°ΡœΠ°ΡšΠ΅ Π½Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈΠΎΡ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚:

output {
  elasticsearch {
    hosts => ["127.0.0.1:9200", "127.0.0.2:9200"]
    manage_template => false
    index => "Exchange-%{+YYYY.MM.dd}"
  }
}

ΠšΠΎΠ½Π΅Ρ‡Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°

ΠšΠΎΠ½Π΅Ρ‡Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ќС ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:

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}"
  }
}

ΠšΠΎΡ€ΠΈΡΠ½ΠΈ врски:

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€