在 Logstash 中将日期格式从 YYYY/MM/DD HH:MM:SS 格式转换为 YYYY-MM-DD for nginx 错误日志
Converting date format to YYYY-MM-DD from YYYY/MM/DD HH:MM:SS format in Logstash for nginx error logs
我有以下形式的 nginx 错误日志:-
2015/09/30 22:19:38 [error] 32317#0: *23 [lua] responses.lua:61:
handler(): Cassandra error: Error during UNIQUE check: Cassandra
error: connection refused, client: 127.0.0.1, server: , request: "POST
/consumers/ HTTP/1.1", host: "localhost:8001"
如前所述here我能够解析这些日志。
我的过滤器配置如下:-
filter {
grok {
match => {
"message" => [
"%{DATESTAMP:mydate} \[%{DATA:severity}\] (%{NUMBER:pid:int}#%{NUMBER}: \*%{NUMBER}|\*%{NUMBER}) %{GREEDYDATA:mymessage}",
"%{DATESTAMP:mydate} \[%{DATA:severity}\] %{GREEDYDATA:mymessage}",
"%{DATESTAMP:mydate} %{GREEDYDATA:mymessage}"
]
}
add_tag => ["nginx_error_pattern"]
}
if ("nginx_error_pattern" in [tags]) {
grok {
match => {
"mymessage" => [
"server: %{DATA:[request_server]},"
]
}
}
grok {
match => {
"mymessage" => [
"host: \"%{IPORHOST:[request_host]}:%{NUMBER:[port]}\""
]
}
}
grok {
match => {
"mymessage" => [
"request: \"%{WORD:[request_method]} %{DATA:[request_uri]} HTTP/%{NUMBER:[request_version]:float}\""
]
}
}
grok {
match => {
"mymessage" => [
"client: %{IPORHOST:[clientip]}",
"client %{IP:[clientip]} "
]
}
}
grok {
match => {
"mymessage" => [
"referrer: \"%{DATA:[request_referrer]}\""
]
}
}
}
}
mydate
的日期格式为:-
"mydate" => "15/09/30 22:19:38"
谁能告诉我如何再添加一个日期格式为 2015-09-30
的字段(比方说 log_day
)?
将 time/date 保存在 date
类型的字段中总是一个好主意。它使您能够 complex range queries 使用 Elasticsearch 或 Kibana。
您可以使用logstash's date filter来解析日期。
过滤器:
date {
match => [ "mydate", "YY/MM/dd HH:mm:ss" ]
}
结果:
"@timestamp" => "2015-09-30T20:19:38.000Z"
日期过滤器默认将结果放在 @timestamp
字段中。
要避免默认映射到@timestamp
字段,指定目标字段如"log_day",如下:
过滤器:
date {
match => [ "mydate", "YY/MM/dd HH:mm:ss" ]
target => "log_day"
}
结果:
"log_day" => "2015-09-30T20:19:38.000Z"
一旦您有了 date
类型的字段,您就可以继续进行进一步的操作。您可以使用 date_formatter 过滤器以您的特殊格式创建另一个日期字段。
date_formatter {
source => "log_day"
pattern => "YYYY-MM-dd"
}
结果:"log_day" => "2015-09-30"
我有以下形式的 nginx 错误日志:-
2015/09/30 22:19:38 [error] 32317#0: *23 [lua] responses.lua:61: handler(): Cassandra error: Error during UNIQUE check: Cassandra error: connection refused, client: 127.0.0.1, server: , request: "POST /consumers/ HTTP/1.1", host: "localhost:8001"
如前所述here我能够解析这些日志。
我的过滤器配置如下:-
filter {
grok {
match => {
"message" => [
"%{DATESTAMP:mydate} \[%{DATA:severity}\] (%{NUMBER:pid:int}#%{NUMBER}: \*%{NUMBER}|\*%{NUMBER}) %{GREEDYDATA:mymessage}",
"%{DATESTAMP:mydate} \[%{DATA:severity}\] %{GREEDYDATA:mymessage}",
"%{DATESTAMP:mydate} %{GREEDYDATA:mymessage}"
]
}
add_tag => ["nginx_error_pattern"]
}
if ("nginx_error_pattern" in [tags]) {
grok {
match => {
"mymessage" => [
"server: %{DATA:[request_server]},"
]
}
}
grok {
match => {
"mymessage" => [
"host: \"%{IPORHOST:[request_host]}:%{NUMBER:[port]}\""
]
}
}
grok {
match => {
"mymessage" => [
"request: \"%{WORD:[request_method]} %{DATA:[request_uri]} HTTP/%{NUMBER:[request_version]:float}\""
]
}
}
grok {
match => {
"mymessage" => [
"client: %{IPORHOST:[clientip]}",
"client %{IP:[clientip]} "
]
}
}
grok {
match => {
"mymessage" => [
"referrer: \"%{DATA:[request_referrer]}\""
]
}
}
}
}
mydate
的日期格式为:-
"mydate" => "15/09/30 22:19:38"
谁能告诉我如何再添加一个日期格式为 2015-09-30
的字段(比方说 log_day
)?
将 time/date 保存在 date
类型的字段中总是一个好主意。它使您能够 complex range queries 使用 Elasticsearch 或 Kibana。
您可以使用logstash's date filter来解析日期。
过滤器:
date {
match => [ "mydate", "YY/MM/dd HH:mm:ss" ]
}
结果:
"@timestamp" => "2015-09-30T20:19:38.000Z"
日期过滤器默认将结果放在 @timestamp
字段中。
要避免默认映射到@timestamp
字段,指定目标字段如"log_day",如下:
过滤器:
date {
match => [ "mydate", "YY/MM/dd HH:mm:ss" ]
target => "log_day"
}
结果:
"log_day" => "2015-09-30T20:19:38.000Z"
一旦您有了 date
类型的字段,您就可以继续进行进一步的操作。您可以使用 date_formatter 过滤器以您的特殊格式创建另一个日期字段。
date_formatter {
source => "log_day"
pattern => "YYYY-MM-dd"
}
结果:"log_day" => "2015-09-30"