Logstash1.4.2を使用しています。
{
"network": {
"servers": [ "xxx.xxx.xxx.xxx:5000" ],
"timeout": 15,
"ssl ca": "certs/logstash-forwarder.crt"
},
"files": [
{
"paths": [ "/var/log/messages" ],
"fields": { "type": "syslog" }
},
{
"paths": [ "/var/log/secure" ],
"fields": { "type": "linux-syslog" }
}
]
}
================================================== =======
Logstashサーバー内
filter {
if [type] == "syslog" {
date {
locale => "en"
match => ["syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss"]
timezone => "Asia/Kathmandu"
target => "@timestamp"
add_field => { "debug" => "timestampMatched"}
}
grok {
match => { "message" => "\[%{Word:messagetype}\]%{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{Host}" ]
}
syslog_pri { }
}
if [type] == "linux-syslog" {
date {
locale => "en"
match => ["syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss"]
timezone => "Asia/Kathmandu"
target => "@timestamp"
add_field => { "debug" => "timestampMatched"}
}
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{Host}" ]
}
syslog_pri { }
mutate { replace => [ "syslog_timestamp", "%{syslog_timestamp} +0545" ] }
}
}
================================================== =====
output {
if [messagetype] == "WARNING" {
elasticsearch { Host => "xxx.xxx.xxx.xxx" }
stdout { codec => rubydebug }
}
if [messagetype] == "ERROR" {
elasticsearch { Host => "xxx.xxx.xxx.xxx" }
stdout { codec => rubydebug }
}
if [type] == "linux-syslog" {
elasticsearch { Host => "xxx.xxx.xxx.xxx" }
stdout { codec => rubydebug }
}
}
================================================== =====
すべてのログを/ var/log/secureから転送し、ERRORおよびWARNINGログのみを/ var/log/messagesから転送したいのですが、これは適切な構成ではないことがわかります。私は誰かにこれを行うためのより良い方法を見せてほしい。
フィルタブロック内のイベントについて決定することを好みます。私の入力ブロックと出力ブロックは通常、非常に単純です。そこから、2つのオプションが表示されます。
drop
filter により、イベントがドロップされます。それはあなたの出力に到達することは決してありません:
filter {
#other processing goes here
if [type] == "syslog" and [messagetype] not in ["ERROR", "WARNING"] {
drop {}
}
}
これの利点は、それが非常に単純なことです。
欠点は、イベントがドロップされることです。全く出力されません。それがあなたが望むものなら、それは問題ありません。
多くのフィルターを使用すると、プラグイン間の決定を伝達するのに役立つタグを追加できます。 ESにイベントを送信するように出力ブロックに指示するタグを添付できます。
filter {
#other processing goes here
if [type] == "linux-syslog" or [messagetype] in ["ERROR", "WARNING"] {
mutate {
add_tag => "send_to_es"
}
}
}
output {
if "send_to_es" in [tags] {
elasticsearch {
#config goes here
}
}
}
これの利点は、細かく制御できることです。
これの欠点は、少し手間がかかり、ESデータが少し汚染されてしまうことです(タグはESで表示され、検索可能になります)。