我使用Logstash + Elasticsearch + Kibana来概述我的Tomcat日志文件。
对于每个日志条目,我需要知道它来自的文件的名称。我想将其添加为字段。有办法吗? 我已经搜索了一点,我只找到this SO question,但答案不再是最新的。
到目前为止,我看到的唯一解决方案是为每个可能的文件名指定单独的配置,使用不同的" add_field"像这样:
input {
file {
type => "catalinalog"
path => [ "/path/to/my/files/catalina**" ]
add_field => { "server" => "prod1" }
}
}
但是每次有新的可能文件名时我都需要重新配置logstash。 有更好的想法吗?
答案 0 :(得分:36)
您好我添加了一个grok过滤器来做这件事。我只想让文件名不是路径,但你可以根据需要改变它。
filter {
grok {
match => ["path","%{GREEDYDATA}/%{GREEDYDATA:filename}\.log"]
}
}
答案 1 :(得分:3)
如果您想在一个事件中合并消息和文件名:
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"
}