Здравствуйте! 
Есть необходимость парсить csv фильтром то, что не распарсил grok. 
Я сделал конфиг:
filter {
  if "ise" in [tags] and ([message] !~ "NetworkDeviceName=ASA1-VPN" and [message] !~ "NetworkDeviceName=ASA2-VPN") {
    drop { }
  }
  if "ise" in [tags] {
    grok {
      patterns_dir => ["/etc/logstash/paterns"]
      match => { "message" => "<181>%{WORD:month}\s*%{NUMBER:date} %{TIME:time} %{DATA:Server} %{DATA:CISE_logging_category} %{NUMBER:trash3} %{NUMBER:trash4} %{NUMBER:trash5} %{DATE_12:Logged_at_start} %{DATA:trash6} %{NUMBER:seq_num} %{NUMBER:cisco_message_code} %{WORD:facility} Radius-Accounting: RADIUS Accounting start request, ConfigVersionId=%{NUMBER:config_version_id}, Device IP Address=%{IP:device_ip}, RequestLatency=%{NUMBER:request_latency}, NetworkDeviceName=%{DATA:device_name_start}, User-Name=%{DATA:vpn_user_start}, %{GREEDYDATA:message2}" }
      match => { "message" => "<181>%{WORD:month}\s*%{NUMBER:date} %{TIME:time} %{DATA:Server} %{DATA:CISE_logging_category} %{NUMBER:trash3} %{NUMBER:trash4} %{NUMBER:trash5} %{DATE_12:Logged_at_stat} %{DATA:trash6} %{NUMBER:seq_num} %{NUMBER:cisco_message_code} %{WORD:facility} Radius-Accounting: RADIUS Accounting stop request, ConfigVersionId=%{NUMBER:config_version_id}, Device IP Address=%{IP:device_ip}, RequestLatency=%{NUMBER:request_latency}, NetworkDeviceName=%{DATA:device_name_stop}, User-Name=%{DATA:vpn_user_stop}, %{GREEDYDATA:message2}" }
      remove_field => [ "message" ]
    }
    mutate {
      gsub => ["message2", " ", ""]
    }
    csv {
      separator => "," 
      autodetect_column_names => "true"
    }
  }
}
 
Но почему то не работает, возможно ли сделать парсинг с помощью csv после grok? 
Спасибо!
             
            
               
               
               
            
            
           
          
            
              
                Igor_Motov  
                (Igor Motov)
               
              
                  
                    January 22, 2020,  2:18pm
                   
                   
              2 
               
             
            
              Какое поле вы пытаетесь парсить с помощью фильтра csv?
             
            
               
               
              1 Like 
            
            
           
          
            
              
                Igor_Motov  
                (Igor Motov)
               
              
                  
                    January 22, 2020,  5:14pm
                   
                   
              4 
               
             
            
              CVS работает с message по умолчанию .
             
            
               
               
              1 Like 
            
            
           
          
            
            
              То есть нужно вот так:
csv {
  source => "message2"
  separator => "," 
  autodetect_column_names => "true"
} 
             
            
               
               
               
            
            
           
          
            
            
              Игорь, подскажите пожалуйста, что не так. Мне нужно из @timestamp  вычесть другую отметку времени для этого написал код:
  if "ise" in [tags] and [Acct_Session_Time] {
    date {
      match => [ "Acct_Session_Time", "UNIX" ]
      target => "Duration_temp"
    }
    ruby {
      code => "
        event.set('Duration', event.get('Duration_temp').time.strftime('%H:%M:%S'))
        event['Session_start'] = (event('@timestamp') - event('Duration_temp'))
        "
    }
 
Фильтр date преобразует число в дату после 1970 года и записывает её в поле "Duration_temp", это преобразование работает.
Фильтр ruby: 
Первый код вырезает из поля Duration_temp часы, минуты и секунды, это тоже работает. 
Второй код вычитает из @timestamp , Duration_temp по сути должно появиться поле Session_start, но не появляется - не работает.
Подскажите, как мне получить результат вычитания @timestamp  из  Duration_temp?
Спасибо!
             
            
               
               
               
            
            
           
          
            
              
                Igor_Motov  
                (Igor Motov)
               
              
                  
                    January 24, 2020,  6:53pm
                   
                   
              8 
               
             
            
              У event('@timestamp') скобки не те, или .get() не хватает.
             
            
               
               
               
            
            
           
          
            
            
              И так и так пробовал, результат ноль..
    event.set('Session_start', event.get['@timestamp'] - event.get['Duration_temp'])
    event['Session_start'] = (event['@timestamp'] - event['Duration_temp']) 
             
            
               
               
               
            
            
           
          
            
              
                Igor_Motov  
                (Igor Motov)
               
              
                  
                    January 28, 2020,  9:32pm
                   
                   
              10 
               
             
            
              Не могу воспроизвести проблему. Пытался вот так:
test.conf :
input {
  stdin {
  }
}
filter {
  csv {
    separator => ","
    autodetect_column_names => "true"
  }
  date {
    match => [ "Acct_Session_Time", "UNIX" ]
    target => "Duration_temp"
  }
  ruby {
    code => "
      event.set('Duration', event.get('Duration_temp').time.strftime('%H:%M:%S'))
      event.set('Session_start', (event.get('@timestamp') - event.get('Duration_temp')))
    "
  }
  date {
    match => [ "Session_start", "UNIX" ]
    target => "Session_start_date"
  }
}
output {
  stdout {
    codec => rubydebug
  }
}
 
test.log :
Acct_Session_Time
2000
3000
 
Запускаю :
 bin/logstash -f config/test.conf < test.log
 
Получаю :
{
              "Duration" => "00:33:20",
            "@timestamp" => 2020-01-28T21:31:03.981Z,
              "@version" => "1",
                  "host" => "grasshopper",
               "message" => "2000",
         "Session_start" => 1580245063.981,
     "Acct_Session_Time" => "2000",
    "Session_start_date" => 2020-01-28T20:57:43.981Z,
         "Duration_temp" => 1970-01-01T00:33:20.000Z
}
{
              "Duration" => "00:50:00",
            "@timestamp" => 2020-01-28T21:31:03.982Z,
              "@version" => "1",
                  "host" => "grasshopper",
               "message" => "3000",
         "Session_start" => 1580244063.982,
     "Acct_Session_Time" => "3000",
    "Session_start_date" => 2020-01-28T20:41:03.982Z,
         "Duration_temp" => 1970-01-01T00:50:00.000Z
}
 
Все, вроде, как надо.
             
            
               
               
              1 Like 
            
            
           
          
            
            
              Игорь спасибо! 
Как всегда, Вы на высоте!)
             
            
               
               
               
            
            
           
          
            
            
              Единственное что, у меня почему то еще минус 3 часа вычитает) 
Походу с часовым поясом, что-то..
@timestamp                   Jan 29, 2020 @ 20:34:37.197
Acct_Session_Time        5637
Duration                         01:33:57
Duration_temp             1970-01-01T01:33:57.000Z
Session_start                 1580313640.197
Session_start_date       2020-01-29T16:00:40.197Z 
             
            
               
               
               
            
            
           
          
            
              
                Igor_Motov  
                (Igor Motov)
               
              
                  
                    January 29, 2020,  6:19pm
                   
                   
              13 
               
             
            
              Как вы этот вывод получили?
             
            
               
               
               
            
            
           
          
            
            
              Добавил Ваш конфиг в свой и просто скопировал из кибаны.
             
            
               
               
               
            
            
           
          
            
              
                Igor_Motov  
                (Igor Motov)
               
              
                  
                    January 30, 2020,  2:09pm
                   
                   
              15 
               
             
            
              Из какой части кибаны? Если из Discover, то там поля с типом date показываются в вашей зоне. Остильные поля, скорее всего текстовые, поэтому они в той зоне, в которой вы их обрабатывали. Все что оканчивается на Z - в UTC, если временной зоны в конце нет - то это ваше местное время.
             
            
               
               
               
            
            
           
          
            
              
                system  
                (system)
                  Closed 
               
              
                  
                    February 27, 2020,  2:09pm
                   
                   
              16 
               
             
            
              This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.