2015-03-31 2 views
2

Я использую Logstash с вводом файлов & Http-вывод для доморощенного сервиса, для которого требуются учетные данные (username:password), которые должны быть отправлены как Base64 encoded значение. Ниже приведена моя конфигурация Logstash. В настоящее время я могу отправить значение Base 64 encoded через headers, однако я ищу способ кодирования String (который будет доступен для Logstash через переменную среды) до значения String Base 64 encoded. Был бы очень признателен, если кто-нибудь может пролить свет на это.Конфигурация Logstash: http-выход с кодированными заголовками Base 64

input { 
file { 
    path => "/home/tom/testData/test2.log" 
    type => "log" 
} 
} 

filter { 
if [type] == "log" { 
    grok { 
    match => ["message", "%{TIMESTAMP_ISO8601:time} %{LOG:level} %{GREEDYDATA:lmessage}"] 
    } 
    ruby { 
    code => "require 'base64'; 
    event['pass'] = Base64.encode64('User:Pwd')" 
    } 

} 
} 
output { 
stdout { codec => rubydebug } 
http { 
http_method => "post" 
    url => "http://10.1.2.3:1123/HomeService?User=Tom" 
    format => "message" 
    headers => {"Authorization" => "Basic %{pass}"}  
    content_type => "application/json" 
    message => '{"Outer": { "Inner": [ {"doc": { "Timestamp": "%{time}", "Single": "%{level}","Double": "%{lmessage}" } } ] } }' 
} 
} 

ответ

3

Вы можете тянуть что-то из окружения и base64 кодирования это следующим образом:

ruby { 
      code => " 
        require 'base64'; 
        event['password'] = Base64.encode64(ENV['USER_PASS']).sub(/\n/,'') 
      " 
    } 

Затем, чтобы использовать его:

export USER_PASS="dog:cat" 
echo '{"test":1}' | bin/logstash agent -f logstash.conf 

С конфигурационный файл, как это:

input { 
stdin { codec => json } 
} 

filter { 
    ruby { 
     code => " 
      require 'base64'; 
      event['password'] = Base64.encode64(ENV['USER_PASS']) 
     " 
    } 
} 
output { 
    stdout { codec => rubydebug } 
    http { 
     http_method => "post" 
     url => "http://localhost:1123" 
     format => "message" 
     headers => {"Authorization" => "Basic %{password}"} 
     content_type => "application/json" 
     message => '{"whatever": 1 }' 
    } 
} 

Вы можете видеть, что это d OES правильно, запустив н.д. -l 1123 и смотрите:

POST HTTP/1.1 
host: localhost 
connection: keep-alive 
authorization: Basic ZG9nOmNhdA== 
content-type: application/json 
content-length: 15 

{"whatever": 1} 

Что является правильным значением:

echo ZG9nOmNhdA== | base64 -D 
dog:cat 
+0

Могу ли я использовать фильтр Ruby, в сочетании с фильтром ГРОК у меня есть на данный момент? Я мог бы вставить переменную окружения даже из выходного фильтра. –

+0

Да. В logstash, если вы не остановите его, события пройдут по цепочке фильтров. – Alcanzar

+0

Непонятно, где будет происходить преобразование из String -> Base64, закодированного в String. –