рд╣рдо рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдХрдЯреНрдард╛, рдкрд╛рд░реНрд╕ рдФрд░ рд▓реЙрдЧ рджреЗрддреЗ рд╣реИрдВ

рдирдорд╕реНрддреЗред

рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реБрдЖ рдХрд┐ рдЕрдкрдиреЗ рдХрд╛рдо рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ рд▓реЙрдЧ рдХреЗ рд╕рдВрдЧреНрд░рд╣ / рднрдВрдбрд╛рд░рдг / рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдФрд░ рдиреАрддрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рднрд╛рдЧреАрджрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдирд╛рдУрдВ рдФрд░ рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╣реИред рдПрдХ рджрд┐рди рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо, рд╕реЗрд╡рд╛рдПрдВ рдФрд░ рд╕рд░реНрд╡рд░ рдмрд╣реБрдд рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓реЙрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рд▓реЙрдЧ рдореЗрдВ рдЦреБрджрд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝ рд░рд╣реА рд╣реИред
рдореБрдЭреЗ рдЖрд░реНрдХрд╕рд╛рдЗрдЯ, рдЖрд░рдПрд╕рдП рдПрдирд╡рд┐рдЬрди, рдХреНрдпреВ 1 рд▓реИрдмреНрд╕ рдЬреИрд╕реЗ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд▓реЙрдЧ рдкреНрд░рдмрдВрдзрди рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рд╛ред рдЗрди рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рджреЛрдиреЛрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред
рдпрд╣ Logstash рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдХреНрдпрд╛ рд╣реИ? рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рд╡рд╣ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рд▓реЙрдЧрд╕реНрдЯреИрд╢ рд▓реЙрдЧ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ, рдЫрд╛рдирдиреЗ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИред рдпрд╣ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдФрд░ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИред рдЕрдкрд╛рдЪреЗ 2.0 рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рдХрд╛рд░ред

рдПрд▓рдПрд╕ (рд▓реЙрдЧрд╕реНрдЯреИрд╢) рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдкрд░рд┐рдЪрд┐рдд рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╣реБрдЖ рдерд╛, рдФрд░ рддрдм рд╕реЗ рдореИрдВ рдЗрд╕ рдкрд░ рдмрд╣реБрдд рдХрд╕рдХрд░ рдмреИрда рдЧрдпрд╛ рд╣реВрдВред рдореБрдЭреЗ рдЙрдирдХрд╛ рд╡рд┐рдЪрд╛рд░ рдФрд░ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдкрд╕рдВрдж рд╣реИрдВред рдореЗрд░реЗ рд▓рд┐рдП, рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдПрдХ рдорд╛рдВрд╕ рдХреА рдЪрдХреНрдХреА рдХреА рддрд░рд╣ рд╣реИред рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдЯрд┐рд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдмрд╛рдж, рдЖрдЙрдЯрдкреБрдЯ рд╣рдореЗрд╢рд╛ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИред

рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рд░реВрдк рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рддреАрди рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ:

input { ... } filter { ... } output { ... } 

рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЗрдирдкреБрдЯ, рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ (рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ?) рдмреНрд▓реЙрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдм рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдФрд░ рд▓реЛрд╣реЗ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдЦрд╛рд▓реА рд▓рд╛рдЗрдиреЛрдВ рдФрд░ # рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛рдПрдВ - рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

1. INPUT

рдпрд╣ рд╡рд┐рдзрд┐ рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИред рдЗрд╕рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд▓реЙрдЧ рд▓реЙрдЧрд╢ рдореЗрдВ рдХреМрди рд╕реЗ рдЪреИрдирд▓ рдЬрд╛рдПрдВрдЧреЗред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдЙрди рдореБрдЦреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ рдЬрд┐рдирдХрд╛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдпреЗ рдлрд╝рд╛рдЗрд▓, рдЯреАрд╕реАрдкреА рдФрд░ рдпреВрдбреАрдкреА рд╣реИрдВред
1.1 рдлрд╝рд╛рдЗрд▓
рд╕реНрдерд╛рдиреАрдп рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЙрджрд╛рд╣рд░рдг:
 input { file { type => "some_access_log" path => [ "/var/log/vs01/*.log", "/var/log/vs02/*.log" ] exclude => [ "*.gz", "*.zip", "*.rar" ] start_position => "end" stat_interval => 1 discover_interval => 30 } } 


рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдПрдХ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рд╡рд┐рд╡рд░рдг:
 type => "some_access_log" 
рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░ / рд╡рд┐рд╡рд░рдгред рдХрдИ рдЗрдирдкреБрдЯ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЙрдиреНрд╣реЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдмрд╛рдж рдХреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИред

 path => [ "/var/log/vs01/*.log", "/var/log/vs02/*.log" ] 
рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдкрде рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрде рдкреВрд░реНрдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (/ рдкрде / рд╕реЗ / рд▓реЙрдЧ /), рд╕рд╛рдкреЗрдХреНрд╖ рдирд╣реАрдВ (..//some/other/path/)ред

 exclude => [ "*.gz", "*.zip", "*.rar" ] 
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИред

 start_position => "end" 
рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЖрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореМрдЬреВрджрд╛ рд▓реЙрдЧ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдк "рд╢реБрд░реБрдЖрдд" рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рд▓реЙрдЧ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реЛрдЧрд╛ред

 stat_interval => 1 
рдХрд┐рддрдиреА рдмрд╛рд░ (рд╕реЗрдХрдВрдб рдореЗрдВ) рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдмрдбрд╝реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдирдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рднреА рдмрдврд╝ рдЬрд╛рдПрдЧрд╛ред

 discover_interval => 30 
рд╕рдордп (рд╕реЗрдХрдВрдб рдореЗрдВ) рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдкрде рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрд╕рд╛рдзрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рдПрдЧреАред

1.2 tcp
рджреВрд░рд╕реНрде рд╕реЗрд╡рд╛ рд▓реЙрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЙрджрд╛рд╣рд░рдг:
 input { tcp { type => "webserver_prod" data_timeout => 10 mode => "server" host => "192.168.3.12" port => 3337 } } 


рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдПрдХ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рд╡рд┐рд╡рд░рдг:
 type => "webserver_prod" 
рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░ / рд╡рд┐рд╡рд░рдгред

 data_timeout => 10 
рд╕рдордп (рд╕реЗрдХрдВрдб рдореЗрдВ) рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп tcp рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдорд╛рди -1 - рдХрдиреЗрдХреНрд╢рди рд╣рдореЗрд╢рд╛ рдЦреБрд▓рд╛ рд░рд╣реЗрдЧрд╛ред

 mode => "server" host => "192.168.3.12" port => 3337 
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдПрдХ рд╕рд░реНрд╡рд░ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ 192.168.3.12, 337 рдкрд░ рд╕реБрдирдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдореЛрдб рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп => "рдХреНрд▓рд╛рдЗрдВрдЯ" рд▓реЙрдЧрд╕реНрдЯреИрд╢ рд░рд┐рдореЛрдЯ рдЖрдИрдкреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛: рд▓реЙрдЧ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯред

1.3 udp
Udp рдХреЗ рд▓рд┐рдП, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ tcp рдХреЗ рд╕рдорд╛рди рд╣реИрдВ:
 input { udp { type => "webserver_prod" buffer_size => 4096 host => "192.168.3.12" port => 3337 } } 

2. рдлрд┐рд▓реНрдЯрд░

рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ, рд▓реЙрдЧ рдХреЗ рд╕рд╛рде рдмреБрдирд┐рдпрд╛рджреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣ рдХреБрдВрдЬреА = рдорд╛рди, рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ, рдФрд░ рдореМрдЬреВрджрд╛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди, рдФрд░ рдЖрдИрдкреА рдкрддреЗ рдпрд╛ рд╣реЛрд╕реНрдЯ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдЬрд┐рдпреЛрдЗрдк рдпрд╛ рдбреАрдПрдирдПрд╕ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИред

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдлрд╝рд┐рд▓реНрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрдЯрд┐рд▓ рдФрд░ рдЕрддрд╛рд░реНрдХрд┐рдХ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред
2.1 рдЦрд╛рдВрдЪрд╛
рдмреЗрд╕рд┐рдХ рд▓реЙрдЧ рд╕рд╛рдорд╛рдиреНрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓:
 filter { grok { type => "some_access_log" patterns_dir => "/path/to/patterns/" pattern => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } } 


рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдПрдХ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рд╡рд┐рд╡рд░рдг:
 type => "apache_access" 
рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░ / рд╡рд┐рд╡рд░рдгред рдпрд╣рд╛рдВ рдЙрд╕ рдкреНрд░рдХрд╛рд░ (рдкреНрд░рдХрд╛рд░) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рдЗрдирдкреБрдЯ рдмреНрд▓реЙрдХ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдЧрд╛ред

 patterns_dir => "/path/to/patterns/" 
рд▓реЙрдЧ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╡рд╛рд▓реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдкрдеред рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЙрдЧрд╕реНрдЯреИрд╢ рджреНрд╡рд╛рд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╡рд╣рд╛рдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╛рдЗрд▓реЗрдВ рд╡рд╛рдВрдЫрдиреАрдп рдирд╣реАрдВ рд╣реИрдВред

 pattern => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" 
рд▓реЙрдЧ disassembly рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдпрд╛ рддреЛ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдпрд╛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рднреНрд░рдорд┐рдд рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд▓реЙрдЧ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реВрдВред

рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ
рдЧреНрд░реЙрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЙрдЧ - syslog, Apache, nginx, mysql, рдЖрджрд┐ рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Logstash рдореЗрдВ 120 рд╕реЗ рдЕрдзрд┐рдХ regex рдкреИрдЯрд░реНрди рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЙрдЧ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдбрд░ рдпрд╛ рдЧрд▓рддрдлрд╣рдореА рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИ - NAME PATTERN , рдЕрд░реНрдерд╛рддреН , рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдирд╛рдо рдФрд░ рдЙрд╕рдХреА рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 NUMBER \d+ WORD \b\w+\b USERID [a-zA-Z0-9_-]+ 

рдЖрдк рдХрд┐рд╕реА рднреА рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 USER %{USERID} 

рдЯреЗрдореНрдкреНрд▓реЗрдЯ рднреА рд╕рдВрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
 CISCOMAC (?:(?:[A-Fa-f0-9]{4}\.){2}[A-Fa-f0-9]{4}) WINDOWSMAC (?:(?:[A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2}) MAC (?:%{CISCOMAC}|%{WINDOWSMAC}) 


рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЙрдЧ рдкреНрд░рд╛рд░реВрдк рд╣реИ:
55.3.244.1 GET /index.html 15824 0.043

рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдЯреЗрдореНрдкреНрд▓реЗрдЯреНрд╕ рдореЗрдВ, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдкреИрд░ рдХреЗ рдкреИрдбрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рд╣рд╛рде рд▓реАрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреА рдорд╛рдВрд╕рдкреЗрд╢рд┐рдпреЛрдВ рдХреА рд╢рдХреНрддрд┐ рд╕реЗ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдкрд╣рд┐рдПрджрд╛рд░ рд╡рд╛рд╣рди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрдирд╛ рд╣реИ (рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмрд╛рдЗрдХ)ред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓реЙрдЧ рдХреЗ рд╕рд╛рде, рдпрд╣ " % {IP: рдЧреНрд░рд╛рд╣рдХ}% {WORD: рд╡рд┐рдзрд┐}% {URIPATHPARAM: рдЕрдиреБрд░реЛрдз}% {NUMBER: рдмрд╛рдЗрдЯреНрд╕}% {NUMBER: рдЕрд╡рдзрд┐} " рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрдЯрд░реНрди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рд╕рднреА рд▓реЙрдЧ рд╣реЛрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдЧреАред
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реА рд▓рд╛рдЗрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
рдЧреНрд░рд╛рд╣рдХ: 55.3.244.1
рд╡рд┐рдзрд┐: рдЬреА.рдИ.рдЯреА.
рдирд┐рд╡реЗрджрди: /index.html
рдмрд╛рдЗрдЯреНрд╕: 15824
рдЕрд╡рдзрд┐: 0.043


рд░реЗрдбреА-рдореЗрдб рдЧреНрд░реЙрдХ-рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдПрдХ рд╕реВрдЪреА рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ ред



реи.реи рдкрд░рд╕реНрдкрд░
рд▓реЙрдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ / рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓:
 filter { mutate { type => "apache_access" remove => [ "client" ] rename => [ "HOSTORIP", "client_ip" ] gsub => [ "message", "\\/", "_" ] add_field => [ "sample1", "from %{clientip}" ] } } 

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдПрдХ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рд╡рд┐рд╡рд░рдг:
 type => "apache_access" 
рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░ / рд╡рд┐рд╡рд░рдгред рд▓реЙрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдЧрд╛, рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 remove => [ "client" ] 
рдХреНрд▓рд╛рдЗрдВрдЯ рдлрд╝реАрд▓реНрдб рдирд╛рдо рд╡рд╛рд▓реЗ рд╕рднреА рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд▓реЛрдкрдиред рдХрдИ рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

 rename => [ "HOSTORIP", "client_ip" ] 
рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП HOSTORIP рдлрд╝реАрд▓реНрдб рдирд╛рдо рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ред

 gsub => [ "message", "\\/", "_" ] 
рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ "_" рдХреЗ рд╕рд╛рде рд╕рднреА "/" рдХреЛ рдмрджрд▓рдирд╛ред

 add_field => [ "sample1", "from %{clientip}" ] 
"{% {рдХреНрд▓рд╛рдЗрдВрдЯрд┐рдк}}" рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдлрд╝реАрд▓реНрдб "рдирдореВрдирд╛ 1" рдЬреЛрдбрд╝рдирд╛ред рдЪрд░ рдирд╛рдо рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред

реи.рей рддрд╛рд░реАрдЦ
рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓:
 filter { date { type => "apache_access" match => [ "timestamp", "MMM dd HH:mm:ss" ] } } 

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдПрдХ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рд╡рд┐рд╡рд░рдг:
 type => "apache_access" 
рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░ / рд╡рд┐рд╡рд░рдгред рд▓реЙрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдЧрд╛, рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 match => [ "timestamp", "MMM dd HH:mm:ss" ] 
рдЕрд╕реНрдерд╛рдпреА рдФрд░ рдореИрдВ рдИрд╡реЗрдВрдЯ рд▓реЗрдмрд▓ рд╣реВрдВред рдЖрдЧреЗ рдЫрдБрдЯрд╛рдИ рдпрд╛ рд▓реЙрдЧ рдХреЗ рдЪрдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЗрдЯрд┐рдВрдЧред рдпрджрд┐ рд╕рдордп рдпреВрдирд┐рдХреНрд╕ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк (рд╕реНрдХреНрд╡рд┐рдб) рдореЗрдВ рд▓реЙрдЧ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореИрдЪ => ["рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк", "рдпреВрдирд┐рдХреНрд╕"] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

реи.рек рдХреЗ.рд╡реА.
рдкреНрд░рд╛рд░реВрдк рдХреБрдВрдЬреА = рдорд╛рди рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 filter { kv { type => "custom_log" value_split => "=:" fields => ["reminder"] field_split => "\t?&" } } 

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдПрдХ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рд╡рд┐рд╡рд░рдг:
 type => "custom_log" 
рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░ / рд╡рд┐рд╡рд░рдгред рд▓реЙрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдЧрд╛, рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 value_split => "=:" 
рдХреБрдВрдЬреА-рдорд╛рди рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "=" рдФрд░ ":" рд╡рд░реНрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

 fields => ["reminder"] 
рдЙрд╕ рдлрд╝реАрд▓реНрдб рдХрд╛ рдирд╛рдо, рдЬрд┐рд╕рдореЗрдВ 'рдХреБрдВрдЬреА = рдорд╛рди' рдЦреЛрдЬрдирд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд▓реЙрдЧ рдХреА рдкреВрд░реА рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд░реЗрдХрдбрд╛рдЙрди рд╣реЛрдЧрд╛ред

 field_split => "\t?&" 
рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "\ t?" рдФрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред \ t - рдЯреИрдм рд╡рд░реНрдг

2.5 рдорд▓реНрдЯреАрд▓рд╛рдЗрди
"рдЧреНрд▓реВрдЗрдВрдЧ" рдорд▓реНрдЯреАрд▓рд╛рдЗрди рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрджрд╛рд╣рд░рдг (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╛рд╡рд╛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕):
 filter { multiline { type => "java_log" pattern => "^\s" what => "previous" } } 

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдПрдХ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рд╡рд┐рд╡рд░рдг:
 type => "java_log" 
рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░ / рд╡рд┐рд╡рд░рдгред рд▓реЙрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдЧрд╛, рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 pattern => "^\s" 
рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐

 what => "previous" 
рдпрджрд┐ рдкреИрдЯрд░реНрди рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рд▓рд╛рдЗрди рдкрд┐рдЫрд▓реА (рдкрд┐рдЫрд▓реА) рд▓рд╛рдЗрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред



3. OUTPUT

рдЗрд╕ рдмреНрд▓реЙрдХ / рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИ - рдпрд╣ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╕рдорд╛рди, рдпрд╣рд╛рдВ рдЖрдк рдХрд┐рд╕реА рднреА рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд╕рдмрдмреНрд▓реЙрдХ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
3.1 рд╕реНрдЯрдбрдЖрдЙрдЯ
рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд▓реЙрдЧ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓:
 output { stdout { type => "custom_log" message => "IP - %{clientip}. Full message: %{@message}. End of line." } } 


 type => "custom_log" 
рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░ / рд╡рд┐рд╡рд░рдгред

 message => "clIP - %{clientip}. Full message: %{@message}. End of line." 
рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд╕рдВрджреЗрд╢ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЪрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред

3.2 рдлрд╝рд╛рдЗрд▓
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЙрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 output { file { type => "custom_log" flush_interval => 5 gzip=> true path => "/var/log/custom/%{clientip}/%{type}" message_format => "ip: %{clientip} request:%{requri}" } } 


 type => "custom_log" 
рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░ / рд╡рд┐рд╡рд░рдгред

 flush_interval => 5 
рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд╕рдВрджреЗрд╢ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдЕрдВрддрд░рд╛рд▓ред 0 рдХрд╛ рдорд╛рди рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдЧрд╛ред

 gzip=> true 
рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд╕рдВрджреЗрд╢ рдлрд╝рд╛рдЗрд▓ рдХреЛ gzip рджреНрд╡рд╛рд░рд╛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 path => "/var/log/custom/%{clientip}/%{type}" 
рдкрде рдФрд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдЬрд╣рд╛рдВ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд╕рдВрджреЗрд╢ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдПрдВрдЧреЗред рдЖрдк рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдкреА рдкрддреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЪрд░% {рдкреНрд░рдХрд╛рд░} рдХреЗ рдЕрдиреБрд░реВрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрджреЗрд╢ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

 message_format => "ip: %{clientip} request:%{requri}" 
рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд╕рдВрджреЗрд╢ рд╕реНрд╡рд░реВрдкред

рей.рей рдЗрд▓рд╛рдпрдЪреА рдЦреЛрдЬ
рдПрд▓рд┐рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓реЙрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓:
 output { elasticsearch { type => "custom_log" cluster => "es_logs" embedded => false host => "192.168.1.1" port => "19300" index => "logs-%{+YYYY.MM.dd}" } } 


 type => "custom_log" 
рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░ / рд╡рд┐рд╡рд░рдгред

 cluster => "es_logs" 
Elasticsearch рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреНрд▓рд╕реНрдЯрд░ .name рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдирд╛рдоред

 embedded => false 
рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдпрд╛ рдмрд╛рд╣рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓рд┐рдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдЖрдзрд╛рд░ рдХреНрдпрд╛ рд╣реИред

 port => "19300" 
рдкрд░рд┐рд╡рд╣рди рдкреЛрд░реНрдЯ рдПрд▓рд┐рдЯрд┐рдХреНрд╕ рдЦреЛрдЬред

 host => "192.168.1.1" 
рдЗрд▓рд╛рд╕реНрдЯрд┐рд╕рд░реНрдЪ рдЖрдИрдкреА рдПрдбреНрд░реЗрд╕

 index => "logs-%{+YYYY.MM.dd}" 
рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдирд╛рдо рдЬрд╣рд╛рдВ рд▓реЙрдЧ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

рей.рек рдИрдореЗрд▓
рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд▓рд░реНрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╕реВрдЪрдирд╛рдУрдВ рдореЗрдВ рдХреЛрдИ рднреА рдмрджрд▓рд╛рд╡ (рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ, рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рддрд░рд╣) рдХреЛ рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрд╡рд▓рдкрд░ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓:
 output { email { type => "custom_log" from => "logstash@domain.com" to => "admin1@domain.com" cc => "admin2@domain.com" subject => "Found '%{matchName}' Alert on %{@source_host}" body => "Here is the event line %{@message}" htmlbody => "<h2>%{matchName}</h2><br/><br/><h3>Full Event</h3><br/><br/><div align='center'>%{@message}</div>" via => "sendmail" options => [ "smtpIporHost", "smtp.gmail.com", "port", "587", "domain", "yourDomain", "userName", "yourSMTPUsername", "password", "PASS", "starttls", "true", "authenticationType", "plain", "debug", "true" ] match => [ "response errors", "response,501,,or,response,301", "multiple response errors", "response,501,,and,response,301" ] } } 


 type => "custom_log" 
рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░ / рд╡рд┐рд╡рд░рдгред

 from => "logstash@domain.com" to => "admin1@domain.com" cc => "admin2@domain.com" 
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рддрд╛рдХрдд рд╣реИ, рддреЛ рдЖрдк рдЗрди 3 рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЕрд░реНрде рд╕реНрд╡рдпрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :)

 subject => "Found '%{matchName}' Alert on %{@source_host}" 
рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкрддреНрд░ рдХреА рд╡рд┐рд╖рдп рдкрдВрдХреНрддрд┐ред рдЖрдк рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,% {matchName} "рдореИрдЪ" рд╕реЗрдЯрд┐рдВрдЧ рд╕реЗ рдореИрдЪ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдирд╛рдо рд╣реИред

 body => "Here is the event line %{@message}" htmlbody => "<h2>%{matchName}</h2><br/><br/><h3>Full Event</h3><br/><br/><div align='center'>%{@message}</div>" 
рдЕрдХреНрд╖рд░ рдХрд╛ рд╢рд░реАрд░ред

 via => "sendmail" 
рдкрддреНрд░ рднреЗрдЬрдиреЗ рдХреА рд╡рд┐рдзрд┐ред рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рдВрднрд╡ рд╣реИ - smtp рдпрд╛ sendmailред

 options => ... 
рдореЗрд▓ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ред

 match => [ "response errors", "response,501,,or,response,301", "multiple response errors", "response,501,,and,response,301" ] 
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ" - рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рдирд╛рдо (рдЪрд░% {matchName}) рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ред "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, 501 ,, рдпрд╛, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, 301" - рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд╛рдирджрдВрдбред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрджрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдлрд╝реАрд▓реНрдб рдореЗрдВ 501 рдпрд╛ 301 рдХрд╛ рдорд╛рди рд╣реИ, рддреЛ рдЕрд▓рд░реНрдЯ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ AND рдФрд░ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рджреЛрдиреЛрдВ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред



4. рдХреБрд▓


Habr.conf рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
 input { tcp { type => "habr" port => "11111" } } filter { mutate { type => "habr" add_field => [ "habra_field", "Hello Habr" ] } } output { stdout { type => "habr" message => "%{habra_field}: %{@message}" } } 


рд▓реЙрдЧрд╕реНрдЯреИрд╢ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ:
java -jar logstash-1.1.9-monolithic.jar agent -f ./habr.conf

рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдЪрд▓ рд░рд╣рд╛ рд╣реИ:
# netstat -nat | grep 11111
рдпрджрд┐ рдкреЛрд░реНрдЯ 11111 рдореМрдЬреВрдж рд╣реИ, рддреЛ рд▓реЙрдЧрд╕реНрдЯреИрд╢ рд▓реЙрдЧ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

рдирдИ рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдВрдбреЛ рдореЗрдВ, рд▓рд┐рдЦреЗрдВ:
echo "Logs are cool!" | nc localhost 11111

рд╣рдо рдЙрд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЧреБрдкреНрдд рд╕рдВрджреЗрд╢ рд╡рд╣рд╛рдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рддреЛ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

Ps рд▓реЙрдЧрд╕реНрдЯреИрд╢ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

Source: https://habr.com/ru/post/In165059/


All Articles