Logstash 简介

前言

之前谈了 Elasticsearch 和 Kibana 的安装,作为开源实时日志分析平台 ELK 的一部分,当然少不了 Logstash 。其实 Logstash 的作用就是一个数据收集器,将各种格式各种渠道的数据通过它收集解析之后格式化输出到 Elasticsearch ,最后再由
Kibana 提供的比较友好的 Web 界面进行汇总、分析、搜索。

ELK 数据流向

ELK 内部实际就是个管道结构,数据从 Logstash 到 Elasticsearch 再到 Kibana 做可视化展示。这三个组件各自也可以单独使用,比如 Logstash 不仅可以将数据输出到
Elasticsearch ,也可以到数据库、缓存等。下面看看 Logstash 的安装和基本的使用。

安装

到官网根据不同操作系统下载最新版本的Logstash压缩包,之后本地解压缩。

运行

解压缩之后就可以运行了,在 Logstash 的根目录下执行命令:

bin/logstash -e "input { stdin {}} output { stdout {}}"

控制台输出“Successfully started Logstash API endpoint”表示 Logstash 启动成功


Logstash启动成功

命令里的-e表示后面跟着的是一个配置信息字符串,字符串的功能就是让 Logstash
接受控制台里的输入,并输出到控制台,比如在控制台输入 hello world :


hello world

如果用最简化的方式执行:

bin/logstash -e ""

会看到 Logstash 采用了默认的配置,从控制台输入,并以 json 格式输出到控制台:


json格式输出

配置文件

实际运维中配置信息通常会放配置文件中来管理,这种情况下 Logstash 提供了 -f 参数来指定配置信息所在的配置文件。在 Logstash 的根目录下执行命令:

bin/logstash -f config/demo.conf

Logstash 会加载 config 目录中 demo.conf 文件,文件中的内容作为配置信息,看下
demo.conf 文件的内容:

input { stdin {}}
output { stdout {}}

执行命令之后会发现其行为和上面的 -e 配置字符串是一样的,输入什么字符控制台显示什么字符。

工作原理

Logstash 内部也是管道的方式进行数据的搜集、处理、输出。在 Logstash 中,包括了三个阶段:
输入 input --> 处理 filter(不是必须的) --> 输出 output


Logstash三个阶段

每个阶段都由很多的插件配合工作,比如 file、elasticsearch、redis 等等。
每个阶段也可以指定多种方式,比如输出既可以输出到 Elasticsearch 中,也可以指定到 stdout 在控制台打印。
正是由于这种插件方式,使得 Logstash 变得易于扩展和定制,下面分别看看这三个阶段的一些插件的使用。

input-file 插件

看下 input 的一个插件例子。上面讲的是从控制台输入,如果要从文件读取输入,则可以用 file 插件:

input { file { path => "/tmp/abc.log" }}

上面是这个插件的最小化配置, path 后面跟随的是文件的全路径名,如果要匹配一个目录下的所有文件,可以用通配符*:

input { file { path => "/tmp/data/*" } }

要匹配多个不同目录下的文件,则用中括号括起来,并逗号分隔不同文件路径:

input { file { path => ["/tmp/data/*","/log/abc/hello.log"] }}

注意文件的路径名需要时绝对路径。

output-elasticsearch 插件

如果要将数据输出到,则可以用 Elasticsearch 插件:

output {
        elasticsearch {
                action => "index"
                hosts  => "localhost:9200"
                index  => "log-example"
         }
}

上面配置的含义是,将数据输出到 Elasticsearch 服务器,hosts 是提供服务的地址和端口号,action 是指索引到一个文档,index 是指要被写进的索引名,当然还有其他参数配置,具体参见该插件的官方文档说明

filter-grok 插件

不论是 input 的 stdin 还是 file 插件,都是从不同来源读取数据,但它们读取的都是一行一行的文本数据,输出的时候会发现它们都是作为一行放到输出的 message 属性中:


文本输出

很多情况下需要对这些文本做格式化的解析再输出,比如日志文件中数据格式是这样的:

[2017-04-03 23:30:11.020][INFO][logstash] Pipeline main started

上面的文本格式是:[时间][日志级别][模块名]日志信息描述
输出 json 时也希望将时间放到自定义的 TimeStamp 属性中,将日志级别信息放到
LogLevel 属性中,将模块名放到 ModuleName 属性中,将日志信息描述放到
LogDesc 属性中。

如果是这种需求就用到了 grok 插件,该插件是 Logstash 将普通文本解析成结构化数据的最好的方式。(这可不是我非要安利,是官网上说的:Grok is currently the best way in logstash to parse crappy unstructured log data into something structured and queryable.)

  1. grok 表达式
    grok 表达式语法是这样的:
%{SYNTAX:SEMANTIC}

SYNTAX 是要匹配的文本的模式名。SEMANTIC 是匹配出的内容的标识符,该标识符即输出到 output 中的属性名。看一个简单的 grok 表达式例子:

%{IP:source_ip}

它表示使用名为 IP 的正则表达式提取内容,并将匹配出的内容命名为 source_ip 。所以如果输入是 IP 地址的格式:11.22.33.123,则会将该内容放到 source_ip 中。

  1. grok 中预定义的模式
    上面的 IP 是 grok 里预定义的模式,其正则表达式的定义实际是:

    IP 模式定义

    grok 已经预定义了很多模式,比如匹配一串数字可以用 NUMBER、匹配 MAC 地址用 MAC、匹配时间用 TIMESTAMP_ISO8601、匹配 LOG 日志级别用 LOGLEVEL
    等等。详细定义参见github 中的说明

  2. grok 中的自定义模式
    如果上面列的这些模式不能满足需求,grok 也允许自定义模式。
    先看下自定义模式的语法:

pattern_name regexp

pattern_name 就是自定义的模式名,regexp 就是模式的正则表达式定义,之间用一个空格分隔开。比如自定义一个队列 ID 模式,它的格式是10或11个数字、大写字母组成的字符串,其定义语法如下:

QUEUE_ID [0-9A-F]{10,11}

熟悉正则表达是的应该知道[0-9A-F]表示数字、大写字母组成的字符,后面的{10,11}表示有10或11个这样的字符。
接着在 Logstash 根目录下建一个 patterns 目录,该目录下新建一个文件叫
myPattern 。文件内容就是:

QUEUE_ID [0-9A-F]{10,11}

最后在 filter 配置中加上 patterns 目录,并引用上面定义的这个 QUEUE_ID :

filter {
    grok {
      patterns_dir => ["./patterns"]
      match => { "message" => "%{TIMESTAMP_ISO8601:TimeStamp} %{QUEUE_ID:queue_id}: %{GREEDYDATA:syslog_message}" }
    }
}

patterns_dir 用于指定自定义模式的文件所在的目录,match 的内容就是 grok 表达式,TIMESTAMP_ISO8601 和 GREEDYDATA 预定义的模式,QUEUE_ID 是自定义的模式。它将匹配以下格式的内容:

2017-04-03 23:30:11.020 12345abcde hello world

匹配后的结果是:

{"@timestamp": "2017-04-12T11:57:40.186Z",  "queue_id": "12345abcde",  "@version": "1",  "syslog_message": "hello world",  "message": "2017-04-03 23:30:11.020 12345abcde hello world",  "TimeStamp": "2017-04-03 23:30:11.020"}
  1. 日志文件的 filter 配置
    所以上面的日志文件中数据的 filter 区段配置:
filter {
        grok {
          match => {
                "message" => "\[%{TIMESTAMP_ISO8601:TimeStamp}\]\[%{LOGLEVEL:LogLevel}\]\[%{WORD:ModuleName}\] %{GREEDYDATA:LogDesc}"
        }
    }
}

由于中括号是特殊字符,所以正则表达式中它的前面要加上反斜杠\。
加载文件配置后运行结果如下:


日志信息解析
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 概述 监控预警平台, eagle + eye (鹰眼)的合体词, 寓意可以快速发现问题, 并及时作出响应,Eagl...
    Kungfu猫熊阅读 7,374评论 0 52
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,773评论 6 342
  • 我于月下向你许誓 说出的话 被记载在时间的碎片里 后来我们没有在一起 那些便成了最讽刺的画面 无论当初多么美好 最...
    未明花香阅读 200评论 24 4
  • 我今天创造了三个小句子。是哪三个小句子呢?这些句子都是跟我的爸爸和我有关的。我现在跟大家讲一讲吧! ...
    静待花开abc阅读 239评论 0 0