安装Logstash
本文以“logstash-2.4.0.tar.gz”为例介绍安装Logstash的方法。
步骤 1 以root用户登录服务器
步骤 2 上传软件包
通过SSH或XFTP等上传工具,将Logstash的安装包“logstash-2.4.0.tar.gz”上传到服务器的“/usr/local”目录下。
步骤 3 进入“/usr/local”目录
cd /usr/local
步骤 4 解压缩安装包
tar -zxvf logstash-2.4.0.tar.gz
解压完成,在当前目录下生成“logstash-2.4.0”文件夹。
1.2 安装测试Logstash
步骤 1 以root用户登录服务器
步骤 2 进入“/usr/local/logstash-2.4.0”目录
cd /usr/local/logstash-2.4.0
步骤 3 验证配置文件
以test.conf为例子,
执行命令 ./bin/logstash -f test.conf -t
如果输出结果为Configuration OK,则说明配置文件正确,可以正常启动。
否则根据给出的错误提示进行检查修改。
步骤 5 启动程序
执行命令 ./bin/logstash -f test.conf &
注意命令行后加上&,否则关闭shell窗口,该程序可能会随着关闭
步骤 4 关闭程序
输入ps -ef|grep logstash
执行kill -9 11281
1.3 配置文件
步骤 1 以root用户登录服务器
步骤 2 进入“/usr/local/logstash-2.4.0”目录
cd /usr/local/logstash-2.4.0
步骤 3 编辑app.conf文件
vi etc/app.conf
#输入
input {
# 文件输入
file {
# 日志文件路径,为数组类型,存在多个时,使用逗号进行分隔,例如["/usr/local/1.log","/usr/local/2.log"],请根据实际进行配置
path => ["/usr/local/logstash-2.4.0/testdata/**/*.log"]
# 第一次读取文件时的起始位置,默认为开头
start_position => "beginning"
# 存放已读取文件以及已经读取文件的行数的记录文件位置
sincedb_path => "/usr/local/logstash-2.4.0/db/request.sincedb"
# 额外添加的字段,修改成相应ip即可
add_field => {"jettyip" => "192.168.15.158"}
# 索引类型,默认即可
type => "jetty-request-log"
# 默认是86400s,即修改时间为1天之前的文件会过滤掉,不会读取
ignore_older => 86400
}
# 标准输入
# stdin{
# }
}
# 过滤与修正
# 非开发人员或者对logstash不熟悉者,建议不要擅自修改。(若进行了修改,应该先进行测试再投入正式使用)
filter {
# 防止多个conf造成进入 ES 的数据会重复,根据类型进行过滤
if([type] == "jetty-request-log"){
grok { match => { "message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:[@metadata][timestamp]}\] "%{WORD:verb} //%{IPORHOST:iphost}(?::%{POSINT:port})?/%{WORD:module}(?:%{URIPATH:requestpath}(?:%{URIPARAM:param})?)?(?: HTTP/%{NUMBER:httpversion})?" %{NUMBER:status} (?<length>[\d|-]+)' }
}
date {
match => [ "[@metadata][timestamp]" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
urldecode {
all_fields => true
}
#grok匹配出现异常时,丢掉该数据
if ("_grokparsefailure" in [tags]) {
drop { }
}
# http响应status!=200时,丢掉该数据
if ("200" != [status]) {
drop { }
}
}
}
# 输出
output {
# 防止多个conf造成进入 ES 的数据会重复,根据类型进行过滤
if([type] == "jetty-request-log"){
# 标准输出到ruby控制台,测试时使用
# stdout { codec => rubydebug}
# 输出到elasticsearch
elasticsearch {
# 主机列表,为数组类型,存在多个时,使用逗号进行分隔,例如["192.168.1.1:9200","192.168.1.2:9200"]
hosts => ["192.168.15.154:9200"]
# 索引名称,默认即可
index => "logstash-request-log-%{+YYYY.MM.dd}"
}
}
}
步骤 4 验证配置文件
执行命令 ./bin/logstash -f etc/app.conf -t
如果输出结果为Configuration OK,则说明配置文件正确,可以正常启动。
否则根据给出的错误提示进行检查修改。
步骤 5 启动程序
执行命令 ./bin/logstash -f etc/app.conf &
注意命令行后加上&,否则关闭shell窗口,该程序可能会随着关闭
如果是多个文件,执行命令./bin/logstash -f etc/conf/ &
etc/conf/ 为logstash配置文件存放相对位置
步骤 4 关闭程序
输入ps -ef|grep logstash
执行kill -9 11281
1.4 配置文件介绍(供参考)
Logstash就是一个收集器,我们需要为它指定Input和Output(当然Input和Output可以为多个)。
Logstash的配置文件主要分为三个部分Input,Filter,Output.
一个简单的配置文件为
input {
stdin{
}
}
filter {
}
output {
stdout{
}
}
下面主要介绍Input和Output插件
Input插件
stdin
标准输入,即从控制台输入数据,主要用于测试
file
文件输入,常用于从日志数据文件导入数据
以下为该插件常用的配置项
path
文件路径
数组类型,存在多个时,使用逗号进行分隔,例如["/tmp/1.log","/tmp/2.log"]
start_position
第一次读取文件内容时的位置
字符串类型,可选值为”beginning”,”end”。
默认为”end”,即从文件的最后一行开始读取
sincedb_path
记录日志文件已经读取的位置
字符串类型,这是一个文件路径而不是目录
默认在$HOME目录下生成文件名为 .sincedb_*,建议自己指定一个文件路径
add_field
增加额外字段到数据中
默认是一个空的键值对,即{}
type
给所有数据添加一个类型字段,可用于在Filter插件中进行特殊处理
字符串类型
ignore_older
忽略老文件,即如果文件已经太长时间没有进行修改,则不会去读取该文件内容
数字类型
默认是86400s,即修改时间为1天之前的文件会过滤掉,不会读取
Output插件
stdout
标准输出,即在控制台输出数据,主要用于测试
elasticsearch
hosts
远程elastic服务的地址
数组类型
默认为["127.0.0.1"],存在多个时,使用逗号进行分隔,例如["127.0.0.1:9200","127.0.0.2:9200"]
index
写入elasticsearch时的索引名称
字符串类型
默认为"logstash-%{+YYYY.MM.dd}"
jdbc插件
安装jdbc插件
[root@localhost logstash]# ./bin/logstash-plugin install logstash-input-jdbc
出现以下信息代表安装成功:
或者使用:
[root@localhost logstash]# ./bin/logstash-plugin list
查看所有安装插件。
配置文件参考
由于需要将数据中心的用户信息导出到elasticsearch中,所以需要重新配置fuc服务器上的logstash
1.将jdbc.conf配置文件拷贝到/usr/local/logstash/etc/conf/目录下,配置jdbc.conf
[root@localhost logstash]# vi etc/conf/jdbc.conf
input {
stdin {
}
jdbc {
# mysql jdbc 数据库链接地址
jdbc_connection_string => "jdbc:mysql://192.168.15.157:3306/ffk_fuc"
# 数据库用户名
jdbc_user => "root"
# 数据库密码
jdbc_password => "coship"
# mysql jdbc 驱动,需要手动拷贝到对应目录下
jdbc_driver_library => "/usr/local/logstash/lib/jdbc/mysql-connector-java-5.1.20-bin.jar"
# mysql数据库驱动名
jdbc_driver_class => "com.mysql.jdbc.Driver"
# 是否分页
jdbc_paging_enabled => "true"
# 每页取50000条
jdbc_page_size => "50000"
# 数据库时区
jdbc_default_timezone => "Asia/Shanghai"
#查询语句,sql_last_value为存储到.logstash_jdbc_last_run文件的上次查询标记
statement => "select id, name, nickname, phone, registerDate, userType, mainId, password from user_info where modifyTime >= :sql_last_value "
# 将会在每个整点执行一次导入操作
schedule => "0 * * * *"
#指定保存上次查询标记的文件位置
last_run_metadata_path => '/usr/local/logstash/.logstash_jdbc_last_run'
type => "jdbc"
}
}
filter {
# 防止多个conf造成进入 ES 的数据会重复,根据类型进行过滤
if([type] == "jdbc"){
json {
source => "message"
remove_field => ["message"]
}
}
}
output {
# 防止多个conf造成进入 ES 的数据会重复,根据类型进行过滤
if([type] == "jdbc"){
elasticsearch {
#es集群地址
hosts => ["192.168.15.159:9200"]
#写入es的index名称
index => "fuc"
#写入es的type名称
document_type => "userinfo"
#指定文档_id为数据库查询出来的id
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}
}
数据重新导入
如果在程序执行一段时间后需要重新全量导入用户数据,需要停止logstash,并执行以下操作:
[root@localhost logstash]# rm –rf .logstash_jdbc_last_run
再重启logstash
1.5常用命令
重载配置文件
使用kill -1 pid(进程号) 可以使logstash重新读取配置文件。如果修改后的配置文件是正确的,则会新的配置生效,否则仍以旧的配置属性运行。