天天看点

output

output区块为事件输出目的地,常用插件有stdout,elasticsearch,kafka等

更多output插件知识查看官网文档:https://www.elastic.co/guide/en/logstash/current/output-plugins.html

stdout插件:

一个简单的打印输出,多用来进行debug

示例:

output {

    stdout {

        codec => rubydebug

        workers => 2

    }

}

workers:多线程输出

rubydebug使用ruby的Awesome打印库打印事件输出

elasticsearch插件:

使用http协议将事件写入elasticsearch

    elasticsearch {

        hosts => ["172.16.133.129:9200", "172.16.133.133:9200"]

        index => "logstash-%{type}-%{+YYYY.MM.dd}"

        flush_size => 20000

        idle_flush_time => 10

hosts:连接elasticsearch服务器

index:写入elasticsearch的索引名。这里可以使用变量。为了更贴合日志场景,Logstash 提供了 <code>%{+YYYY.MM.dd}</code> 这种写法。在语法解析的时候,看到以 + 号开头的,就会自动认为后面是时间格式,尝试用时间格式来解析后续字符串。所以,之前处理过程中不要给自定义字段取个加号开头的名字。此外,注意索引名中不能有大写字母,否则 ES 在日志中会报 InvalidIndexNameException,但是 Logstash 不会报错,这个错误比较隐晦。

<code>flush_size</code> 和 <code>idle_flush_time</code> 共同控制 Logstash 向 Elasticsearch 发送批量数据的行为。以上面示例来说:Logstash 会努力攒到 20000 条数据一次性发送出去,但是如果 10 秒钟内也没攒够 20000 条,Logstash 还是会以当前攒到的数据量发一次。默认情况下,<code>flush_size</code> 是 500 条,<code>idle_flush_time</code> 是 1 秒。这也是很多人改大了 <code>flush_size</code>也没能提高写入 ES 性能的原因——Logstash 还是 1 秒钟发送一次。

Logstash 在有多个 conf 文件的情况下,进入 ES 的数据会重复,几个 conf 数据就会重复几次,这是因为output 段顺序执行,没有对日志进行type判断的各插件配置都会全部执行一次。所以如果有多个conf文件,在 output 段对 type 进行判断,语法如下所示:

    if [type] == "test" {

        elasticsearch { }

kafka插件:

将事件写入kafka的topic中

        kafka {

            bootstrap_servers =&gt; "10.10.10.6:9092,10.10.10.8:9092,10.10.10.9:9092"

            topic_id =&gt; "command_audit_log"

            compression_type =&gt; "snappy"

        }

bootstrap_servers:kafka server的地址

topic_id:生成消息的话题(必填项)

compression_type:压缩类型(snappy,gzip,none)

该插件默认的codec为json,所以事件将以json的格式导入,如果配置codec为plain,logstash除了编码messages外,还会添加timestamp和hostname的字段,如果只想输出message信息,配置如下output:

    kafka {

        codec =&gt; plain {

        format =&gt; "%{message}"

继续阅读