设为首页 收藏本站
查看: 684|回复: 0

[经验分享] ELK+kafka收集 Nginx与tomcat日志

[复制链接]

尚未签到

发表于 2018-12-2 13:10:20 | 显示全部楼层 |阅读模式


ELK日志收集


  ELK原理与介绍
为什么用到ELK:
一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
一个完整的集中式日志系统,需要包含以下几个主要特点:
1.收集-能够采集多种来源的日志数据
2.传输-能够稳定的把日志数据传输到中央系统
3.存储-如何存储日志数据
4.分析-可以支持 UI 分析
5.警告-能够提供错误报告,监控机制
ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统。
ELK简介:
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
Filebeat隶属于Beats。目前Beats包含四种工具:
1.Packetbeat(搜集网络流量数据)
2.Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
3.Filebeat(搜集文件数据)
4.Winlogbeat(搜集 Windows 事件日志数据)
官方文档:
Filebeat:
https://www.elastic.co/cn/products/beats/filebeat
https://www.elastic.co/guide/en/beats/filebeat/5.6/index.html
Logstash:
https://www.elastic.co/cn/products/logstash
https://www.elastic.co/guide/en/logstash/5.6/index.html
Kibana:
https://www.elastic.co/cn/products/kibana
https://www.elastic.co/guide/en/kibana/5.5/index.html
Elasticsearch:
https://www.elastic.co/cn/products/elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html
elasticsearch中文社区:
https://elasticsearch.cn/
ELK架构图
架构图一:
  这是最简单的一种ELK架构方式。优点是搭建简单,易于上手。缺点是Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。
此架构由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web方便的对日志查询,并根据数据生成报表。
架构图二:
  此种架构引入了消息队列机制,位于各个节点上的Logstash Agent先将数据/日志传递给Kafka(或者Redis),并将队列中消息或数据间接传递给Logstash,Logstash过滤、分析后将数据传递给Elasticsearch存储。最后由Kibana将日志和数据呈现给用户。因为引入了Kafka(或者Redis),所以即使远端Logstash server因故障停止运行,数据将会先被存储下来,从而避免数据丢失。
架构图三:
  此种架构将收集端logstash替换为beats,更灵活,消耗资源更少,扩展性更强。同时可配置Logstash 和Elasticsearch 集群用于支持大集群系统的运维日志数据监控和查询
Filebeat工作原理:
Filebeat由两个主要组件组成:prospectors 和 harvesters。这两个组件协同工作将文件变动发送到指定的输出中。
  Harvester(收割机):负责读取单个文件内容。每个文件会启动一个Harvester,每个Harvester会逐行读取各个文件,并将文件内容发送到制定输出中。Harvester负责打开和关闭文件,意味在Harvester运行的时候,文件描述符处于打开状态,如果文件在收集中被重命名或者被删除,Filebeat会继续读取此文件。所以在Harvester关闭之前,磁盘不会被释放。默认情况filebeat会保持文件打开的状态,直到达到close_inactive(如果此选项开启,filebeat会在指定时间内将不再更新的文件句柄关闭,时间从harvester读取最后一行的时间开始计时。若文件句柄被关闭后,文件发生变化,则会启动一个新的harvester。关闭文件句柄的时间不取决于文件的修改时间,若此参数配置不当,则可能发生日志不实时的情况,由scan_frequency参数决定,默认10s。Harvester使用内部时间戳来记录文件最后被收集的时间。例如:设置5m,则在Harvester读取文件的最后一行之后,开始倒计时5分钟,若5分钟内文件无变化,则关闭文件句柄。默认5m)。
Prospector(勘测者):负责管理Harvester并找到所有读取源。Prospector会找到/apps/logs/*目录下的所有info.log文件,并为每个文件启动一个Harvester。Prospector会检查每个文件,看Harvester是否已经启动,是否需要启动,或者文件是否可以忽略。若Harvester关闭,只有在文件大小发生变化的时候Prospector才会执行检查。只能检测本地的文件。
Filebeat如何记录文件状态:
将文件状态记录在文件中(默认在/var/lib/filebeat/registry)。此状态可以记住Harvester收集文件的偏移量。若连接不上输出设备,如ES等,filebeat会记录发送前的最后一行,并再可以连接的时候继续发送。Filebeat在运行的时候,Prospector状态会被记录在内存中。Filebeat重启的时候,利用registry记录的状态来进行重建,用来还原到重启之前的状态。每个Prospector会为每个找到的文件记录一个状态,对于每个文件,Filebeat存储唯一标识符以检测文件是否先前被收集。
Filebeat如何保证事件至少被输出一次:
Filebeat之所以能保证事件至少被传递到配置的输出一次,没有数据丢失,是因为filebeat将每个事件的传递状态保存在文件中。在未得到输出方确认时,filebeat会尝试一直发送,直到得到回应。若filebeat在传输过程中被关闭,则不会再关闭之前确认所有时事件。任何在filebeat关闭之前为确认的时间,都会在filebeat重启之后重新发送。这可确保至少发送一次,但有可能会重复。可通过设置shutdown_timeout 参数来设置关闭之前的等待事件回应的时间(默认禁用)。
  Logstash工作原理:
Logstash事件处理有三个阶段:inputs → filters → outputs。是一个接收,处理,转发日志的工具。支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。
  Input:输入数据到logstash。
一些常用的输入为:
file:从文件系统的文件中读取,类似于tial -f命令
syslog:在514端口上监听系统日志消息,并根据RFC3164标准进行解析
redis:从redis service中读取
beats:从filebeat中读取
Filters:数据中间处理,对数据进行操作。
一些常用的过滤器为:
grok:解析任意文本数据,Grok 是 Logstash 最重要的插件。它的主要作用就是将文本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使用。内置120多个解析语法。
官方提供的grok表达式:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
grok在线调试:https://grokdebug.herokuapp.com/
mutate:对字段进行转换。例如对字段进行删除、替换、修改、重命名等。
drop:丢弃一部分events不进行处理。
clone:拷贝 event,这个过程中也可以添加或移除字段。
geoip:添加地理信息(为前台kibana图形化展示使用)
Outputs:outputs是logstash处理管道的最末端组件。一个event可以在处理过程中经过多重输出,但是一旦所有的outputs都执行结束,这个event也就完成生命周期。
一些常见的outputs为:
elasticsearch:可以高效的保存数据,并且能够方便和简单的进行查询。
file:将event数据保存到文件中。
graphite:将event数据发送到图形化组件中,一个很流行的开源存储图形化展示的组件。
Codecs:codecs 是基于数据流的过滤器,它可以作为input,output的一部分配置。Codecs可以帮助你轻松的分割发送过来已经被序列化的数据。
一些常见的codecs:
json:使用json格式对数据进行编码/解码。
multiline:将汇多个事件中数据汇总为一个单一的行。比如:java异常信息和堆栈信息。
  部署ELK:
1.搭建客户机Nginx
ls[root@nginx ~]# hostname
nginx
[root@nginx ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@nginx ~]# uname -r
2.6.32-431.el6.x86_64
[root@nginx ~]# /etc/init.d/iptables stop
iptables:将链设置为政策 ACCEPT:filter                    [确定]
iptables:清除防火墙规则:                                 [确定]
iptables:正在卸载模块:                                   [确定]
[root@nginx ~]# setenforce 0
setenforce: SELinux is disabled
[root@nginx ~]# chkconfig iptables off
[root@nginx ~]# tar xf nginx-1.13.12.tar.gz -C /usr/src/
[root@nginx ~]# useradd -M -s /sbin/nologin nginx
[root@nginx ~]# cd /usr/src/nginx-1.13.12/
[root@nginx nginx-1.13.12]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
[root@nginx nginx-1.13.12]# cp -p /usr/local/nginx/sbin/ /usr/local/sbin/
[root@nginx nginx-1.13.12]# nginx
[root@nginx nginx-1.13.12]# netstat -anpt|grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:
                   LISTEN      5605/nginx
3.部署Elasticserch(Logstash、Kibana三台都需要安装JDK)
1.查看系统环境:
[root@Elasticserch ~]# hostname
Elasticserch
[root@Elasticserch ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@Elasticserch ~]# uname -r
2.6.32-431.el6.x86_64
[root@Elasticserch ~]# /etc/init.d/iptables stop         
[root@Elasticserch ~]# setenforce 0
2.安装JDK环境:
[root@Elasticserch ~]# tar xf jdk-8u161-linux-x64.tar.gz
[root@Elasticserch ~]# mv jdk1.8.0_161/ /usr/local/java
[root@Elasticserch ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
[root@Elasticserch ~]# source /etc/profile
[root@Elasticserch ~]# java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
3.安装Elasticserch节点:
[root@Elasticserch ~]# tar xf elasticsearch-6.2.4.tar.gz
[root@Elasticserch ~]# mv elasticsearch-6.2.4 /usr/local/elasticsearch
[root@Elasticserch ~]# cd /usr/local/elasticsearch/
[root@Elasticserch elasticsearch]# cd config/
[root@Elasticserch config]# cp elasticsearch.yml{,.default}     #备份配置文件,防止修改错误
4.修改配置文件:
[root@Elasticserch config]# vim elasticsearch.yml
cluster.name: my-es-cluster           #集群的名称
node.name: node-1                 #节点的名称
path.data: /usr/local/elasticsearch/data   #数据路径
path.logs: /usr/local/ elasticsearch /logs    #日志路径
bootstrap.memory_lock: false          #这行去掉注释把ture改成false,不改会造成服务启动报错
bootstrap.system_call_filter: false      #添加这行,否则启动会报错。
配置上述两行的原因:
这是在因为Centos6不支持SecComp,而ES5.2.0默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动。
network.host: 192.168.200.132          # elasticsearch主机地址
http.port: 9200                        #端口号
discovery.zen.ping.unicast.hosts: ["node-1"]  #启动新节点通过主机列表发现。
discovery.zen.minimum_master_nodes: 1    #总节点数
[root@elasticsearch ~]# vim /etc/security/limits.d/90-nproc.conf


  • soft    nproc     4096   #默认1024,改成4096
    [root@elasticsearch ~]# vim /etc/sysctl.conf
    #末尾追加否则服务会报错。
    vm.max_map_count=655360
    [root@elasticsearch ~]# sysctl -p   #使上述配置生效
    3.创建elasticsearch运行的用户:
    [root@Elasticserch config]# useradd elasticsearch
    [root@Elasticserch config]# chown -R elasticsearch.elasticsearch /usr/local/elasticsearch/
    4.修改文件句柄数:
    [root@Elasticserch config]# vim /etc/security/limits.conf
    #添加下面内容:
  • soft    nofile           65536
  • hard    nofile           65536
  • soft    nproc           65536
  • hard    nproc           65536
    5.切换用户启动服务
    [root@Elasticserch config]# su - elasticsearch -c '/usr/local/elasticsearch/bin/elasticsearch'
    echo "su - elasticsearch -c '/usr/local/elasticsearch/bin/elasticsearch'"  >> /etc/rc.local注:如果启动错误请看下上述配置过程×××标记的部分是否有配置错误或者没有配置。
  6.查看服务是否启动成功
[root@elasticsearch ~]# netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:111                 0.0.0.0:                   LISTEN      970/rpcbind         
tcp        0      0 0.0.0.0:22                  0.0.0.0:
                   LISTEN      1150/sshd           
tcp        0      0 0.0.0.0:56600               0.0.0.0:                   LISTEN      988/rpc.statd      
tcp        0      0 127.0.0.1:25                0.0.0.0:
                   LISTEN      1226/master         
tcp        0     64 192.168.200.132:22          192.168.200.2:62459         ESTABLISHED 1301/sshd           
tcp        0      0 :::111                      :::                        LISTEN      970/rpcbind         
tcp        0      0 ::ffff:192.168.200.132:9200 :::
                        LISTEN      3990/java           
tcp        0      0 ::ffff:192.168.200.132:9300 :::                        LISTEN      3990/java           
tcp        0      0 :::52916                    :::
                        LISTEN      988/rpc.statd      
tcp        0      0 :::22                       :::                        LISTEN      1150/sshd           
tcp        0      0 ::1:25                      :::
                        LISTEN      1226/master      
7.简单测试下:
[root@elasticsearch ~]# curl http://192.168.200.132:9200
{
"name" : "node-1",
"cluster_name" : "my-es-cluster",
"cluster_uuid" : "tMW5tRXMTwO0g1i9BAp0rg",
"version" : {
"number" : "6.2.4",
"build_hash" : "ccec39f",
"build_date" : "2018-04-12T20:37:28.497551Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
说明服务正常。
8.安装head插件:
[root@Elasticserch ~]# vim /usr/local/elasticsearch/config/elasticsearch.yml

增加参数,使head插件可以访问es
  http.cors.enabled: true
http.cors.allow-origin: ""
下载head插件
wget https://github.com/mobz/elasticsearch-head/archive/master.zip
安装node
wget https://npm.taobao.org/mirrors/node/latest-v4.x/node-v4.4.7-linux-x64.tar.gz
tar -zxvf node-v4.4.7-linux-x64.tar.gz
配置下环境变量,编辑/etc/profile添加
[root@Elasticserch ~]# vim /etc/profile.d/node.sh
export NODE_HOME=/root/node-v4.4.7-linux-x64
export PATH=$PATH:$NODE_HOME/bin
export DODE_PATH=$NODE_HOME/lib/node_modules
[root@Elasticserch ~]# . /etc/profile
安装grunt
grunt是基于Node.js的项目构建工具,可以进行打包压缩、测试、执行等等的工作,head插件就是通过grunt启动
[root@Elasticserch ~]# unzip master.zip
[root@Elasticserch ~]# cd elasticsearch-head-master/
[root@Elasticserch elasticsearch-head-master]# npm install -g grunt-cli         # 执行后会生成node_modules文件夹
[root@Elasticserch elasticsearch-head-master]# grunt -version
grunt-cli v1.2.0
[root@Elasticserch elasticsearch-head-master]# vim Gruntfile.js
connect: {
server: {
options: {
port: 9100,
base: '.',
keepalive: true
hostname: '
'             #添加这行
[root@Elasticserch elasticsearch-head-master]# vim _site/app.js
(function( app, i18n ) {

    var ui = app.ns("ui");
var services = app.ns("services");
app.App = ui.AbstractWidget.extend({
defaults: {
base_uri: null
},
init: function(parent) {
this._super();
this.prefs = services.Preferences.instance();
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://192.168.200.130:9200";            #改成es地址
  运行head
[root@Elasticserch elasticsearch-head-master]# grunt server &
  重启es
报错解决方法:
npm config set strict-ssl false
npm config set registry http://registry.cnpmjs.org
npm info underscore
npm --registry http://registry.cnpmjs.org info underscore
编辑 ~/.npmrc 加入下面内容
registry = http://registry.cnpmjs.org
4.部署Logstash节点
1.查看系统环境:
[root@Logstash ~]# hostname
Logstash
[root@Logstash ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@Logstash ~]# uname -r
2.6.32-431.el6.x86_64
[root@Logstash ~]# /etc/init.d/iptables stop
iptables:将链设置为政策 ACCEPT:filter                    [确定]
iptables:清除防火墙规则:                                 [确定]
iptables:正在卸载模块:                                   [确定]
[root@Logstash ~]# setenforce 0
setenforce: SELinux is disabled
2.安装logstash,通过它来监听数据源文件的新增内容经过logstash处理后上传到es里面。
[root@Logstash ~]# tar xf logstash-6.2.4.tar.gz
[root@Logstash ~]# mv logstash-6.2.4 /usr/local/logstash
  Logstash默认有input、filter、output三个区域,一般最少需要配置input和output即可!
logstash的本身默认的logstash.yml配置文件选择不修改即可!
7.测试下logstash,指定配置文件启动:
5.部署Kibana节点
1.查看系统环境:
[root@Kibana ~]# hostname
Kibana
[root@Kibana ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@Kibana ~]# uname -r
2.6.32-431.el6.x86_64
2.安装kibana
[root@Kibana ~]# tar xf kibana-6.2.4-linux-x86_64.tar.gz
[root@Kibana ~]# mv kibana-6.2.4-linux-x86_64 /usr/local/kibana
[root@Kibana ~]# cd /usr/local/kibana/config/
[root@Kibana config]# cp kibana.yml{,.default}
3.编辑配置文件:
[root@Kibana config]# vim kibana.yml
server.port: 5601              #这行去掉注释
server.host: "192.168.200.134"   #去掉注释,写上本机地址
elasticsearch.url: "http://192.168.200.132:9200"   #写上elasticsearch主机的IP
4.启动服务:
[root@Kibana config]# nohup /usr/local/kibana/bin/kibana &
log   [19:28:15.757] [info][status][plugin:kibana@6.2.4] Status changed from uninitialized to green - Ready
log   [19:28:15.871] [info][status][plugin:elasticsearch@6.2.4] Status changed from uninitialized to yellow - Waiting for Elasticsearch
log   [19:28:16.190] [info][status][plugin:timelion@6.2.4] Status changed from uninitialized to green - Ready
log   [19:28:16.209] [info][status][plugin:console@6.2.4] Status changed from uninitialized to green - Ready
log   [19:28:16.225] [info][status][plugin:metrics@6.2.4] Status changed from uninitialized to green - Ready
log   [19:28:16.299] [info][listening] Server running at http://192.168.200.134:5601
log   [19:28:16.448] [info][status][plugin:elasticsearch@6.2.4] Status changed from yellow to green - Ready
[root@Kibana ~]# netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:                   LISTEN      1123/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:
                   LISTEN      1199/master         
tcp        0      0 192.168.200.134:5601        0.0.0.0:                   LISTEN      1355/../bin/../node
tcp        0      0 192.168.200.134:22          192.168.200.2:65383         ESTABLISHED 1273/sshd           
tcp        0      0 192.168.200.134:39393       192.168.200.132:9200        ESTABLISHED 1355/../bin/../node
tcp        0      0 :::22                       :::
                        LISTEN      1123/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1199/master
5.打开浏览器访问192.168.200.134:5601
  6.Nginx安装filebeat收集日志:
1.安装filebeat:
[root@nginx ~]# vim /usr/local/filebeat/filebeat.yml
[root@nginx ~]# tar xf filebeat-6.2.4-linux-x86_64.tar.gz
[root@nginx ~]# mv filebeat-6.2.4-linux-x8664 /usr/local/filebeat
[root@nginx ~]# cp /usr/local/filebeat/filebeat.yml{,.default}
2.因为logstash默认没有Nginx日志格式需要手动创建添加:
[root@Logstash ~]# vim /usr/local/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/nginx
#将下面内容添加到文件里即可,下面内容是日志格式,和格式内容:
URIPARM1 [A-Za-z0-9$.+!*'|(){},~@#%&/=:;
?-[]]
URIPATH1 (?:/[A-Za-z0-9$.+!
'(){},~:;=@#%&_- ])+
URI1 (%{URIPROTO}://)?(?:%{USER}(?::[^@]
)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})?
NGINXACCESS %{IPORHOST:remote_addr} - (%{USERNAME:user}|-) [%{HTTPDATE:log_timestamp}] %{HOSTNAME:http_host} %{WORD:request_method} \"%{URIPATH1:uri}\" \"%{URIPARM1:param}\" %{BASE10NUM:http_status} (?:%{BASE10NUM:body_bytes_sent}|-) \"(?:%{URI1:http_referrer}|-)\" (%{BASE10NUM:upstream_status}|-) (?:%{HOSTPORT:upstream_addr}|-) (%{BASE16FLOAT:upstream_response_time}|-) (%{BASE16FLOAT:request_time}|-) (?:%{QUOTEDSTRING:user_agent}|-) \"(%{IPV4:client_ip}|-)\" \"(%{WORD:x_forword_for}|-)\"
注:日志默认路径/usr/local/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/
收集Nginx-access,Nginx-error日志
1.配置Logstash
[root@Logstash logstash]# vim /usr/local/logstash/config/nginx_log.conf
input {
beats {
port => "5044"
}
}
filter {
if [type] == "nginx"{
grok {
match => { "message" => "%{NGINXACCESS}" }
  }
  }
  date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => ["datetime"]
}
geoip {
source => "clientip"
}
  }
output {
if [fields][logsource] == "nginx_access"{
elasticsearch {
hosts => ["192.168.200.130:9200"]
index => "nginx_access"
}
}
if [fields][logsource] == "nginx_error"{
elasticsearch {
hosts => ["192.168.200.130:9200"]
index => "nginx_error"
}
}
  stdout { codec => rubydebug }
}
  2.配置filebeat:
[root@mobanji filebeat]# egrep -v "#|^$" filebeat.yml
filebeat.prospectors:


  • type: log
    fields:
    logsource: nginx_access
    log_type: access_log
    paths:

    • /usr/local/nginx/logs/access.log

  • type: log
    fields:
    logsource: nginx_error
    log_type: error_log
    paths:

    • /usr/local/nginx/logs/error.log
      output.logstash:
      hosts: ["192.168.200.131:5044"]
      结束原有的filebeat进程
      ps -elf | grep filebeat
      kill -9 pid
      启动filebeat
      nohup /usr/local/filebeat/filebeat &

  Redis做消息队列
1.连接从Redis中获取日志文件并存储到ES中
[root@Logstash ~]# vim /usr/local/logstash/config/redis.conf
input {
beats {
port => "5044"
}
redis {
data_type => "list"
key => "220"
host => "192.168.200.134"
port => 6379
db => 0
threads => 1
}
}
filter {
if [type] == "nginx"{
grok {
match => { "message" => "%{NGINXACCESS}" }
  }
  }
  date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => ["datetime"]
}
geoip {
source => "clientip"
}
  }
  output {
if [fields][logsource] == "220nginx_access"{
elasticsearch {
hosts => ["192.168.200.130:9200"]
index => "220nginx_access"
}
}
if [fields][logsource] == "220nginx_error"{
elasticsearch {
hosts => ["192.168.200.130:9200"]
index => "220nginx_error"
}
}

    stdout { codec => rubydebug }
  }
  2.将Nginx访问日志和错误日志推送到Redis消息队列中。
[root@mobanji filebeat]# egrep -v "#|^$" filebeat.yml
filebeat.prospectors:


  • type: log
    fields:
    logsource: 220nginx_access
    log_type: access_log
    fields_under_root: true
    paths:

    • /usr/local/nginx/logs/access.log

  • type: log
    fields:
    logsource: 220nginx_error
    log_type: error_log
    paths:

    • /usr/local/nginx/logs/error.log
      output.redis:
      hosts: ["192.168.200.134"]
      port: 6379
      db: 0
      timeout: 5
      key: "220"

  使用Kafka做消息队列
Kafka单节点部署
  注:需要先部署java
[root@Elasticserch ~]# tar xf jdk-8u161-linux-x64.tar.gz
[root@Elasticserch ~]# mv jdk1.8.0_161/ /usr/local/java
[root@Elasticserch ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
[root@Elasticserch ~]# source /etc/profile
[root@Elasticserch ~]# java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
  1,  安装zookeeper
tar xf zookeeper-3.4.10.tar.gz
mv zookeeper-3.4.10 /usr/local/
cd /usr/local/zookeeper-3.4.10/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
  tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data
dataLogDir=/var/zookeeper/logs
clientPort=2181
  ../bin/zkServer.sh start
tar xf kafka_2.11-2.0.0.tgz
mv kafka_2.11-2.0.0 /usr/local/kafka
cd /usr/local/kafka/config/
vim /usr/local/kafka/config/server.properties
  broker.id=1  设置节点的ID号,不能相同
listeners=PLAINTEXT://192.168.56.35:9092  设置监听的地址
log.dirs=/var/kafka/kafka-logs             指定日志目录
zookeeper.connect=192.168.56.35:2181     配置连接zookeeper
  已守护进程的方式启动kafka
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
  修改Nginx端的filebeat配置文件
vim filebeat.yml
filebeat.prospectors:


  • type: log
    fields:
    logsource: nginx_access
    log_type: access_log
    paths:

    • /usr/local/nginx/logs/access.log

  • type: log
    fields:
    logsource: nginx_error
    log_type: error_log
    paths:

    • /usr/local/nginx/logs/error.log
      output.kafka:
      enabled: true
      hosts: ["192.168.56.35:9092"]
      topic: "nginx-filebeat"
      partition.hash:
      reachable_only: true
      compression: gzip
      max_message_bytes: 1000000
      required_acks: 1
      logging.to_files: true

  修改完成后重新启动filebeat服务。
  新建log节点的配置文件,将之前的测试配置文件删除。
vim /usr/local/logstash/config/kafka_log.conf
input{
kafka{
bootstrap_servers => "192.168.56.35:9092"
topics => "nginx-filebeat"
consumer_threads => 1
decorate_events => true
codec => "json"
auto_offset_reset => "latest"
  }
  }
  filter {

if [type] == "nginx"{
grok {
match => { "message" => "%{NGINXACCESS}" }
  }
  }
  date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => ["datetime"]
}
geoip {
source => "clientip"
}
  }
output {
if [fields][logsource] == "nginx_access"{
elasticsearch {
hosts => ["192.168.56.30:9200"]
index => "nginx_access"
}
}
if [fields][logsource] == "nginx_error"{
elasticsearch {
hosts => ["192.168.56.30:9200"]
index => "nginx_error"
}
}
  stdout { codec => rubydebug }
}
  修改完成后重新启动logstash服务
/usr/local/logstash/bin/logstash /usr/local/logstash/config/kafka_log.conf
  出现以上信息代表日志分析成功。
前台启动无误后切换为后台启动
nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/kafka_log.conf.conf &
  收集tomcat日志
更改tomcat日志格式
vim conf/server.xml

  修改完成后重新启动tomcat
  在logstash节点新建tomcat的配置文件
vim /usr/local/logstash/config/kafka1.conf
input{
kafka{
bootstrap_servers => "192.168.56.35:9092"
topics => "tomcat-filebeat"
consumer_threads => 1
decorate_events => true
codec => "json"
auto_offset_reset => "latest"
  }
}
  output {
elasticsearch {
hosts => ["192.168.56.30:9200"]
index => "tomcat-access-%{+YYYY.MM.dd}"
codec => "json"
}}
修改完成后重新启动logstash
  在tomcat节点安装filebeat
vim /usr/local/filebeat/filebeat.yml
filebeat.prospectors:


  • type: log
    fields:
    logsource: tomcat_access
    log_type: access_log
    paths:

    • /usr/local/tomcat7/logs/tomcat_access_log*.log
      output.kafka:
      enabled: true
      hosts: ["192.168.56.35:9092"]
      topic: "tomcat-filebeat"
      partition.hash:
      reachable_only: true
      compression: gzip
      max_message_bytes: 1000000
      required_acks: 1
      logging.to_files: true

  启动filebeat




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-642401-1-1.html 上篇帖子: Tomcat 优化配置 下篇帖子: Linux 下安装JDK及Tomcat
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表