logstash 弹性不使用源时间戳
logstash elastic not using source timestamp
当前设置如下所示。
Spring boot -> log-file.json ( using logstash-logback-encoder) -> filebeat -> logstash -> elastic
我可以看到弹性搜索中出现的日志。但是,它不使用日志文件中提供的日期,而是即时创建它们。
json-例子
{
"@timestamp":"2017-09-08T17:23:38.677+01:00",
"@version":1,
"message":"A received request - withtimestanp",
etc..
我的 logstash.conf 输入过滤器看起来像这样。
input {
beats {
port => 5044
codec => "json"
}
}
output {
elasticsearch {
hosts => [ 'elasticsearch' ]
}
}
如果您查看日志的 kibana 输出,它是第 9 个而不是第 8 个(当我实际创建日志时)
所以现在已经解决了这个问题。修复的细节如下。
logback.xml
<appender name="stash" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<file>/home/rob/projects/scratch/log-tracing-demo/build/logs/tracing-A.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/rob/projects/scratch/log-tracing-demo/build/logs/tracing-A.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" >
<includeContext>false</includeContext>
<fieldNames>
<message>msg</message>
</fieldNames>
</encoder>
</appender>
将字段 message 重命名为 msg,因为 logstash 期望来自 beat 的消息具有不同的默认值
json-file.log
下面是示例 json 输出的样子
{"@timestamp":"2017-09-11T14:32:47.920+01:00","@version":1,"msg":"Unregistering JMX-exposed beans","logger_name":"org.springframework.jmx.export.annotation.AnnotationMBeanExporter","thread_name":"Thread-19","level":"INFO","level_value":20000}
filebeat.yml
下面的 json 设置现在处理时间戳问题,它没有使用日志文件中的时间。
它还将 json 移动到 json 输出到 logstash 的根目录中。即它没有嵌套在节拍 json 事件中它是根的一部分。
filebeat.prospectors:
- input_type: log
paths:
- /mnt/log/*.log
json.overwrite_keys: true
json.keys_under_root: true
fields_under_root: true
output.logstash:
hosts: ['logstash:5044']
logstash.conf
使用 msg 而不是 message 可以解决 JSON 解析错误,原始数据现在位于 message 字段中。看这里
https://discuss.elastic.co/t/logstash-issue-with-json-input-from-beats-solved/100039
input {
beats {
port => 5044
codec => "json"
}
}
filter {
mutate {
rename => {"msg" => "message"}
}
}
output {
elasticsearch {
hosts => [ 'elasticsearch' ]
user => 'elastic'
password => 'changeme'
}
}
当前设置如下所示。
Spring boot -> log-file.json ( using logstash-logback-encoder) -> filebeat -> logstash -> elastic
我可以看到弹性搜索中出现的日志。但是,它不使用日志文件中提供的日期,而是即时创建它们。
json-例子
{
"@timestamp":"2017-09-08T17:23:38.677+01:00",
"@version":1,
"message":"A received request - withtimestanp",
etc..
我的 logstash.conf 输入过滤器看起来像这样。
input {
beats {
port => 5044
codec => "json"
}
}
output {
elasticsearch {
hosts => [ 'elasticsearch' ]
}
}
如果您查看日志的 kibana 输出,它是第 9 个而不是第 8 个(当我实际创建日志时)
所以现在已经解决了这个问题。修复的细节如下。
logback.xml
<appender name="stash" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<file>/home/rob/projects/scratch/log-tracing-demo/build/logs/tracing-A.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/rob/projects/scratch/log-tracing-demo/build/logs/tracing-A.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" >
<includeContext>false</includeContext>
<fieldNames>
<message>msg</message>
</fieldNames>
</encoder>
</appender>
将字段 message 重命名为 msg,因为 logstash 期望来自 beat 的消息具有不同的默认值
json-file.log
下面是示例 json 输出的样子
{"@timestamp":"2017-09-11T14:32:47.920+01:00","@version":1,"msg":"Unregistering JMX-exposed beans","logger_name":"org.springframework.jmx.export.annotation.AnnotationMBeanExporter","thread_name":"Thread-19","level":"INFO","level_value":20000}
filebeat.yml
下面的json 设置现在处理时间戳问题,它没有使用日志文件中的时间。
它还将 json 移动到 json 输出到 logstash 的根目录中。即它没有嵌套在节拍 json 事件中它是根的一部分。
filebeat.prospectors:
- input_type: log
paths:
- /mnt/log/*.log
json.overwrite_keys: true
json.keys_under_root: true
fields_under_root: true
output.logstash:
hosts: ['logstash:5044']
logstash.conf
使用 msg 而不是 message 可以解决 JSON 解析错误,原始数据现在位于 message 字段中。看这里 https://discuss.elastic.co/t/logstash-issue-with-json-input-from-beats-solved/100039
input {
beats {
port => 5044
codec => "json"
}
}
filter {
mutate {
rename => {"msg" => "message"}
}
}
output {
elasticsearch {
hosts => [ 'elasticsearch' ]
user => 'elastic'
password => 'changeme'
}
}