grokdebug.herokuapp.com 依賴 Google CDN 的 JS,國內常無法訪問。本文提供一支純 Ruby 終端機腳本 grokdebug.rb,支援自訂 Pattern 目錄、命名捕獲、型別轉換(:float、:int),比線上版更強大。
gem install jls-grok awesome_print
# jls-grok 0.11.0+ 支援型別轉換
grokdebug.rb#!/usr/bin/env ruby
require 'rubygems'
gem 'jls-grok', '=0.11.0'
require 'grok-pure'
require 'optparse'
require 'ap'
options = { dirs: ['patterns'], named: false }
OptionParser.new do |opts|
opts.banner = 'Run grokdebug at your terminal.'
opts.on('-d DIR1,DIR2', '--dirs DIR1,DIR2', Array, 'Pattern 目錄 (預設 ./patterns)') { |v| options[:dirs] = v }
opts.on('-m MSG', '--msg MSG', '要匹配的原始訊息') { |v| options[:message] = v }
opts.on('-p PAT', '--pattern PAT', 'Grok pattern') { |v| options[:pattern] = v }
opts.on('-n', '--named', '僅顯示命名捕獲') { options[:named] = true }
end.parse!
grok = Grok.new
options[:dirs].each do |dir|
dir = File.join(dir, '*') if File.directory?(dir)
Dir.glob(dir).each { |f| grok.add_patterns_from_file(f) }
end
grok.compile(options[:pattern], options[:named])
ap grok.match(options[:message]).captures
$ ruby grokdebug.rb -m 'abc123' -p '%{NUMBER:test}'
{
"test" => ["123"],
"BASE10NUM" => ["123"]
}
$ ruby grokdebug.rb -m 'abc123' -p '%{NUMBER:test:float}' -n
{
"test" => [123.0] # 自動轉 Float!
}
%{NUMBER:field:int}、:float、:bool 直接產出 Ruby 原生型別。-d /etc/logstash/patterns,./my-patterns 靈活組合。awesome_print 自動上色、縮排。# 1. 開發新 pattern 存入 ./patterns/my.grok
# 2. 測試
ruby grokdebug.rb -d ./patterns -m "$(cat sample.log)" -p '%{MY_CUSTOM}'
# 3. 確認無誤後複製到 Logstash 設定
filter { grok { patterns_dir => ["/etc/logstash/patterns"] match => { "message" => "%{MY_CUSTOM}" } } }
| 現象 | 原因與解法 |
|---|---|
| LoadError: cannot load such file -- grok-pure | gem install jls-grok 未裝或版本不符,指定 gem 'jls-grok', '=0.11.0' |
| Pattern not found: XXX | Pattern 檔未放在 -d 指定目錄,或檔名不符 *.grok/* |
| 編碼亂碼 | 終端機編碼非 UTF-8,執行前 export LC_ALL=en_US.UTF-8 |
將 grokdebug.rb 放入 ~/bin/ 並 chmod +x,即可隨時隨地 grokdebug.rb -m ... -p ... 高效調試。