关于elk:不背锅运维享一个具有高可用性和可伸缩性的ELK架构实战案例

写在开篇本文只分享各个链路环节的配置对接,对于环境的搭建,比方kafka集群、es集群的搭建等请自行实现。还有,业务利用的日志能够是你的其余业务日志,心愿本文能够起到抛砖援用的成果。测试架构 这个架构形容了一个将来自不同数据源的数据通过 Kafka 直达,而后应用 Logstash 将数据从 Kafka 中读取并解决,最终将解决后的数据再写回到 Kafka 中,以供 Elasticsearch 进行存储和剖析的过程。通过应用 Kafka 和 Logstash,能够将来自不同数据源的数据进行集中管理和解决,并将数据以牢靠的形式发送到 Elasticsearch 进行存储和剖析。这种架构具备高可用性和可伸缩性,并且能够在解决大量数据时提供良好的性能。同时,因为 Logstash 能够从多种起源读取数据,因而能够适应各种数据集成计划的需要。 留神:kafka集群a接管来自filebeat的音讯,并由logstash进行生产。kafka集群b接管来自logstash的音讯,并由es或者其余业务进行生产。 机器布局主机名角色IP备注srv-mysql8mysql+filebeat192.168.11.161业务数据库,filebeat读取mysql的日志wordpressnginx+filebeat192.168.11.170业务web利用,filebeat读取nginx的日志kafka01kafka节点192.168.11.247kafka集群a,broker.id=1kafka02kafka节点192.168.11.248kafka集群a,broker.id=2kafka03kafka节点192.168.11.249kafka集群a,broker.id=3logstash01logstash192.168.11.250第1套logstashkafka-b01kafka节点192.168.11.40kafka集群b,broker.id=10kafka-b02kafka节点192.168.11.41kafka集群b,broker.id=20kafka-b03kafka节点192.168.11.42kafka集群b,broker.id=30logstash02logstash192.168.11.133第2套logstashes-node01es节点(主)192.168.11.243es集群es-node02es节点192.168.11.244es集群es-node03es节点192.168.11.245es集群kibana-svrkibana192.168.11.246 留神:在同一个网段中,两个 Kafka 集群必须要应用不同的 broker.id,否则会导致抵触。因为 broker.id 是 Kafka 集群中惟一标识一个 Broker 的参数,同一个网段中不能存在两个具备雷同 broker.id 的 Broker。实战开撸创立kafka主题在kafka集群a中创立主题bin/kafka-topics.sh --create --zookeeper 192.168.11.247:2181 --replication-factor 2 --partitions 3 --topic wordpress-nginx-log装置和配置filebeat在装置了wordpress web的业务主机上进行装置下载和装置wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.6.2-x86_64.rpmrpm -ivh filebeat-8.6.2-x86_64.rpm filebeat version配置filebeat读取日志 关上和编辑/etc/filebeat/filebeat.yml配置文件,增加以下内容,使其读取Nginx拜访日志文件:filebeat.inputs:- type: log  enabled: true  paths:    - /usr/local/nginx/logs/wordpress.access.log  fields:    log_type: wordpress_accessoutput.kafka:  hosts: ["192.168.11.247:9092",192.168.11.248:9092,192.168.11.249:9092]  topic: "wordpress-nginx-log"启动filebeatsystemctl start filebeat配置logstash01,生产kafka集群a的音讯在logstash01主机上配置logstash,使其可能生产kafka集群a中主题为"wordpress-nginx-log"的音讯。 装置kafka插件bin/logstash-plugin install logstash-input-kafka留神:如果装置的时候提醒:ERROR: Installation aborted, plugin 'logstash-input-kafka' is already provided by 'logstash-integration-kafka',这个谬误提醒'logstash-input-kafka'插件曾经被Logstash集成插件'logstash-integration-kafka'提供了,能够间接应用 logstash-integration-kafka 插件生产 Kafka 音讯在 Logstash 的配置文件中应用 kafka 输出插件配置之前,先阐明下我的nginx日志自定义的格局: log_format my_log_format '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';创立和编辑配置文件config/wordpress-logstash.conf,增加以下内容: input { kafka { bootstrap_servers => "192.168.11.247:9092,192.168.11.248:9092,192.168.11.249:9092" topics => ["wordpress-nginx-log"] }}filter { # 解析Nginx日志行 grok { match => { "message" => '%{IPORHOST:clientip} - %{USERNAME:remote_user} [%{HTTPDATE:timestamp}] "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:status} %{NUMBER:body_bytes_sent} "%{DATA:http_referer}" "%{DATA:user_agent}"' } } # 将工夫戳转换为ISO 8601格局 date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] target => "@timestamp" }}output { stdout { codec => rubydebug }}启动 Logstashbin/logstash -f config/wordpress-logstash.conf 在这里,先让其输入到屏幕,看看是否失常。确保logstash生产kafka集群a的音讯没问题、以及确保过滤没问题能够失常打印到屏幕之后,就能够持续上面的步骤了。配置logstash01,过滤后的音讯写入到kafka集群b持续在logstash01上配置,从kafka集群a中生产数据并过滤,解决后写入到kafka集群b中的主题wordpress-web-log。在kafka集群b中创立主题bin/kafka-topics.sh --create --zookeeper 192.168.11.40:2181 --replication-factor 2 --partitions 3 --topic wordpress-web-log编辑配置文件config/wordpress-logstash.conf,配置outputinput { kafka { bootstrap_servers => "192.168.11.247:9092,192.168.11.248:9092,192.168.11.249:9092" topics => ["wordpress-nginx-log"] }}filter { # 解析Nginx日志行 grok { match => { "message" => '%{IPORHOST:clientip} - %{USERNAME:remote_user} [%{HTTPDATE:timestamp}] "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:status} %{NUMBER:body_bytes_sent} "%{DATA:http_referer}" "%{DATA:user_agent}"' } } # 将工夫戳转换为ISO 8601格局 date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] target => "@timestamp" }}output { kafka { bootstrap_servers => "192.168.11.40:9092,192.168.11.41:9092,192.168.11.42:9092" topic_id => "wordpress-web-log" }}编辑实现后,记得重启logstash哦。长期启动一个消费者,验证从kafka集群b生产主题wordpress-web-log的音讯bin/kafka-console-consumer.sh --bootstrap-server 192.168.11.40:9092 --topic wordpress-web-log如果能失常生产,读取到的音讯打印到管制台上,就能够持续上面的步骤了。配置logstash02,生产kafka集群a的音讯在logstash02主机上配置logstash,使其可能生产kafka集群b中主题为"wordpress-web-log"的音讯,并写入到ES集群关上并编辑config/logstash.conf,增加以下内容: ...

March 16, 2023 · 1 min · jiezi

关于elk:Filebeat-接入观测云用观测云替换-ELK

作者|小熊博望运维经理 —— 王明松 简略介绍一下ELK包含 ElasticSearch、Kibana 和 Logstash,Filebeat 负责在终端进行采集,将数据上报给 Logstash,存储在 ElasticSearch 或者其余存储(如 S3),最终通过 Kibana 来出现数据并进行剖析,设置告警等。咱们的原环境里一共有 5 个 ELK 集群,别离承当收集审计日志,收集业务日志,剖析业务日志的职能。其中收集审计日志是须要长期保留以供前期;收集业务日志是次要是谬误日志的收集和告警生成;剖析业务日志只是对业务状况进行实时展现,可靠性要求不高。通过评估,咱们筹备替换掉前两种收集审计日志和业务日志的共计 4 个 ELK 集群,只保留 1 个须要实时剖析业务日志的集群。观测云观测云是国内当先的可观测平台,基本功能能够齐全代替 ELK 来做日志收集,并且也能够做进一步的指标生成和告警告诉。DataKitDataKit 是观测云提供的需装置到主机上的采集器,也是数据上报给观测云的入口。(编者注:观测云还提供一种须要独立部署的可编程数据处理平台 DataFlux Func,也能够作数据采集器应用。)用观测云替换 ELK 的思路是什么?咱们尝试了以下几种替换计划: 计划一:Logstash 接入,只替换 ElasticSearch 和 Kibana 在咱们开始测试的时候,因过后 DataKit 1.2.19(2022 年 5 月 12 日之前的版本)不反对串联 Filebeat 采集器,而之后的 DataKit 版本尽管开始反对串联 Filebeat,但并不稳固,比方不反对 6.x 版本的 Filebeat。 所以过后的思路是 Logstash 对接 DataKit 的 Logstreaming 采集器,观测云代替掉 ElasticSearch 和 Kibana 性能,这不是一个完满的计划,咱们还须要保护十分消耗资源而且容易 crash 的 Logstash。这原本就是一个权宜之计,而且在 DataKit 1.4.0 下面试验用 Logstash 6.x 接入并不稳固,最终放弃。参考文档:https://docs.guance.com/integ... ...

January 14, 2023 · 2 min · jiezi

关于elk:Docker安装ELK8x

Docker装置ELK集成镜像一、下载ELK镜像搜寻镜像docker search sebp/elk [root@www ~]# docker search sebp/elkNAME DESCRIPTION STARS OFFICIAL AUTOMATEDsebp/elk Collect, search and visualise log data with … 1169 [OK]sebp/elkx Collect, search and visualise log data with … 43 [OK]下载镜像docker pull sebp/elk [root@www ~]# docker pull sebp/elkUsing default tag: latestlatest: Pulling from sebp/elkDigest: sha256:c5f1d0f845ab217ef509b8c6565d0c4a5dd8dea063a411b60dfb7c4508312acaStatus: Image is up to date for sebp/elk:latestdocker.io/sebp/elk:latest二、批改系统配置批改eleasticsearch用户权限vim /etc/security/limits.conf # 在最初面追加上面内容elk hard nofile 65536elk soft nofile 65536能够解决ELK启动报: ERROR: Elasticsearch did not exit normally - check the logs at /var/log/elasticsearch/elasticsearch.log错的问题 ...

September 6, 2022 · 2 min · jiezi

关于elk:为ELK提供SSL访问

五、设置ELK明码(可选)开启elasticsearch明码vim /data/elk/elasticsearch/config/elasticsearch.yml开端减少两行 # 开启明码xpack.security.transport.ssl.enabled: truexpack.security.enabled: true为kibana配置拜访明码vim /data/elk/kibana/config/kibana.yml开端减少用户名明码配置 # elk体系有很多的用户组,elastic是默认的用户组之一,能够应用默认的用户,也能够自定义用户elasticsearch.username: "elastic" elasticsearch.password: "1qaz@WSX3edc"重启ELKdocker restart elk重启可能报错. [elk] Exceptionorg.elasticsearch.ElasticsearchSecurityException: invalid SSL configuration for xpack.security.transport.ssl - server ssl configuration requires a key and certificate, but these have not been configured; you must set either [xpack.security.transport.ssl.keystore.path], or both [xpack.security.transport.ssl.key] and [xpack.security.transport.ssl.certificate] at org.elasticsearch.xpack.core.ssl.SSLService.validateServerConfiguration(SSLService.java:635) ~[?:?] at org.elasticsearch.xpack.core.ssl.SSLService.loadSslConfigurations(SSLService.java:612) ~[?:?] at org.elasticsearch.xpack.core.ssl.SSLService.<init>(SSLService.java:156) ~[?:?] at org.elasticsearch.xpack.core.XPackPlugin.createSSLService(XPackPlugin.java:461) ~[?:?] at org.elasticsearch.xpack.core.XPackPlugin.createComponents(XPackPlugin.java:310) ~[?:?] at org.elasticsearch.node.Node.lambda$new$14(Node.java:668) ~[elasticsearch-8.3.3.jar:?] at org.elasticsearch.plugins.PluginsService.lambda$flatMap$0(PluginsService.java:235) ~[elasticsearch-8.3.3.jar:?] at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273) ~[?:?] at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[?:?] at java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:720) ~[?:?] at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[?:?] at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?] at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575) ~[?:?] at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260) ~[?:?] at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616) ~[?:?] at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622) ~[?:?] at java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627) ~[?:?] at org.elasticsearch.node.Node.<init>(Node.java:681) ~[elasticsearch-8.3.3.jar:?] at org.elasticsearch.node.Node.<init>(Node.java:300) ~[elasticsearch-8.3.3.jar:?] at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:230) ~[elasticsearch-8.3.3.jar:?] at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:230) ~[elasticsearch-8.3.3.jar:?] at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) [elasticsearch-8.3.3.jar:?] at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:224) [elasticsearch-8.3.3.jar:?] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:67) [elasticsearch-8.3.3.jar:?][2022-09-05T19:41:12,778][ERROR][o.e.b.Elasticsearch ] [elk] fatal exception while booting Elasticsearchorg.elasticsearch.bootstrap.StartupException: org.elasticsearch.ElasticsearchSecurityException: invalid SSL configuration for xpack.security.transport.ssl - server ssl configuration requires a key and certificate, but these have not been configured; you must set either [xpack.security.transport.ssl.keystore.path], or both [xpack.security.transport.ssl.key] and [xpack.security.transport.ssl.certificate] at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:228) [elasticsearch-8.3.3.jar:?] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:67) [elasticsearch-8.3.3.jar:?]Caused by: org.elasticsearch.ElasticsearchSecurityException: invalid SSL configuration for xpack.security.transport.ssl - server ssl configuration requires a key and certificate, but these have not been configured; you must set either [xpack.security.transport.ssl.keystore.path], or both [xpack.security.transport.ssl.key] and [xpack.security.transport.ssl.certificate]较新的版本开启明码须要SSL证书, 如果报以上谬误, 还原下面五-第一步的操作, 再重启ELK生成证书; 如果ELK失常重启, 跳过以下步骤。3.1 重启ELKdocker restart elk3.2 进入docker docker exec -it elk /bin/bash3.3 生成elastic-stack-ca.p12文件 ...

September 6, 2022 · 2 min · jiezi

关于elk:Censtos7-安装部署-elastalert日志告警

装置依赖包yum -y install gcc libffi-devel python-devel openssl-devel4 ca-certificates openssl-dev openssl python2-dev python2 py2-pip py2-yaml libffi-dev gcc musl-dev wgetyum -y install wget openssl openssl-devel gcc gcc-c++下载Python3.6.9wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz解压,编译装置tar xf Python-3.6.9.tgzcd Python-3.6.9./configure --prefix=/usr/local/python --with-opensslmake && make install创立软链接,降级pipln -s /usr/local/python/bin/python3 /usr/bin/python3ln -s /usr/local/python/bin/pip3 /usr/bin/pip3pip install --upgrade pip验证python -V下载安装elastalertgit clone https://github.com/Yelp/elastalert.gitcd elastalertpip3 install "elasticsearch<7,>6"pip3 install -r requirements.txtpython3 setup.py install装置胜利后能够看到四个命令ll /usr/local/python/bin/elastalert* /usr/local/python/bin/elastalert /usr/local/python/bin/elastalert-create-index /usr/local/python/bin/elastalert-rule-from-kibana /usr/local/python/bin/elastalert-test-rule软连贯到/usr/bin下,方便使用ln -s /usr/local/python/bin/elastalert* /usr/bin应用官网文档:https://elastalert.readthedocs.io规定文档:https://elastalert.readthedocs.io/en/latest/ruletypes.html依据模板来写config.yamlcp config.yaml.example config.yamlvim config.yaml配置文件模板# 用来加载rule的目录,默认是example_rulesrules_folder: rules# 用来设置定时向elasticsearch发送申请,也就是告警执行的频率run_every: minutes: 1# 用来设置申请里工夫字段的范畴buffer_time: minutes: 15# elasticsearch的host地址es_host: 10.3.0.41# elasticsearch的端口es_port: 9200# elastalert产生的日志在elasticsearch中的创立的索引writeback_index: elastalert_status# 失败重试的工夫限度alert_time_limit: #days: 2 minutes: 15创立告警索引执行elastalert-create-index命令在ES创立索引,这不是必须的步骤,然而强烈建议创立。因为对于审计和测试很有用,并且重启ES不影响计数和发送alert.$ elastalert-create-index/usr/lib/python2.7/site-packages/elastalert-0.1.37-py2.7.egg/elastalert/create_index.py:65: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details. data = yaml.load(config_file)Elastic Version:6Mapping used for string:{'type': 'keyword'}New index elastalert_status createdDone!Rule配置它通过将Elasticsearch与两种类型的组件(规定类型和警报)联合应用。定期查问Elasticsearch,并将数据传递到规定类型,该规定类型确定何时找到匹配项。产生匹配时,将为该警报提供一个或多个警报,这些警报将依据匹配采取行动。这是由一组规定配置的,每个规定定义一个查问,一个规定类型和一组警报。 ...

June 6, 2022 · 2 min · jiezi

关于elk:Docker启动ELK失败

启动Docker时报错, 提醒vm.max_map_count值太小 bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]更改零碎vm.max_map_count设置值 [root@localhost /]# sysctl -w vm.max_map_count=262144vm.max_map_count = 262144# 再次查看[root@localhost /]# sysctl -a | grep vm.max_map_countvm.max_map_count = 262144

May 26, 2022 · 1 min · jiezi

关于elk:Centos7一键部署elasticsearch脚本

在脚本外面配置信息即可 #!/bin/bashinstall_es(){#配置信息HOSTNAME=`hostname`#所有节点NODE_1=node-1NODE_2=node-2NODE_3=node-3NODE_1_IP=10.0.0.21NODE_2_IP=10.0.0.22NODE_3_IP=10.0.0.23#启动用户明码es_userES_USER_PASSWORD=123cd /etc cat >> sysctl.conf <<EOF vm.max_map_count=262144EOFsysctl -pcd /usr/lib/sysctl.d/ cat >> 00-system.conf <<EOFnet.ipv4.ip_forward=1EOFsystemctl restart networkulimit -ncd /etc/security/cat >> limits.conf <<EOF* soft nofile 65535* hard nofile 65535* hard nproc 4096* soft nproc 4096EOF#创立es用户(ELK都用自建用户启动)useradd es_user#批改es用户明码echo "${ES_USER_PASSWORD}" | passwd --stdin es_user#同一目录mkdir -p {/data/software,/data/modules}cd /data/software/file="elasticsearch-7.16.1-linux-x86_64.tar.gz"if [ ! -f $file ]; then yum install -y wget && wget -c wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.16.1-linux-x86_64.tar.gz #exit 0fi#解压elasticsearch安装包cd /data/softwaretar -zxvf elasticsearch-7.16.1-linux-x86_64.tar.gz -C /data/modules/cd /data/modulesmv elasticsearch-7.16.1 escd /data/modules/es/configcat > elasticsearch.yml << EOF#node-1配置文件# 集群名称cluster.name: my-application# 集群节点名称node.name: ${HOSTNAME}# ES默认 只容许本地 127.0.0.1 和[::1] 拜访# 也能够设置成0.0.0.0 容许所有IP主机拜访# 如果不配置就默认认为是开发者模式,如果配置不正确会写入正告然而能正确运行# 如果配置了就会认为进入了生产环境, 如果配置不正确就会降级为异样,ES无奈正确启动。network.host: 0.0.0.0# 默认ES节点端口9200,如果是伪集群(在一台服务器上搭建集群),须要批改。http.port: 9200# 设置数据寄存门路,倡议批改这个门路到ES的装置文件夹里面,防止ES降级误删掉这个文件夹path.data: /data/modules/es/data/# 设置日志寄存门路,倡议批改这个门路到ES的装置文件夹里面,防止ES降级误删掉这个文件夹path.logs: /data/modules/es/log/# 发现其余节点主机配置 这里配置的是ES所在服务器的公网IP地址discovery.seed_hosts: ["${NODE_1_IP}:9300","${NODE_2_IP}:9300","${NODE_3_IP}:9300"]# 哪些节点能够被选举为主节点配置cluster.initial_master_nodes: ["${NODE_1}", "${NODE_2}","${NODE_3}"]EOF#配置内置JAVAcd /data/modules/es/bincat >> elasticsearch << EOFexport JAVA_HOME=/data/modules/es/jdkexport PATH=$JAVA_HOME/bin:$PATHEOFsleep 1s# 授予执行权限,modules文件夹权限受权给es_user 用户chmod u+x /data/modules/es/binchown -R es_user:es_user /data/modules/es# 将ES数据存储文件夹权限受权给es_user用户mkdir -p /data/modules/es/datachown -R es_user /data/modules/es/data# 将ES 日志存储文件夹权限受权给es_user用户mkdir -p /data/modules/es/log/chown -R es_user /data/modules/es/log/#端口firewall-cmd --zone=public --add-port=9200/tcp --permanent;firewall-cmd --zone=public --add-port=9300/tcp --permanent;firewall-cmd --zone=public --add-service=http --permanent;firewall-cmd --zone=public --add-service=https --permanent;firewall-cmd --reload;firewall-cmd --list-all;# 切换用户cd /data/modules/essu es_user}install_es手动启动./bin/elasticsearch

February 18, 2022 · 1 min · jiezi

关于ELK:ELKkafkafilebeatPrometheusGrafana

ELK+Kafka+FileBeat高可用集群环境筹备点击查看ELK对操作系统是否兼容点击查看ELK对JDK是否兼容信息列表ELK 是Elasticsearch ,Logstash, Kibana 的简称缩写,次要专一于可视化日志剖析和查问 Elastic Stack 次要包含三大部分: 海量数据存储和检索----- Elasticsearch 分布式存储和查问可视化界面和图表生成----Kibana 可提供可视化界面和各种图表的生成。可视化界面和图表生成----Kibana 可提供可视化界面和各种图表的生成。ELK 不过是Elastic Stack 用法中日志剖析栈的一部分 阐明: 不晓得你们有没有留神到,官网仿佛曾经无意在应用FileBeat 替换Logstash 采集日志了。Logstash 是由 Elastic 公司推出的一款开源的服务器端数据处理管道,可能同时从多个起源采集数据,转换数据,而后将数据发送指定的存储库中。Logstash 官网介绍。Filebeat 是 Elastic 公司为解决 Logstash “太重” 的问题推出的一款轻量级日志采集器,在解决数量泛滥的服务器、虚拟机和容器生成的日志时可应用 Logstash + Filebeat 的日志采集形式。Filebeat 官网介绍。架构图服务器IP主机名软件列表10.0.0.11Master-1Kibana,Prometheus+grafana,node_exporter10.0.0.12Master-2Kibana,kafka,zookeeper,node_exporter10.0.0.21Node-1Elasticsearch,Logstash,kafka,zookeeper,node_exporter10.0.0.22Node-2Elasticsearch,Logstash,kafka,zookeeper,node_exporter10.0.0.23Node-3Elasticsearch,Mysql,Nginx,redis,FileBeat,Logstashnode_exporter 软件应用版本 elasticsearch-7.16.1-linux-x86_64.tar.gzfilebeat-7.16.1-linux-x86_64.tar.gzlogstash-7.16.2-linux-x86_64.tar.gzkafka_2.13-3.0.0.tgzkibana-7.16.1-linux-x86_64.tar.gzprometheus-2.32.1.linux-amd64.tar.gzgrafana-enterprise-8.3.3.linux-amd64.tar.gz网盘链接 链接:https://pan.baidu.com/s/192mr...提取码:7777机器的配置都是 批改过程在Centos7 Linux 操作系统中,默认单个过程能够关上的最多文件数是1024 然而ES 对操作系统有些特殊要求 要求操作系统单个过程能够关上的最大文件数起码要达到65535.而且ES 将会应用很多线程,也须要批改下操作系统限度。如果不配置就会报错如下所示: bootstrap checks failed. You must address the points described in the following [3] lines before starting Elasticsearch.bootstrap check failure [1] of [3]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]bootstrap check failure [2] of [3]: max number of threads [3687] for user [elasticsearch] is too low, increase to at least [4096]bootstrap check failure [3] of [3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]查看以后操作系统反对单个过程能够关上的最多文件数,返回值如果没批改会显示1024 ...

December 27, 2021 · 7 min · jiezi

关于elk:elk7151安装部署搭建

ELK简介 ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称(然而前期呈现的Filebeat(beats中的一种)能够用来代替Logstash的数据收集性能,比拟轻量级)。市面上也被成为Elastic Stack。 Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监督您指定的日志文件或地位,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。Filebeat的工作形式如下:启动Filebeat时,它将启动一个或多个输出,这些输出将在为日志数据指定的地位中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将汇集事件,并将汇集的数据发送到为Filebeat配置的输入。 Logstash是收费且凋谢的服务器端数据处理管道,可能从多个起源采集数据,转换数据,而后将数据发送到您最喜爱的“存储库”中。Logstash可能动静地采集、转换和传输数据,不受格局或复杂度的影响。利用Grok从非结构化数据中派生出构造,从IP地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。 Elasticsearch是Elastic Stack外围的分布式搜寻和剖析引擎,是一个基于Lucene、分布式、通过Restful形式进行交互的近实时搜寻平台框架。Elasticsearch为所有类型的数据提供近乎实时的搜寻和剖析。无论您是结构化文本还是非结构化文本,数字数据或天文空间数据,Elasticsearch都能以反对疾速搜寻的形式无效地对其进行存储和索引。 Kibana是一个针对Elasticsearch的开源剖析及可视化平台,用来搜寻、查看交互存储在Elasticsearch索引中的数据。应用Kibana,能够通过各种图表进行高级数据分析及展现。并且能够为Logstash和ElasticSearch提供的日志剖析敌对的 Web 界面,能够汇总、剖析和搜寻重要数据日志。还能够让海量数据更容易了解。它操作简略,基于浏览器的用户界面能够疾速创立仪表板(Dashboard)实时显示Elasticsearch查问动静 残缺日志零碎基本特征 收集:可能采集多种起源的日志数据 传输:可能稳固的把日志数据解析过滤并传输到存储系统 存储:存储日志数据 剖析:反对UI剖析 正告:可能提供错误报告,监控机制 装置jdk17环境 root@elk:~# mkdir jdkroot@elk:~# cd jdkroot@elk:~/jdk# wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gzroot@elk:~/jdk# tar xf jdk-17_linux-x64_bin.tar.gzroot@elk:~/jdk# cd ..root@elk:~#root@elk:~# mv jdk/ /root@elk:~# vim /etc/profileroot@elk:~#root@elk:~#root@elk:~# tail -n 4 /etc/profileexport JAVA_HOME=/jdk/jdk-17.0.1/export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarroot@elk:~#root@elk:~# source /etc/profileroot@elk:~# chmod -R 777 /jdk/创立elk文件夹,并下载所需包 root@elk:~# mkdir elkroot@elk:~# cd elkroot@elk:~/elk# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.1-linux-x86_64.tar.gzroot@elk:~/elk# wget https://artifacts.elastic.co/downloads/kibana/kibana-7.15.1-linux-x86_64.tar.gzroot@elk:~/elk# wget https://artifacts.elastic.co/downloads/logstash/logstash-7.15.1-linux-x86_64.tar.gz解压安装包 root@elk:~/elk# tar xf elasticsearch-7.15.1-linux-x86_64.tar.gzroot@elk:~/elk# tar xf kibana-7.15.1-linux-x86_64.tar.gzroot@elk:~/elk# tar xf logstash-7.15.1-linux-x86_64.tar.gzroot@elk:~/elk# lltotal 970288drwxr-xr-x 5 root root 4096 Oct 20 06:09 ./drwx------ 7 root root 4096 Oct 20 06:04 ../drwxr-xr-x 9 root root 4096 Oct 7 22:00 elasticsearch-7.15.1/-rw-r--r-- 1 root root 340849929 Oct 14 13:28 elasticsearch-7.15.1-linux-x86_64.tar.gzdrwxr-xr-x 10 root root 4096 Oct 20 06:09 kibana-7.15.1-linux-x86_64/-rw-r--r-- 1 root root 283752241 Oct 14 13:34 kibana-7.15.1-linux-x86_64.tar.gzdrwxr-xr-x 13 root root 4096 Oct 20 06:09 logstash-7.15.1/-rw-r--r-- 1 root root 368944379 Oct 14 13:38 logstash-7.15.1-linux-x86_64.tar.gz创立用户并设置权限 ...

October 22, 2021 · 3 min · jiezi

关于ELK:ELK79-及Kafka-222-安装与配置

一、Kafka 2.2.21、server.properties 配置文件broker.id=128listeners=PLAINTEXT://cwbg001:9092num.network.threads=3num.io.threads=4socket.send.buffer.bytes=1024000socket.receive.buffer.bytes=1024000socket.request.max.bytes=104857600log.dirs=/home/kafka/kafka_2.12-2.2.2/datanum.partitions=3num.recovery.threads.per.data.dir=1offsets.topic.replication.factor=1transaction.state.log.replication.factor=1transaction.state.log.min.isr=1log.retention.hours=168log.segment.bytes=1073741824log.retention.check.interval.ms=300000zookeeper.connect=192.168.32.128:2181zookeeper.connection.timeout.ms=6000group.initial.rebalance.delay.ms=3000二、Filebeat7.9.3 1、filebeat.ymlfilebeat.inputs:- type: log enabled: true paths: - /home/elastic/elasticsearch-7.9.3/logs/elasticsearch_server.json fields: log_topic: 'prod-app-service-name-app-prod' exclude_files: [".tar$",".tgz$",".gz$",".bz2$",".zip$"]filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: false# output kafkaoutput.kafka: hosts: ["192.168.32.128:9092"] topic: '%{[fields.log_topic]}' partition.round_robin: reachable_only: true required_acks: 1 compression: gzip max_message_bytes: 1000000三、logstash 7.9.11、logstash.conf

July 31, 2021 · 1 min · jiezi

关于ELK:Centos6搭建ELK-02-安装使用Filebeat和Logstash

装置Filebeat官网文档:https://www.elastic.co/guide/... curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.13.3-x86_64.rpmsudo rpm -vi filebeat-7.13.3-x86_64.rpm配置文件门路 vim /etc/filebeat/filebeat.yml filebeat.config.modules: path: ${path.config}/modules.d/*.yml装置Logstash官网文档:https://www.elastic.co/cn/dow... vim /etc/yum.repos.d/logstash.repo[logstash-7.x]name=Elastic repository for 7.x packagesbaseurl=https://artifacts.elastic.co/packages/7.x/yumgpgcheck=1gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearchenabled=1autorefresh=1type=rpm-md装置 sudo yum install logstashrpm -ql logstash #查看装置目录ln -s /usr/share/logstash/bin/logstash /bin/ #创立软链接测试 logstash -e 'input { stdin { } } output { stdout {} }' #运行胜利后输出任意内容测试

July 21, 2021 · 1 min · jiezi

关于elk:CentOS7中搭建ELK分布式日志收集和分析-集群

介绍 体系结构 指标 在CentOS7中搭建ELK分布式日志治理;相熟ElasticSearch 集群配置;相熟Logstash+FileBeat数据采集配置;相熟Kibana可视化治理配置;环境 VMwareCentOS7Jdk 1.8elasticsearch-7.13.3-linux-x86_64.tar.gzkibana-7.13.3-linux-x86_64.tar.gzlogstash-7.13.3-linux-x86_64.tar.gzfilebeat-7.13.3-linux-x86_64.tar.gz剖析 ElasticSearch 集群构建 节点阐明192.168.157.120ES集群1192.168.157.121ES集群2Logstash + FileBeat 日志采集节点 节点阐明192.168.157.130日志节点192.168.157.131日志节点192.168.157.132日志节点Kibana 可视化治理 节点阐明192.168.157.122:5601可视化地址约定 下载寄存目录:/mysoft装置程序:ElasticSearch -> Kibana -> Logstash + filebeatElasticSearch 约定 模块内容软件装置地位/usr/local/elasticsearch集群端口9200集群名称ES数据文件寄存目录/usr/local/elasticsearch/data日志文件寄存目录/usr/local/elasticsearch/logs用户(非root)elastic明码(非root)elasticKibana 约定 模块内容软件装置地位/usr/local/Kibana本机端口5601本机地址192.168.157.122ES集群节点["http://192.168.157.120:9200","http://192.168.157.121:9200"]用户(非root)kibana明码(非root)kibanaLogstash +fileBeat 约定 模块内容Logstash装置地位/usr/local/elk/logstashFileBeat装置地位/usr/local/elk/fileBeat发送ES节点["http://192.168.157.120:9200","http://192.168.157.121:9200"]ElasticSearch 装置 通用操作进入目录cm /mysoft解压包tar zxvf elasticsearch-7.13.3-linux-x86_64.tar.gz挪动并批改名称mv elasticsearch-7.13.3 /usr/local/elasticsearchjdk问题解决vi /usr/local/elasticsearch/bin/elasticsearch-env用户与受权 # 创立用户useradd elastic# 设置明码passwd elastic# 赋予用户权限chown -R elastic:elastic /usr/local/elasticsearch/配置ES节点-1 #设置集群名称(集群名称,节点之间要保持一致)cluster.name: my-application#设置节点名称(节点名称,集群内要惟一 例:node-1 ,node-2)node.name: node-1# elasticsearch数据文件寄存目录path.data: /usr/local/elasticsearch/data# elasticsearch日志文件寄存目录path.logs: /usr/local/elasticsearch/logs#对所有IP凋谢network.host: 0.0.0.0# HTTP端口号http.port: 9200# ES集群地址discovery.seed_hosts: ["192.168.157.120", "192.168.157.121"]# ES集群节点cluster.initial_master_nodes: ["node-1", "node-2"]#跨域配置#action.destructive_requires_name: true配置ES节点-2 #设置集群名称(集群名称,节点之间要保持一致)cluster.name: my-application#设置节点名称(节点名称,集群内要惟一 例:node-1 ,node-2)node.name: node-2# elasticsearch数据文件寄存目录path.data: /usr/local/elasticsearch/data# elasticsearch日志文件寄存目录path.logs: /usr/local/elasticsearch/logs#对所有IP凋谢network.host: 0.0.0.0# HTTP端口号http.port: 9200# ES集群地址discovery.seed_hosts: ["192.168.157.120", "192.168.157.121"]# ES集群节点cluster.initial_master_nodes: ["node-1", "node-2"]#跨域配置#action.destructive_requires_name: true启动ES集群 ...

July 14, 2021 · 1 min · jiezi

关于ELK:Centos6搭建ELK-01-安装Elasticsearch

更换yum源CentOS 6曾经进行更新反对,同时官网也把yum源删除了,目前CentOS 6零碎应用yum命令装置软件包根本都是失败,因而须要更换yum源。 wget -O /etc/yum.repos.d/CentOS-Base.repo http://file.kangle.odata.cc/repo/Centos-6.repowget -O /etc/yum.repos.d/epel.repo http://file.kangle.odata.cc/repo/epel-6.repoyum makecache* 留神先备份一下原有的repo文件,免得出问题无奈复原 装置elasticsearch装置 yum install -y elasticsearch配置 vim /etc/elasticsearch/elasticsearch.ymlnode.name: master-nodepath.data: /data/elasticsearch/es-datapath.logs: /data/elasticsearch/es-loghttp.port: 9200vim /etc/elasticsearch/jvm.options-Xms1g-Xmx1g启动 开机启动 service elasticsearch startchkconfig elasticsearch on装置elasticsearch-head chrome浏览器插件下载地址https://files.cnblogs.com/fil... 查看端口占用 lsof -i:9100

July 10, 2021 · 1 min · jiezi

关于ELK:ELK-本地安装

1、下载EShttps://www.elastic.co/cn/dow...2、启动ES3、查看http://localhost:9200/4、下载logstashhttps://www.elastic.co/cn/dow...5、装置logstatsh5.1配置logstash input { tcp { port => "5044" codec => json } }output { elasticsearch { hosts => ["localhost:9200"] index => "document" } stdout { codec => rubydebug } }启动logstash D:\logstash-7.12.0\bin>logstash.bat -f ../config/logstash.conf装置logstash插件 D:\logstash-7.12.0\bin>logstash-plugin install 插件名6、下载kibanahttps://www.elastic.co/cn/dow...装置kibana,配置文件在config目录下 启动kibana 7、logback.xml配置 maven依赖 <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>4.9</version> </dependency>logback.xml配置 <configuration> <springProperty name="LOG_PATH" source="logging.path" defaultValue="/usr/data/applicationName" /> <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>127.0.0.1:5044</destination> <!-- <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" /> --> <!-- 日志输入编码 --> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <timestamp> <timeZone>UTC</timeZone> </timestamp> <pattern> <pattern> { "severity": "%level", "service": "applicationName", "thread": "%thread", "class": "%logger{40}", "msg": "%message" } </pattern> </pattern> </providers> </encoder> </appender> <root level="ERROR"> <appender-ref ref="LOGSTASH" /> </root></configuration>注意事项,装置目录最好不要有中文字符 ...

April 14, 2021 · 1 min · jiezi

关于ELK:ESElasticsearch集群常见问题Unassigned

问题一、索引呈现Unassigned问题如图问题呈现起因:因为该索引的主分片的正本未调配胜利导致。(根本原因应该是内存缓和)解决形式:1.确定有问题的索引列表(通过kibana查看:Kibana提供了Console UI来通过REST API与Elasticsearch交互,Console位于Kibana的Dev Tools栏下。) #查问索引列表及状态 GET /_cat/shards?v&h=index,shard,prirep,state,unassigned.reason #查问后果如下index shard prirep state unassigned.reason gaczrk 4 p STARTED gaczrk 4 r UNASSIGNED CLUSTER_RECOVERED gaczrk 2 p STARTED gaczrk 2 r UNASSIGNED CLUSTER_RECOVERED gaczrk 1 p STARTED#起因INDEX_CREATED: 因为创立索引的API导致未调配。CLUSTER_RECOVERED: 因为齐全集群复原导致未调配。INDEX_REOPENED: 因为关上open或敞开close一个索引导致未调配。DANGLING_INDEX_IMPORTED: 因为导入dangling索引的后果导致未调配。NEW_INDEX_RESTORED: 因为复原到新索引导致未调配。EXISTING_INDEX_RESTORED: 因为复原到已敞开的索引导致未调配。REPLICA_ADDED: 因为显式增加正本分片导致未调配。ALLOCATION_FAILED: 因为分片调配失败导致未调配。NODE_LEFT: 因为承载该分片的节点来到集群导致未调配。REINITIALIZED: 因为当分片从开始挪动到初始化时导致未调配(例如,应用影子shadow正本分片)。REROUTE_CANCELLED: 作为显式勾销从新路由命令的后果勾销调配。REALLOCATED_REPLICA: 确定更好的正本地位被标定应用,导致现有的正本调配被勾销,呈现未调配。# 2.查问单个索引配置信息GET /driver-2021.03.03/_settings# 后果如下{ "driver-2021.03.04" : { "settings" : { "index" : { "refresh_interval" : "5s", "number_of_shards" : "1", "provided_name" : "driver-2021.03.04", "creation_date" : "1614729630195", "number_of_replicas" : "1", "uuid" : "vUOn0P-9TkKCojmsEEjCdg", "version" : { "created" : "7060199" } } } }}#3.查问单个索引分片信息GET /driver-2021.03.04/_search_shards#后果如下:{ "nodes" : { "qKQnEdF6TMePf9GLiH-4Ng" : { "name" : "es-node2", "ephemeral_id" : "ksU4VNkhR4iMI-mPHOLu0Q", "transport_address" : "", "attributes" : { "ml.machine_memory" : "33531363328", "xpack.installed" : "true", "ml.max_open_jobs" : "20" } } }, "indices" : { "driver-2021.03.04" : { } }, "shards" : [ [ { "state" : "STARTED", "primary" : true, "node" : "qKQnEdF6TMePf9GLiH-4Ng", "relocating_node" : null, "shard" : 0, "index" : "driver-2021.03.04", "allocation_id" : { "id" : "q3luk6zmSw29aO16ZplWXw" } } ] ]}##联合2,3剖析:## number_of_shards(每个索引的主分片数) 1## number_of_replicas(每个主分片的正本数)1## 分片所占节点数=正本数+1理论节点数就只有一个,所以是索引的正本未调配 解决形式:重新分配正本数即.重置正本数 ...

March 4, 2021 · 1 min · jiezi

关于ELK:ELK

[client] vi /etc/rsyslog.conf <code># rsyslog configuration file manager by ansble#### MODULES ####$ModLoad imuxsock$ModLoad imjournal$ModLoad imklog#### GLOBAL DIRECTIVES ####$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # Use default timestamp format$WorkDirectory /var/lib/rsyslog # Where to place auxiliary files$IncludeConfig /etc/rsyslog.d/*.conf # Include all config files in /etc/rsyslog.d/$MaxMessageSize 128k$OmitLocalLogging on$IMJournalStateFile imjournal.state#### RULES ##### ### begin forwarding rule ###$ActionQueueFileName fwdRule1 # unique name prefix for spool files$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)$ActionQueueSaveOnShutdown on # save messages to disk on shutdown$ActionQueueType LinkedList # run asynchronously$ActionResumeRetryCount -1 # infinite retries if host is down*.* @@10.1.100.12:514# ### end of the forwarding rule ###</code>systemctl restart rsyslogsystemctl status rsyslog[server]==rsyslog==mkdir -p /var/log/LOGSfirewall-cmd --add-rich-rule='rule family="ipv4" source address="10.1.0.0/16" port port="514" protocol="tcp" accept' --permanentvi /etc/rsyslog.conf<code>$MaxMessageSize 128k$ModLoad imuxsock.so$ModLoad imklog.so$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat$SystemLogRateLimitInterval 0$SystemLogRateLimitBurst 0$ModLoad imtcp$InputTCPServerRun 514:msg,contains,"GET /daemon.php?tableid" ~:rawmsg,contains,"ASKMQ-WORKER 29" ~# Standard System Services$template DYNmessages,"/var/log/LOGS/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/messages"$template DYNsecure,"/var/log/LOGS/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/secure"$template DYNmaillog,"/var/log/LOGS/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/maillog"$template DYNcron,"/var/log/LOGS/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/cron"$template DYNspooler,"/var/log/LOGS/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/spooler"$template DYNboot,"/var/log/LOGS/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/boot.log"$template DYNiptables,"/var/log/LOGS/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/iptables.log"$template DYNaudit,"/var/log/LOGS/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/audit.log"$template DYNapache-access,"/var/log/LOGS/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/apache-access.log"$template DYNapache-error,"/var/log/LOGS/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/apache-error.log"if $programname == 'apache-access' then ?DYNapache-access&~if $programname == 'apache-error' then ?DYNapache-error&~if $programname == 'audispd' then ?DYNaudit&~if $msg contains 'iptables:' then ?DYNiptables&~if $syslogseverity <= '6' and ( $syslogfacility-text != 'mail' and $syslogfacility-text != 'authpriv' and $syslogfacility-text != 'cron') then ?DYNmessagesif $syslogfacility-text == 'authpriv' then ?DYNsecureif $syslogfacility-text == 'mail' then -?DYNmaillogif $syslogfacility-text == 'cron' then ?DYNcronif ( $syslogfacility-text == 'uucp' or $syslogfacility-text == 'news' ) and $syslogseverity-text == 'crit' then ?DYNspoolerif $syslogfacility-text == 'local7' then ?DYNboot</code>systemctl restart rsyslogsystemctl status rsyslogll /var/log/LOGS==logstash==参考文档https://www.elastic.co/cn/downloads/logstashrpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearchvi /etc/yum.repos.d/logstash.repo<code>[logstash-7.x]name=Elastic repository for 7.x packagesbaseurl=https://artifacts.elastic.co/packages/7.x/yumgpgcheck=1gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearchenabled=1autorefresh=1type=rpm-md</code>yum install logstashvi /etc/systemd/system/logstash.service<code>#User=logstash#Group=logstashUser=rootGroup=root</code>vi /etc/logstash/jvm.options<code># Xms represents the initial size of total heap space# Xmx represents the maximum size of total heap space-Xms8g-Xmx24g</code>systemctl start logstashsystemctl status logstashvi /etc/logstash/conf.d/apache.conf <code>input { file { type => "syslog" path => [ "/var/log/LOGS/**/cron", "/var/log/LOGS/**/messages", "/var/log/LOGS/**/secure" ] start_position => "beginning" exclude => ["*.gz"] } file { type => "apache-access" path => [ "/var/log/LOGS/**/apache-access.log" ] start_position => "beginning" exclude => ["*.gz"] } file { type => "apache-error" path => [ "/var/log/LOGS/**/apache-error.log" ] start_position => "beginning" exclude => ["*.gz"] }}filter { if [type] == "apache-access" { grok { match => { "message" => "%{SYSLOGTIMESTAMP} %{SYSLOGHOST:webserver} %{SYSLOGPROG}: %{HOSTNAME:host} \"%{GREEDYDATA:X-Forwarded-For}\" %{IPORHOST:HA_IP} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response:int} (?:%{NUMBER:bytes:int}|-) \"%{GREEDYDATA:referrer}\" \"%{GREEDYDATA:agent}\""} } if [X-Forwarded-For] == "-" { drop {} } mutate { remove_field => [ "message"] split => { "X-Forwarded-For" => ", " } } geoip { source => "X-Forwarded-For" } date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] remove_field => ["timestamp"] } } if [type] == "apache-error" { grok { match => { "message" => "%{SYSLOGTIMESTAMP} %{SYSLOGHOST:hostname} %{DATA}: \[%{HTTPDERROR_DATE:timestamp}\] \[%{LOGLEVEL:loglevel}\] (?:\[client %{IPORHOST:clientip}\] ){0,1}%{GREEDYDATA:error_message}" } } date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] } mutate { rename => ["hostname", "host"] } }}</code>vi /etc/logstash/conf.d/output.conf<code>output { elasticsearch { hosts => ["127.0.0.1:9200"] index => "logstash-%{type}-%{+YYYY.MM.dd}" template_overwrite => true }}</code>===elasticsearch===参考: https://www.elastic.co/cn/downloads/elasticsearchrpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearchvi /etc/yum.repos.d/elasticsearch.repo <code>[elasticsearch]name=Elasticsearch repository for 7.x packagesbaseurl=https://artifacts.elastic.co/packages/7.x/yumgpgcheck=1gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearchenabled=0autorefresh=1type=rpm-md</code>yum install --enablerepo=elasticsearch elasticsearchvi /etc/elasticsearch/elasticsearch.yml<code>cluster.name: gwj-elknode.name: gwj-logpath.data: /var/lib/elasticsearchpath.logs: /var/log/elasticsearchbootstrap.memory_lock: truenetwork.host: 0.0.0.0http.port: 9200cluster.initial_master_nodes: ["gwj-log"]</code>vi /etc/elasticsearch/jvm.options<code># Xms represents the initial size of total heap space# Xmx represents the maximum size of total heap space-Xms4g-Xmx4g</code>vi /etc/security/limits.conf<code>elasticsearch soft memlock unlimitedelasticsearch hard memlock unlimited</code>systemctl edit elasticsearch<code>[Service]LimitMEMLOCK=infinity</code>systemctl restart elasticsearchsystemctl status elasticsearchnetstat -tlncurl http://localhost:9200<code>{ "name" : "gwj-log", "cluster_name" : "gwj-elk", "cluster_uuid" : "8KPET2yDSCaQwfwncWSTQQ", "version" : { "number" : "7.10.0", "build_flavor" : "default", "build_type" : "rpm", "build_hash" : "51e9d6f22758d0374a0f3f5c6e8f3a7997850f96", "build_date" : "2020-11-09T21:30:33.964949Z", "build_snapshot" : false, "lucene_version" : "8.7.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search"}</code>查看是否生成索引ls -lh /var/lib/elasticsearch/nodes/0/indices/http://10.1.100.12:9200/_cat/indices?v===kibana===参考: https://www.elastic.co/guide/en/kibana/current/install.htmlrpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearchvi /etc/systemd/system/kibana.service<code>[Unit]Description=Kibana[Service]Type=simpleUser=kibanaGroup=kibana# Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.# Prefixing the path with '-' makes it try to load, but if the file doesn't# exist, it continues onward.EnvironmentFile=-/etc/default/kibanaEnvironmentFile=-/etc/sysconfig/kibanaExecStart=/usr/share/kibana/bin/kibanaRestart=on-failureRestartSec=3StartLimitBurst=3StartLimitInterval=60WorkingDirectory=/[Install]WantedBy=multi-user.target</code>yum install kibanasystemctl restart kibanasystemctl status kibanakibana - management - stack managementkibana - Index Patterns - create index pattern http://10.1.100.12:9200/_cat/indices?v

February 23, 2021 · 3 min · jiezi

关于elk:ELK-Filebeat-搭建日志系统

之前也介绍过 开源组件ELK日志系统配置与治理明天也聊一聊 ELK + Filebeat 搭建日志零碎 Elasticsearch分布式搜寻和剖析引擎。具备高可伸缩、高牢靠和易治理等特点。基于 Apache Lucene 构建,能对大容量的数据进行靠近实时的存储、搜寻和剖析操作。 Logstash日志收集器。收集各种数据源,并对数据进行过滤、剖析、格式化等操作,而后存储到 Elasticsearch。 Kibana数据分析和可视化平台。与 Elasticsearch 配合应用,对其中数据进行搜寻、剖析、图表展现。 Filebeat一个轻量级开源日志文件数据收集器,Filebeat 读取文件内容,发送到 Logstash 进行解析后进入 Elasticsearch,或间接发送到 Elasticsearch 进行集中式存储和剖析。 架构介绍基于ELK的应用形式,Logstash 作为日志收集器,Elasticsearch 进行日志存储,Kibana作为日志出现,大抵以下几种架构。 架构一 图中 Logstash 多个的起因是思考到程序是分布式架构的状况,每台机器都须要部署一个 Logstash,如果的确是单服务器的状况部署一个 Logstash 即可。 后面提到 Logstash 会对数据进行剖析、过滤、格式化等操作,这一系列操作对服务器的 CPU 和内存资源的耗费都是比拟高的,所以这种架构会影响每台服务器的性能,所以并不举荐采纳。 架构二 相比于架构一,减少了一个MQ 和 Logstash, Logstash 的输入和输出反对 Kafka、Redis、RabbitMQ 等常见音讯队列, MQ 前的 Logstash 只作为日志收集和传输,并不解析和过滤,先将日志退出队列,由 MQ 前面的 Logstash 持续解析和过滤,这样就不至于每台服务器耗费资源都很多。 架构三 这种架构是基于架构二简化来的,理论在应用过程中也是能够采取的,日志间接进入 MQ,Logstash 生产 MQ 数据即可。 架构四 这种架构在日志数据源和 Logstash(或 Elasticsearch) 中减少了 Beats 。Beats 汇合了多种繁多用处数据采集器,每款采集器都是以用于转发数据的通用库 libbeat 为基石,beat 所占的零碎CPU和内存简直能够忽略不计,libbeat平台还提供了检测机制,当上游服务器负载高或网络拥挤时,会主动升高产生速率。上面的例子咱们应用 Filebeat 来对文件日志的收集,其余的 beat 能够疏忽。 ...

November 25, 2020 · 2 min · jiezi

关于elk:集中日志系统ELK

作用以前都是登陆到每个机器去看日志,特地是一个服务有多个机器集群部署,还要下载多个机器的日志(运维下载日志,而后给开发排查问题),当初elk是集中式日志零碎,所有的我的项目和我的项目集群都在一个日志零碎里,而且能够搜寻。 界面 组成L是收集日志,还有解析日志 E是搜索引擎,就是ElasticSearch K就是界面 流程原始日志(L的客户端)——收集和解析日志(L的服务器端)——搜索引擎(E)——界面展现(K) 解释1.收集日志和解析日志 收集日志就是客户端到服务器,就是把L客户端装置到部署我的项目的机器,而后读原始日志文件,再写到L的服务器端。这是收集日志,就是:原始日志文件——L的客户端——L的服务器。 L的服务器还要解析日志,次要是解析为固定的几个字段,比方工夫、IP(哪个机器的日志)、日志自身的内容、我的项目名字(哪个我的项目的日志)。这几个固定字段是搜索引擎须要的字段。 2.搜索引擎 方才解析之后的字段,再写给搜索引擎。 3.界面 filebeat为什么要用filebeat,因为L的客户端性能不好,影响部署我的项目的机器,所以换了filebeat作为L的客户端,作用和L的客户端一样,都是收集日志,实质就是先读原始日志文件,而后再写到L的服务器。这就是filebeat的作用,对部署我的项目的机器无影响。 kafka为什么要用kafka,因为日志产生和日志生产的速度不匹配,还有因为网络起因,可能会导致数据失落,所以才要加消息中间件,因为消息中间件能够缓存海量数据,并且数据不会失落(失落可能性极小,不会大量失落数据)。 架构图的演变只有ELK L的客户端没有应用filebeat。 换了filebeat L的客户端换成了filebeat。 加了消息中间件 双层L 从左往右看 从右往左看 第一层L作用只是分流,第二层L作用是解析为固定几个字段。 参考https://mp.weixin.qq.com/s/F8...https://www.cnblogs.com/wangx... https://blog.qiniu.com/archiv... https://jusene.github.io/2018...

October 3, 2020 · 1 min · jiezi

关于elk:太赞了大佬竟然用ELK搭建起了支撑TB级的日志监控系统

起源:_https://www.cnblogs.com/dengb...本文次要介绍怎么应用 ELK Stack 帮忙咱们打造一个撑持起日产 TB 级的日志监控零碎。在企业级的微服务环境中,跑着成千盈百个服务都算是比拟小的规模了。在生产环境上,日志扮演着很重要的角色,排查异样须要日志,性能优化须要日志,业务排查须要业务等等。 然而在生产上跑着成千盈百个服务,每个服务都只会简略的本地化存储,当须要日志帮助排查问题时,很难找到日志所在的节点。也很难开掘业务日志的数据价值。 那么将日志对立输入到一个中央集中管理,而后将日志解决化,把后果输入成运维、研发可用的数据是解决日志治理、帮助运维的可行计划,也是企业迫切解决日志的需要。 咱们的解决方案 通过下面的需要咱们推出了日志监控零碎,如上图: 日志对立收集、过滤荡涤。生成可视化界面、监控,告警,日志搜寻。 性能流程概览如上图:在每个服务节点上埋点,实时采集相干日志。对立日志收集服务、过滤、荡涤日志后生成可视化界面、告警性能。咱们的架构 ①日志文件采集端咱们应用 FileBeat,运维通过咱们的后盾治理界面化配置,每个机器对应一个 FileBeat,每个 FileBeat日志对应的 Topic 能够是一对一、多对一,依据日常的日志量配置不同的策略。 除了采集业务服务日志外,咱们还收集了 MySQL 的慢查问日志和谬误日志,还有别的第三方服务日志,如:Nginx 等。 最初联合咱们的自动化公布平台,主动公布并启动每一个 FileBeat 过程。 ②调用栈、链路、过程监控指标咱们应用的代理形式:Elastic APM,这样对于业务侧的程序无需任何改变。 对于曾经在经营中的业务零碎来说,为了退出监控而须要改变代码,那是不可取的,也是无奈承受的。 Elastic APM 能够帮咱们收集 HTTP 接口的调用链路、外部办法调用栈、应用的SQL、过程的 CPU、内存应用指标等。 可能有人会有疑难,用了 Elastic APM,其它日志根本都能够不必采集了。还要用 FileBeat 干嘛? 是的,Elastic APM 采集的信息的确能帮咱们定位 80% 以上的问题,然而它不是所有的语言都反对的比方:C。 其二、它无奈帮你采集你想要的非 Error 日志和所谓的要害日志,比方:某个接口调用时出了错,你想看出错工夫点的前后日志;还有打印业务相干不便做剖析的日志。 其三、自定义的业务异样,该异样属于非零碎异样,属于业务领域,APM 会把这类异样当成零碎异样上报。 如果你前面对系统异样做告警,那这些异样将会烦扰告警的准确度,你也不能去过滤业务异样,因为自定义的业务异样品种也不少。 ③同时咱们对 Agent 进行了二开。采集更具体的 GC、堆栈、内存、线程信息。 ④服务器采集咱们采纳普罗米修斯。 ⑤因为咱们是 Saas 服务化,服务 N 多,很多的服务日志做不到对立规范化,这也跟历史遗留问题无关,一个与业务零碎无关的零碎去间接或间接地去对接已有的业务零碎,为了适配本人而让其更改代码,那是推不动的。 牛逼的设计是让本人去兼容他人,把对方当成攻打本人的对象。很多日志是没有意义的,比方:开发过程中为了不便排查跟踪问题,在 if else 里打印只是有标志性的日志,代表是走了 if 代码块还是 else 代码块。 ...

July 24, 2020 · 1 min · jiezi

ElasticSearch基础入门

ElasticSearch简写ES,ES是一个高扩展、开源的全文检索和分析引擎,它可以准实时地快速存储、搜索、分析海量的数据。 应用场景 我们常见的商城商品的搜索日志分析系统(ELK)基于大量数据(数千万的数据)需要快速调查、分析并且并将结果可视化的业务需求安装并运行ESJava环境安装Elastic 需要 Java 8 环境。如果你的机器还没安装 Java,可以参考JAVA安装 ElasticSearch安装安装完Java环境后,我们可以开始以下ElasticSearch安装或者根据官方文档安装 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zipunzip elasticsearch-5.5.1.zipcd elasticsearch-5.5.1/进入解压目录之后,运行下面命令,启动ElasticSearch ./bin/elasticsearch 如果此时报以下错误错误一OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N打开: elasticsearch-5.5.1/config/jvm.options 在末尾添加: -XX:-AssumeMP错误二OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)先执行: sysctl -w vm.max_map_count=262144再打开elasticsearch-5.5.1/config/jvm.options -Xmx512m-Xms512m错误三[2019-06-27T15:01:43,165][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main]org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root原因:elasticsearch自5版本之后,处于安全考虑,不允许使用root用户运行。 ...

June 28, 2019 · 3 min · jiezi

EFK接入kafka消息队列

1 前言在笔者最开始维护的日志服务中,日质量较小,没有接入kafka。随着业务规模扩增,日质量不断增长,接入到日志服务的产品线不断增多,遇到流量高峰,写入到es的性能就会降低,cpu打满,随时都有集群宕机的风险。因此,接入消息队列,进行削峰填谷就迫在眉睫。本文主要介绍在EFK的基础上如何接入kafka,并做到向前兼容。 2 主要内容如何搭建kafka集群原有EFK升级3 搭建kafka集群3.1 搭建zookeeper集群主要参考文章:【zookeeper安装指南】由于是要线上搭建集群,为避免单点故障,就需要部署至少3个节点(取决于多数选举机制)。 3.1.1 下载进入要下载的版本的目录,选择.tar.gz文件下载 3.1.2 安装使用tar解压要安装的目录即可,以3.4.5版本为例这里以解压到/home/work/common,实际安装根据自己的想安装的目录修改(注意如果修改,那后边的命令和配置文件中的路径都要相应修改) tar -zxf zookeeper-3.4.5.tar.gz -C /home/work/common3.1.3 配置在主目录下创建data和logs两个目录用于存储数据和日志: cd /home/work/zookeeper-3.4.5mkdir data mkdir logs在conf目录下新建zoo.cfg文件,写入如下配置: tickTime=2000 dataDir=/home/work/common/zookeeper1/data dataLogDir=/home/work/common/zookeeper1/logs clientPort=2181 initLimit=5 syncLimit=2 server.1=192.168.220.128:2888:3888 server.2=192.168.222.128:2888:3888 server.3=192.168.223.128:2888:3888在zookeeper1的data/myid配置如下: echo '1' > data/myidzookeeper2的data/myid配置如下: echo '2' > data/myidzookeeper2的data/myid配置如下: echo '3' > data/myid3.1.4 启停进入bin目录,启动、停止、重启分和查看当前节点状态(包括集群中是何角色)别执行: ./zkServer.sh start ./zkServer.sh stop ./zkServer.sh restart./zkServer.sh statuszookeeper集群搭建完成之后,根据实际情况开始部署kafka。以部署2个broker为例。 3.2 搭建kafka broker集群3.2.1 安装下载并解压包: curl -L -O http://mirrors.cnnic.cn/apache/kafka/0.9.0.0/kafka_2.10-0.9.0.0.tgz tar zxvf kafka_2.10-0.9.0.0.tgz 3.2.2 配置进入kafka安装工程根目录编辑config/server.properties #不同的broker对应的id不能重复broker.id=1delete.topic.enable=trueinter.broker.protocol.version=0.10.0.1log.message.format.version=0.10.0.1listeners=PLAINTEXT://:9092,SSL://:9093auto.create.topics.enable=falsessl.key.password=testssl.keystore.location=/home/work/certificate/server-keystore.jksssl.keystore.password=testssl.truststore.location=/home/work/certificate/server-truststore.jksssl.truststore.password=testnum.network.threads=3num.io.threads=8socket.send.buffer.bytes=102400socket.receive.buffer.bytes=102400socket.request.max.bytes=104857600log.dirs=/home/work/data/kafka/lognum.partitions=1num.recovery.threads.per.data.dir=1offsets.topic.replication.factor=1transaction.state.log.replication.factor=1transaction.state.log.min.isr=1log.retention.hours=72log.segment.bytes=1073741824log.retention.check.interval.ms=300000zookeeper.connect=192.168.220.128:2181,192.168.222.128:2181,192.168.223.128:2181zookeeper.connection.timeout.ms=6000group.initial.rebalance.delay.ms=03.2.3 启动kafka进入kafka的主目录 nohup sh bin/kafka-server-start.sh config/server.properties > /dev/null 2>&1 &3.2.4 连通性测试首先创建一个topic:topic_1 ...

April 24, 2019 · 2 min · jiezi

恭喜 Fluentd 从 CNCF 毕业

今年新闻不断,多数早期进入 CNCF 的项目都相继宣布毕业。CNCF(云原生计算基金会)在美国时间 2019 年 4 月 11 日宣布 fluentd 今天正式毕业了。这是 CNCF 中毕业的第 6 个项目,之前已经毕业的项目为 Kubernetes、Prometheus、Envoy 、CoreDNS 和 containerd 。fluentd 自 2011 年由 Treasure Data 公司的联合创始人 Sadayuki “Sada” Furuhashi 创建,作为构建统一记录层的开源数据收集器,统一记录层统一收集采集和消费,以便更好的使用和理解数据。在 2016 年 11 月,fluentd 也是第 6 个成为 CNCF 托管项目的。fluentd 可以从多种数据源采集事件,并将它写入文件, RDBMS, NoSQL, IaaS, SaaS, Hadoop等等各类的目标地址。截至目前,fluentd 在 GitHub 上有 7629 个 star ,895 个 fork,以及 166 位贡献者,超过 4k+ commit 。做日志相关的小伙伴基本都玩过 ELK ,我们都知道在大规模使用 Logstash 时的痛苦(还记得被 Logstash 配置文件支配的恐惧吗? 2333) 而 fluentd 的事件路由是通过 tag 来做,相比 Logstash 使用管道将所有数据路由到单个流里再通过配置将它发送到对应的目标而言这将大大简化配置的复杂度。(是的,这里是吐槽)再一个,便是需要考虑部署和插件生态,首先来说部署:fluentd 使用 C + Ruby 编写(Ruby 写起来蛮舒服的,早先写过一段时间),只要有 Ruby 的环境,可以很方便的进行部署。而大多数的 Linux 发行版是默认带着 Ruby 环境的,这也非常方便。Logstash 使用 JRuby 编写(JRuby 就是使用 Java 实现的 Ruby 解释器),部署时需要有 JDK 和 JRuby 的环境。这里只做陈述,不再展开。回到插件生态上:两者都有丰富的插件,并且编写插件也很简单。不过插件这种东西,按需使用,日常需要的基本都能找的到。唯一需要注意的就是选择插件时,需要仔细甄别。“Fluentd has earned its place as the industry standard for log collection and shipping, and I am excited to see it as a graduated CNCF project,” said Gabe Monroy, Lead Program Manager for Containers, Microsoft Azure. “At Microsoft, we are proud to use Fluentd to power our cloud native logging subsystems and we look forward to working with the growing the open source community around Fluentd.”引用一段话,fluentd 是否成为整个日志收集的行业标准,这个我不确定, 但在它托管至 CNCF 后,在云原生领域它确实发展迅速,多数公司都会采用 EFK 的方式进行云原生时代下的日志方案。附一张 fluentd 的图,有空会写下 fluentd 的使用姿势 (flag++)再次恭喜 fluentd 毕业。可以通过下面二维码订阅我的文章公众号【MoeLove】 ...

April 12, 2019 · 1 min · jiezi

ELK集中式日志平台之三 — 进阶

首发于 樊浩柏科学院部署 ELK 后,日志平台就搭建完成了,基本上可以投入使用,但是其配置并不完善,也并未提供实时监控和流量分析功能,本文将对 ELK 部署后的一些常见使用问题给出解决办法。Elasticsearch证书为了获得 Elasticsearch 更好的体验,我们需要获得 Elastic 的使用授权,安装颁发的永久 License 证书。首先,前往 registration 地址注册,稍后我们会收到 License 的下载地址:接着,点击邮件中的 地址 下载 License 文件,并另存为fan-haobai-dbc3f18c-f87e-40e4-9a1d-f496e58a591e-v5.json:然后,通过 Elasticsearch 的 API 更新 License:# 文件名前有@符号$ curl -XPOST -u elastic:changeme http://127.0.0.1:9200/_xpack/license/start_basic?acknowledge=true -H “Content-Type: application/json” -d @fan-haobai-dbc3f18c-f87e-40e4-9a1d-f496e58a591e-v5.json# 返回如下信息则成功{“acknowledged”:true,“basic_was_started”:true}通过 Kibana 查看新的证书信息:Logstash管道进阶InputInput 插件指定了 Logstash 事件的输入源,已经支持 beats、kafka、redis 等源的输入。例如,配置 Beats 源为输入,且端口为 5044:input { beats { port => 5044 }}FilterFilter 插件主要功能是数据过滤和格式化,通过简洁的表达式就可以完成数据的处理。以下这些配置信息,为插件共有配置:配置项类型描述add_fieldhash添加字段add_tagarray添加标签remove_fieldarray删除字段remove_tagarray删除标签DropDrop 插件用来过滤掉无价值的数据,例如过滤掉静态文件日志信息:if [url] =~ “.(jpg|jpeg|gif|png|bmp|swf|fla|flv|mp3|ico|js|css|woff)” { drop {}}Date我们可以用 Date 插件来格式化时间字段。例如,将 time 字段值格式化为dd/MMM/YYYY:HⓂ️s Z形式:date { match => [ “[time]”, “dd/MMM/YYYY:HⓂ️s Z” ] }MutateMutate 插件用来对字段进行 rename、replace 、merge 以及字段值 convert、split、join 操作。例如,将字段@timestamp重命名(rename 或 replace)为 read_timestamp:mutate { rename => { “@timestamp” => “read_timestamp” } }以下是对字段值的操作,使用频率较高。字段值类型转换(convert)例如,将 response_code 字段值转换为整型:mutate { convert => { “fieldname” => “integer” } }字符串分割为数组(split)例如,将经纬度坐标用数组表示:mutate { split => { “location” => “,” } }数组合并为字符串(join)例如,将经纬度坐标合并:mutate { join => { “location” => “,” } }KvKv 插件能够对 key=value 格式的字符进行格式化或过滤处理,这里只对 field_split 项配置进行说明,更多配置见 Kv Filter Configuration Options。例如,获取形如?name=cat&type=2GET 请求的参数:kv { field_split => “&?” }处理后,将会获取到以下 2 个参数:name: cattype: 2JsonJson 插件当然是用来解析 Json 字符串,而 Json_encode 插件是对字段编码为 Json 字符串。例如,Nginx 日志为 Json 格式,则:json { source => “message” }GrokGrok 插件可以根据指定的表达式 结构化 文本数据,表达式需形如%{SYNTAX:SEMANTIC}格式,SYNTAX 指定字段值类型,可以为 IP、WORD、DATA、NUMBER 等。例如,形如55.3.244.1 GET /index.html 15824 0.043的请求日志,则对应的表达式应为%{IP:client} %{WORD:method} %{WORD:request} %{NUMBER:bytes} %{NUMBER:duration},配置如下:grok { match => { “message” => “%{IP:client} %{WORD:method} %{WORD:request} %{NUMBER:bytes} %{NUMBER:duration}” }}经过 Grok 过滤后,输出为:client: 55.3.244.1method: GETrequest: /index.htmlbytes: 15824duration: 0.043我们可以使用 Grok Debug 在线调试 Grok 表达式,常用 Nginx、MySQL、Redis 日志的 Grok 表达式见 Configuration Examples 部分。useragent 插件用来解析用户客户端信息,geoip 插件可以根据 IP 地址解析出用户所在的地址位置,配置较简单,这里不做说明。OutputOutput 插件配置 Logstash 输出对象,可以为 elasticsearch、email、file 等介质。例如,配置过滤后存储在 Elasticsearch 中:output { elasticsearch { hosts => “localhost:9200” manage_template => false index => “%{[@metadata][type]}-%{+YYYY.MM}” document_type => “%{[fields][env]}” template_name => “logstash” user => “elastic” password => “changeme” }}当然,Output 插件不只是可以将过滤数据输出到一种介质,还可以同时指定多种介质。配置示例实现基于 Nginx 日志进行过滤处理,并且通过 useragent 和 geoip 插件获取用户客户端和地理位置信息。详细配置如下:input { beats { port => 5044 }}filter { if [fileset][module] == “nginx” { if [fileset][name] == “access” { grok { match => { “message” => ["%{IPORHOST:[@metadata][remote_ip]} - %{DATA:[user_name]} [%{HTTPDATE:[time]}] "%{WORD:[method]} %{DATA:[url]} HTTP/%{NUMBER:[http_version]}" %{NUMBER:[response_code]} %{NUMBER:[body_sent][bytes]} "%{DATA:[referrer]}" "%{DATA:[@metadata][agent]}""] } remove_field => “message” } grok { match => { “referrer” => “%{URIPROTO}://%{URIHOST:referrer_domain}” } } if [url] =~ “.(jpg|jpeg|gif|png|bmp|swf|fla|flv|mp3|ico|js|css|woff)” { drop {} } mutate { add_field => { “read_timestamp” => “%{@timestamp}” } } date { match => [ “[time]”, “dd/MMM/YYYY:HⓂ️s Z” ] } useragent { source => “[@metadata][agent]” target => “useragent” } geoip { source => “[@metadata][remote_ip]” target => “geoip” } } else if [fileset][name] == “error” { grok { match => { “message” => ["%{DATA:[time]} [%{LOGLEVEL:[level]}] %{POSINT:[pid]}#%{NUMBER:[tid]}: %{GREEDYDATA:[error_message]}(?:, client: %{IPORHOST:[ip]})(?:, server: %{IPORHOST:[server]}?)(?:, request: "%{WORD:[method]} %{DATA:[url]} HTTP/%{NUMBER:[http_version]}")?(?:, upstream: %{WORD:[upstream]})?(?:, host: %{QS:[request_host]})?(?:, referrer: "%{URI:[referrer]}")?"] } remove_field => “message” } date { match => [ “[time]”, “YYYY/MM/dd HⓂ️s” ] } } }}output { elasticsearch { hosts => “localhost:9200” manage_template => false index => “%{[@metadata][type]}-%{+YYYY.MM}” document_type => “%{[fields][env]}” template_name => “logstash” user => “elastic” password => “changeme” }}相对应的 Filebeat 的配置见 filebeat.yml 部分。索引模板Logstash 在推送数据至 Elasticsearch 时,默认会自动创建索引,但有时候我们需要定制化索引信息,Logstash 创建的索引就不符合我们的要求,此时就可以使用索引模板来解决。创建一个名为logstash的索引模板,并指定该索引模板的匹配模式,作为 Logstash 推送日志时索引的模板。PUT _template/logstash{ “index_patterns”: ["access", “error”], “settings”: { “index”: { “number_of_shards”: “3”, “number_of_replicas”: “0” } }, “mappings”: { “default”: { “properties”: { “@timestamp”: { “type”: “date” }, “@version”: { “type”: “text”, “fields”: { “keyword”: { “type”: “keyword”, “ignore_above”: 256 } } } } } }}其中 index_patterns 为匹配模式,表示含有 access 和 error 的索引才会使用该模板。mappings 为字段映射规则,可以配置更多的字段映射规则,已配置字段根据索引模板规则映射,未配置字段则动态映射。指定数据存储类型Logstash 推送数据到 Elasticsearch 时,可以通过以下几种方式指定字段存储类型。grokgrok { match => { “message” => “%{IP:client} %{WORD:method} %{WORD:request} %{NUMBER:bytes} %{NUMBER:duration}” }}其中 IP、WORD、NUMBER 分别会映射为 Elasticsearch 的 IP、String、Number 类型。mutate通过 Mutate 过滤插件的 convert 配置项,可以转换字段值类型。mutate { convert => { “fieldname” => “integer” } }索引模板若想要根据用户 IP 地址解析后的地理位置信息,得出访问用户的地理分布情况,就需要在 Elasticsearch 中将用户地理坐标存储为 geo_point 类型,而 Logstash 并不能自动完成这个步骤,我们可以在索引模板中指定 location 字段的类型为 geo_point。Elasticsearch 待存储的地理位置数据,格式如下:{“geoip”: { “location”: { “lat”: 40.722, “lon”: -73.989 }}}索引模板的 Mappings 部分,应设置为:{“mappings”: { “default”: { “properties”: { “geoip”: { “type”: “object”, “dynamic”: true, “properties”: { “location”: { “type”: “geo_point” } } } } }}}清理过期数据日志平台会产生大量的索引文件,这样不但会占用磁盘空间,而且还会导致检索性能降低,对于那些已经失效的日志文档,应该定期对其清理。设置索引过期时间最简单的办法就是给每个索引设定 TTLs(过期时间),在索引模板中定义失效时间为 7 天:PUT /_template/logstash{ “template”: “”, “mappings”: { “default”: { “_ttl”: { “enabled”: true, “default”: “7d” } } }}索引的 TTLs 特性已经从 Elasticsearch 5+ 版本移除,故不推荐使用该方式。通过查询条件删除文档例如,日志中时间格式形如"2016-12-24T17:36:14.000Z,则清理 7 天前日志的查询条件为:{ “query”: { “range”: { “@timestamp”: { “lt”: “now-7d”, “format”: “date_time” } } }}上述查询中,@timestamp指定查询字段,format指定时间的 格式 为date_time,now-7d表示当前时间往前推移 7 天的时间。配置定期清理过期日志的任务:0 0 * * * /usr/bin/curl -u elastic:changeme -H’Content-Type:application/json’ -d’query’ -XPOST “host//_delete_by_query?pretty” > path.log其中,elastic和changeme分别为 Elasticsearch 的用户名和密码,query为待清理日志的查询条件,path.log为日志文件路径。该方式只是删除了过期的日志文档,并不会删除过期的索引信息,适用于对特定索引下的日志文档进行定期清理的场景。自定义脚本我们部署日志收集时,通常会以日、月的形式归档建立索引,所以清理过期日志,只需清理过期的索引。这里通过GET /_cat/indices和DELETE /index?pretty这 2 个 API 完成过期索引的清理,清理脚本如下:#!/bin/bash# 待删除索引的正则表达式SEARCH_PREG=“nginx-www-access-20[0-9]0-9+”# 保留索引的天数KEEP_DAYS=7URL=http://es.fanhaobai.comPORT=USER=elasticPASSWORD=changemedate2stamp () { date –utc –date “$1” +%s}if [ $PORT ]; then elastic_url="$URL:${PORT}"; fiindices=curl -u "$USER:$PASSWORD" -s "$URL/_cat/indices?v" | grep -E "$SEARCH_PREG" | awk '{ print $3 }'endDate=date2stamp "$KEEP_DAYS day ago"for index in ${indices}; do date=echo $index | sed "s/.*\([0-9]\{4\}\([.\-][0-9]\{2\}\)*\).*/\1/g" | sed 's/[.\-]/-/g' if [ echo $date | grep -o \- | wc -l = 1 ]; then date="$date-01"; fi currentDate=date -u "+%Y-%m-%d %T" logDate=date2stamp $date if [ $(($endDate-$logDate)) -ge 0 ]; then echo “[${currentDate}] - ${index} | DELETE”; curl -u “$USER:$PASSWORD” -XDELETE “$URL/${index}?pretty” else echo “[${currentDate}] - ${index} | NO”; fidone配置定时任务:0 0 * * * /usr/local/elk/elasticsearch/bin/delete-index.sh >> /usr/local/elk/elasticsearch/logs/delete-index.log 2>&1该方式通过自定义脚本方式,可以较灵活的配置所需清理的过期索引,使用起来简洁轻便,但若 Elasticsearch 采用集群方式部署,那么该方式就不是很灵活了。Curator工具当遇到清理过期索引比较复杂的场景时,就可以使用官方提供的管理工具 Curator。其不仅可以进行复杂场景的索引管理,还可以进行快照管理,而实现这一切,只需要配置 YAML 格式的配置文件。安装这里使用 yum 安装,先配置 yum 源。在/etc/yum.repos.d/目录下创建名为curator.repo的文件,内容如下:[curator-5]name=CentOS/RHEL 6 repository for Elasticsearch Curator 5.x packagesbaseurl=https://packages.elastic.co/curator/5/centos/6gpgcheck=1gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearchenabled=1使用 yum 命令安装:$ rpm –import https://packages.elastic.co/GPG-KEY-elasticsearch$ yum install -y elasticsearch-curator# 获取所有索引$ curator_cli –http_auth elastic:changeme –host es.fanhaobai.com –port 80 show_indices –verbose.kibana open 15.7KB 3 1 0 2017-12-15T06:15:07Z配置主配置文件创建名为/etc/curator/curator.yml的配置文件,主要用来配置 Elasticsearch 服务的相关信息:client: hosts: - es.fanhaobai.com #集群配置形如[“10.0.0.1”, “10.0.0.2”] port: 80 http_auth: elastic:changeme #授权信息 url_prefix: use_ssl: false certificate: client_cert: client_key: ssl_no_validate: false timeout: 30 master_only: falselogging: loglevel: INFO logfile: /usr/local/elk/elasticsearch/logs/elasticsearch-curator.log logformat: default blacklist: [’elasticsearch’, ‘urllib3’]其中,需要配置 hosts、port、http_auth 这 3 个配置项。任务配置文件例如,待清理索引的格式形如test-2017.11.16,需清理 7 天过期的索引。创建名为delete-index.yml的 配置 文件,内容如下:actions: 1: #任务1 action: delete_indices #任务动作 description: “Delete nginx index” #日志描述 options: ignore_empty_list: false disable_action: false filters: #管道 - filtertype: pattern #模式过滤 kind: prefix #匹配索引前缀 value: test- #匹配值,索引前缀为test- - filtertype: age #时间过滤 source: name #过滤形式 direction: older #往后推算 timestring: ‘%Y.%m.%d’ #时间格式,同索引时间格式 unit: days #时间单位 unit_count: 7 #时间间隔,7天内Curator 支持配置多个任务,其中 action 为任务动作,filters 为管道过滤器,filtertype 为过滤器的过滤类型,支持多种过滤类型。测试删除过期索引:#删除前$ curator_cli –config /etc/curator/curator.yml show_indices –verbose | grep test-test-2017.11.16 open 162.0B 0 3 0 2017-12-17T06:10:04Ztest-2017.12.16 open 486.0B 0 3 0 2017-12-17T05:58:07Z$ curator –config /etc/curator/curator.yml /etc/curator/delete-index.yml#删除过期索引后$ curator_cli –config /etc/curator/curator.yml show_indices –verbose | grep test-test-2017.12.16 open 486.0B 0 3 0 2017-12-17T05:58:07Z配置每天执行任务:0 0 * * * /usr/bin/curator –config /etc/curator/curator.yml /etc/curator/delete-index.yml该方式不但直接通过配置即可方便实现过期索引的清理,而且可以在复杂场景轻松地管理索引、快照等,故推荐该方式。数据报表上述一切准备步骤做好后,我们就可以利用 Kibana 对大量的日志数据进行报表分析,进而实现应用监控和流量分析。创建索引模式选择 Kibana 的 ”Managemant >> Kibana >> Index Patterns" 项 ,创建一个名为nginx-www-access*的索引模式,并设为默认索引,如图:创建数据图表选择 Kibana 的 ”Visualize" 项,创建一个数据图表,Kibana 已经支持了丰富的图标类型,这里选择 Line 类型图表制作一个用户访问量的图表。图表的 Metrics(指标) 和 Buckets(桶)属性,Metrics 用来表示 PV 和 UV,而 Buckets 则是时间维度,UV 需要根据 location 去重后统计。图表的 Metrics 部分,如下图:图表的 Buckets 部分,如下图:最后,生成的用户访问量图表如文章起始所示。创建实时监控面板当我们创建了各种指标的数据图表后,就可以将这些数据图表组合成一个实时监控面板。选择 Kibana 的 ”Dashboard" 项,创建一个监控面板,并添加所需监控指标的数据图表,拖拽调整各图表到合适位置并保存,一个实时监控面板就呈现在眼前了。下面是我针对主站 Blog 健康监控和流量分析做出的实时 数据报表 展示,基本上满足了实时监控要求。Logstash出现OutOfMemory异常当 Logstash 运行一段时间后,你可能会发现日志中出现大量的 OutOfMemory 错误,并且服务器 CPU 处于 100% 状态。产生原因是因为 Logstash 堆栈溢出,进而要频繁进行 GC 操作导致。尽管在 安装 过程中调整了 Logstash 内存大小,这个由于服务器硬件限制导致的问题还是没法根本解决,但是可以规避问题嘛。很简单,这种堆栈溢出只会长期运行出现,所以只需要定期重启 Logstash 即可。定时任务为:0 */12 * * * /sbin/service logstash restart相关文章 »ELK集中式日志平台之一 — 平台架构(2017-12-16)ELK集中式日志平台之二 — 部署(2017-12-22) ...

March 25, 2019 · 5 min · jiezi

filebeat读取本地文件到ELK简单配置

filebeat读取本地文件到ELK简单配置前言阅读本文前请确保已经部署ELK,本文是基于window server如未部署请参考window环境下搭建简单ELK日志收集相比较之前用logback + redis + elk 收集日志的方式,filebeat的方式可以减少对系统的耦合性,不会对运行的系统造成干扰。依赖组件filebeat-5.6.14-windows-x86_64官网下载地址 最新版本6.6filebeat官方下载5.6到6.6 跨度太大,如果elk使用6.X的版本需要注意下参数配置,有些参数在6.X的版本已经取消了配置filebeat下载下来之后解压,修改配置文件 filebeat.yml配置文件里面其实已经有详细的说明,5.X跟6.X的版本不太一样,不过测试的时候发现5.X的配置在6.X的filebeat也能用,只是启动会提示你该参数已经过时,建议更换。首先需要定义输入源和输出源输入源那边定义文件夹地址,支持读取单个文件或者是多个文件,输出可以输出到redis、logstash和es可以参考官网的配置:filebeat配置filebeat.prospectors:# Each - is a prospector. Most options can be set at the prospector level, so# you can use different prospectors for various configurations.# Below are the prospector specific configurations.- input_type: log # Paths that should be crawled and fetched. Glob based paths. paths: - c:\programdata\elasticsearch\logs*.log # Optional additional fields. These field can be freely picked # to add additional information to the crawled log files for filtering # 这边这个自已定参数名,例如这边定义了个type名字叫service-debug # 在logstash那边可以用这个type参数作为es的索引名称 fields: type: service-debug # level: debug # review: 1 ##————————– es output ————————————#output.elasticsearch: # Array of hosts to connect to. #hosts: [“localhost:9200”] # Optional protocol and basic auth credentials. #protocol: “https” #username: “elastic” #password: “changeme” ##————————– logstash output —————————– output.logstash: # The Logstash hosts hosts: [“127.0.0.1:5044”] 如果需要通过redis输出,只需要把输出配置改成用redisoutput.redis: hosts: [“127.0.0.1”] port: 6379 #password: “test” db: 2 timeout: 5 key: “service-debug"修改logstash配置如果是filebeat直接输出logstash,配置如下,如果是通过redis,请参考上面文章input{ beats { port => 5044 }}filter {}output { if [fields][type]==“service-debug” { elasticsearch { hosts => [“127.0.0.1:9200”] index => “service-debug-%{+YYYY.MM.dd}” } } stdout{}}配置完成后启动filebeat,启动参数 filebeat.exe -e -c filebeat.yml启动完成后,当日志文件有发生变化时候,filebeat会把相关日志输出到logstashEND ...

March 15, 2019 · 1 min · jiezi

window环境下搭建简单ELK日志收集

window环境下搭建简单ELK日志收集前言本文主要介绍如何在window环境下部署elk日志收集,网络上大部分是linux的,刚好这边服务需要用到window 环境,配置方式有点不同,大体是一样的。部署环境window server 2008 R2依赖第三方组件JDK8+elasticsearch-5.6.14logstash-5.6.14kibana-5.6.14-windows-x86redis-3.2下载地址官网: https://www.elastic.co/简单的流程示意图redis跟elasticsearch 都支持集群部署,本文只简单描述如何单独部署部署步骤elk三件套版本最好一致,elasticsearch小版本可以高,但是不可以低。关于elasticsearch 的搭建和配置可以参考之前的一篇文章DUBBO监控环境搭建启动redisredis默认只允许本地访问,如果要redis可以远程需要修改redis.windows.conf将 bind 127.0.0.1 注释掉,在redis3.2版本以上增加了一个保护模式,所以还需要修改protected-mode no#bind 127.0.0.1# Protected mode is a layer of security protection, in order to avoid that# Redis instances left open on the internet are accessed and exploited.## When protected mode is on and if:## 1) The server is not binding explicitly to a set of addresses using the# “bind” directive.# 2) No password is configured.# By default protected mode is enabled. You should disable it only if# you are sure you want clients from other hosts to connect to Redis# even if no authentication is configured, nor a specific set of interfaces# are explicitly listed using the “bind” directive.protected-mode no配置logstashlogstash的作用是将redis中的日志信息收集并保存到elasticsearch中,redis只是作为缓存保存数据,logstash取完之后会删除redis中的数据信息。1.指定启动JDK指定JDK信息,如果有多个JDK需要指定,如果系统默认1.8可以跳过在 logstash-5.6.14bin的setup.bat 中加入这句set JAVA_HOME=C:Program FilesJavajdk1.8.0_181set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_181rem ### 1: determine logstash homerem to do this, we strip from the path until werem find bin, and then strip bin (there is an assumption here that there is norem nested directory under bin also named bin)2.配置输入输出源在 logstash-5.6.14bin中新建 logback.config(名字任意) 配置文件,定义输入输出input接受数据的输入,这边指定到redis;output输出文件到指定的地方, elasticsearch;这边的index索引会在kibana那边配置用到这个输入和输出的配置支持的类型比较多,有兴趣专研的可以参考官网配置logstash输入配置logstash输出配置另外logstash还支持filter过滤器设置input { redis { data_type => “list” key => “logstash” host => “127.0.0.1” port => 6379 threads => 5 codec => “json” }}filter {}output { elasticsearch { hosts => [“127.0.0.1:9200”] index => “logstash-%{type}-%{+YYYY.MM.dd}” document_type => “%{type}” workers => 1 flush_size => 20 idle_flush_time => 1 template_overwrite => true } stdout{}}启动logstash配置kibana找到kibana-5.6.14-windows-x86config 中kibana.yml,1.配置host 0.0.0.0,运行外网访问,默认只能本地访问 2.配置es的地址。server.host: “0.0.0.0”# Enables you to specify a path to mount Kibana at if you are running behind a proxy. This only affects# the URLs generated by Kibana, your proxy is expected to remove the basePath value before forwarding requests# to Kibana. This setting cannot end in a slash.#server.basePath: “”# The maximum payload size in bytes for incoming server requests.#server.maxPayloadBytes: 1048576# The Kibana server’s name. This is used for display purposes.#server.name: “your-hostname”# The URL of the Elasticsearch instance to use for all your queries.elasticsearch.url: “http://localhost:9200"启动Kibana.bat跟logback的结合添加maven支持,引入logback-redis-appender.jar包 <dependency> <groupId>com.cwbase</groupId> <artifactId>logback-redis-appender</artifactId> <version>1.1.3</version> <exclusions> <exclusion> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </exclusion> </exclusions> </dependency>配置logback.xml,这里的key需要跟上面配置的logback.config配置文件中配置的key相匹配 <appender name=“LOGSTASH” class=“com.cwbase.logback.RedisAppender”> <source>demo</source> <type>dubbo</type> <host>127.0.0.1</host> <key>logstash</key> <tags>dev</tags> <mdc>true</mdc> <location>true</location> <callerStackIndex>0</callerStackIndex> </appender> <!– 语句监控 end –> <root level=“INFO”> <appender-ref ref=“stdout” /> <appender-ref ref=“file-stdout” /> <appender-ref ref=“file-error” /> <appender-ref ref=“LOGSTASH” /> </root>启动服务工程,logback会将日志发送到redis,打开kibana的页面,第一次打开会提示创建索引规则,就是logback.config中es配置的索引logstash-,创建好之后就可以看到日志已经被采集到elasticsearch中,我们在页面就可以查看日志信息。kibana默认端口http://127.0.0.1:5601结尾最后说明下关于清除日志,ElasticSearch 5.x版本中删除过期ttl属性,所以我们需要定时清理es的索引,在服务中建一个bat定时执行,以下为删除30天前的全部索引。set DATA=date -d "-30 days" +%Y.%m.%dcurl -XDELETE http://127.0.0.1:9200/-${DATA}参考文档http://www.cnblogs.com/ASPNET…https://blog.csdn.net/xuezhan… ...

January 22, 2019 · 2 min · jiezi

ElastAlert日志告警(邮件、企业微信)

ElastAlert 工作原理It works by combining Elasticsearch with two types of components, rule types and alerts. Elasticsearch is periodically queried and the data is passed to the rule type, which determines when a match is found. When a match occurs, it is given to one or more alerts, which take action based on the match.周期性的查询Elastsearch并且将数据传递给规则类型,规则类型定义了需要查询哪些数据。当一个规则匹配触发,就会给到一个或者多个的告警,这些告警具体会根据规则的配置来选择告警途径,就是告警行为,比如邮件、企业微信等elastalert文档地址安装使用官网的pip install elastalert安装时,我这里报错,所以改用了git clone到本地的方式ElastAlert官方安装流程如果没有pip安装工具看下面流程pip 安装流程依赖yum install python-develsudo yum install openssl-devel 配置Next, open up config.yaml.example. In it, you will find several configuration options. ElastAlert may be run without changing any of these settings.rules_folder is where ElastAlert will load rule configuration files from. It will attempt to load every .yaml file in the folder. Without any valid rules, ElastAlert will not start. ElastAlert will also load new rules, stop running missing rules, and restart modified rules as the files in this folder change. For this tutorial, we will use the example_rules folder.这里我们复制config.yaml.example为config.yaml,新建目录rulescp config.yaml.example config.yamlmkdir rules配置ES服务器信息修改config.yaml文件如下,其他的配置不需要修改# 这里指定了我们配置的规则的目录rules_folder: rules# How often ElastAlert will query Elasticsearch# The unit can be anything from weeks to seconds# 每次间隔1分钟触发一次run_every: minutes: 1# ElastAlert will buffer results from the most recent# period of time, in case some log sources are not in real timebuffer_time: minutes: 15# The Elasticsearch hostname for metadata writeback# Note that every rule can have its own Elasticsearch host# 配置elasticsearch 的地址和端口es_host: xxx.xx.xxx.xx# The Elasticsearch portes_port: 9200配置rules规则里面已经给出了配置的范例,这里我们使用frequency的配置。要做根据频率变化的告警。[example_rules]# tree.├── example_cardinality.yaml├── example_change.yaml├── example_frequency.yaml├── example_new_term.yaml├── example_opsgenie_frequency.yaml├── example_percentage_match.yaml├── example_single_metric_agg.yaml├── example_spike.yaml└── jira_acct.txt复制frequency的配置文件到新的rules目录cp example_rules/example_frequency.yaml rules/cd rulesmv example_frequency.yaml app_frequency_mail.yaml基于邮件的配置邮件告警样例这里会详细介绍下配置,但是只会用到个别字段# Alert when the rate of events exceeds a threshold# (Optional)# Elasticsearch host# 无需修改使用全局# es_host: elasticsearch.example.com# (Optional)# Elasticsearch port# es_port: 14900# (OptionaL) Connect with SSL to Elasticsearch#use_ssl: True# (Optional) basic-auth username and password for Elasticsearch#es_username: someusername#es_password: somepassword# (Required)# Rule name, must be unique# 这里要定义一个规则名称,而且要unique唯一name: app frequency rule mail# (Required)# Type of alert.# the frequency rule type alerts when num_events events occur with timeframe time# 定义规则类型type: frequency# (Required)# Index to search, wildcard supported# 需要检索的日志索引index: logstash-app-prod*# (Required, frequency specific)# Alert when this many documents matching the query occur within a timeframe# 命中五次num_events: 5# (Required, frequency specific)# num_events must occur within this amount of time to trigger an alert# 十分钟之内命中五次,就算是触发一次规则timeframe:# hours: 4 minutes: 10# 按照某个字段进行聚合,意思是aggreation_key会和rule的名称拼接在一起作为一个组,单独发送告警,相同的mesage是一个组#aggregation_key:# - message# 聚合2分钟aggregation: minutes: 2# 不进行重复提醒的字段,和realert联合使用,30分钟内这个query_key只告警一次query_key: - messagerealert: minutes: 30# (Required)# A list of Elasticsearch filters used for find events# These filters are joined with AND and nested in a filtered query# For more info: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html# 这里按照正则匹配来查询,可以看query-dsl里面的官方文档filter:- query: regexp: category: “error-”#- term:# category: “error-”# 邮箱设置smtp_host: smtp.qq.comsmtp_port: 465smtp_ssl: true# 发件箱的地址from_addr: “xx@qq.com”# 这个是指向的邮箱验证的配置文件,有用户名、和密码,对于qq而言,这里面的密码是授权码,可以通过qq邮箱设置里面,开启smtp的时候查看smtp_auth_file: /home/elastalert/smtp_auth_file.yaml# (Required)# The alert is use when a match is found# 定义告警类型是邮件提醒alert:- “email”# 下面这些不配置,会发送一个默认的告警模板,纯文字太丑了,所以我们进行了格式化,发送一个html格式的email_format: htmlalert_subject: “app 正式环境 告警 {}”# 这里使用python 的format 进行格式化alert_subject_args:- category# 如果这个去掉,那么发送alert_text的同时,也会发送默认模板内容alert_text_type: alert_text_only# 下面这个是自己配置的alert_text: “<div style=‘display:block;background-color: red;padding: 10px;border-radius: 5px;color: white;font-weight: bold;’ > <p>{}</p></div><br><a href=‘这里填写自己的kibana地址href’ target=’_blank’ style=‘padding: 8px 16px;background-color: #46bc99;text-decoration:none;color: white;border-radius: 5px;’>Click to Kibana</a><br><h3>告警详情</h3><table><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>@timestamp:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>@version:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>_id:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>_index:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>_type:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>appType:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>appVersion:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>business:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>category:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>geoip:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>guid:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>host:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>message:</td><td style=‘padding:10px 5px;border-radius: 5px;background-color: red;color: white;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>num_hits:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>num_matches:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>path:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>server:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>uid:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>uri:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr><tr><td style=‘padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;’>userAgent:</td><td style=‘padding:5px;border-radius: 5px;background-color: #eef;’>{}</td></tr></table>”# 这里需要配置area_text中出现的各个字段,其实跟sprintf一样按照顺序格式化的alert_text_args:- message- “@timestamp”- “@version”- _id- _index- _type- appType- appVersion- business- category- geoip- guid- host- message- num_hits- num_matches- path- server- uid- uri- userAgent# (required, email specific)# a list of email addresses to send alerts to# 这里配置收件人的邮箱email:- “xxx@xxx.com"邮箱验证配置然后来看下邮箱验证的配置,也就是smtp_auth_file.yaml# 发件箱的qq邮箱地址,也就是用户名user: xxx@qq.com# 不是qq邮箱的登录密码,是授权码password: uxmmmmtefwqeibcjd执行的时候,很简单,稍后我们看下配置supervisor高可用nohup python -m elastalert.elastalert –rule app_frequency_mail.yaml –verbose &配置企业微信告警需要信息部门应用新建一个接收日志的部门,会分配部门id新建一个发送日志的应用程序,会有应用id在应用的可见配置里面,配置上相关人员这里我们使用一个开源企业微信发送插件git地址:https://github.com/anjia0532/elastalert-wechat-plugin插件使用说明https://anjia0532.github.io/2017/02/16/elastalert-wechat-plugin/ 按照创建邮件告警规则一样,创建新的规则告警文件。其中从alert开始配置成新的告警方式alert:- “elastalert_modules.wechat_qiye_alert.WeChatAlerter"alert_text: “======start====== \n索引:{}\n服务器:{}\n接口:{}\n告警:\n{}“alert_text_type: alert_text_only# 企业微信告警的数据不需要太多,太长alert_text_args:- _index- server- path- message#后台登陆后【设置】->【权限管理】->【普通管理组】->【创建并设置通讯录和应用权限】->【CorpID,Secret】#设置微信企业号的appidcorp_id: wxea4f5f73xxxx#设置微信企业号的Secretsecret: “xxxxxBGnxxxxxxxxxrBNHxxxxxxxE”#后台登陆后【应用中心】->【选择应用】->【应用id】#设置微信企业号应用idagent_id: 100xxxx#部门idparty_id: 14#用户微信号user_id: “@all”# 标签id#tag_id:企业微信配置注意查看作者的另一个项目https://github.com/anjia0532/weixin-qiye-alert 发现对于user_id,tag_id的配置是有规则的:如果指定标签名称不存在,会自动通过api创建一个标签(处于锁定状态),需要管理员,手动解锁,并且添加成员 如果指定标签下没有成员(标签添加部门无效),则会根据cp.properties指定的部门idPartyId和人员idUserId进行发送 如果部门下没有成员,而且指定的用户也没有关注该企业号,则会将信息推送给该企业号全部已关注成员,测试时需谨记这正合我们的心意,因为我们不会只给一个人发送消息!我们需要的是,发给所有日志告警部门的小伙伴,所以我们要怎么做呢?!!经过测试,我将user_id注释掉,并不能发送消息, 理想状态不应该是删掉user_id,就只发送给全部门么?然而并不是哒~,我们查看下源码(发现作者简直是每一行代码都有注释太好啦)我们会看到作者的注释,全部用@all~~ ,所以能看到上面user_id 我配置的是@all啦self.party_id = self.rule.get(‘party_id’) #部门idself.user_id = self.rule.get(‘user_id’, ‘’) #用户id,多人用 | 分割,全部用 @allself.tag_id = self.rule.get(’tag_id’, ‘’) #标签id企业微信告警样例 ...

December 28, 2018 · 4 min · jiezi

k8s与log--利用fluent bit收集k8s日志

前言收集日志的组件多不胜数,有ELK久负盛名组合中的logstash, 也有EFK组合中的filebeat,更有cncf新贵fluentd,另外还有大数据领域使用比较多的flume。本次主要说另外一种,和fluentd一脉相承的fluent bit。Fluent Bit是一个开源和多平台的Log Processor and Forwarder,它允许您从不同的来源收集数据/日志,统一并将它们发送到多个目的地。它与Docker和Kubernetes环境完全兼容。Fluent Bit用C语言编写,具有可插拔的架构,支持大约30个扩展。它快速轻便,通过TLS为网络运营提供所需的安全性。之所以选择fluent bit,看重了它的高性能。下面是官方贴出的一张与fluentd对比图: FluentdFluent BitScopeContainers / ServersContainers / ServersLanguageC & RubyCMemory40MB450KBPerformanceHigh PerformanceHigh PerformanceDependenciesBuilt as a Ruby Gem, it requires a certain number of gems.Zero dependencies, unless some special plugin requires them.PluginsMore than 650 plugins availableAround 35 plugins availableLicenseApache License v2.0Apache License v2.0在已经拥有的插件满足需求和场景的前提下,fluent bit无疑是一个很好的选择。fluent bit 简介在使用的这段时间之后,总结以下几点优点:支持routing,适合多output的场景。比如有些业务日志,或写入到es中,供查询。或写入到hdfs中,供大数据进行分析。fliter支持lua。对于那些对c语言hold不住的团队,可以用lua写自己的filter。output 除了官方已经支持的十几种,还支持用golang写output。例如:fluent-bit-kafka-output-plugink8s日志收集k8s日志分析主要讲kubeadm部署的k8s集群。日志主要有:kubelet和etcd的日志,一般采用systemd部署,自然而然就是要支持systemd格式日志的采集。filebeat并不支持该类型。kube-apiserver等组件stderr和stdout日志,这个一般输出的格式取决于docker的日志驱动,一般为json-file。业务落盘的日志。支持tail文件的采集组件都满足。这点不在今天的讨论范围之内。部署方案fluent bit 采取DaemonSet部署。 如下图:部署yaml—apiVersion: v1kind: Servicemetadata: name: elasticsearch-logging namespace: kube-system labels: k8s-app: elasticsearch-logging kubernetes.io/cluster-service: “true” addonmanager.kubernetes.io/mode: Reconcile kubernetes.io/name: “Elasticsearch"spec: ports: - port: 9200 protocol: TCP targetPort: db selector: k8s-app: elasticsearch-logging—# RBAC authn and authzapiVersion: v1kind: ServiceAccountmetadata: name: elasticsearch-logging namespace: kube-system labels: k8s-app: elasticsearch-logging kubernetes.io/cluster-service: “true” addonmanager.kubernetes.io/mode: Reconcile—kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: elasticsearch-logging labels: k8s-app: elasticsearch-logging kubernetes.io/cluster-service: “true” addonmanager.kubernetes.io/mode: Reconcilerules:- apiGroups: - "” resources: - “services” - “namespaces” - “endpoints” verbs: - “get”—kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata: namespace: kube-system name: elasticsearch-logging labels: k8s-app: elasticsearch-logging kubernetes.io/cluster-service: “true” addonmanager.kubernetes.io/mode: Reconcilesubjects:- kind: ServiceAccount name: elasticsearch-logging namespace: kube-system apiGroup: ““roleRef: kind: ClusterRole name: elasticsearch-logging apiGroup: “”—# Elasticsearch deployment itselfapiVersion: apps/v1kind: StatefulSetmetadata: name: elasticsearch-logging namespace: kube-system labels: k8s-app: elasticsearch-logging version: v6.3.0 kubernetes.io/cluster-service: “true” addonmanager.kubernetes.io/mode: Reconcilespec: serviceName: elasticsearch-logging replicas: 2 selector: matchLabels: k8s-app: elasticsearch-logging version: v6.3.0 template: metadata: labels: k8s-app: elasticsearch-logging version: v6.3.0 kubernetes.io/cluster-service: “true” spec: serviceAccountName: elasticsearch-logging containers: - image: k8s.gcr.io/elasticsearch:v6.3.0 name: elasticsearch-logging resources: # need more cpu upon initialization, therefore burstable class limits: cpu: 1000m requests: cpu: 100m ports: - containerPort: 9200 name: db protocol: TCP - containerPort: 9300 name: transport protocol: TCP volumeMounts: - name: elasticsearch-logging mountPath: /data env: - name: “NAMESPACE” valueFrom: fieldRef: fieldPath: metadata.namespace # Elasticsearch requires vm.max_map_count to be at least 262144. # If your OS already sets up this number to a higher value, feel free # to remove this init container. initContainers: - image: alpine:3.6 command: ["/sbin/sysctl”, “-w”, “vm.max_map_count=262144”] name: elasticsearch-logging-init securityContext: privileged: true volumeClaimTemplates: - metadata: name: elasticsearch-logging annotations: volume.beta.kubernetes.io/storage-class: gp2 spec: accessModes: - “ReadWriteOnce” resources: requests: storage: 10Gi—apiVersion: v1kind: ConfigMapmetadata: name: fluent-bit-config namespace: kube-system labels: k8s-app: fluent-bitdata: # Configuration files: server, input, filters and output # ====================================================== fluent-bit.conf: | [SERVICE] Flush 1 Log_Level info Daemon off Parsers_File parsers.conf HTTP_Server On HTTP_Listen 0.0.0.0 HTTP_Port 2020 @INCLUDE input-kubernetes.conf @INCLUDE filter-kubernetes.conf @INCLUDE output-elasticsearch.conf input-kubernetes.conf: | [INPUT] Name tail Tag kube.* Path /var/log/containers/.log Parser docker DB /var/log/flb_kube.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 [INPUT] Name systemd Tag host. Systemd_Filter SYSTEMD_UNIT=kubelet.service Path /var/log/journal DB /var/log/flb_host.db filter-kubernetes.conf: | [FILTER] Name kubernetes Match kube.* Kube_URL https://kubernetes.default.svc.cluster.local:443 Merge_Log On K8S-Logging.Parser On K8S-Logging.Exclude On [FILTER] Name kubernetes Match host.* Kube_URL https://kubernetes.default.svc.cluster.local:443 Merge_Log On Use_Journal On output-elasticsearch.conf: | [OUTPUT] Name es Match * Host ${FLUENT_ELASTICSEARCH_HOST} Port ${FLUENT_ELASTICSEARCH_PORT} Logstash_Format On Retry_Limit False parsers.conf: | [PARSER] Name apache Format regex Regex ^(?<host>[^ ]) [^ ] (?<user>[^ ]) [(?<time>[^]])] “(?<method>\S+)(?: +(?<path>[^"]?)(?: +\S)?)?” (?<code>[^ ]) (?<size>[^ ])(?: “(?<referer>[^"])” “(?<agent>[^"])”)?$ Time_Key time Time_Format %d/%b/%Y:%H:%M:%S %z [PARSER] Name apache2 Format regex Regex ^(?<host>[^ ]) [^ ] (?<user>[^ ]) [(?<time>[^]])] “(?<method>\S+)(?: +(?<path>[^ ]) +\S)?” (?<code>[^ ]) (?<size>[^ ])(?: “(?<referer>[^"])” “(?<agent>[^"])”)?$ Time_Key time Time_Format %d/%b/%Y:%H:%M:%S %z [PARSER] Name apache_error Format regex Regex ^[[^ ]* (?<time>[^]])] [(?<level>[^]])](?: [pid (?<pid>[^]])])?( [client (?<client>[^]])])? (?<message>.)$ [PARSER] Name nginx Format regex Regex ^(?<remote>[^ ]) (?<host>[^ ]) (?<user>[^ ]) [(?<time>[^]])] “(?<method>\S+)(?: +(?<path>[^"]?)(?: +\S*)?)?” (?<code>[^ ]) (?<size>[^ ])(?: “(?<referer>[^"])” “(?<agent>[^"])”)?$ Time_Key time Time_Format %d/%b/%Y:%H:%M:%S %z [PARSER] Name json Format json Time_Key time Time_Format %d/%b/%Y:%H:%M:%S %z [PARSER] Name docker Format json Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%L Time_Keep On # Command | Decoder | Field | Optional Action # =============|==================|================= Decode_Field_As escaped log [PARSER] Name syslog Format regex Regex ^&lt;(?<pri>[0-9]+)&gt;(?<time>[^ ]* {1,2}[^ ]* [^ ]) (?<host>[^ ]) (?<ident>[a-zA-Z0-9/.-])(?:[(?<pid>[0-9]+)])?(?:[^:]:)? (?<message>.)$ Time_Key time Time_Format %b %d %H:%M:%S—apiVersion: extensions/v1beta1kind: DaemonSetmetadata: name: fluent-bit namespace: kube-system labels: k8s-app: fluent-bit-logging version: v1 kubernetes.io/cluster-service: “true"spec: template: metadata: labels: k8s-app: fluent-bit-logging version: v1 kubernetes.io/cluster-service: “true” annotations: prometheus.io/scrape: “true” prometheus.io/port: “2020” prometheus.io/path: /api/v1/metrics/prometheus spec: containers: - name: fluent-bit image: fluent/fluent-bit:1.0.0 imagePullPolicy: Always ports: - containerPort: 2020 env: - name: FLUENT_ELASTICSEARCH_HOST value: “elasticsearch-logging” - name: FLUENT_ELASTICSEARCH_PORT value: “9200” volumeMounts: - name: varlog mountPath: /var/log - name: varlibdockercontainers mountPath: /data/docker/containers readOnly: true - name: fluent-bit-config mountPath: /fluent-bit/etc/ terminationGracePeriodSeconds: 10 volumes: - name: varlog hostPath: path: /var/log - name: varlibdockercontainers hostPath: path: /data/docker/containers - name: fluent-bit-config configMap: name: fluent-bit-config serviceAccountName: fluent-bit tolerations: - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule—apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: fluent-bit-readroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: fluent-bit-readsubjects:- kind: ServiceAccount name: fluent-bit namespace: kube-system—apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: fluent-bit-readrules:- apiGroups: [””] resources: - namespaces - pods verbs: [“get”, “list”, “watch”]—apiVersion: v1kind: ServiceAccountmetadata: name: fluent-bit namespace: kube-system—apiVersion: apps/v1kind: Deploymentmetadata: name: kibana-logging namespace: kube-system labels: k8s-app: kibana-logging kubernetes.io/cluster-service: “true” addonmanager.kubernetes.io/mode: Reconcilespec: replicas: 1 selector: matchLabels: k8s-app: kibana-logging template: metadata: labels: k8s-app: kibana-logging annotations: seccomp.security.alpha.kubernetes.io/pod: ‘docker/default’ spec: containers: - name: kibana-logging image: docker.elastic.co/kibana/kibana-oss:6.3.2 resources: # need more cpu upon initialization, therefore burstable class limits: cpu: 1000m requests: cpu: 100m env: - name: ELASTICSEARCH_URL value: http://elasticsearch-logging:9200 ports: - containerPort: 5601 name: ui protocol: TCP—apiVersion: v1kind: Servicemetadata: name: kibana-logging namespace: kube-system labels: k8s-app: kibana-logging kubernetes.io/cluster-service: “true” addonmanager.kubernetes.io/mode: Reconcile kubernetes.io/name: “Kibana” annotations: service.beta.kubernetes.io/aws-load-balancer-type: nlbspec: ports: - port: 5601 protocol: TCP targetPort: ui selector: k8s-app: kibana-logging type: LoadBalancer—总结真实场景的日志收集比较复杂,在日志量大的情况下,一般要引入kafka。此外关于注意日志的lograte。一般来说,docker是支持该功能的。可以通过下面的配置解决:cat > /etc/docker/daemon.json <<EOF{ “log-opts”: { “max-size”: “100m”, “max-file”: “3” }}EOF在k8s中运行的业务日志,不仅要考虑清除过时的日志,还要考虑新增pod的日志的收集。这个时候,往往需要在fluent bit上面再包一层逻辑,获取需要收集的日志路径。比如log-pilot。 ...

December 26, 2018 · 4 min · jiezi

ELK实践(二):收集Nginx日志

Nginx访问日志这里补充下Nginx访问日志使用的说明。一般在nginx.conf主配置文件里需要定义一种格式:log_format main ‘$remote_addr - $remote_user [$time_local] “$request” ’ ‘$status $body_bytes_sent “$http_referer” ’ ‘"$http_user_agent" “$http_x_forwarded_for” $request_time’;上面的格式我是基于默认的加了一个$request_time。然后子配置使用:access_log logs/myapp.log main;即可。Filebeat采集日志数据到ElasticSearch配置:su -e elkcd /usr/local/elkvim beats/filebeat/filebeat.test_nginx.yml配置详情:filebeat.prospectors:- type: log input_type: log paths: - /work/yphp/nginx/logs/.log tags: [“ngx”, “yujc”] fields: logIndex: nginx docType: nginx-access fields_under_root: true tail_files: falseoutput.elasticsearch: hosts: [“127.0.0.1:9200”] index: “test-nginx-%{+yyyy.MM.dd}“配置说明:filebeat.prospectors:type 日志类型,默认loginput_type 输入类型,默认logpaths 采集的日志,可以使用通配符。支持多个tags 自定义标签,是个数组。自定义fields 自定义字段fields_under_root 自定义字段是否追加到根。如果为false,fields配置的字段键名是fieldstail_files 是否从末尾开始采集document_type 自定义字段,用于Logsatsh区分来源,在Logsatsh里用变量type表示output.elasticsearch:hosts 配置ES节点,数组格式,支持多个。index 配置ES索引。不配置使用默认的 filebeat-protocol 配置协议,例如http,httpsusername 配置ES用户名,例如elasticpassword 配置ES密码,例如changeme设置权限600,并启动filebeat:chmod -R 600 beats/filebeat/filebeat.test_nginx.yml./beats/filebeat/filebeat -c beats/filebeat/filebeat.test_nginx.yml然后访问Nginx应用,查看ES是否新增了一个索引:$ curl http://127.0.0.1:9200/_cat/indices?v | grep test-nginx % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed105 1161 105 1161 0 0 123k 0 –:–:– –:–:– –:–:– 125kyellow open test-nginx-2018.09.24 ArxrVVOkTjG8ZlXJjb9bVg 5 1 1 0 11.6kb 11.6kb我们查看一条数据:$ curl http://127.0.0.1:9200/test-nginx-2018.09.24/_search?q=&size=1{ “_index”: “test-nginx-2018.09.24”, “_type”: “doc”, “_id”: “AWYKkBqtJzfnbYlB_DRX”, “_version”: 1, “_score”: null, “_source”: { “@timestamp”: “2018-09-24T07:51:43.140Z”, “beat”: { “hostname”: “2106567e5bce”, “name”: “2106567e5bce”, “version”: “5.6.2” }, “docType”: “nginx-access”, “input_type”: “log”, “logIndex”: “nginx”, “message”: “172.16.10.1 - - [24/Sep/2018:07:51:40 +0000] "GET /?time=22 HTTP/1.1" 200 97991 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" "-" 0.009”, “offset”: 5243, “source”: “/work/yphp/nginx/logs/hello71.log”, “tags”: [ “ngx”, “yujc” ], “type”: “log” }, “fields”: { “@timestamp”: [ 1537775503140 ] }, “sort”: [ 1537775503140 ]}可以看到已经有数据了。但是日志内容作为一个整体(字段是message)了。Filebeat采集日志数据,Logstash过滤发到ElasticSearch配置:su -e elkcd /usr/local/elkvim beats/filebeat/filebeat.test_nginx2.yml配置详情:filebeat.prospectors:- type: log input_type: log paths: - /work/yphp/nginx/logs/.log tags: [“ngx”, “yujc”] fields: logIndex: nginx docType: nginx-access fields_under_root: true tail_files: falseoutput.logstash: hosts: [“127.0.0.1:5044”]配置logstashsu -e elkcd /usr/local/elkvim logstash/config/conf.d/filebeat.conf配置详情:input { beats { port => 5044 }}filter { grok { match => { “message” => “%{IPORHOST:remote_ip} - %{DATA:user_name} [%{HTTPDATE:time}] "%{WORD:method} %{DATA:url} HTTP/%{NUMBER:http_version}" %{NUMBER:response_code} %{NUMBER:body_sent:bytes} "%{DATA:referrer}" "%{DATA:agent}" "%{DATA:x_forwarded_for}" %{NUMBER:request_time}” } remove_field => “message” }}output { elasticsearch { hosts => [“127.0.0.1:9200”] index => “test-nginx2-%{type}-%{+YYYY.MM.dd}” document_type => “%{type}” } stdout { codec => rubydebug }}我使用的nginx日志格式是在标准格式后面加了2个字段$http_x_forwarded_for和$request_time:log_format main ‘$remote_addr - $remote_user [$time_local] “$request” ’ ‘$status $body_bytes_sent “$http_referer” ‘’"$http_user_agent” “$http_x_forwarded_for” $request_time’;日志示例:172.16.10.1 - - [24/Sep/2018:09:04:40 +0000] “GET /?time=2244 HTTP/1.1” 200 98086 “-” “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36” “-” 0.002上面的grok表达式是:%{IPORHOST:remote_ip} - %{DATA:user_name} [%{HTTPDATE:time}] "%{WORD:method} %{DATA:url} HTTP/%{NUMBER:http_version}" %{NUMBER:response_code} %{NUMBER:body_sent:bytes} "%{DATA:referrer}" "%{DATA:agent}" "%{DATA:x_forwarded_for}" %{NUMBER:request_time}我们先使用Grok Debugger 工具在线调试下,看看写的grok是否正确。我之前没有测试之前启动,发现ES里没有grok里解析出来的字段,后来在命令行看到filebeat的输出(前台运行):$ ./beats/filebeat/filebeat -c beats/filebeat/filebeat.test_nginx2.yml{ “@timestamp” => 2018-09-24T09:01:19.555Z, “logIndex” => “nginx”, “offset” => 6467, “docType” => “nginx-access”, “@version” => “1”, “input_type” => “log”, “beat” => { “name” => “2106567e5bce”, “hostname” => “2106567e5bce”, “version” => “5.6.2” }, “host” => “2106567e5bce”, “source” => “/work/yphp/nginx/logs/hello71.log”, “message” => “172.16.10.1 - - [24/Sep/2018:09:01:14 +0000] "GET /?time=2244 HTTP/1.1" 200 98087 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" "-" 0.195”, “type” => “log”, “tags” => [ [0] “ngx”, [1] “yujc”, [2] “beats_input_codec_plain_applied”, [3] “_grokparsefailure” ]}最后面提示了_grokparsefailure,说明grok部分写的有问题。由于是参考的网上教程,也加上刚接触,不知道怎么配置,filebeat.conf调试了很久才生效。我们打开Grok Debugger,第一个输入框输入filebeat采集的消息原文message字段里的内容,第二个输入框输入grok表达式:点击Go按钮即可解析。如果下面的内容是{}说明解析失败,然后可以修改表达式,该工具会自动解析。最终解析结果:{ “remote_ip”: [ [ “172.16.10.1” ] ], “HOSTNAME”: [ [ “172.16.10.1” ] ], “IP”: [ [ null ] ], “IPV6”: [ [ null ] ], “IPV4”: [ [ null ] ], “user_name”: [ [ “-” ] ], “time”: [ [ “24/Sep/2018:08:47:59 +0000” ] ], “MONTHDAY”: [ [ “24” ] ], “MONTH”: [ [ “Sep” ] ], “YEAR”: [ [ “2018” ] ], “TIME”: [ [ “08:47:59” ] ], “HOUR”: [ [ “08” ] ], “MINUTE”: [ [ “47” ] ], “SECOND”: [ [ “59” ] ], “INT”: [ [ “+0000” ] ], “method”: [ [ “GET” ] ], “url”: [ [ “/?time=2244” ] ], “http_version”: [ [ “1.1” ] ], “BASE10NUM”: [ [ “1.1”, “200”, “98086”, “0.002” ] ], “response_code”: [ [ “200” ] ], “body_sent”: [ [ “98086” ] ], “referrer”: [ [ “-” ] ], “agent”: [ [ “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36” ] ], “x_forwarded_for”: [ [ “-” ] ], “request_time”: [ [ “0.002” ] ]}然后可以启动logstash了。 测试logstash配置是否通过:./logstash/bin/logstash -f logstash/config/conf.d/filebeat.conf –config.test_and_exitConfig Validation Result: OK. Exiting Logstash# 启动logstash./logstash/bin/logstash &# 启动filebeat./beats/filebeat/filebeat -c beats/filebeat/filebeat.test_nginx2.yml我们再次访问Nginx应用,然后我们查看一条数据:$ curl http://127.0.0.1:9200/test-nginx2-log-2018.09.24/_search?q=&size=1&sort=@timestamp:desc{ “took”: 14, “timed_out”: false, “_shards”: { “total”: 5, “successful”: 5, “skipped”: 0, “failed”: 0 }, “hits”: { “total”: 3, “max_score”: null, “hits”: [ { “_index”: “test-nginx2-log-2018.09.24”, “_type”: “log”, “_id”: “AWYK0to8JzfnbYlB_DRx”, “_score”: null, “_source”: { “response_code”: “200”, “agent”: “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36”, “logIndex”: “nginx”, “offset”: 6875, “method”: “GET”, “docType”: “nginx-access”, “user_name”: “-”, “input_type”: “log”, “http_version”: “1.1”, “source”: “/work/yphp/nginx/logs/hello71.log”, “message”: “““172.16.10.1 - - [24/Sep/2018:09:04:40 +0000] “GET /?time=2244 HTTP/1.1” 200 98086 “-” “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36” “-” 0.002"””, “type”: “log”, “url”: “/?time=2244”, “tags”: [ “ngx”, “yujc”, “beats_input_codec_plain_applied” ], “x_forwarded_for”: “-”, “referrer”: “-”, “@timestamp”: “2018-09-24T09:04:40.404Z”, “remote_ip”: “172.16.10.1”, “request_time”: “0.002”, “@version”: “1”, “beat”: { “name”: “2106567e5bce”, “hostname”: “2106567e5bce”, “version”: “5.6.2” }, “host”: “2106567e5bce”, “body_sent”: “98086”, “time”: “24/Sep/2018:09:04:40 +0000” }, “sort”: [ 1537779880404 ] } ] }}里面就包含了所有我们解析出来的字段。kibana里查看打开kibana web地址:http://127.0.0.1:5601,依次打开:Management-> Kibana -> Index Patterns ,选择Create Index Pattern:a. Index pattern 输入:test-nginx2- ;b. Time Filter field name 选择 @timestamp。 c. 点击Create。然后打开Discover,选择 filebeat-* 就能看到日志数据了。可以看到详细字段:参考1、Logstash使用grok过滤nginx日志(二) - Orgliny - 博客园https://www.cnblogs.com/Orgli…2、Rsyslog日志服务搭建 - K‘e0llm - 博客园http://www.cnblogs.com/Eivll0…3、Logstash中如何处理到ElasticSearch的数据映射 - Cocowool - 博客园https://www.cnblogs.com/cocow…4、ELK 架构之 Logstash 和 Filebeat 安装配置 - 田园里的蟋蟀 - 博客园http://www.cnblogs.com/xishua…5、搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器-zero菌-51CTO博客http://blog.51cto.com/zero01/… ...

December 23, 2018 · 4 min · jiezi

ELK实践(一):基础入门

虽然用了ELK很久了,但一直苦于没有自己尝试搭建过,所以想抽时间尝试尝试。原本打算按照教程 《ELK集中式日志平台之二 — 部署》(作者:樊浩柏科学院) 进行测试的,没想到一路出了很多坑,所以又按照自己成功搭建的流程写了本文。《ELK集中式日志平台之二 — 部署》一文参考价值非常大,图文并茂,大家可以在学习过程中参考参考。作者一上来就安装ELK插件,实际可以按需选择安装,但作为初学者,无疑增加了复杂度。ELK插件后续我会单独拿出来讲解,本文略过。简介ELK 指的是一套解决方案,是 Elasticsearch、Logstash 和 Kibana 三种软件产品的首字母缩写,Beats 是 ELK 协议栈的新成员。E:代表 Elasticsearch,负责日志的存储和检索;L:代表 Logstash,负责日志的收集、过滤和格式化;K:代表 Kibana,负责日志数据的可视化;Beats:是一类轻量级数据采集器;本来ELK是没有Beats的。最开始的架构中,由 Logstash 承担数据采集器和过滤功能,并部署在应用服务器。由于 Logstash 对大量日志进行过滤操作,会消耗应用系统的部分性能,带来不合理的资源分配问题;另一方面,过滤日志的配置,分布在每台应用服务器,不便于集中式配置管理。所以就有了Beats。由于 Beats 的系统性能开销更小,所以应用服务器性能开销可以忽略不计;另一方面,Beats 可以作为数据采集插件形式工作,可以按需启用 Beats 下不同功能的插件,更灵活,扩展性更强。例如,应用服务器只启用 Filebeat,则只收集日志文件数据,如果某天需要收集系统性能数据时,再启用 Metricbeat 即可,并不需要太多的修改和配置。其中,目前 Beats 家族根据功能划分,主要有:FilebeatReal-time insight into log data.负责收集文件数据。PacketbeatAnalyze network packet data.负责收集网络流量数据。WinlogbeatAnalyze Windows event logs.负责收集 Windows 事件日志数据。MetricbeatShip and analyze metrics.负责收集系统级的 CPU 使用率、内存、文件系统、磁盘 IO 和网络 IO 统计数据。HeartbeatPing your Infrastructure.AuditbeatSend audit data to Elasticsearch.如果日志量巨大,可能还会引入Kafka用以均衡网络传输,从而降低了网络闭塞,尤其是丢失数据的可能性;另一方面,这样可以系统解耦,具有更好的灵活性和扩展性。环境说明环境:CentOS6.8elk版本ELK各自版本最好都是一致的,否则可能会有兼容性问题。本次都是使用5.6.2版本。截止到2018-09-23,官网的最新版本是6.4.1。官网下载地址:https://www.elastic.co/downloadselasticsearchhttps://artifacts.elastic.co/…kibanahttps://artifacts.elastic.co/…logstashhttps://artifacts.elastic.co/…filebeathttps://artifacts.elastic.co/…历史版本汇集页:https://www.elastic.co/downlo…安装方式安装有两种方法:yum安装二进制包手动安装建议第二种方法,可以自由安装版本及定义安装目录。启动方式另外需要注意的是:ELK系列软件启动服务的时候不允许以root用户启动。这里我们统一建立用户 elk:useradd elkMac因为默认用户就不是root,可以忽略这一步。启动软件的时候,有2种方式启动:切换到elk用户执行命名配置service,使用service启动测试的时候建议以第一种,这样可以及时查看错误日志。生产环境可以配置service启动。特点1、ElasticSearch、Kibana都支持安装插件:例如x-pack。2、ElasticSearch、Kibana的配置文件一般在安装目录的config里(yml格式),二进制文件在bin里。ElasticSearch和Logstatsh config目录都有jvm.options,测试环境建议修改:-Xms256m-Xmx1g默认可能是2g,测试环境改小一点。后面这点还会说明。配置JDK安装JDK1.8:yum install -y java-1.8.0-openjdk配置环境变量:vi /etc/profile增加:JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el6_10.x86_64PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarJAVACMD=/usr/bin/javaexport JAVA_HOME JAVACMD CLASSPATH PATH然后使之生效:source /etc/profile验证版本信息:# java -versionopenjdk version “1.8.0_181"OpenJDK Runtime Environment (build 1.8.0_181-b13)OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)安装 ElasticSearch二进制安装wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.2.tar.gz大小32.2M。安装很简单,解压即可:mkdir -p /usr/local/elktar zxvf elasticsearch-5.6.2.tar.gz -C /usr/local/elkmv /usr/local/elk/elasticsearch-5.6.2 /usr/local/elk/elasticsearch配置权限:chown -R elk:elk /usr/local/elk/elasticsearch简单配置对目录/usr/local/elk/elasticsearch的增删改操作建议使用上面创建的elk用户,否则还要使用chown命令修改权限。su -e elk修改config/jvm.options:vi /usr/local/elk/elasticsearch/config/jvm.options根据实际情况修改:默认是2g:# 最小值-Xms256m#最大值-Xmx1g我测试的时候忘记修改了,测试机器卡死了。启动如果没有配置service启动方式,需要切换用户。su - elk# -d表示后台运行/usr/local/elk/elasticsearch/bin/elasticsearch -d查看是否已运行:$ netstat -tulnp | grep 9200tcp 0 0 127.0.0.1:9200 0.0.0.0:* LISTEN 121/java 测试默认是 9200 端口。如果需要修改,可以编辑config/elasticsearch.yml。$ curl http://127.0.0.1:9200{ “name” : “6e1PMnr”, “cluster_name” : “elasticsearch”, “cluster_uuid” : “Uahv9iLnSLyMjIxX57lbMQ”, “version” : { “number” : “5.6.2”, “build_hash” : “bd92e7f”, “build_date” : “2017-12-17T20:23:25.338Z”, “build_snapshot” : false, “lucene_version” : “7.1.0”, “minimum_wire_compatibility_version” : “5.6.0”, “minimum_index_compatibility_version” : “5.0.0” }, “tagline” : “You Know, for Search”}防盗版声明:本文系原创文章,发布于公众号飞鸿影的博客(fhyblog)及博客园,转载需作者同意。安装 KibanaKibana负责日志数据的可视化。Kibana从ElasticSearch里读取数据。二进制安装wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.2-linux-x86_64.tar.gz大小48.5M。同样是解压:tar zxvf kibana-5.6.2-linux-x86_64.tar.gz -C /usr/local/elk/mv /usr/local/elk/kibana-5.6.2-linux-x86_64 /usr/local/elk/kibanachown -R elk:elk /usr/local/elk/kibana简单配置对目录/usr/local/elk/kibana的增删改操作建议使用上面创建的elk用户,否则还要使用chown命令修改权限。su -e elk修改配置:vim /usr/local/elk/kibana/config/kibana.yml默认配置都是注释了的,默认端口是5601,默认访问 elasticsearch 的9200端口。我们可以按需修改。例如:server.port: 5601 # 监听端口server.host: “0.0.0.0” # 绑定地址#server.name: “elk.fanhaobai.com” # 域名#elasticsearch.url: “http://127.0.0.1:9200” # es#kibana.index: “.kibana” # 索引名#elasticsearch.username: “elastic” # 用户名#elasticsearch.password: “changeme” # 密码这里修改了server.host,默认是localhost。启动kibana/usr/local/elk/kibana/bin/kibana注意:默认是前台运行的,如果需要后台运行:nohup /usr/local/elk/kibana/bin/kibana &可以使用前台运行的方式,没有报错误,然后使用后台运行的方式。查看是否已运行:$ netstat -tulnp | grep 5601tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 248/./kibana/bin/..配置web默认打开浏览器 http://127.0.0.1:5601 就可以看到 kibana 的界面了:也可以配置Nginx代理到别的域名:server { listen 80; server_name elk.cc; #当前主机名 # auth_basic “Restricted Access”; # auth_basic_user_file /usr/local/nginx/conf/htpasswd.users; #登录验证 location / { proxy_pass http://127.0.0.1:5601; #转发到kibana proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection ‘upgrade’; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; }}到现在还没有数据可以展示,因为ES里我们还没有导入或者传入数据。接下来我们使用 Logstash+Filebeat 导入日志数据。安装 Logstash二进制方式安装wget https://artifacts.elastic.co/downloads/logstash/logstash-5.6.2.tar.gztar zxvf logstash-5.6.2-linux.gz -C /usr/local/elk/mv /usr/local/elk/logstash-5.6.2/ /usr/local/elk/logstashchown -R elk:elk /usr/local/elk/logstashlogstash-5.6.2.tar.gz 大小96.8M。简单配置对目录/usr/local/elk/logstash的增删改操作建议使用上面创建的elk用户,否则还要使用chown命令修改权限。# 切换用户su - elk1、修改 config/jvm.options:vim /usr/local/elk/logstash/config/jvm.options这里我修改为:-Xms128m-Xmx512m2、修改 config/logstash.yml:vim /usr/local/elk/logstash/config/logstash.yml默认全是注释的,这里仅修改一处:path.config: /usr/local/elk/logstash/config/conf.d这样就支持子配置了,我们可以把新建的配置都放在conf.d目录里。注意:path.config:后面有一个空格。然后创建子文件夹:mkdir /usr/local/elk/logstash/config/conf.d 测试logstash由于现在我们还没有安装filebeat,也不打算直接使用logstash收集日志,所以先简单测试下标准输入输出,只要正常就行了:$ ./logstash/bin/logstash -e ‘input { stdin { } } output { stdout {}}‘稍等几秒钟:Sending Logstash’s logs to /usr/local/elk/logstash/logs which is now configured via log4j2.properties[2018-09-24T23:07:35,424][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>“netflow”, :directory=>"/usr/local/elk/logstash/modules/netflow/configuration”}[2018-09-24T23:07:35,434][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>“fb_apache”, :directory=>"/usr/local/elk/logstash/modules/fb_apache/configuration"}[2018-09-24T23:07:35,657][INFO ][logstash.pipeline ] Starting pipeline {“id”=>“main”, “pipeline.workers”=>4, “pipeline.batch.size”=>125, “pipeline.batch.delay”=>5, “pipeline.max_inflight”=>500}[2018-09-24T23:07:35,683][INFO ][logstash.pipeline ] Pipeline main startedThe stdin plugin is now waiting for input:[2018-09-24T23:07:35,776][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}hello2018-09-24T15:07:42.760Z 2106567e5bce hellowelcome2018-09-24T15:07:49.501Z 2106567e5bce welcome我们输入了hello、welcome,终端实时的输出了内容。后面的内容里,我们将会修改 stdin 为为beats,修改 stdout 为ElasticSearch。如果新增配置,需要后台常驻运行,可以使用下列命令:/usr/local/elk/logstash/bin/logstash &查看是否已运行(需要过10s左右,可以多刷几次):$ netstat -tulnp | grep 5044tcp 0 0 0.0.0.0:5044 0.0.0.0:* LISTEN 1040/java 安装 FilebeatFilebeat不依赖JDK。二进制安装wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.6.2-linux-x86_64.tar.gzfilebeat 8.4M。解压、设置 :mkdir /usr/local/elk/beatstar zxvf filebeat-5.6.2-linux-x86_64.tar.gz -C /usr/local/elk/beats/mv /usr/local/elk/beats/filebeat-5.6.2-linux-x86_64/ /usr/local/elk/beats/filebeatchown -R elk:elk /usr/local/elk/beats注意:后续对目录/usr/local/elk/beats的增删改操作建议使用上面创建的elk用户,否则还要使用chown命令修改权限。# 切换用户su - elkfilebeat采集内容发送到ElasticSearch为了让测试简单,我们手动模拟日志的生成:echo “test - test2” >> /tmp/test1.logecho “test - test2” >> /tmp/test2.log生成了2个日志文件test1.log、test2.log,各有一行日志。新建一个filebeat配置文件:cd /usr/local/elkvim beats/filebeat/filebeat.test.yml配置内容:filebeat.prospectors:- type: log paths: - /tmp/test1.log tags: [“test1”] document_type: test1- type: log paths: - /tmp/test2.log tags: [“test2”] document_type: test2output.elasticsearch: hosts: [“127.0.0.1:9200”] index: “test-filebeat"配置说明:filebeat.prospectors:type 日志类型,默认loginput_type 输入类型,默认logpaths 采集的日志,可以使用通配符。支持多个tags 自定义标签,是个数组。自定义document_type 自定义字段,用于Logsatsh区分来源,在Logsatsh里用变量type表示一个-表示一个filebeat.prospector,这里设置了2个。日志发送到elasticsearch,索引index 是test-filebeat。我们运行 filebeat:# 修改权限chmod 600 beats/filebeat/filebeat.test.yml# 指定配置文件前台运行./beats/filebeat/filebeat -c beats/filebeat/filebeat.test.yml我们新开终端查看ES里是否新增了内容:curl http://127.0.0.1:9200/test-filebeat/_search?q={ “took”: 0, “timed_out”: false, “_shards”: { “total”: 5, “successful”: 5, “skipped”: 0, “failed”: 0 }, “hits”: { “total”: 2, “max_score”: 1, “hits”: [ { “_index”: “test-filebeat”, “_type”: “test2”, “_id”: “AWYL9s4WJzfnbYlB_DSO”, “_score”: 1, “_source”: { “@timestamp”: “2018-09-24T14:23:30.652Z”, “beat”: { “hostname”: “2106567e5bce”, “name”: “2106567e5bce”, “version”: “5.6.2” }, “input_type”: “log”, “message”: “test - test2”, “offset”: 13, “source”: “/tmp/test2.log”, “tags”: [ “test2” ], “type”: “test2” } }, { “_index”: “test-filebeat”, “_type”: “test1”, “_id”: “AWYL9s4WJzfnbYlB_DSP”, “_score”: 1, “_source”: { “@timestamp”: “2018-09-24T14:23:30.652Z”, “beat”: { “hostname”: “2106567e5bce”, “name”: “2106567e5bce”, “version”: “5.6.2” }, “input_type”: “log”, “message”: “test - test2”, “offset”: 13, “source”: “/tmp/test1.log”, “tags”: [ “test1” ], “type”: “test1” } } ] }}新开命令行追加一行日志:echo “new msg” >> /tmp/test1.logcurl http://127.0.0.1:9200/test-filebeat/_search?q=&size=1&sort=@timestamp:desc{ “took”: 0, “timed_out”: false, “_shards”: { “total”: 5, “successful”: 5, “skipped”: 0, “failed”: 0 }, “hits”: { “total”: 3, “max_score”: null, “hits”: [ { “_index”: “test-filebeat”, “_type”: “test1”, “_id”: “AWYL-BjvJzfnbYlB_DSQ”, “_score”: null, “_source”: { “@timestamp”: “2018-09-24T14:24:55.654Z”, “beat”: { “hostname”: “2106567e5bce”, “name”: “2106567e5bce”, “version”: “5.6.2” }, “input_type”: “log”, “message”: “new msg”, “offset”: 21, “source”: “/tmp/test1.log”, “tags”: [ “test1” ], “type”: “test1” }, “sort”: [ 1537799095654 ] } ] }}这说明直接使用filebeat,也是可以发送数据到ES的,为什么还用logstash呢?原因是filebeat采集的是原始日志内容,发送到ES的也是原始内容,如果不需要处理的话,使用filebeat也行。我们可以看到返回的文档json里有一个字段 message ,这个是日志原始内容。filebeat还默认加了一些字段:@timestamp 时间beat filebeat相关信息,数组类型input_type 日志类型,一般是logmessage 日志原文offset 当前采集的日志的偏移量source 日志所在文件tags 自定义标签,数组类型type document_type字段定义的内容kibana里查看打开kibana web地址:http://127.0.0.1:5601,依次打开:Management-> Kibana -> Index Patterns ,选择Create Index Pattern:a. Index pattern 输入:test-filebeat ;b. Time Filter field name 选择 @timestamp。c. 点击Create。然后打开Discover,选择 test-filebeat 就能看到日志数据了。这时候我们去访问下自己配置了nginx日志的应用,这里能实时更新,再也不用去命令行使用tail查看了。filebeat内容发送到logstash接下来,我们将日志使用filebeat发送到logstash,然后通过logstash处理后发送到ElasticSearch。首先我们要修改上一节里filebeat的配置:vim beats/filebeat/filebeat.test.yml改为:filebeat.prospectors:- type: log paths: - /tmp/test1.log tags: [“test1”] document_type: test1- type: log paths: - /tmp/test2.log tags: [“test2”] document_type: test2output.logstash: hosts: [“127.0.0.1:5046”]#output.elasticsearch:# hosts: [“127.0.0.1:9200”]# index: “test-filebeat"我们把output.elasticsearch注释了,新增了output.logstash。然后新增logstash配置:vim logstash/config/conf.d/filebeat.test.confinput { beats { port => 5046 }}output { elasticsearch { hosts => [“127.0.0.1:9200”] index => “test-filebeat-%{type}” } stdout { codec => rubydebug }}这里的type变量就是filebeat里面的document_type。端口指定为5046(自定义即可),和filebeat里面配置的一致。logstash可以有多个子配置,所以也就能配置多个端口。此时,logstash是作为服务端运行的,filebeat是客户端。接下来我们启动logstash和filebeat:./logstash/bin/logstash &&表示后台运行:./beats/filebeat/filebeat -c beats/filebeat/filebeat.test.yml我们新开终端往日志里加点新内容:echo “new msg” >> /tmp/test2.logecho “new msg3” >> /tmp/test2.log稍等几秒钟,我们可以查看ES里的数据:curl http://127.0.0.1:9200/test-filebeat-test2/_search?q=&sort=@timestamp:desc{ “took”: 3, “timed_out”: false, “_shards”: { “total”: 5, “successful”: 5, “skipped”: 0, “failed”: 0 }, “hits”: { “total”: 2, “max_score”: null, “hits”: [ { “_index”: “test-filebeat-test2”, “_type”: “test2”, “_id”: “AWYMF-PeJzfnbYlB_DSo”, “_score”: null, “_source”: { “@timestamp”: “2018-09-24T14:59:38.188Z”, “offset”: 49, “@version”: “1”, “input_type”: “log”, “beat”: { “name”: “2106567e5bce”, “hostname”: “2106567e5bce”, “version”: “5.6.2” }, “host”: “2106567e5bce”, “source”: “/tmp/test2.log”, “message”: “new msg3”, “type”: “test2”, “tags”: [ “test2”, “beats_input_codec_plain_applied”, “_grokparsefailure” ] }, “sort”: [ 1537801178188 ] }, { “_index”: “test-filebeat-test2”, “_type”: “test2”, “_id”: “AWYMF-PeJzfnbYlB_DSn”, “_score”: null, “_source”: { “@timestamp”: “2018-09-24T14:59:38.186Z”, “offset”: 40, “@version”: “1”, “input_type”: “log”, “beat”: { “name”: “2106567e5bce”, “hostname”: “2106567e5bce”, “version”: “5.6.2” }, “host”: “2106567e5bce”, “source”: “/tmp/test2.log”, “message”: “new msg”, “type”: “test2”, “tags”: [ “test2”, “beats_input_codec_plain_applied”, “_grokparsefailure” ] }, “sort”: [ 1537801178186 ] } ] }}本节里我们虽然用到了logstash,但没有发挥它的强大处理功能。仅仅是演示了将日志使用filebeat发送到logstash,然后通过logstash处理后发送到ElasticSearch。处理功能后续再做讲解。提示:其实我们可以在logstash里根据filebeat里的document_type做条件判断:# 根据tags判断if “test1” in [tags] { # something}# type 就是filebeat里的document_typeif [type] == ’test1’{}else if [type] == ’test2’{}总结ELK我们一共安装了4个软件:elasticsearch-5.6.2kibana-5.6.2-linux-x86_64logstash-5.6.2filebeat-5.6.2-linux-x86_64其中es、kibana、logstash三者作为服务端安装在一起,filebeat安装在应用服务器,用于收集日志。我们看一下共起了哪些端口:$ netstat -tulnpActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:9000 0.0.0.0: LISTEN 13/php-fpm tcp 0 0 127.0.0.1:9200 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10/nginx tcp 0 0 0.0.0.0:5046 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:9300 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:9600 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN -9200 elasticsearch默认端口5601 kibana 默认端口5046 logstash 收集日志参考1、ELK集中式日志平台之二 — 部署 - 樊浩柏’s Bloghttps://www.fanhaobai.com/201… 2、ElasticSearch 5学习(1)——安装Elasticsearch、Kibana和X-Pack - wuxiwei - 博客园https://www.cnblogs.com/wxw16… 3、Logstash Filebeat 安装配置之使用 Kibana 分析日志数据 - 任我乐https://renwole.com/archives/661 4、ELK集中式日志平台之一 — 平台架构 - 樊浩柏’s Bloghttps://www.fanhaobai.com/201… 5、ELK集中式日志平台之三 — 进阶 - 樊浩柏’s Bloghttps://www.fanhaobai.com/201…6、ELK+Filebeat 集中式日志解决方案详解https://www.ibm.com/developer… ...

December 2, 2018 · 5 min · jiezi