本文是 Elastic 技术栈(ELK)的 Logstash 应用。html
若是不了解 Elastic 的安装、配置、部署,能够参考:Elastic 技术栈之快速入门java
Logstash 能够传输和处理你的日志、事务或其余数据。node
Logstash 是 Elasticsearch 的最佳数据管道。linux
Logstash 是插件式管理模式,在输入、过滤、输出以及编码过程当中均可以使用插件进行定制。Logstash 社区有超过 200 种可用插件。nginx
Logstash 有两个必要元素:input
和 output
,一个可选元素:filter
。git
这三个元素,分别表明 Logstash 事件处理的三个阶段:输入 > 过滤器 > 输出。github
在实际应用场景中,一般输入、输出、过滤器不止一个。Logstash 的这三个元素都使用插件式管理方式,用户能够根据应用须要,灵活的选用各阶段须要的插件,并组合使用。redis
后面将对插件展开讲解,暂且不表。spring
logstash.yml
:logstash 的默认启动配置文件jvm.options
:logstash 的 JVM 配置文件。startup.options
(Linux):包含系统安装脚本在 /usr/share/logstash/bin
中使用的选项为您的系统构建适当的启动脚本。安装 Logstash 软件包时,系统安装脚本将在安装过程结束时执行,并使用 startup.options
中指定的设置来设置用户,组,服务名称和服务描述等选项。节选部分设置项,更多项请参考:https://www.elastic.co/guide/en/logstash/current/logstash-settings-file.htmlsql
参数 | 描述 | 默认值 |
---|---|---|
node.name |
节点名 | 机器的主机名 |
path.data |
Logstash及其插件用于任何持久性需求的目录。 | LOGSTASH_HOME/data |
pipeline.workers |
同时执行管道的过滤器和输出阶段的工做任务数量。若是发现事件正在备份,或CPU未饱和,请考虑增长此数字以更好地利用机器处理能力。 | Number of the host’s CPU cores |
pipeline.batch.size |
尝试执行过滤器和输出以前,单个工做线程从输入收集的最大事件数量。较大的批量处理大小通常来讲效率更高,可是以增长的内存开销为代价。您可能必须经过设置 LS_HEAP_SIZE 变量来有效使用该选项来增长JVM堆大小。 |
125 |
pipeline.batch.delay |
建立管道事件批处理时,在将一个尺寸太小的批次发送给管道工做任务以前,等待每一个事件须要多长时间(毫秒)。 | 5 |
pipeline.unsafe_shutdown |
若是设置为true,则即便在内存中仍存在inflight事件时,也会强制Logstash在关闭期间退出。默认状况下,Logstash将拒绝退出,直到全部接收到的事件都被推送到输出。启用此选项可能会致使关机期间数据丢失。 | false |
path.config |
主管道的Logstash配置路径。若是您指定一个目录或通配符,配置文件将按字母顺序从目录中读取。 | Platform-specific. See [dir-layout]. |
config.string |
包含用于主管道的管道配置的字符串。使用与配置文件相同的语法。 | None |
config.test_and_exit |
设置为true时,检查配置是否有效,而后退出。请注意,使用此设置不会检查grok模式的正确性。 Logstash能够从目录中读取多个配置文件。若是将此设置与log.level:debug结合使用,则Logstash将记录组合的配置文件,并注掉其源文件的配置块。 | false |
config.reload.automatic |
设置为true时,按期检查配置是否已更改,并在配置更改时从新加载配置。这也能够经过SIGHUP信号手动触发。 | false |
config.reload.interval |
Logstash 检查配置文件更改的时间间隔。 | 3s |
config.debug |
设置为true时,将彻底编译的配置显示为调试日志消息。您还必须设置log.level:debug 。警告:日志消息将包括任何传递给插件配置做为明文的“密码”选项,并可能致使明文密码出如今您的日志! |
false |
config.support_escapes |
当设置为true时,带引号的字符串将处理转义字符。 | false |
modules |
配置时,模块必须处于上表所述的嵌套YAML结构中。 | None |
http.host |
绑定地址 | "127.0.0.1" |
http.port |
绑定端口 | 9600 |
log.level |
日志级别。有效选项:fatal > error > warn > info > debug > trace | info |
log.format |
日志格式。json (JSON 格式)或 plain (原对象) | plain |
path.logs |
Logstash 自身日志的存储路径 | LOGSTASH_HOME/logs |
path.plugins |
在哪里能够找到自定义的插件。您能够屡次指定此设置以包含多个路径。 |
经过命令行启动 logstash 的方式以下:
bin/logstash [options]
其中 [options] 是您能够指定用于控制 Logstash 执行的命令行标志。
在命令行上设置的任何标志都会覆盖 Logstash 设置文件(logstash.yml
)中的相应设置,但设置文件自己不会更改。
注
虽然能够经过指定命令行参数的方式,来控制 logstash 的运行方式,但显然这么作很麻烦。
建议经过指定配置文件的方式,来控制 logstash 运行,启动命令以下:
bin/logstash -f logstash.conf若想了解更多的命令行参数细节,请参考:https://www.elastic.co/guide/en/logstash/current/running-logstash-command-line.html
上节,咱们了解到,logstash 能够执行 bin/logstash -f logstash.conf
,按照配置文件中的参数去覆盖默认设置文件(logstash.yml
)中的设置。
这节,咱们就来学习一下这个配置文件如何配置参数。
在工做原理一节中,咱们已经知道了 Logstash 主要有三个工做阶段 input 、filter、output。而 logstash 配置文件文件结构也与之相对应:
input {} filter {} output {}
每一个部分都包含一个或多个插件的配置选项。若是指定了多个过滤器,则会按照它们在配置文件中的显示顺序应用它们。
插件的配置由插件名称和插件的一个设置块组成。
下面的例子中配置了两个输入文件配置:
input { file { path => "/var/log/messages" type => "syslog" } file { path => "/var/log/apache/access.log" type => "apache" } }
您能够配置的设置因插件类型而异。你能够参考: Input Plugins, Output Plugins, Filter Plugins, 和 Codec Plugins 。
一个插件能够要求设置的值是一个特定的类型,好比布尔值,列表或哈希值。如下值类型受支持。
users => [ {id => 1, name => bob}, {id => 2, name => jane} ]
path => [ "/var/log/messages", "/var/log/*.log" ] uris => [ "http://elastic.co", "http://example.net" ]
ssl_enable => true
my_bytes => "1113" # 1113 bytes my_bytes => "10MiB" # 10485760 bytes my_bytes => "100kib" # 102400 bytes my_bytes => "180 mb" # 180000000 bytes
codec => "json"
match => { "field1" => "value1" "field2" => "value2" ... }
port => 33
my_password => "password"
my_uri => "http://foo:bar@example.net"
my_path => "/tmp/logstash"
String
转义字符
Logstash 支持各类输入选择 ,能够在同一时间从众多经常使用来源捕捉事件。可以以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各类 AWS 服务采集数据。
tail -0F
同样更多详情请见:Input Plugins
过滤器是Logstash管道中的中间处理设备。若是符合特定条件,您能够将条件过滤器组合在一块儿,对事件执行操做。
mutate:对事件字段执行通常转换。您能够重命名,删除,替换和修改事件中的字段。
drop:彻底放弃一个事件,例如调试事件。
clone:制做一个事件的副本,可能会添加或删除字段。
geoip:添加有关IP地址的地理位置的信息(也能够在Kibana中显示惊人的图表!)
更多详情请见:Filter Plugins
输出是Logstash管道的最后阶段。一个事件能够经过多个输出,可是一旦全部输出处理完成,事件就完成了执行。
更多详情请见:Output Plugins
用于格式化对应的内容。
更多插件请见:Codec Plugins
前面的内容都是对 Logstash 的介绍和原理说明。接下来,咱们来实战一些常见的应用场景。
stdin input 插件从标准输入读取事件。这是最简单的 input 插件,通常用于测试场景。
应用
(1)建立 logstash-input-stdin.conf
:
input { stdin { } } output { elasticsearch { hosts => ["localhost:9200"] } stdout { codec => rubydebug } }
更多配置项能够参考:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-stdin.html
(2)执行 logstash,使用 -f
来指定你的配置文件:
bin/logstash -f logstash-input-stdin.conf
想使用 logback + logstash ,可使用 logstash-logback-encoder 。logstash-logback-encoder 提供了 UDP / TCP / 异步方式来传输日志数据到 logstash。
(1)建立 logstash-input-tcp.conf
:
input { tcp { port => 9251 codec => json_lines mode => server } } output { elasticsearch { hosts => ["localhost:9200"] } stdout { codec => rubydebug } }
更多配置项能够参考:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-tcp.html
(2)执行 logstash,使用 -f
来指定你的配置文件:bin/logstash -f logstash-input-udp.conf
(1)在 Java 应用的 pom.xml 中引入 jar 包:
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>4.11</version> </dependency> <!-- logback 依赖包 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> <version>1.2.3</version> </dependency>
(2)接着,在 logback.xml 中添加 appender
<appender name="ELK-TCP" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <!-- destination 是 logstash 服务的 host:port, 至关于和 logstash 创建了管道,将日志数据定向传输到 logstash --> <destination>192.168.28.32:9251</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/> </appender> <logger name="io.github.dunwu.spring" level="TRACE" additivity="false"> <appender-ref ref="ELK-TCP" /> </logger>
(3)接下来,就是 logback 的具体使用 ,若是对此不了解,不妨参考一下个人这篇博文:细说 Java 主流日志工具库 。
UDP 和 TCP 的使用方式大同小异。
(1)建立 logstash-input-udp.conf
:
input { udp { port => 9250 codec => json } } output { elasticsearch { hosts => ["localhost:9200"] } stdout { codec => rubydebug } }
更多配置项能够参考:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-udp.html
(2)执行 logstash,使用 -f
来指定你的配置文件:bin/logstash -f logstash-input-udp.conf
(1)在 Java 应用的 pom.xml 中引入 jar 包:
与 TCP 应用 一节中的引入依赖包彻底相同。
(2)接着,在 logback.xml 中添加 appender
<appender name="ELK-UDP" class="net.logstash.logback.appender.LogstashSocketAppender"> <host>192.168.28.32</host> <port>9250</port> </appender> <logger name="io.github.dunwu.spring" level="TRACE" additivity="false"> <appender-ref ref="ELK-UDP" /> </logger>
(3)接下来,就是 logback 的具体使用 ,若是对此不了解,不妨参考一下个人这篇博文:细说 Java 主流日志工具库 。
在 Java Web 领域,须要用到一些重要的工具,例如 Tomcat 、Nginx 、Mysql 等。这些不属于业务应用,可是它们的日志数据对于定位问题、分析统计一样很重要。这时没法使用 logback 方式将它们的日志传输到 logstash。
如何采集这些日志文件呢?别急,你可使用 logstash 的 file input 插件。
须要注意的是,传输文件这种方式,必须在日志所在的机器上部署 logstash 。
应用
logstash 配置
(1)建立 logstash-input-file.conf
:
input { file { path => ["/var/log/nginx/access.log"] type => "nginx-access-log" start_position => "beginning" } } output { if [type] == "nginx-access-log" { elasticsearch { hosts => ["localhost:9200"] index => "nginx-access-log" } } }
(2)执行 logstash,使用 -f
来指定你的配置文件:bin/logstash -f logstash-input-file.conf
更多配置项能够参考:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html
若是你的 logstash 每次都是经过指定配置文件方式启动。不妨创建一个启动脚本。
# cd xxx 进入 logstash 安装目录下的 bin 目录 logstash -f logstash.conf
若是你的 logstash 运行在 linux 系统下,不妨使用 nohup 来启动一个守护进程。这样作的好处在于,即便关闭终端,应用仍会运行。
建立 startup.sh
nohup ./logstash -f logstash.conf >> nohup.out 2>&1 &
终止应用没有什么好方法,你只能使用 ps -ef | grep logstash ,查出进程,将其kill 。不过,咱们能够写一个脚原本干这件事:
建立 shutdown.sh
脚本很少解释,请自行领会做用。
PID=`ps -ef | grep logstash | awk '{ print $2}' | head -n 1` kill -9 ${PID}