安装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重新读取配置文件。如果修改后的配置文件是正确的,则会新的配置生效,否则仍以旧的配置属性运行。