logstash的output插件
标准输出(Stdout)
和之前 inputs/stdin 插件一样,outputs/stdout 插件也是最基础和简单的输出插件。同样在这里简单介绍一下,作为输出插件的一个共性了解。
output { stdout { codec => rubydebug workers => 2 } }
输出插件统一具有一个参数是 workers
。Logstash 为输出做了多线程的准备。
其次是 codec 设置。codec 的作用在之前已经讲过。可能除了 codecs/multiline
,其他 codec 插件本身并没有太多的设置项。所以一般省略掉后面的配置区段。换句话说。上面配置示例的完全写法应该是:
output { stdout { codec => rubydebug { } workers => 2 } }
单就 outputs/stdout 插件来说,其最重要和常见的用途就是调试。所以在不太有效的时候,加上命令行参数 -vv
运行,查看更多详细调试信息。
保存成文件(File)
通过日志收集系统将分散在数百台服务器上的数据集中存储在某中心服务器上,这是运维最原始的需求。早年的 scribed ,甚至直接就把输出的语法命名为 <store>
。Logstash 当然也能做到这点。
和 LogStash::Inputs::File
不同, LogStash::Outputs::File
里可以使用 sprintf format 格式来自动定义输出到带日期命名的路径。
output { file { path => "/path/to/%{+yyyy/MM/dd/HH}/%{host}.log.gz" message_format => "%{message}" gzip => true } }
使用 output/file 插件首先需要注意的就是 message_format
参数。插件默认是输出整个 event 的 JSON 形式数据的。这可能跟大多数情况下使用者的期望不符。大家可能只是希望按照日志的原始格式保存就好了。所以需要定义为 %{message}
,当然,前提是在之前的 filter 插件中,你没有使用 remove_field
或者 update
等参数删除或修改 %{message}
字段的内容。
另一个非常有用的参数是 gzip。gzip 格式是一个非常奇特而友好的格式。其格式包括有:
- 10字节的头,包含幻数、版本号以及时间戳
- 可选的扩展头,如原文件名
- 文件体,包括DEFLATE压缩的数据
- 8字节的尾注,包括CRC-32校验和以及未压缩的原始数据长度
保存进 Elasticsearch
output {
elasticsearch {
host => "192.168.0.2"
protocol => "http"
index => "logstash-%{type}-%{+YYYY.MM.dd}"
index_type => "%{type}"
workers => 5
template_overwrite => true
}
}
输出到 Redis
input { stdin {} } output { redis { data_type => "channel" key => "logstash-chan-%{+yyyy.MM.dd}" } }
发送网络数据(TCP)
output { tcp { host => "192.168.0.2" port => 8888 codec => json_lines } }
在收集端采用 tcp 方式发送给远端的 tcp 端口。这里需要注意的是,默认的 codec 选项是 json。而远端的 LogStash::Inputs::TCP 的默认 codec 选项却是 plain !所以不指定各自的 codec ,对接肯定是失败的。
另外,由于IO BUFFER 的原因,即使是两端共同约定为 json 依然无法正常运行,接收端会认为一行数据没结束,一直等待直至自己 OutOfMemory !
所以,正确的做法是,发送端指定 codec 为 json_lines ,这样每条数据后面会加上一个回车,接收端指定 codec 为 json_lines 或者 json 均可,这样才能正常处理。包括在收集端已经切割好的字段,也可以直接带入收集端使用了。