簡體   English   中英

Logstash - csv 輸出標頭

[英]Logstash - csv output headers

我正在嘗試使用logstash jdbc 插件請求數據庫,並返回一個帶有logstash csv plugin標頭的 csv 輸出文件。

我花了很多時間在 logstash 文檔上,但我仍然遺漏了一點。

使用以下 logstash 配置,結果為我提供了一個包含每一行標題的文件。 我找不到只為 logstash 配置中的第一行添加標題的方法。

非常感謝幫助。

輸出文件

_object$id;_object$name;_object$type;nb_surveys;csat_score
2;Jeff Karas;Agent;2;2  
_object$id;_object$name;_object$type;nb_surveys;csat_score
3;John Lafer;Agent;2;2;2;2;$2;2
_object$id;_object$name;_object$type;nb_surveys;csat_score
4;Michele Fisher;Agent;2;2
_object$id;_object$name;_object$type;nb_surveys;csat_score
5;Chad Hendren;Agent;2;78

文件:simple-out.conf

input {
    jdbc {
        jdbc_connection_string => "jdbc:postgresql://localhost:5432/postgres"
        jdbc_user => "postgres"
        jdbc_password => "postgres"
        jdbc_driver_library => "/tmp/drivers/postgresql/postgresql_jdbc.jar"
        jdbc_driver_class => "org.postgresql.Driver"
        statement_filepath => "query.sql"
    }
}
output {
    csv {
        fields => ["_object$id","_object$name","_object$type","nb_surveys","csat_score"]
        path => "output/%{team}/output-%{team}.%{+yyyy.MM.dd}.csv"
        csv_options => {
        "write_headers" => true
        "headers" =>["_object$id","_object$name","_object$type","nb_surveys","csat_score"]
        "col_sep" => ";"
        }
    }
}

謝謝

您在輸出中獲得多個標頭的原因是因為 Logstash 沒有事件之間的全局/共享狀態的概念,每個項目都是獨立處理的,因此每次 CSV 輸出插件運行時,它的行為都與第一個相同並寫入標頭。

我遇到了同樣的問題,並找到了使用 ruby​​ 過濾器的init選項在 logstash 啟動時執行一些代碼的解決方案。

這是一個示例 logstash 配置:

# csv-headers.conf

input {
    stdin {}
}
filter {
    ruby {
        init => "
            begin
                @@csv_file    = 'output.csv'
                @@csv_headers = ['A','B','C']
                if File.zero?(@@csv_file) || !File.exist?(@@csv_file)
                    CSV.open(@@csv_file, 'w') do |csv|
                        csv << @@csv_headers
                    end
                end
            end
        "
        code => "
            begin
                event['@metadata']['csv_file']    = @@csv_file
                event['@metadata']['csv_headers'] = @@csv_headers
            end
        "
    }
    csv {
        columns => ["a", "b", "c"]
    }
}
output {
    csv {
        fields => ["a", "b", "c"]
        path   => "%{[@metadata][csv_file]}"
    }
    stdout {
        codec => rubydebug {
            metadata => true
        }
    }
}

如果您使用該配置運行 Logstash:

echo "1,2,3\n4,5,6\n7,8,9" | ./bin/logstash -f csv-headers.conf

您將獲得一個包含以下內容的output.csv文件:

A,B,C
1,2,3
4,5,6
7,8,9

這也是線程安全的,因為它僅在啟動時運行代碼,因此您可以使用多個工作線程。

希望有幫助!

我正在使用利用事件日期 (index-YYYY-MM-DD.csv) 的動態文件名,因此在管道開始時寫入標頭對我來說不是一個可行的選擇。

相反,我允許寫入重復的標題並設置一個 cron 作業每隔幾分鍾運行一次並刪除所有重復的行並將結果寫回同一個文件。

#!/bin/bash -xe
 for filename in /tmp/logstash/*.csv; do awk '!v[$1]++' $filename > $filename.tmp && mv -f $filename.tmp $filename; done

注意:這僅在我提取幾百 MB 數據的實例上進行了測試 - 如果您的數據管道每分鍾攝取 GB,這可能不是一個可行的選擇。

暫無
暫無

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

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