0

Я пытаюсь разобрать журналы nginx, используя Logstash, все выглядит прекрасно, за исключением получения этого тега _grokparsefailure с линиями, содержащими Nginx $ remote_user. Когда $ remote_user это «-» (значение по умолчанию, если не указано никакого $ remote_user), Logstash сделать работу, но с реальным $ REMOTE_USER как [email protected] это не удается, и поставить _grokparsefailure тег:Logstash _grokparsefailure при разборе журналов Nginx

127.0.0.1 - - [17/Feb/2017: 23: 14: 08 +0100] «GET /favicon.ico HTTP/1.1» 302 169 «http://training-hub.tn/trainer/» «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, например, Gecko) Chrome/56.0.2924.87 Safari/537,36"

=====> Работает отлично

127.0.0.1 - [email protected] [17/Feb/2017: 23: 14: 07 +0100] "GET /trainer/templates/home.tmpl.html HTTP/1.1" 304 0 "http://training-hub.tn/trainer/" "Mozilla/5,0 (X11; Linux x86_64) AppleWebKit/537,36 (KHTML, как Gecko) Chrome/56.0.2924.87 Safari/537,36"

=====>_grokparsefailure теги и не разобрать строки журнала

Я использую этот файл конфигурации:

input {  
    file {  
     path => "/home/dev/node/training-hub/logs/access_log"  
     start_position => "beginning"  
     sincedb_path => "/dev/null" 
     ignore_older => 0 
     type => "logs" 
    } 
} 

filter {  
    if[type] == "logs" {   
     mutate {    
      gsub => ["message", "::ffff:", ""]   
     }  
     grok {   
      match=> [ 
       "message" , "%{COMBINEDAPACHELOG}+%{GREEDYDATA:extra_fields}", 
       "message" , "%{COMMONAPACHELOG}+%{GREEDYDATA:extra_fields}" 
      ] 
      overwrite=> [ "message" ] 
     } 

     mutate { 
      convert=> ["response", "integer"] 
      convert=> ["bytes", "integer"] 
      convert=> ["responsetime", "float"] 
     } 
     geoip { 
      source => "clientip" 
      target => "geoip" 
      database => "/etc/logstash/GeoLite2-City.mmdb" 
      add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ] 
      add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ] 
     } 
     mutate { 
      convert => [ "[geoip][coordinates]", "float"] 
     } 

     date { 
      match=> [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ] 
      remove_field=> [ "timestamp" ] 
     } 

     useragent { 
      source=> "agent" 
     } 
    } 
} 

output { elasticsearch {   hosts => "localhost:9200" } } 

ответ

0

После тестирования на выходе со многими значениями, я понял, что Logstash не удается разобрать строки, содержащие такую ​​$remote_user, потому что это не является допустимым именем пользователя (адрес электронной почты) журнал, поэтому я добавил mutate gsub фильтр, чтобы удалить @ и остальную часть почтового адреса, чтобы иметь действительный $remote_user.

GSUB => [ "сообщение", «@ + а-z0-9 (:(?: а-z0-9?.) |? [(:(?: 25 [0- 5] | 2 [0-4] [0-9] |? [01] [0-9] [0-9])) {3} (?: 25 [0-5] |?. 2 [0- 4] [0-9] | [01] [0-9] [0-9] | [а-z0-9 -] * [а-z0-9]:? (: [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21- \ x5a \ x53- \ x7f] | \ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) +)]) ["," [" ]

И теперь он отлично работает