Saya memiliki pengaturan proxy squid untuk mengirim log berformat JSON ke Elastic melalui Logstash. Saya mencoba menggunakan pemfilteran GROK untuk mengurai log. Filter berfungsi di Kiabana Grok Debugger tetapi mengeluh dengan kesalahan berikut ketika saya me-restart Logstash

Failed to execute action {:action=>LogStash::PipelineAction::Create/pipeline_id:squid_logs,
 :exception=>"LogStash::ConfigurationError", :message=>"Expected one of [ \\t\\r\\n], \"#\", \"
{\", \",\", \"]\" at line 10, column 62 (byte 137) after filter {\n  grok {\n    match => {\n 
       \"message\" => [ \"%{IPV4:vendor_ip}\", \"%{WORD:message}\"", :backtrace=>["/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:32:in `compile_imperative'", 
"org/logstash/execution/AbstractPipelineExt.java:184:in `initialize'", 
"org/logstash/execution/JavaBasePipelineExt.java:69:in `initialize'", 
"/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:47:in `initialize'", 
"/usr/share/logstash/logstash-core/lib/logstash/pipeline_action/create.rb:52:in `execute'", 
"/usr/share/logstash/logstash-core/lib/logstash/agent.rb:389:in `block in converge_state'"]}


Saya memiliki filter GROK berikut

"%{IPV4:vendor_ip}", "%{WORD:message}": "%{IPV4:clientip}", "%{WORD:message}": "%
{DATA:timestamp}", "%{WORD:message}": "%{WORD:verb}", "%{WORD:message}": "%{DATA:request}", "%
{WORD:message}": "%{URIPATHPARAM:path}"

Di Kibana Grok Debugger filter berfungsi dengan baik terhadap pesan seperti berikut:

{ "vendor_ip": "x.x.x.x", "clientip": "x.x.x.x", "timestamp": "2021-04-09T13:58:38+0000", 
"verb": "GET", "request": "https://domain", "path": "/somepath", "httpversion": "HTTP/1.1", 
"response": 200, "bytes": 2518042, "referer": "-", "useragent": "Microsoft BITS/7.8", 
"request_status": "HIER_DIRECT", "hierarchy_status": "HIER_DIRECT" }

Konfigurasi logstash di bawah ini:

input {
  beats {
    port => 5045
  }
}

filter {
  grok {
    match => {
        "message" => [ "%{IPV4:vendor_ip}", "%{WORD:message}": "%{IPV4:clientip}", "%{WORD:message}": "%{DATA:timestamp}", "%{WORD:message}": "%{WORD:verb}", "%{WORD:message}": "%{DATA:request}", "%{WORD:message}": "%{URIPATHPARAM:path}" ]
    }
  }
}


output {
  elasticsearch {
    hosts => ["x.x.x.x:9200"]
    index => "squid_logs"
  }
}
0
user982599 13 Mei 2021, 22:09

1 menjawab

Jawaban Terbaik

Mengurai pesan json menggunakan filter grok adalah pendekatan yang salah, tidak perlu melakukan ini dan itu akan menjadi banyak pekerjaan karena Anda harus menghindari semua tanda kutip ganda dalam pesan atau Anda akan mendapatkan kesalahan konfigurasi, yaitu kasus Anda.

Gunakan filter json untuk mengurai pesan json

Cukup gunakan ini di saluran Anda:

filter {
    json {
        source => "message"
    }
}
0
leandrojmp 13 Mei 2021, 19:36