рдореИрдВ рджреЛрд╕реНрдд рдПрдХреНрд╕рдЪреЗрдВрдЬ рдФрд░ рдИрдПрд▓рдХреЗ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ (рд╢реБрд░реБрдЖрдд) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рдХрд╣рд╛рдиреА рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВ
рдИрдПрд▓рдХреЗ рд╕реНрдЯреИрдХ рдореЗрдВ рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрдЧ рдХреЛ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдореЗрдВ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдмрд╛рдирд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмрдирд╛рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИред
рд╕реНрдерд╛рдкрдирд╛
рджреЛ рдЪрд░рдгреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдирддрд╛ рд╣реИ:
- OpenJDK рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ред
- рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ред
OpenJDK рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
OpenJDK рдкреИрдХреЗрдЬ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЕрдирдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдкрде Windows рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ $env:Path рдФрд░ $env:JAVA_HOME рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
рдЖрдЗрдП рдЬрд╛рд╡рд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
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)
рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
рд▓реЙрдЧрд╕реНрдЯреИрд╢ рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ C:Program Files
рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЙрдЧрд╕реНрдЯреИрд╢ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛ред рдлрд┐рд░ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ jvm.options
рдЬрд╛рд╡рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд░реИрдо рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдлрд┐рдХреНрд╕ред рдореИрдВ рд╕рд░реНрд╡рд░ рдХреА рдЖрдзреА рд░реИрдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдБред рдпрджрд┐ рдЗрд╕рдореЗрдВ 16 рдЬреАрдмреА рд░реИрдо рд╣реИ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╣реИрдВ:
-Xms1g
-Xmx1g
рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
-Xms8g
-Xmx8g
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд╛рдЗрди рд╕реЗ рдмрд╛рд╣рд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ -XX:+UseConcMarkSweepGC
. рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ
input {
stdin{}
}
filter {
}
output {
stdout {
codec => "rubydebug"
}
}
рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде, рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдХрдВрд╕реЛрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рдЦрд╛рд▓реА рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХрдВрд╕реЛрд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЗрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдореЛрдб рдореЗрдВ рдЪрд▓рд╛рдПрдВ:
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}
рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдкреЛрд░реНрдЯ 9600 рдкрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЙрдиреНрдЪ рд╣реБрдЖред
рдЕрдВрддрд┐рдо рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдЪрд░рдг: рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдХреЛ рд╡рд┐рдВрдбреЛрдЬ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
PS C:...bin> .nssm.exe install logstash
Service "logstash" installed successfully!
рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛
рд╕реНрд░реЛрдд рд╕рд░реНрд╡рд░ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрдиреЗ рдкрд░ рд▓реЙрдЧ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдкрд░реНрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдХреНрдпреВ рддрдВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рд▓реЙрдЧ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдХрддрд╛рд░реЛрдВ рдХрд╛ рд▓реЗрдЖрдЙрдЯ рд╣реИ: рдЗрдирдкреБрдЯ тЖТ рдХрддрд╛рд░ тЖТ рдлрд╝рд┐рд▓реНрдЯрд░ + рдЖрдЙрдЯрдкреБрдЯред
рдЗрдирдкреБрдЯ рдкреНрд▓рдЧрдЗрди рдПрдХ рд▓реЙрдЧ рд╕реНрд░реЛрдд рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рдХрддрд╛рд░ рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдкреБрд╖реНрдЯрд┐ рднреЗрдЬрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдХрддрд╛рд░ рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд▓реЙрдЧрд╕реНрдЯреИрд╢ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд▓рдЧрдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдкреБрд╖реНрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдХрд┐ рд▓реЙрдЧ рднреЗрдЬ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЙрдЧрд╕реНрдЯреИрд╢ рд╕рдВрд╕рд╛рдзрд┐рдд рд▓реЙрдЧ рдХреЛ рдХрддрд╛рд░ рд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рдЕрд╕рдВрд╕рд╛рдзрд┐рдд рд╕рдВрджреЗрд╢ рдФрд░ рд╕рдВрджреЗрд╢ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреБрд╖реНрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рдХрддрд╛рд░ рдореЗрдВ рдмрдиреЗ рд░рд╣реЗрдВрдЧреЗ, рдФрд░ рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдЕрдЧрд▓реА рдмрд╛рд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ред
рд╕рдорд╛рдпреЛрдЬрди
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдпреЛрдЬреНрдп C:Logstashconfiglogstash.yml:
queue.type
: (рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рди -persisted
╨╕memory (default))
.path.queue
: (рдХреНрдпреВ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╡рд╛рд▓реЗ рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдкрде, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ C:Logstashqueue рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИ)редqueue.page_capacity
: (рдЕрдзрд┐рдХрддрдо рдХрддрд╛рд░ рдкреГрд╖реНрда рдЖрдХрд╛рд░, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди 64рдПрдордмреА рд╣реИ)редqueue.drain
: (рд╕рд╣реА/рдЧрд▓рдд - рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрддрд╛рд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо/рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реАрдзреЗ рд╕рд░реНрд╡рд░ рд╢рдЯрдбрд╛рдЙрди рдХреА рдЧрддрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛)редqueue.max_events
: (рдХрддрд╛рд░ рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ 0 рд╣реИ (рдЕрд╕реАрдорд┐рдд))редqueue.max_bytes
: (рдЕрдзрд┐рдХрддрдо рдХрддрд╛рд░ рдЖрдХрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ - 1024 рдПрдордмреА (1 рдЬреАрдмреА))ред
рдпрджрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ queue.max_events
╨╕ queue.max_bytes
, рддреЛ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рдорд╛рди рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╕рддрдд рдХрддрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдиреЗрдВ
рдХрддрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ logstash.yml рдХреЗ рднрд╛рдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
queue.type: persisted
queue.max_bytes: 10gb
рд╕рдорд╛рдпреЛрдЬрди
рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рддреАрди рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд▓реЙрдЧ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ: рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ (рдЗрдирдкреБрдЯ рдЕрдиреБрднрд╛рдЧ), рдкрд╛рд░реНрд╕рд┐рдВрдЧ (рдлрд╝рд┐рд▓реНрдЯрд░ рдЕрдиреБрднрд╛рдЧ) рдФрд░ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ (рдЖрдЙрдЯрдкреБрдЯ рдЕрдиреБрднрд╛рдЧ) рдХреЛ рднреЗрдЬрдирд╛ред рдиреАрдЪреЗ рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВрдЧреЗред
рдирд┐рд╡реЗрд╢
рд╣рдо рдлрд╝рд╛рдЗрд▓рдмреАрдЯ рдПрдЬреЗрдВрдЯреЛрдВ рд╕реЗ рдХрдЪреНрдЪреЗ рд▓реЙрдЧ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реА рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд╣ рдкреНрд▓рдЧрдЗрди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЗрдирдкреБрдЯ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
input {
beats {
port => 5044
}
}
рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрд╛рдж, рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдкреЛрд░реНрдЯ 5044 рдХреЛ рд╕реБрдирдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд▓реЙрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп, рдлрд╝рд┐рд▓реНрдЯрд░ рдЕрдиреБрднрд╛рдЧ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рдПрд╕рдПрд╕рдПрд▓ рдореЗрдВ рдлрд╝рд╛рдЗрд▓рдмрд┐рдЯ рд╕реЗ рд▓реЙрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреИрдирд▓ рдХреЛ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВред рдмреАрдЯреНрд╕ рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВ
рдлрд╝рд┐рд▓реНрдЯрд░
рд╕рднреА рдЯреЗрдХреНрд╕реНрдЯ рд▓реЙрдЧ рдЬреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╕реАрдПрд╕рд╡реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реИрдВред рд╕реАрдПрд╕рд╡реА рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧрд╕реНрдЯреИрд╢ рд╣рдореЗрдВ рддреАрди рдкреНрд▓рдЧрдЗрдиреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рд┐рдХреЙрд░реНрдб рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рджреЗрдЧрд╛ (рдлрд╝реАрд▓реНрдб рдХреЗ рдЕрдВрджрд░ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг), рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рд▓реЙрдЧ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
тАж,"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" }
}
}
}
рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ IIS
. рдкреНрд▓рдЧрдЗрди рдХреЗ рдЕрдВрджрд░ рд╣рдо рдлрд╝реАрд▓реНрдб рдорд╛рдиреЛрдВ рдХреЛ рдЙрдирдХреЗ рдирд╛рдореЛрдВ рд╕реЗ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ, рдореВрд▓ рдлрд╝реАрд▓реНрдб рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ message
, рдЬрд┐рд╕рдореЗрдВ рд▓реЙрдЧ рд╕реЗ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рд╣рдо рдПрдХ рдХрд╕реНрдЯрдо рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд╛рдо рд╣реЛрдЧрд╛ рдЬрд┐рд╕рд╕реЗ рд╣рдо рд▓реЙрдЧ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВред
рдЯреНрд░реИрдХрд┐рдВрдЧ рд▓реЙрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реАрдПрд╕рд╡реА рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ; рдпрд╣ рдЬрдЯрд┐рд▓ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
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" }
тАж
}
рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рддрднреА рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬрдм рдлрд╝реАрд▓реНрдб рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдЧреАред рд╡рд┐рдХрд▓реНрдк рдлрд╝реАрд▓реНрдб рд╕реЗ рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИред
рд▓реЙрдЧ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд╛рдж рд╕реЗ рд╕рдорд╛рди рдХрдирд╡рд░реНрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ recipient-count
╨╕ total-bites
рдЦрд╛рд▓реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ. рдЗрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ
mutate {
convert => [ "total-bytes", "integer" ]
convert => [ "recipient-count", "integer" ]
}
рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛_рдкрддреЗ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдореНрдпреВрдЯреЗрдЯ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
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" ]
}
рдЙрддреНрдкрд╛рджрди
рдЖрдЙрдЯрдкреБрдЯ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрд╕рд╛рдзрд┐рдд рд▓реЙрдЧ рдХреЛ рд▓реЙрдЧ рд░рд┐рд╕реАрд╡рд░ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реАрдзреЗ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдкрд░ рднреЗрдЬрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
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}"
}
}
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХреНрд╕:
рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдУрдкрдирдЬреЗрдбреАрдХреЗ 11 рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ? рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдбреАрдкреНрд░рд┐рдХреЗрдЯреЗрдб рд╡рд┐рдХрд▓реНрдк рдпреВрдЬрд╝рдХреЙрдиреНрдХрдорд╛рд░реНрдХрд╕реНрд╡реАрдкрдЬреАрд╕реА #36828 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдПрдирдПрд╕рдПрд╕рдПрдо рд▓рдЧрд╛рддрд╛рд░ рдХрддрд╛рд░реЗрдВ рдмреАрдЯреНрд╕ рдЗрдирдкреБрдЯ рдкреНрд▓рдЧрдЗрди рд▓реЙрдЧрд╕реНрдЯреИрд╢ рджреЛрд╕реНрдд, рдореЗрд░реА рдЪреЗрдирд╕реЙ рдХрд╣рд╛рдБ рд╣реИ? рдореБрдЭреЗ рдЕрдкрдиреЗ рд▓реЙрдЧ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд┐рдЪреНрдЫреЗрджрди рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд▓рдЧрдЗрди рд╕рд╢рд░реНрдд, рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд▓рдЧрдЗрди рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ рджрд┐рдирд╛рдВрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд▓рдЧрдЗрди рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд▓рдЧрдЗрди
рд╕реНрд░реЛрдд: www.habr.com