(二)ELK学习之LogStash

来源:互联网 发布:大公司如何混淆js代码 编辑:程序博客网 时间:2024/05/18 04:00

什么是 Logstash

Logstash 是一个开源工具,它可以对你的日志进行收集、分析、并将其存储以后使用

怎么用 Logstash

安装配置

在安装之前要有 Java1.8 环境,因此先要配置 Java 环境,这点不懂可自行百度。

首先安装 Logstash,[Logstash下载地址][1]。因为我是在 Windows 下安装,因此下载的是 ZIP 版本 。下载完成后,直接解压即可。

解压完毕后,进入 bin 目录,首先要写响应的配置文件,先新建一个配置文件,pipeline.conf 配置文件主要包括三个部分,分别是 input、filter、output 分别定义了输入来源,过滤规则,输出到什么地方。一个简单地配置文件如下,从控制台输入,在输出到控制台,没有过滤规则。

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

然后执行命令 logstash agent -f pipeline.conf ,结果如下:

PS C:\ELK\logstash-2.1.0\bin> .\logstash agent -f .\pipeline.confio/console not supported; tty will not be manipulatedSettings: Default filter workers: 2Logstash startup completed

表示运行成功,在命令行输入 hello world ,显示如下:

PS C:\ELK\logstash-2.1.0\bin> .\logstash agent -f .\pipeline.confio/console not supported; tty will not be manipulatedSettings: Default filter workers: 2Logstash startup completedhello world2015-12-03T13:30:39.180Z liuyb hello world

配置语法

Logstash 设计了自己的 DSL ———— 包括有区域、注释、数据类型(布尔值、字符串、数值、数组、哈希)、条件判断、字段引用。

  • 区段(section)
    Logstash 用 {} 来定义区域,区域内可以包括插件区域定义,你可以在一个区域内定义多个插件,插件区域内则可以定义键值对设置。如下所示。
input{    stdin{}    syslog{}}
  • 数据类型

    • bool

      debug=>true

    • String

      host=>”hostname”

    • number

      port=>514

    • array

      options=>{key1=>val1,key2=>val2}

  • 字段引用
    字段是 Logstash::Event 对象的属性。我们之前提过事件就像一个哈希一样,所以你可以想象字段就想一个键值对。
    如果你想在 Logstash 配置中使用字段的值,只需要把字段的名字写在中括号 [] 里就行了,这就叫做字段引用。
    对于嵌套字段(也就是多维哈希表,或者叫哈希的哈希),每层的字段名都写在 [] 里就可以了。

  • 条件判断
    表达式支持以下这些操作符

    • ==(等于), !=(不等于), <(小于), >(大于), <=(小于等于), >=(大于等于)
    • =~(匹配正则), !~(不匹配正则)
    • in(包含), not in(不包含)
    • and(与), or(或), nand(非与), xor(非或)
    • ()(复合表达式), !()(对复合表达式结果取反)

插件介绍

在 “Hello World” 示例中,我么已经见到并介绍了 Logstash 的运行流程和配置的基础语法。从这里开始我们就要逐一介绍 Logstash 流程中比较常用的一些插件,并在介绍中针对其主要适用的场景,推荐的配置,做一些说明。

配置示例中代码并不能贴完整,请记住一个原则:Logstash 配置一定要有一个 input 和一个 output。

input

collectd

collectd 是一个守护进程,用来收集系统性能和提供各种存储方式来存储不同值的机制,他会在系统运行和存储信息时周期性的统计系统相关信息。利用这些信息有助于查找当前系统性能瓶颈(如作为性能分析 performance analysis)和预测系统未来的 load(如能力部署 capacity planning)等。

collectd 的配置

以下配置可以实现对服务器基本的 CPU、内存、网卡流量、磁盘IO以及磁盘空间占用情况监控

Hostname "host.example.com"LoadPlugin interfaceLoadPlugin cpuLoadPlugin memoryLoadPlugin networkLoadPlugin dfLoadPlugin disk<Plugin interface>    Interface "eth0"    IgnoreSelected false</Plugin><Plugin network>    <Server "10.0.0.1" "25826"> ## logstash 的 IP 地址和 collectd 的数据接收端口号    </Server></Plugin>

Logstash配置

以下配置实现通过 logstash 监听 25826 端口,接受从 collectd 发送过来的各项检测数据:

input { collectd {    port => 25826 ## 端口号与发送端对应    type => collectd}

推荐配置

udp {    port => 25826    buffer_size => 1452    workers => 3          # Default is 2    queue_size => 30000   # Default is 2000    codec => collectd { }    type => "collectd"}

运行结果

{  "_index": "logstash-2014.12.11",  "_type": "collectd",  "_id": "dS6vVz4aRtK5xS86kwjZnw",  "_score": null,  "_source": {    "host": "host.example.com",    "@timestamp": "2014-12-11T06:28:52.118Z",    "plugin": "interface",    "plugin_instance": "eth0",    "collectd_type": "if_packets",    "rx": 19147144,    "tx": 3608629,    "@version": "1",    "type": "collectd",    "tags": [      "_grokparsefailure"    ]  },  "sort": [    1418279332118  ]}

file

Logstash 使用一个名叫 FileWatch 的 Ruby Gem 库来监听文件变化。这个库支持 glob 展开文件路径,而且会记录一个叫 .sincedb 的数据库文件来跟踪被监听的日志文件的当前读取位置。所以不要担心 logstash 会漏过你的数据。
实例配置

input {    file {        path => ["/var/log/*.log", "/var/log/message"]        type => "system"        start_position => "beginning"    }}

解释


  • discover_interval

logstash 每隔多久去检查一次被监听的 path 下是否有新文件,默认值是15秒

  • exclude

    不想被监听的文件可以排除出去,这里跟 path 一样支持 glob 展开

  • close_older

    一个已经监听中的文件,如果超过这个值的时间内没有更新内容,就关闭监听它的文件句柄。默认是 3600 秒,即一个小时

  • ignore_older

    在每次检测文件列表的时候,如果一个文件的最后修改时间超过这个值,就忽略这个文件,默认是 86400 秒,即一天

  • since_path

    如果你不想使用默认的$HOME/.sincedb
    (Windows平台上在C:\Windows\System32\config\systemprofile.sincedb),可以通过这个配置定义 sincedb 文件到其他位置

  • sincedb_write_interval

    logstash 每隔多久写一次 sincedb 文件,默认是 15 秒

  • stat_interval

    logstash 每隔多久检查一次被监听文件状态(是否有更新),默认是 1 秒。

  • start_position
    logstash 从什么位置开始读取文件数据,默认是结束位置,也就是说 logstash 进程会以类似 tail -F 的形式运行。如果你是要导入原有数据,把这个设定改成 “beginning”,logstash 进程就从头开始读取,有点类似 cat,但是读到最后一行不会终止,而是继续变成 tail -F。
  • stdin

    配置示例

    input {    stdin {        add_field => {"key" => "value"}        codec => "plain"        tags => ["add"]        type => "std"    }}

    运行结果

    用上面的 stdin 设置重新运行一次最开始的 hello world 示例。得到下面的输出:

    {       "message" => "hello world",      "@version" => "1",    "@timestamp" => "2014-08-08T06:48:47.789Z",          "type" => "std",          "tags" => [        [0] "add"    ],           "key" => "value",          "host" => "raochenlindeMacBook-Air.local"}

    解释
    type 和 tags 是 logstash 事件中两个特殊字段,通常来说我们会在输入区段中通过 type 来标记事件类型。而 tags 则是在数据处理过程中,有具体的插件添加或者删除的。

    常见用法如下:

    input {    stdin {        type => "web"    }}filter {    if [type] == "web" {        grok {            match => ["message", %{COMBINEDAPACHELOG}]        }    }}output {    if "_grokparsefailure" in [tags] {        nagios_nsca {            nagios_status => "1"        }    } else {        elasticsearch {        }    }}

    syslog

    tcp

    读取网络数据,未来你可能会使用 Redis 服务器或者其他的消息队列系统来作为 logstash broker 的角色。不过 Logstash 其实也有自己的 TCP/UDP 插件,在临时任务的时候,也算能用,尤其是在测试环境中。

    配置示例

    input {    tcp {        port => 8888        mode => "server"        ssl_enable => false    }}

    常见场景

    目前开来,LogStash::Inputs::TCP 最常见的用法就是配合 nc 命令导入旧数据。再启动 Logstash 进程后,在另一个终端运行如下命令即可导入数据。

    nc 127.0.0.1 8888 < olddata

    codec(编码插件)

    采用 Json 编码

    示例配置

    input {    file {        path => "/var/log/nginx/access.log_json""        codec => "json"    }}

    合并多行数据(multiline)

    有些时候,应用程序调试日志会包含非常丰富的内容,为一个时间打印出很多行内容,这种日志通常都很难通过命令行解析方式分析。
    而 logstash 正为此准备好了 codec/multiline 插件

    示例配置

    input {    stdin {        codec => multiline {            pattern => "^\["            negate => true            what => "previous"        }    }}

    运行结果
    运行 logstash 进程,然后在等待输入的终端中输入如下几行数据:

    [Aug/08/08 14:54:03] hello world[Aug/08/09 14:54:04] hello logstash    hello best practice    hello raochenlin[Aug/08/10 14:54:05] the end

    你会发现 logstash 输出下面的这样的返回:

    {    "@timestamp" => "2014-08-09T13:32:24.359Z",       "message" => "[Aug/08/09 14:54:04] hello logstash\n\n    hello best practice\n\n    hello raochenlin\n",      "@version" => "1",          "tags" => [        [0] "multiline"    ],          "host" => "raochenlindeMacBook-Air.local"}

    解释
    其实这个插件的原理很简单,就是把当前行的数据添加到前面一行后面,指导新的当前行匹配到 ^[ 正则为止。

    netflow

    filter(过滤器插件)

    时间处理(Date)

    filter/date 插件

    grok

    geoip

    json

    kv

    metrics

    ruby

    split

    elapsed

    output

    持续更新中。。。

    0 0