(二)ELK学习之LogStash

什么是 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.conf
io/console not supported; tty will not be manipulated
Settings: Default filter workers: 2
Logstash startup completed

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

PS C:\ELK\logstash-2.1.0\bin> .\logstash agent -f .\pipeline.conf
io/console not supported; tty will not be manipulated
Settings: Default filter workers: 2
Logstash startup completed
hello world
2015-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 interface
LoadPlugin cpu
LoadPlugin memory
LoadPlugin network
LoadPlugin df
LoadPlugin 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

    持续更新中。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值