簡體   English   中英

logstash 每 30 秒創建一個新文件

[英]logstash create new file every 30seconds

我的 logstatsh 管道中有以下過濾器配置。 它所做的是,在事件開始時,第一個過濾器使用 header 創建一個 CSV 文件,並將文件名設置為元數據。 第二個過濾器將 output 寫入 CSV 以上。

我的挑戰(或)要求是:每 X 秒,我們需要創建新的 CSV 文件並寫入該文件。 我不是 ruby 專家,無法從谷歌搜索中獲得任何線索。 有人可以建議嗎?

  filter {
    ruby {
       init => "
            begin
                randval = (0...8).map { (65 + rand(26)).chr }.join      
                @csv_file = 'output'+randval+'.csv'
                csv_headers = ['YYYY-MM-ddTHH:mm:ss.SSSZ','Log Level','Event ID']
                if File.zero?(@csv_file) || !File.exist?(@csv_file)
                    CSV.open(@csv_file, 'w') do |csv|
                        csv << csv_headers
                    end
                    
                end
            end
        "
        code => '
                event.set("[@metadata][suffix]",@csv_file)
        '
    }
}


output {
   file {
      path => "output.log"
   }    
   csv {
       fields => [ "created", "level", "code"]
       path => "%{[@metadata][suffix]}"
    }
}

有趣的是,昨天有人在discuss.elastic.co上問了這個問題,用同樣不必要的 init 選項完成,所以我碰巧知道答案是

ruby {
    code => '
            event.set("[@metadata][suffix]", 'output' + (Time.now.to_i / 30).to_s + '.csv')
    '
}

這將導致文件 output 為 30 秒間隔內到達的任何事件寫入不同的文件。

我不知道有什么方法可以為 output 寫入文件的第一個事件添加 header。csv output 可以為每一行添加標題。 csv 編解碼器可以寫入一次文件頭,但當文件名更改時不會再寫入。

也就是說,如果您只是寫入一個文件,您可以在 ruby 過濾器中進行寫入,並跟蹤是否已為 Time.now.to_i / 30 的當前值寫入 header。您可以使用類似的方法來做到這一點對此。 我重新利用了csv output中的一些代碼。

input { heartbeat { interval => 5 message => '{ "foo": 1, "bar": 2, "baz": 3 }' } }
filter {
    json { source => "message" target => "data" remove_field => [ "message" ] }
    ruby {
        init => '
            @fields = [ "[data][bar]", "[data][baz]" ]
            @csv_options = Hash.new
            @spreadsheet_safe = true
        '
        code => '
            def event_to_csv(event)
                csv_values = @fields.map {|name| get_value(name, event)}
                csv_values.to_csv(@csv_options)
            end

            def get_value(name, event)
                val = event.get(name)
                val.is_a?(Hash) ? LogStash::Json.dump(val) : escape_csv(val)
            end

            def escape_csv(val)
                (@spreadsheet_safe && val.is_a?(String) && val.start_with?("=")) ? "\'#{val}" : val
            end

            id = Time.now.to_i / 20
            file = "output" + id.to_s + ".csv"

            fd = open("/tmp/#{file}", "a")
            if id != @last_id
                chunk = "bar,baz\n"
                fd.write(chunk)
            end

            chunk = event_to_csv(event)
            fd.write(chunk)
            fd.close

            @last_id = id
            event.cancel
        '
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM