我正在使用ELK Stack分析我的Spring Boot应用程序生成的日志。下面是我生成的日志的示例结构。
日志:
13-04-2020 10:53:40.074信息16688-[DefaultMessageListenerContainer-1] c.i.e.util.SavingEquityData:保存记录-EquityFeeds在数据库以及REDIS缓存中。
我想通过ELK堆栈监视我的日志。
Logstash.conf
input {
file {
type => "syslog"
path => ["C:/temp/equityFeedsProcessing.log"]
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{LOGLEVEL:log-level} %{DATA:class}:%{GREEDYDATA:message}" }
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
}
}
我确实了解输入和输出插件。我不明白的是过滤器插件。尽管我编写了一个Grok过滤器,但在下面将其传递给Grok调试器:https://grokdebug.herokuapp.com/
模式:
%{LOGLEVEL:log-level} %{DATA:class}:%{GREEDYDATA:message}
输出:
{
"log": [
[
"INFO"
]
],
"class": [
[
" 2568 --- [DefaultMessageListenerContainer-1] c.i.e.util.JAXBDateDeSerializer "
]
],
"message": [
[
" Inside Unmarshall method of JAXB Date Deserializer."
]
]
}
http://localhost:9200/_cat/indices/?v
如上所述,我的基本目标是分析和监视日志(期间)。我无法创建适当的过滤器并创建索引。我在网上搜索,但找不到从初学者那里详细显示此内容的地方。一切似乎太复杂了。
以示例日志的以下模式开始(它包含自定义模式-MSG
:]
%{DATESTAMP:log_timestamp}\s*%{LOGLEVEL:log_level}\s*%{POSINT:logged_for_pid}\s*--- \[+%{NOTSPACE:logged_for_thread}+\]\s*%{JAVACLASS:logger}\s*%{MSG:log_message}
您可以在Grok Debugger中对其进行验证:
filter
文件中具有这种模式的logstash.conf
看起来像这样:
# logstash.conf
…
filter {
grok {
patterns_dir => ["./patterns"]
match => {
"message" => "%{DATESTAMP:log_timestamp}\s*%{LOGLEVEL:log_level}\s*%{POSINT:logged_for_pid}\s*--- \[+%{NOTSPACE:logged_for_thread}+\]\s*%{JAVACLASS:logger}\s*%{MSG:log_message}"
}
}
}
…
[您可以看到,我告诉grok在custom patterns目录中查找我的patterns
,该目录与logstash.conf
文件放在相同的位置。在此目录中,我创建了具有以下内容的custom.txt
文件:
# patterns/custom.txt
MSG \s:.*
如果您不喜欢在Grok Debugger界面中打印时间戳的方式,请在DATESTAMP
中签出grok-patterns。为了创建以下模式,我用相应的正则表达式替换了DATESTAMP
的每个元素(直接在Grok Debugger中一个接一个地替换,太复杂了,无法一次替换所有内容):
CUSTOM_DATE (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])[./-](?:0?[1-9]|1[0-2])[./-](?>\d\d){1,2}[- ](?!<[0-9])(?:2[0123]|[01]?[0-9]):(?:[0-5][0-9])(?::(?:(?:[0-5][0-9]|60)(?:[:.,][0-9]+)?))(?![0-9])
如果需要(Logstash输出将保持不变),可以在custom.txt
文件的新行中添加此新模式,并更新match
:
# logstash.conf
…
match => {
"message" => "%{CUSTOM_DATE:log_timestamp}\s*%{LOGLEVEL:log_level}\s*%{POSINT:logged_for_pid}\s*--- \[+%{NOTSPACE:logged_for_thread}+\]\s*%{JAVACLASS:logger}\s*%{MSG:log_message}"
}
…
我在output defined for elasticsearch中定义了一个示例索引:
# logstash.conf
…
output {
elasticsearch {
…
index => "example-index-%{+YYYY.MM.dd}"
}
}
在Kibana中创建索引时,您应该能够选择example-index*
之类的东西。
class
字段似乎包含太多信息