为什么要用date插件:

我们希望日志展示的时间就是日志生成的时间,一般日志中都会附加时间,这样方便根据时间查找问题。但在logstash中,默认使用@timestamp时间值来表示日志的时间,@timestamp值的获取是根据logstash本身什么时候处理这条日志数据而产生的。也就是说@timestamp并不是日志中的时间,所以不管日志是实时的还是非实时的日志,都无法保证日志产生的精确时间。所以我们就需要使用date插件来匹配日志中产生的时间并将值赋给@timestamp`,这样最后展示的时间就是日志生成时间。

常用选项:

  • match

    [field,formats...],匹配日期型字段的格式,并统一处理成ISO8086时间戳。

  • locale

    用于指定本地语言,比如设置为es,es-US等,主要用于解析非数字的月和天,比如Monday,Jan等。如果时间日期都是数字的话,不用关心这个值。

  • target

    默认@timestamp,用于指定转化后的日期保存的字段名。

  • timezone

    指定用于日期解析的时区规范。如果无法从值中提取时区,则使用此处定义的时区。如果未指定,则使用此机器上的时区

match format语法的更多详细介绍:

y year

  1. yyyy // 全年号码,例如:2018
  2. yy // 两位数年份,例如:2018年的18

M month

  1. M // 最小数字月份,如1-12
  2. MM // 两位数月份,如01-12
  3. MMM // 缩短的月份文本,如Jan,Feb,Dec...
  4. MMMM // 全月文本,如January..

d day

  1. d //最少数字的一天,如1-31
  2. dd //两位数日子,如01-31

H hour

  1. H //最小数字小时,如0表示午夜
  2. HH //两位数小时,如果需要填零,如午夜00

m minutes

  1. m //最小数字分钟,如0
  2. mm //两位数字分钟,如00

s seconds

  1. s //最小数字秒,如0
  2. ss //最小数字秒,如00

S 秒的小数部分,最大精度是毫秒(SSS)。除此之外,零附加

  1. S //十分之一秒
  2. SS //百分之一秒
  3. SSS //千分之一秒

Z 时区偏移或身份。不能被分析

  1. Z //时区偏移,如+0800
  2. ZZ //时区偏移,如+08:00
  3. ZZZ //时区身份,如America/Los_Angeles

W 一年中的一周

  1. W //最小数字周,如1
  2. WW //两位数字周,如01

E 一周中的天

  1. E,EE,EEE //星期几缩写,如Mon,Tue,Wed...
  2. EEEE //星期几全拼,如Monday,Tuesday...

例: 如果想要解析ISO8601的时间"2018-01-01T01:12:23",可以写成"yyyy-MM-dd'T'HH:mm:ss"

示例:

匹配nginx日志中的时间。

  1. [root@node2006 logstash]# cat text.conf
  2. input {
  3. stdin {}
  4. }
  5. filter {
  6. dissect {
  7. mapping => {
  8. "message" => "[%{time}]|%{remote_addr}|%{verb} %{request} HTTP/%{httpversion}|%{status}|%{body_bytes_sent}"
  9. }
  10. remove_field => [ "request_all" ]
  11. remove_field => [ "message" ]
  12. }
  13. # date {
  14. # match => [ "time", "dd/MMM/yyyy:HH:mm:ss Z" ]
  15. # locale => "en"
  16. # target => "@timestamp"
  17. # }
  18. }
  19. output {
  20. stdout{
  21. codec => rubydebug
  22. }
  23. }

未添加date插件(注释date代码块):


  1. [root@node2006 logstash]# bin/logstash -f text.conf
  2. [21/Jan/2019:14:59:49 +0800]|183.212.160.154|GET /siteapp/regionInfoApp/regions HTTP/1.1|502|166 #提供的一行nginx日志数据
  3. ....
  4. {
  5. "body_bytes_sent" => "166",
  6. "time" => "21/Jan/2019:14:59:49 +0800", #这个是匹配的time字段
  7. "@timestamp" => 2019-01-23T06:57:40.923Z, #这个是logstash处理这条日志的时间,我们肯定需要logstash处理的时间
  8. "host" => "node2006",
  9. "remote_addr" => "183.212.160.154",
  10. "@version" => "1",
  11. "status" => "502",
  12. "httpversion" => "1.1",
  13. "verb" => "GET",
  14. "request" => "/siteapp/regionInfoApp/regions"
  15. }

增加date插件(打开date代码块注释):

  1. [root@node2006 logstash]# bin/logstash -f text.conf
  2. [21/Jan/2019:14:59:49 +0800]|183.212.160.154|GET /siteapp/regionInfoApp/regions HTTP/1.1|502|166
  3. ...
  4. {
  5. "remote_addr" => "183.212.160.154",
  6. "status" => "502",
  7. "body_bytes_sent" => "166",
  8. "httpversion" => "1.1",
  9. "@timestamp" => 2019-01-21T06:59:49.000Z, #timestamp的时间和time的年月日已经相同了,只是小时比time少了8小时,因为logstash将timestamp改成了UTC时间,原time时间是UTC+8,但不用担心,在kibana上,会将此时间根据你系统时进行自动调整显示。
  10. "time" => "21/Jan/2019:14:59:49 +0800", #
  11. "host" => "node2006",
  12. "verb" => "GET",
  13. "request" => "/siteapp/regionInfoApp/regions",
  14. "@version" => "1"
  15. }

QA:

问:为什么一定要在logstash中将日志中获取到的时间转换成UTC时间,然后在kibana在根据实际时间在转换回来。直接使用日志的时间不可以吗?非要转换UTC时间然后再转换成展示时间。

答(个人见解):估计是为了当日志系统跨越多个时区时,方便统一查询才把时间进行统一转换。这样在UTC +0700时区发生的事故,但是人在UTC +0800时区的时间看的肯定以当地时间来看待事故发生的时间并查询日志。这样就不用考虑跨时区日志时间的问题了。

filter - date 日期插件的更多相关文章

  1. boostrap 日期插件(带中文显示)

    不知道大家用什么样的日期插件,我最近用了bootstrap插件,整理了下,分享给大家,第四部分是我找的插件源码,可以省去大家的找的时间,按1-3的步骤用就好了,有些样式上的小问题就自己调一调: (1) ...

  2. 求大神帮解答calendar日期插件的问题

    小颖最近公司的项目里用了一款日期插件  calendar.js  但是在用的过程中遇到了难题,就是当日期只需要选择具体的月份就可以了,不需要再选具体日期时,小颖解决不了,只能让它默认显示出月份,但是月 ...

  3. 轻量级的日期插件--datebox

    jquery的日期插件有好几款,H5中的input也可以自带日期选择.但为什么要再写一个,有两个理由,一个是引用的文件太大,而有时候只需要很简单的功能,二个是想加一些自定义的效果不好改. 我写的这个功 ...

  4. Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例

    Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...

  5. My97DatePicker日期插件

    My97DatePicker是一款优秀的日期插件,它可以很方便地实现各种日期选择效果,博得广大IT开发人员的青睐. 下面来讲讲它的常用功能及设置方法. 方法/步骤   先来最简单的配置方法: (1)下 ...

  6. 基于JS功能强大的日期插件Kalendae

    开发中需要一个日期插件,可以在zepto下使用,可以选择日期段,可以设置不可选日期 找到一个完全满足的,并且基于JS不依赖于任何库. 在线演示:http://chipersoft.com/Kalend ...

  7. jsp日期插件My97DatePicker

    jsp日期插件My97DatePicker 强大的日期控件 使用方便简单 (2010-10-30 18:59:12) 转载▼ 标签: js javascript 日期插件 jsp it 分类: jqu ...

  8. (转)jQuery Mobile 移动开发中的日期插件Mobiscroll 2.3 使用说明

    (原)http://www.cnblogs.com/hxling/archive/2012/12/12/2814207.html jQuery Mobile 移动开发中的日期插件Mobiscroll ...

  9. jquery移动端日期插件

    不说多的,直接看代码<!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

随机推荐

  1. hdu 6620 Just an Old Puzzle(N数码问题)

    http://acm.hdu.edu.cn/showproblem.php?pid=6620 N数码问题: n*n矩阵,里面填着1—n*n-1,还有1个空格, 通过上下左右移动空格的位置, 使矩阵里的 ...

  2. ELK原理

    为什么要使用Elasticsearch?​ 因为在我们中的数据,会随着时间变的非常多,若采用以往的模糊查询,模糊查询前置通配符,如:"%aa%",会放弃索引,导致数据表查询将变成全 ...

  3. 创建java类中类出现is not an enclosing class

    public class A { public class B { } }; 需要实例B类时,按照正逻辑是,A.B ab = new A.B(); 那么编译器就会出现一个错误--"is no ...

  4. MongoDB Shell 命令

    更新列名 db.Stores.update({}, {$rename : {"StoreId" : "MetaId"}}, false, true) 查询长度 ...

  5. MinGW g++.exe 编译 DLL 时,导出函数名带@的问题

    今天尝试用CodeBlocks写了一个简单的Dll,发现生成的 dll 文件导出的函数名后面都有一个 @xxx 从生成的 libDll2.def 中看到: EXPORTS DllMain@ @ Max ...

  6. 《Linux就该这么学》培训笔记_ch07_RAID和LVM

    <Linux就该这么学>培训笔记_ch07_RAID和LVM 文章最后会post上书本的笔记照片. 文章主要内容: RAID(独立冗余磁盘阵列) 部署磁盘阵列 损坏磁盘阵列及修复 磁盘阵列 ...

  7. Excel 简单使用

    1.Excel复制上一行 注意鼠标的样子 2.删除多行 删除之后如图所示: 删除多列也是同样的操作 3.日期格式不能按照数据库的形式进行输入 数字的位数太多输入之后改变了数字,可以设置为文本格式,进行 ...

  8. AntDesign vue学习笔记(三)嵌套路由使用

    本项目目前结构如下 1.Login页面=>MainFrm页面=>MainFrm左部菜单,右边是显示区域可以切换子页面. 2.当点击左部菜单时,右边的子页面随着进行切换. 实现关键代码如下1 ...

  9. 『正睿OI 2019SC Day6』

    动态规划 \(dp\)早就已经是经常用到的算法了,于是老师上课主要都在讲题.今天讲的主要是三类\(dp\):树形\(dp\),计数\(dp\),\(dp\)套\(dp\).其中计数\(dp\)是我很不 ...

  10. ServerSocketChannel简述

    一.前言 前篇文章中了解了SocketChannel:提供了连接到套接字通道,从某种层面而言,NIO中提供了类似于java.net包中对于网络操作的api的功能.既然已经有连接到Socket套接字的通 ...