Ответ 1
Привет, я добавил фильтр grok, чтобы сделать это. Я только хотел, чтобы имя файла не было, но вы можете изменить это на свои нужды.
filter {
grok {
match => ["path","%{GREEDYDATA}/%{GREEDYDATA:filename}\.log"]
}
}
Я использую Logstash + Elasticsearch + Kibana, чтобы получить обзор моих журнальных файлов Tomcat.
Для каждой записи в журнале мне нужно знать имя файла, из которого он пришел. Я хотел бы добавить его в качестве поля. Есть ли способ сделать это? Я немного искал googled, и я нашел этот вопрос SO, но ответ больше не обновляется.
Пока единственное решение, которое я вижу, - это указать отдельную конфигурацию для каждого возможного имени файла с другим "add_field" следующим образом:
input {
file {
type => "catalinalog"
path => [ "/path/to/my/files/catalina**" ]
add_field => { "server" => "prod1" }
}
}
Но тогда мне нужно переконфигурировать logstash каждый раз, когда появляется новое возможное имя файла. Любые лучшие идеи?
Привет, я добавил фильтр grok, чтобы сделать это. Я только хотел, чтобы имя файла не было, но вы можете изменить это на свои нужды.
filter {
grok {
match => ["path","%{GREEDYDATA}/%{GREEDYDATA:filename}\.log"]
}
}
Если вы хотите совместить сообщение и имя файла в одном событии:
filter {
grok {
match => {
message => "ERROR (?<function>[\S]*)"
}
}
grok {
match => {
path => "%{GREEDYDATA}/%{GREEDYDATA:filename}\.log"
}
}}
Результат в ElasticSearch (сфокусируйтесь на полях "filename" и "function" ):
"_index": "logstash-2016.08.03",
"_type": "logs",
"_id": "AVZRyEI49-A6kyBCq6Yt",
"_score": 1,
"_source": {
"message": "27/07/16 12:16:18,321 ERROR blaaaaaaaaa.internal.com",
"@version": "1",
"@timestamp": "2016-08-03T19:01:33.083Z",
"path": "/home/admin/mylog.log",
"host": "my-virtual-machine",
"function": "blaaaaaaaaa.internal.com",
"filename": "mylog"
}