LogStash安装及综合案例

给你一囗甜甜゛ 提交于 2019-11-30 06:12:49

文章目录

14、LogStash介绍及安装

官网:
https://www.elastic.co/guide/en/logstash/current/index.html

1、介绍

logstash就是一个具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景。是一个input | filter | output 的数据流。

2 、node01机器安装LogStash

下载logstache并上传到第一台服务器的/home/es路径下,然后进行解压
#下载安装包—可以直接将已经下载好的安装包上传到/home/es路径下即可

cd /home/es 
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.7.0.tar.gz
#解压
tar -zxf logstash-6.7.0.tar.gz -C /export/servers/es/

3、Input插件

1、stdin标准输入和stdout标准输出

使用标准的输入与输出组件,实现将我们的数据从控制台输入,从控制台输出

cd /export/servers/es/logstash-6.7.0/
bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'


{
      "@version" => "1",
          "host" => "node01",
    "@timestamp" => 2018-10-13T08:33:13.126Z,
       "message" => "hello"
}

2、监控日志文件变化

Logstash 使用一个名叫 FileWatch 的 Ruby Gem 库来监听文件变化。这个库支持 glob 展开文件路径,而且会记录一个叫 .sincedb 的数据库文件来跟踪被监听的日志文件的当前读取位置。所以,不要担心 logstash 会漏过你的数据。
编写脚本

cd /export/servers/es/logstash-6.7.0/config
vim monitor_file.conf
#输入一下信息 
input{
    file{
        path => "/export/servers/es/datas/tomcat.log"
        type => "log"
        start_position => "beginning"
    }
}
output{
        stdout{
        codec=>rubydebug
        }
}

检查配置文件是否可用

cd /export/servers/es/logstash-6.7.0/
bin/logstash -f /export/servers/es/logstash-6.7.0/config/monitor_file.conf -t

成功会出现一下信息:
Config Validation Result: OK. Exiting Logstash

启动服务

cd /export/servers/es/logstash-6.7.0
bin/logstash -f /export/servers/es/logstash-6.7.0/config/monitor_file.conf

发送数据
新开xshell窗口通过以下命令发送数据

mkdir -p /export/servers/es/datas
echo "hello logstash" >> /export/servers/es/datas/tomcat.log

其它参数说明
Path=>表示监控的文件路径
Type=>给类型打标记,用来区分不同的文件类型。
Start_postion=>从哪里开始记录文件,默认是从结尾开始标记,要是你从头导入一个文件就把改成”beginning”.
discover_interval=>多久去监听path下是否有文件,默认是15s
exclude=>排除什么文件
close_older=>一个已经监听中的文件,如果超过这个值的时间内没有更新内容,就关闭监听它的文件句柄。默认是3600秒,即一个小时。
sincedb_path=>监控库存放位置(默认的读取文件信息记录在哪个文件中)。默认在:/data/plugins/inputs/file。
sincedb_write_interval=> logstash 每隔多久写一次 sincedb 文件,默认是 15 秒。
stat_interval=>logstash 每隔多久检查一次被监听文件状态(是否有更新),默认是 1 秒。

3、jdbc插件

jdbc插件允许我们采集某张数据库表当中的数据到我们的logstashe当中来

第一步:编写脚本

开发脚本配置文件

cd /export/servers/es/logstash-6.7.0/config
vim jdbc.conf
input {
  jdbc {
    jdbc_driver_library => "/home/es/mysql-connector-java-5.1.38.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://192.168.31.82:3306/userdb"
    jdbc_user => "root"
    jdbc_password => "admin"

    use_column_value => true
    tracking_column => "create_time"
  #  parameters => { "favorite_artist" => "Beethoven" }
    schedule => "* * * * *"
    statement => "SELECT * from emp where create_time > :sql_last_value ;"
  }
}



output{
        stdout{
        codec=>rubydebug
        }
}

第二步:上传mysql连接驱动包到指定路劲

将我们mysql的连接驱动包上传到我们指定的/home/es/路径下

第三步:检查配置文件是否可用

cd /export/servers/es/logstash-6.7.0/
bin/logstash -f /export/servers/es/logstash-6.7.0/config/jdbc.conf  -t

通过之后
Config Validation Result: OK. Exiting Logstash

第四步:启动服务

通过以下命令启动logstash

cd /export/servers/es/logstash-6.7.0
bin/logstash -f /export/servers/es/logstash-6.7.0/config/jdbc.conf

第五步:数据库当中添加数据

在我们的数据库当中手动随便插入数据,发现我们的logstash可以进行收集

4 systlog插件

syslog机制负责记录内核和应用程序产生的日志信息,管理员可以通过查看日志记录,来掌握系统状况
默认系统已经安装了rsyslog.直接启动即可
编写脚本

cd /export/servers/es/logstash-6.7.0/config
vim syslog.conf
input{
    tcp{
        port=> 6789
        type=> syslog
    }
    udp{
        port=> 6789
        type=> syslog
    }
}

filter{
    if [type] == "syslog" {
        grok {
                match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
                add_field => [ "received_at", "%{@timestamp}" ]
                add_field => [ "received_from", "%{host}" ]
        }
       date {
             match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
           }
    }
}

output{
    stdout{
        codec=> rubydebug
    }
}

检查配置文件是否可用

cd /export/servers/es/logstash-6.7.0
bin/logstash -f /export/servers/es/logstash-6.7.0/config/syslog.conf -t

启动服务
执行以下命令启动logstash服务

cd /export/servers/es/logstash-6.7.0
bin/logstash -f /export/servers/es/logstash-6.7.0/config/syslog.conf

发送数据
修改系统日志配置文件

sudo vim /etc/rsyslog.conf

添加一行以下配置
. @@node01:6789

#重启系统日志服务

sudo /etc/init.d/rsyslog restart

其它参数说明
在logstash中的grok是正则表达式,用来解析当前数据
原始数据其实是:

Dec 23 12:11:43 louis postfix/smtpd[31499]: connect from unknown[95.75.93.154]
Jun 05 08:00:00 louis named[16000]: client 199.48.164.7#64817: query (cache) 'amsterdamboothuren.com/MX/IN' denied
Jun 05 08:10:00 louis CRON[620]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)
Jun 05 08:05:06 louis rsyslogd: [origin software="rsyslogd" swVersion="4.2.0" x-pid="2253" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.

4、filter插件

Logstash之所以强悍的主要原因是filter插件;通过过滤器的各种组合可以得到我们想要的结构化数据。

1、grok正则表达式

grok正则表达式是logstash非常重要的一个环节;可以通过grok非常方便的将数据拆分和索引
语法格式:
(?pattern)
?表示要取出里面的值,pattern就是正则表达式

1、收集控制台输入数据,采集日期时间出来

第一步:开发配置文件

cd /export/servers/es/logstash-6.7.0/config/
vim filter.conf
input {stdin{}} filter {
        grok {
                match => {
"message" => "(?<date>\d+\.\d+)\s+"
                }       
        }       
}       
output {stdout{codec => rubydebug}}

第二步:启动logstash服务

cd /export/servers/es/logstash-6.7.0/
bin/logstash -f /export/servers/es/logstash-6.7.0/config/filter.conf

第三步:控制台输入文字
5.20 今天天气还不错ya

2、使用grok收集nginx日志数据

nginx一般打印出来的日志格式如下

36.157.150.1 - - [05/Nov/2018:12:59:28 +0800] "GET /phpmyadmin_8c1019c9c0de7a0f/js/get_scripts.js.php?scripts%5B%5D=jquery/jquery-1.11.1.min.js&scripts%5B%5D=sprintf.js&scripts%5B%5D=ajax.js&scripts%5B%5D=keyhandler.js&scripts%5B%5D=jquery/jquery-ui-1.11.2.min.js&scripts%5B%5D=jquery/jquery.cookie.js&scripts%5B%5D=jquery/jquery.mousewheel.js&scripts%5B%5D=jquery/jquery.event.drag-2.2.js&scripts%5B%5D=jquery/jquery-ui-timepicker-addon.js&scripts%5B%5D=jquery/jquery.ba-hashchange-1.3.js HTTP/1.1" 200 139613 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"

这种日志是非格式化的,通常,我们获取到日志后,还要使用mapreduce 或者spark 做一下清洗操作,
就是将非格式化日志编程格式化日志;
在清洗的时候,如果日志的数据量比较大,那么也是需要花费一定的时间的;
所以可以使用logstash 的grok 功能,将nginx 的非格式化数据采集成格式化数据:

第一步:安装grok插件

第一种方式安装:在线安装(强烈不推荐)
在线安装grok插件

cd /export/servers/es/logstash-6.7.0/
vim Gemfile
#source 'https://rubygems.org'    # 将这个镜像源注释掉
source https://gems.ruby-china.com/  # 配置成中国的这个镜像源

准备在线安装

cd /export/servers/es/logstash-6.7.0/
bin/logstash-plugin  install logstash-filter-grok

第二种安装方式,直接使用我已经下载好的安装包进行本地安装(强烈推荐使用)
上传我们的压缩包logstash-filter-grok-4.0.4.zip上传到/export/servers/es/logstash-6.7.0 这个路径下面
然后准备执行本地安装

cd /export/servers/es/logstash-6.7.0/
bin/logstash-plugin install file:///export/servers/es/logstash-6.7.0/logstash-filter-grok-4.0.4.zip

安装成功之后查看logstash的插件列表

cd /export/servers/es/logstash-6.7.0/
bin/logstash-plugin list
第二步:开发logstash的配置文件

定义logstash的配置文件如下,我们从控制台输入nginx的日志数据,然后经过filter的过滤,将我们的日志文件转换成为标准的数据格式

cd /export/servers/es/logstash-6.7.0/config
vim monitor_nginx.conf

input {stdin{}}
filter {
grok {
match => {
"message" => "%{IPORHOST:clientip} \- \- \[%{HTTPDATE:time_local}\] \"(?:%{WORD:method} %{NOTSPACE:request}(?:HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:status} %{NUMBER:body_bytes_sent} %{QS:http_referer} %{QS:agent}"
         }
     }
}
output {stdout{codec => rubydebug}}
第三步:启动logstash

执行以下命令启动logstash

cd /export/servers/es/logstash-6.7.0
bin/logstash -f /export/servers/es/logstash-6.7.0/config/monitor_nginx.conf
第四步:从控制台输入nginx日志文件数据

输入第一条数据

36.157.150.1 - - [05/Nov/2018:12:59:27 +0800] "GET /phpmyadmin_8c1019c9c0de7a0f/js/messages.php?lang=zh_CN&db=&collation_connection=utf8_unicode_ci&token=6a44d72481633c90bffcfd42f11e25a1 HTTP/1.1" 200 8131 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"

输入第二条数据

36.157.150.1 - - [05/Nov/2018:12:59:28 +0800] "GET /phpmyadmin_8c1019c9c0de7a0f/js/get_scripts.js.php?scripts%5B%5D=jquery/jquery-1.11.1.min.js&scripts%5B%5D=sprintf.js&scripts%5B%5D=ajax.js&scripts%5B%5D=keyhandler.js&scripts%5B%5D=jquery/jquery-ui-1.11.2.min.js&scripts%5B%5D=jquery/jquery.cookie.js&scripts%5B%5D=jquery/jquery.mousewheel.js&scripts%5B%5D=jquery/jquery.event.drag-2.2.js&scripts%5B%5D=jquery/jquery-ui-timepicker-addon.js&scripts%5B%5D=jquery/jquery.ba-hashchange-1.3.js HTTP/1.1" 200 139613 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"

5、 Output插件

1 标准输出到控制台

将我们收集的数据直接打印到控制台

output {
    stdout {
        codec => rubydebug
    }
}
bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
[es@node01 logstash]$ bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
hello

2 将采集数据保存到file文件中

logstash也可以将收集到的数据写入到文件当中去永久保存,接下来我们来看看logstash如何配置以实现将数据写入到文件当中

第一步:开发logstash的配置文件

cd /export/servers/es/logstash-6.7.0/config
vim output_file.conf

input {stdin{}}
output {
    file {
        path => "/export/servers/es/datas/%{+YYYY-MM-dd}-%{host}.txt"
        codec => line {
            format => "%{message}"
        }
        flush_interval => 0
    }
}

第二步:检测配置文件并启动logstash服务

cd /export/servers/es/logstash-6.7.0

检测配置文件是否正确

bin/logstash -f config/output_file.conf -t

启动服务,然后从控制台输入一些数据

bin/logstash -f config/output_file.conf

查看文件写入的内容

cd /export/servers/es/datas
more 2018-11-08-node01.hadoop.com.txt

3 将采集数据保存到elasticsearch

第一步:开发logstash的配置文件

cd /export/servers/es/logstash-6.7.0/config
vim output_es.conf
input {stdin{}}
output {
    elasticsearch {
        hosts => ["node01:9200"]
        index => "logstash-%{+YYYY.MM.dd}"
    }
}

这个index是保存到elasticsearch上的索引名称,如何命名特别重要,因为我们很可能后续根据某些需求做查询,所以最好带时间,因为我们在中间加上type,就代表不同的业务,这样我们在查询当天数据的时候,就可以根据类型+时间做范围查询

第二步:检测配置文件并启动logstash

检测配置文件是否正确

cd /export/servers/es/logstash-6.7.0
bin/logstash -f config/output_es.conf -t 

启动logstash

bin/logstash -f config/output_es.conf

第三步:es当中查看数据

访问
http://node01:9100/
查看es当中的数据

注意:
更多的input,filter,output组件参见以下链接
https://www.elastic.co/guide/en/logstash/current/index.html

16、logStash+ES综合案例

ELK Stack全量日志查询
在实际工作当中,我们经常会对服务器当中产生的各种日志比较感兴趣,因为产生的日志可以很好的说明我们的服务器的工作状态是否正常,日志的也可以供我们排查各种错误等。所以很多时候我们都会收集各种日志进行汇总,方便我们统一的查看,有了ELK技术栈之后,我们就可以很轻松方便的使用logstash来进行收集我们的日志数据,然后将数据存储到ES当中,然后通过kibana的可视化工具来查看我们的日志数据了

1、采集服务器运行产生的日志

1.1、rsyslog的基本介绍

每台linux服务器运行的时候,系统都会产生一些日志出来,我们可以收集这些日志以便于我们查看linux服务器运行的状况等
Rsyslog 是CentOS6.X 自带的一款系统日志工具:
具有以下多种特性
1.支持多线程
2.支持TCP,SSL,TLS,RELP 等协议
3.支持将日志写入MySQL, PGSQL, Oracle 等多种关系型数据中
4.拥有强大的过滤器,可实现过滤系统信息中的任意部分
5.可以自定义日志输出格式
接下来我们来看如何通过rsyslog来收集我们的系统日志
Rsyslog 配置文件介绍:
/etc/rsyslog.conf 文件:

*.info;mail.none;authpriv.none;cron.none	/var/log/messages.	各类型日志存放位置
cron.*	/var/log/cron	具体日志存放的位置
authpriv.*	/var/log/secure	认证授权认证
mail.*	-/var/log/maillog	邮件日志
cron.*	/var/log/cron	任务计划相关日志
kern		内核相关日志
lpr		打印
mark(syslog)		rsyslog 服务内部的信
息,时间标识
news		新闻组
user		用户程序产生的相关信
息
uucp		协议
local 0~7		用户自定义日志级别

日志级别:
rsyslog 共有7 种日志级别,数字代号从 0~7。具体的意义如下所示:

0 debug –有调式信息的,日志信息最多
1 info 一般信息的日志,最常用
2 notice –最具有重要性的普通条件的信息
3 warning –警告级别
4 err –错误级别,阻止某个功能或者模块不能正常工作的信息
5 crit –严重级别,阻止整个系统或者整个软件不能正常工作的信息
6 alert –需要立刻修改的信息
7 emerg –内核崩溃等严重信息

本项目中,将日志级别调整成3,并将日志信息发送至node01服务器的6789这个端口

1.2、修改rsyslog的配置文件

我们修改node01服务器的rsyslog的配置,

sudo vim /etc/rsyslog.conf

添加以下三行配置

local3.* /var/log/boot.log
*.warning /var/log/warning_Log
*.* @@node01:6789

1.3、重启linux服务器的rsyslog服务

执行以下命令重启rsyslog服务

sudo /etc/init.d/rsyslog restart

1.4、开发logstash的配置文件,收集rsyslog日志

切换到logstash的配置文件目录下,开发logstash的配置文件

cd /export/servers/es/logstash-6.7.0/config
vim rsyslog.conf

input {
    tcp {
    port => "6789"   #监控6789端口
    type => "rsyslog"   #日志类型是rsyslog
   }
}
filter {
  if [type] == "rsyslog" {   # 做一次判断,只要从6789端口过来的rsyslog日志
    grok { # 通过正则表达式,取出想要的字段
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ] #将系统的日志格式化成标准国际化时间
    }
  }
}
output{   #将日志打入elasticsearch
    if [type] == "rsyslog"{
       stdout{codec=>rubydebug}
       elasticsearch {
       action => "index"
       hosts  => "node01:9200"
       index  => "logstash-%{type}-%{+yyyy.MM.dd}"
   }
 }
}

1.5、启动logstash服务

执行以下命令启动logstash服务

cd /export/servers/es/logstash-6.7.0
bin/logstash -f config/rsyslog.conf

2、采集服务器用户操作所有历史日志

用户在命令行环境下的操作日志都会被系统记录下来;比如我们输入history命令,都会展示出每一个用户输入过的命令;
.bash_history文件,这个日志格式我们可以定义成我们需要显示的内容,方便我们排查或者做入侵检查的时候;
自定义日志格式:

HISTFILESIZE=4000     #保存命令的记录总数
HISTSIZE=4000         #  history 命令输出的记录数
HISTTIMEFORMAT='%F %T'   #输出时间格式
export HISTTIMEFORMAT.  #自定义日志输出格式,也就是取出我们想要的字段,以json的形式
HISTTIMEFORMAT修改线上的相关格式
PROMPT_COMMAND实时记录历史命令(一般用在存储history命令道文件中)

第一步:定义日志格式

修改/etc/bashrc配置文件,然后添加以下配置

sudo  vim /etc/bashrc
HISTDIR='/var/log/command.log'
if [ ! -f $HISTDIR ];then
touch $HISTDIR
chmod 666 $HISTDIR
fi
export HISTTIMEFORMAT="{\"TIME\":\"%F%T\",\"HOSTNAME\":\"$HOSTNAME\",\"LI\":\"$(who am i 2>/dev/null| awk '{print $NF}'|sed -e's/[()]//g')\",\"LOGIN_USER\":\"$(who am i|awk '{print$1}')\",\"CHECK_USER\":\"${USER}\",\"CMD\":\""

export PROMPT_COMMAND='history 1|tail -1|sed "s/^[ ]\+[0-9]\+  //"|sed "s/$/\"}/">>/var/log/command.log'

使配置修改立即生效
这个命令必须使用root用户来执行

export PROMPT_COMMAND='history >> /var/log/command.log'
source /etc/bashrc

第二步:开发logstash的配置文件

继续开发我们logstash的配置文件

cd /export/servers/es/logstash-6.7.0/config
vim history.conf
input {
    file {
        path => ["/var/log/command.log"]
        type => "command"
        codec => "json"
    }
  }
output{
    if [type] == "command"{
       stdout{codec=>rubydebug}
       elasticsearch {
       hosts  => "node01:9200"
       index  => "history-%{+yyyy.MM.dd}"
   }
 }
}

第三步:启动logstash

启动logstash:

cd /export/servers/es/logstash-6.7.0
bin/logstash -f config/history.conf

执行source,让环境变量立即生效
source /etc/bashrc
node01服务器任意目录执行任意命令,然后去9100页面,查看是否已经把history日志灌入elasticsearch

3、采集nginx日志到es当中

第一步:上传日志文件

node01机器创建文件夹,将我们的nginx的日志都上传到

/export/servers/es/esdatas
mkdir -p  /export/servers/es/esdatas 

第二步:开发logstash的配置文件

cd /export/servers/es/logstash-6.7.0/config
vim nginxlog.conf
input{
  file {
	path =>  "/export/servers/es/esdatas/access.log"
        type => "access.log"
 	start_position => "beginning"
	}
}
filter {  
    grok {
            match => {
           	   "message" => "%{IPORHOST:clientip} \- \- \[%{HTTPDATE:time_local}\] \"(?:%{WORD:method} %{NOTSPACE:request}(?:HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:status} %{NUMBER:body_bytes_sent} %{QS:http_referer}"
		 }
        }
}
output {
       stdout{codec=>rubydebug}
       elasticsearch {
                action => "index"
                hosts =>"node01:9200"
                index => "nginxes"
     }
}

第三步:启动logstash并查看es当中的数据

执行以下命令启动logstash

cd /export/servers/es/logstash-6.7.0
bin/logstash -f /export/servers/es/logstash-6.7.0/config/nginxlog.conf
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!