我打算建立一个ELK堆栈设置,其中每日JSON输入存储在创建的日志文件中,每个日期对应一个。我的logstash将通过这些日志监听输入,并将其存储在与日志文件条目日期对应的索引处的Elasticsearch中。
我的logstash-output.conf
类似于:
output {
elasticsearch {
host => localhost
cluster => "elasticsearch_prod"
index => "test"
}
}
因此,就目前而言,logstash的所有输入都存储在elasticsearch的索引test
中。我想要的是,在2015.11.19上发生的logstash条目存储在名为logstash-2015.11.19.log
的日志文件中,必须相应地存储在索引test-2015.11.19
中。
如何编辑我的logstash配置文件以启用此功能?
答案 0 :(得分:6)
回答,因为评论无法格式化,看起来很糟糕。
您的文件名(我假设您使用文件输入)存储在您的路径变量中:
file {
path => "/logs/**/*my_log_file*.log"
}
type => "myType"
}
这个变量可以在整个配置中访问,所以你可以做的是使用正则表达式过滤器来解析路径中的日期,例如使用grok,你可以做类似的事情(注意:Pseudocode)
if [type] == "myType" {
grok {
match => {
"path" => "%{MY_DATE_PATTERN:myTimeStampVar}"
}
}
}
有了这个你现在你的变量在“myTimeStampVar”中,你可以在你的输出中使用它:
elasticsearch {
host => "127.0.0.1"
cluster => "logstash"
index => "events-%{myTimeStampVar}"
}
说完这一切之后,我不太确定你为什么需要这个?我认为让ES为你做好工作会更好。它将知道您的日志的时间戳并相应地为其编制索引,以便您轻松访问它。但是,上面的设置应该适合您,我使用一种非常类似的方法来解析客户端名称并在每个客户端基础上创建子索引,例如:myIndex - %{client} - %{+ YYYY.MM .DD}
希望这有帮助,
阿图尔
编辑:我做了一些挖掘,因为我怀疑你担心你的日志被放入错误的索引,因为它们是在错误的时间解析的?如果这是正确的,解决方案不是从日志文件中解析索引,而是解析每个日志的时间戳。我假设您的每个日志行都有一个时间戳。 Logstash将创建一个@timestamp字段,该字段是当前日期。所以这不等于索引。但是,解决此问题的正确方法是改变@timestamp字段,而是使用日志行中的时间戳(已解析的时间戳)。这样logstash将具有正确的索引并将其放在那里。