ElasticSearch+Logstash+Kibana 构建实时日志平台(ELK)
一、背景
- 作为运维工程师,我们每天需要对服务器进行故障排除,那么最先能帮助我们定位问题的就是查看服务器日志,通过日志可以快速的定位问题。
- 目前我们说的日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常需要分析日志可以了解服务器的负荷,性能,安全性,从而及时采取措施纠正错误。而且日志被分散的储存不同的设备上。
- 如果你管理数上百台服务器,我们登录到每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的 syslog,将所有服务器上的日志收集汇总。
- 集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用 find、grep、awk 和 wc 等 Linux 命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
今天给大家分享的开源实时日志分析 ELK 平台能够完美的解决我们上述的问题, ELK 由 ElasticSearch、Logstash 和 Kiabana 三个开源工具组成。不过现在还新增了一个Beats,它是一个轻量级的日志收集处理工具(Agent),Beats占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具, 目前由于原本的ELK Stack成员中加入了 Beats 工具所以已改名为Elastic Stack。
Elastic Stack包含:
-
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。详细可参考Elasticsearch权威指南
-
Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
-
Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
-
Beats在这里是一个轻量级日志采集器,其实Beats家族有6个成员,早期的ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、io等资源消耗比较高。相比 Logstash,Beats所占系统的CPU和内存几乎可以忽略不计
ELK Stack (5.0版本之后)–> Elastic Stack == (ELK Stack + Beats)。目前Beats包含六种工具:
Packetbeat: 网络数据(收集网络流量数据)
Metricbeat: 指标 (收集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
Filebeat:日志文件(收集文件数据)
Winlogbeat: windows事件日志(收集 Windows 事件日志数据)
Auditbeat:审计数据 (收集审计日志)
Heartbeat:运行时间监控 (收集系统运行时的数据)
- Logstash 和 Elasticsearch 是用 Java 语言编写(比较吃内存),而 Kibana 使用 node.js 框架,在配置 ELK 环境要保证系统有 JAVA JDK 开发库哦。
二、官方文档:
Filebeat:
https://www.elastic.co/cn/products/beats/filebeat
https://www.elastic.co/guide/en/beats/filebeat/index.html
Logstash:
https://www.elastic.co/cn/products/logstash
https://www.elastic.co/guide/en/logstash/index.html
Kibana:
https://www.elastic.co/cn/products/kibana
https://www.elastic.co/guide/en/kibana/index.html
Elasticsearch:
https://www.elastic.co/cn/products/elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/index.html
elasticsearch中文社区:
https://elasticsearch.cn/
二、ELK 原理拓扑图
架构图一:
这是最简单的一种ELK架构方式。优点是搭建简单,易于上手。缺点是Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。
此架构由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web方便的对日志查询,并根据数据生成报表。
架构图二:
此种架构引入了消息队列机制,位于各个节点上的Logstash Agent先将数据/日志传递给Kafka(或者Redis),并将队列中消息或数据间接传递给Logstash,Logstash过滤、分析后将数据传递给Elasticsearch存储。最后由Kibana将日志和数据呈现给用户。因为引入了Kafka(或者Redis),所以即使远端Logstash server因故障停止运行,数据将会先被存储下来,从而避免数据丢失。
架构图三:
此种架构将收集端logstash替换为beats,更灵活,消耗资源更少,扩展性更强。同时可配置Logstash 和Elasticsearch 集群用于支持大集群系统的运维日志数据监控和查询。
Filebeat工作原理:
Filebeat由两个主要组件组成:prospectors 和 harvesters。这两个组件协同工作将文件变动发送到指定的输出中。
ELK 工作流程
通过 logstash 收集客户端 APP 的日志数据,将所有的日志过滤出来,存入 Elasticsearch 搜索引擎里,然后通过 Kibana GUI 在 WEB前端展示给用户,用户需要可以进行查看指定的日志内容。同时也可以加入 redis 通信队列:
加入 Redis 队列后工作流程
Logstash 包含 Index 和 Agent(shipper) ,Agent 负责客户端监控 和 过 滤 日 志 , 而 Index 负 责 收 集 日 志 并 将 日 志 交 给ElasticSearch,ElasticSearch 将日志存储本地,建立索引、提供搜索,kibana 可以从 ES 集群中获取想要的日志信息。
三、Elasticsearch 安装配置
1、系统环境配置
1、关闭防火墙和selinux
# 内网环境:直接关闭防火墙,减少防火墙规则的维护工作
systemctl stop firewalld
systemctl disable firewalld
# 关闭SElinux安全模组,临时生效
setenforce 0
# 永久生效
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
- 修改内核参数
vim /etc/sysctl.conf
# 修改如下两个参数
fs.file-max=419430
vm.max_map_count=262144
sysctl -p
- 修改系统打开最大文件句柄,解决开启bootstrap.memory_lock: true功能导致的报错如下
[1]: memory locking requested for elasticsearch process but memory is not locked
cat >> /etc/security/limits.conf << EOF
* soft nofile 655360
* hard nofile 655360
* soft nproc 40960
* hard nproc 40960
* hard memlock unlimited
* soft memlock unlimited
EOF
cat >> /etc/systemd/system.conf << EOF
# 开启内存锁定设定
DefaultLimitNOFILE=655360
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity
EOF
4.分别下载软件包
下载地址:https://www.elastic.co/cn/downloads/ 下载最新安装包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.8.0.tar.gz
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.0-linux-x86_64.tar.gz
tar -xvf elasticsearch-7.8.0-linux-x86_64.tar.gz
- 创建用户
useradd es
chown es:es -R elasticsearch-7.8.0
su - es
- 创建数据及日志目录
[root@node3 ~]# mkdir /data/elasticsearch/{data,logs} -p
[root@node3 ~]# chown es:es -R /data/elasticsearch/
2、es7内置jdk,修改启动脚本
jdk下载地址:https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html
注意需要登录oracle账户密码,自行下载安装
Elasticsearch1.7.X之后的版本需要安装jdk11之后的版本
此处采用es自带的jdk版本
# es7内置jdk,修改启动脚本
cd /elasticsearch-7.8.0
vim ./bin/elasticsearch
# 配置自己的jdk11
export JAVA_HOME=/elasticsearch-7.8.0/jdk
export PATH=$JAVA_HOME/bin:$PATH
# 添加jdk判断
if [ -x "$JAVA_HOME/bin" ]; then
JAVA="/elasticsearch-7.8.0/jdk/bin/java"
else
JAVA=`which java`
fi
:wq
3、目录说明
目录 | 主要配置文件 | 描述 |
---|---|---|
/elasticsearch/bin/ | elasticsearch | 脚本文件存放目录,包括 elasticesearch,安装插件.运行统计数据等. |
/elasticsearch/ | elasticsearch.yml | 集群配置文件,jvm配置文件 |
/elasticsearch/jdk/ | java | java运行环境 |
/data/elasticsearch/ | 日志和数据目录 | 数据文件及日志目录 |
/elasticsearch/lib/ | java类库 | |
/elasticsearch/modules/ | 包含所有ES模块 | |
/elasticsearch/plugins/ | 包含所有已安装的插件 |
4、elasticsearch主配置
(注意elasticsearch.yml文件配置项开头不要用空格、tab等,每个配置项顶行头写)
vim /elasticsearch-7.8.0/config/elasticsearch.yml
# ---------------------------------- Cluster -----------------------------------
# 集群名称
cluster.name: es-cluster
# ------------------------------------ Node ------------------------------------
# 节点 name
node.name: node-6
# 节点是否参加 master 选举
node.master: true
# 是否为数据节点
node.data: true
# ----------------------------------- Paths ------------------------------------
# 数据目录
path.data: /data/elasticsearch/data
# 日志文件存储路径
path.logs: /data/elasticsearch/logs
# ----------------------------------- Memory -----------------------------------
# 是否启动时锁定内存,生产建议开启,预生产建议关闭
bootstrap.memory_lock: true
# ---------------------------------- Network -----------------------------------
# 监听地址
network.host: 192.168.2.212
# 监听端口
http.port: 9200
# --------------------------------- Discovery ----------------------------------
#设置提供群集中其他节点的列表,这些节点符合主要条件且可能是实时且可联系的,以便为发现过程设定种子。 此设置通常应包含群集中所有符合主节点的节点的地址。 此设置包含主机数组或逗号分隔的字符串。 每个值应采用host:port或host的形式
#自动发现节点
discovery.seed_hosts: ["192.168.2.212", "192.168.2.213"]
# Bootstrap the cluster using an initial set of master-eligible nodes:
# 初始化引导集群节点
cluster.initial_master_nodes: ["node-1", "node-2"]
5、JVM配置
官网配置建议: https://www.elastic.co/cn/blog/a-heap-of-trouble
- Xms 和 Xmx 此处设置成一样
- Xmx 不要超过机器内存的 50 %.
- 不要超过 30G
6、启动并检查集群状态
启动服务
./bin/elasticsearch -d #主目录的bin目录下执行,-d是后台运行
查看日志
tail -100f ./logs/elasticsearch.log
# 查看集群状态
[es@localhost config]$ curl http://192.168.2.212:9200/_cluster/health?pretty
{
"cluster_name" : "es-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
# 查看各nodes 数据和主节点
[es@localhost config]$ curl http://192.168.2.212:9200/_cat/nodes?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.2.212 44 93 4 0.19 0.19 0.14 dilmrt * node-1
*:就是leader;-:就是follower
elasticsearch状态说明
- green:表示每个index的shard和replica都是活跃状态的。
- yellow:表示每个index的shard是活跃状态的,replica是不可用状态的。
- red:表示索引中有些shard是不可用状态,导致数据丢失。
7、配置图形化界面工具Head插件
Head插件是Elasticsearch的图形化界面工具,通过此插件可以很方便的对数据进行增删改查等数据交互操作。在Elasticsearch5.x版本以后,head插件已经是一个独立的Web App了,所以不需要和Elasticsearch进行集成。可以将Head插件安装到任何一台机器上
由于Head插件本质上是一个Node.js的工程,因此需要安装Node.js,使用npm工具来安装依赖的包。
NPM的全名叫Node Package Manager,是随NodeJS一起安装的包管理和分发工具,方便让JavaScript开发者下载、安装、上传以及管理已经安装的包。
1、下载Node.js和NPM工具
url --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
或
curl --silent --location https://rpm.nodesource.com/setup_10.x | sudo bash -
然后
yum -y install nodejs
这个安装好后,npm也在这个模块中,已经有了,所以不需要再安装。
2、下载并安装Head插件
yum install -y git
git clone git://github.com/mobz/elasticsearch-head.git
3、修改配置文件
这是从github上克隆过的,安装好后你就会发现当前目录下有一个ES-Head目录。
进去elasticsearch-head/_site/app.js文件,修改如下配置:
4、开始安装
npm config set registry=http://registry.npm.taobao.org/ //修改源地址为淘宝NPM镜像,因为默认NPM的官方源为https://registry.npmjs.org/ 。国外下载速度会很慢,所以这里建议切换到淘宝的NPM镜像站点比较好。
cd elasticsearch-head
npm install
npm install 安装时,可能会报 phantomjs-prebuilt@2.1.16安装失败如下
[root@localhost elasticsearch-head]# npm install
npm WARN deprecated coffee-script@1.10.0: CoffeeScript on NPM has moved to “coffeescript” (no hyphen)
npm WARN deprecated http2@3.3.7: Use the built-in module in node 9.0.0 or newer, instead
npm WARN deprecated core-js@2.6.11: core-js@❤️ is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
npm WARN deprecated chokidar@1.7.0: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
npm WARN deprecated phantomjs-prebuilt@2.1.16: this package is now deprecated
npm WARN deprecated json3@3.3.2: Please use the native JSON object instead of JSON 3
npm WARN deprecated json3@3.2.6: Please use the native JSON object instead of JSON 3
npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
phantomjs-prebuilt@2.1.16 install /elasticsearch-head/node_modules/phantomjs-prebuilt
node install.js
PhantomJS not found on PATH
Downloading https://github.com/Medium/phantomjs/releases/download/v2.1.1/phantomjs-2.1.1-linux-x86_64.tar.bz2
Saving to /tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2
Receiving…
一直停顿在这里…
解决办法:
[root@localhost elasticsearch-head]# npm install phantomjs-prebuilt@2.1.16 --ignore-scripts
然后再
[root@localhost elasticsearch-head]# npm install
5、启动head插件服务
[root@localhost elasticsearch-head]# npm run start #前台命令会中断
#后台启动的命令
nohup npm run start &
head插件服务启动之后,默认的访问端口为9100,如图所示:
说明已正常启动,浏览器打开查看:
自己手动创建一个索引test,如上图所示。其中 *:是主节点,我创建索引时,配置中设置了5个分片,一个副本分片,因此可以看到每个索引都有10个分片,每个分片都用0、1、2、3、4等数字加方框表示,其中,粗体方框是主分片,细体方框是副本分片。
my-cluster是集群的名称,后面的“集群健康值”通过不同的颜色表示集群的健康状态:其中,绿色表示主分片和副本分片都可用;黄色表示只有主分片可用,没有副本分片;红色表示主分片中的部分索引不可用,但是某些索引还可以继续访问。正常情况下都显示绿色。
附加:Elasticsearch 7.x 插件的安装、查看、删除
安装:
[elsearch@bigdata1 ~]$ bin/elasticsearch-plugin install xxxxxx
查看:
[elsearch@bigdata1 ~]$ bin/elasticsearch-plugin list
删除:
[elsearch@bigdata1 ~]$ bin/elasticsearch-plugin remove xxxxxx
8、cerebro管理监控工具插件
erebro 和 elasticsearch-head 类似.是一款基于Web的ElasticSearch管理监控工具 图形化比elasticsearch-head更加友好.
项目地址: https://github.com/lmenezes/cerebro
1、安装软件
wget https://github.com/lmenezes/cerebro/releases/download/v0.9.1/cerebro-0.9.1.tgz
tar xf cerebro-0.9.1.tgz
cd cerebro-0.9.1/
2、修改配置文件
vim /usr/local/cerebro-0.9.1/conf/application.conf
hosts = [
{
host = "http://172.16.0.206:9200"
name = "es-cluster"
}
]
3、启动程序
# 默认监听 0.0.0.0
bin/cerebro
# 也可指定监听ip和端口号
bin/cerebro -Dhttp.port=1234 -Dhttp.address=127.0.0.1
四、kibana安装配置
# 也可以使用kibana登录验证
vi /usr/local/server/kibana/config/kibana.yml
server.port: 80
server.host: "0.0.0.0"
server.name: "kibana"
# 这里可以配置多个
elasticsearch.hosts: ["http://192.168.1.1:9200"]
kibana.index: ".kibana"
kibana.defaultAppId: "home"
#中文显示
i18n.locale: "zh-CN"
# 初始化kibana用户名
elasticsearch.username: "kibana"
# 初始化密码,修改成自己的
elasticsearch.password: "123456"
创建用户
useradd elk
chown elk:elk /kibana-7.8.0-linux-x86_64 -R
su -elk
# 启动kibana默认需要使用非root用户
nohup /kibana-7.8.0-linux-x86_64/bin/kibana >/data/logs/kibanalog.log &
用root用户启动如下
nohup /kibana-7.8.0-linux-x86_64/bin/kibana --allow-root >/data/logs/kibanalog.log &
报错如下
{"type":"log","@timestamp":"2020-07-08T23:05:09Z","tags":["warning","savedobjects-service"],"pid":3012,"message":"Unable to connect to Elasticsearch. Error: [resource_already_exists_exception] index [.kibana_task_manager_1/LNAllBdGSEG1np180q_U_g] already exists, with { index_uuid=\"LNAllBdGSEG1np180q_U_g\" & index=\".kibana_task_manager_1\" }"}
{"type":"log","@timestamp":"2020-07-08T23:05:09Z","tags":["warning","savedobjects-service"],"pid":3012,"message":"Another Kibana instance appears to be migrating the index. Waiting for that migration to complete. If no other Kibana instance is attempting migrations, you can get past this message by deleting index .kibana_task_manager_1 and restarting Kibana."}
处理办法:在elastic中删除kibana的索引
我是使用elasticsearch-head工具手动删除的,
也可以使用如下命令删除
cd /elasticsearch-7.8.0
curl -XDELETE http://192.168.2.212:9200/.kibana*
原因:索引已经存在
五、logstash的配制
ogstash:数据处理引擎,可以处理每秒几万条的日志;它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到 ES
Logstash事件处理有三个阶段: inputs →filters→outputs。是一个接收, 处理,转发日志的工具。
支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。
1、下载命令:wget https://artifacts.elastic.co/downloads/logstash/logstash-7.8.0.tar.gz
2、安装:可以下载tar.gz,一解压就可以了
logstash像上面说的支持动态的从各种数据源搜集数据
input接受数据的输入,分值的输入的方式(需要插件支持)
output输出文件到指定的地方,需要插件支持
filters和codecs:对数据进行过滤、分析、丰富、统一格式等操作
配置Logstash文件
要配置Logstash,您将创建一个配置文件,该文件指定要使用的插件以及每个插件的设置。您可以在配置中引用事件字段,并在条件满足特定条件时使用条件处理事件。运行logstash时,您可以使用-f来指定您的配置文件。
让我们逐步创建一个简单的配置文件,并使用它运行Logstash。创建一个名为“ logstash-simple.conf”的文件,并将其保存在与Logstash相同的目录中。
input { stdin { } }
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
然后,运行logstash并使用该-f标志指定配置文件。
bin/logstash -f logstash-simple.conf
配置文件的结构
Logstash配置文件针对要添加到事件处理管道中的每种插件类型都有一个单独的部分。例如
# This is a comment. You should use comments to describe
# parts of your configuration.
input {
...
}
filter {
...
}
output {
...
}
示例配置文件如下:
引用此博客内容
input {
# 从文件读取日志信息
file {
path => "/var/log/error.log"
type => "error"//type是给结果增加一个type属性,值为"error"的条目
start_position => "beginning"//从开始位置开始读取
# 使用 multiline 插件,传说中的多行合并
codec => multiline {
# 通过正则表达式匹配,具体配置根据自身实际情况而定
pattern => "^\d"
negate => true
what => "previous"
}
}
}
#可配置多种处理规则,他是有顺序,所以通用的配置写下面
# filter {
# grok {
# match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
# }
output {
# 输出到 elasticsearch
elasticsearch {
hosts => ["192.168.22.41:9200"]
index => "error-%{+YYYY.MM.dd}"//索引名称
}
}
上面的file可以配置多个:
file {
type => "tms_inbound.log"
path => "/JavaWeb/tms2.wltest.com/logs/tms_inbound.es.*.log"
codec => json {
charset => "UTF-8"
}
}
file {
type => "tms_outbound.log"
path => "/JavaWeb/tms2.wltest.com/logs/tms_outbound.es.*.log"
codec => json {
charset => "UTF-8"
}
}
启动logstash
接下来可以将文件保存为testLogs.conf文件,保存到logstash的bin路径下,进入logstash的bin路径下运行:
bin/logstash -f testLogs.conf
//如果放到conf文件夹下
bin/logstash -f conf/testLogs.conf//路径要对应上,这里是conf/testLogs.conf
logstash启动参数:
-f:指定配置文件,根据配置文件配置logstash
-e:字符串,配置,默认“”stdin输入、stdout输出(在控制台输入、输出),可通过命令行接受设置
-l:输出地址,默认控制台输出
-t:测试配置文件是否正确后退出
标准输入到标准输出:
[root@localhost bin]# ./logstash -e 'input { stdin { } } output { stdout {} }'
OpenJDK 64-Bit Server VM warning: Ignoring option UseConcMarkSweepGC; support was removed in 14.0
OpenJDK 64-Bit Server VM warning: Ignoring option CMSInitiatingOccupancyFraction; support was removed in 14.0
OpenJDK 64-Bit Server VM warning: Ignoring option UseCMSInitiatingOccupancyOnly; support was removed in 14.0
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.headius.backport9.modules.Modules (file:/logstash-7.8.0/logstash-core/lib/jars/jruby-complete-9.2.11.1.jar) to method sun.nio.ch.NativeThread.signal(long)
WARNING: Please consider reporting this to the maintainers of com.headius.backport9.modules.Modules
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Sending Logstash logs to /logstash-7.8.0/logs which is now configured via log4j2.properties
[2020-07-09T03:13:08,001][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2020-07-09T03:13:08,148][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"7.8.0", "jruby.version"=>"jruby 9.2.11.1 (2.5.7) 2020-03-25 b1f55b1a40 OpenJDK 64-Bit Server VM 14.0.1+7 on 14.0.1+7 +indy +jit [linux-x86_64]"}
[2020-07-09T03:13:10,643][INFO ][org.reflections.Reflections] Reflections took 73 ms to scan 1 urls, producing 21 keys and 41 values
[2020-07-09T03:13:11,835][INFO ][logstash.javapipeline ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>250, "pipeline.sources"=>["config string"], :thread=>"#<Thread:0x45d7005d run>"}
[2020-07-09T03:13:13,294][INFO ][logstash.javapipeline ][main] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[2020-07-09T03:13:13,401][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2020-07-09T03:13:13,845][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
hello
/logstash-7.8.0/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated
{
"@version" => "1",
"@timestamp" => 2020-07-08T19:14:20.826Z,
"message" => "hello",
"host" => "localhost.localdomain"
}
您好
{
"@version" => "1",
"@timestamp" => 2020-07-08T19:14:33.920Z,
"message" => "您好",
"host" => "localhost.localdomain"
}
可以看出,我们输入什么就会输出什么,说明部署没有问题
file输出插件
vim /logstash-7.8.0/config/test.conf
input {
stdin {}
}
output {
file {
path => "/tmp/logstash.txt"
codec => line { format => "custom format: %{message}"}
}
}
[root@localhost bin]# ./logstash -f /logstash-7.8.0/config/test.conf
OpenJDK 64-Bit Server VM warning: Ignoring option UseConcMarkSweepGC; support was removed in 14.0
OpenJDK 64-Bit Server VM warning: Ignoring option CMSInitiatingOccupancyFraction; support was removed in 14.0
OpenJDK 64-Bit Server VM warning: Ignoring option UseCMSInitiatingOccupancyOnly; support was removed in 14.0
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.headius.backport9.modules.Modules (file:/logstash-7.8.0/logstash-core/lib/jars/jruby-complete-9.2.11.1.jar) to method sun.nio.ch.NativeThread.signal(long)
WARNING: Please consider reporting this to the maintainers of com.headius.backport9.modules.Modules
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Sending Logstash logs to /logstash-7.8.0/logs which is now configured via log4j2.properties
[2020-07-09T03:22:42,032][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2020-07-09T03:22:42,185][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"7.8.0", "jruby.version"=>"jruby 9.2.11.1 (2.5.7) 2020-03-25 b1f55b1a40 OpenJDK 64-Bit Server VM 14.0.1+7 on 14.0.1+7 +indy +jit [linux-x86_64]"}
[2020-07-09T03:22:44,391][INFO ][org.reflections.Reflections] Reflections took 125 ms to scan 1 urls, producing 21 keys and 41 values
[2020-07-09T03:22:45,068][INFO ][logstash.javapipeline ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>250, "pipeline.sources"=>["/logstash-7.8.0/config/test.conf"], :thread=>"#<Thread:0x2b777b24 run>"}
[2020-07-09T03:22:46,206][INFO ][logstash.javapipeline ][main] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[2020-07-09T03:22:46,299][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2020-07-09T03:22:46,682][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
Mr.XU
[2020-07-09T03:23:15,890][INFO ][logstash.outputs.file ][main][6ec9f3145f2b7aafc6b201595f3c9ffa034bd43b5ab90710027e886110b77cde] Opening file {:path=>"/tmp/logstash.txt"}
[2020-07-09T03:23:36,267][INFO ][logstash.outputs.file ][main][6ec9f3145f2b7aafc6b201595f3c9ffa034bd43b5ab90710027e886110b77cde] Closing file /tmp/logstash.txt
20200721
[2020-07-09T03:23:53,387][INFO ][logstash.outputs.file ][main][6ec9f3145f2b7aafc6b201595f3c9ffa034bd43b5ab90710027e886110b77cde] Opening file {:path=>"/tmp/logstash.txt"}
[2020-07-09T03:24:11,235][INFO ][logstash.outputs.file ][main][6ec9f3145f2b7aafc6b201595f3c9ffa034bd43b5ab90710027e886110b77cde] Closing file /tmp/logstash.txt ^H
[2020-07-09T03:25:27,076][INFO ][logstash.outputs.file ][main][6ec9f3145f2b7aafc6b201595f3c9ffa034bd43b5ab90710027e886110b77cde] Opening file {:path=>"/tmp/logstash.txt"}
没有一个冬天不可逾越,没有一个春天不会到来!
[2020-07-09T03:25:46,233][INFO ][logstash.outputs.file ][main][6ec9f3145f2b7aafc6b201595f3c9ffa034bd43b5ab90710027e886110b77cde] Closing file /tmp/logstash.txt
######可以看出这里的输出指定到了 :path=>"/tmp/logstash.txt#####
[root@localhost ~]# cat /tmp/logstash.txt
custom format: Mr.XU
custom format: 20200721
custom format:
custom format: 没有一个冬天不可逾越,没有一个春天不会到来!
[root@localhost ~]#
一般情况我们输出至ES,ES进行分析,然后kibana在进行展示。
elasticsearch输出插件
输出至ES:
vim /logstash-7.8.0/config/es.conf
input {
stdin {}
}
output {
stdout {}
elasticsearch {
hosts => "192.168.2.212:9200" # 输出到的ES主机与端口
index => "logstash-%{+YYYY.MM.dd}" # 定制索引名称
}
}
[root@localhost bin]# ./logstash -f /logstash-7.8.0/config/es.conf
OpenJDK 64-Bit Server VM warning: Ignoring option UseConcMarkSweepGC; support was removed in 14.0
OpenJDK 64-Bit Server VM warning: Ignoring option CMSInitiatingOccupancyFraction; support was removed in 14.0
OpenJDK 64-Bit Server VM warning: Ignoring option UseCMSInitiatingOccupancyOnly; support was removed in 14.0
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.headius.backport9.modules.Modules (file:/logstash-7.8.0/logstash-core/lib/jars/jruby-complete-9.2.11.1.jar) to method sun.nio.ch.NativeThread.signal(long)
WARNING: Please consider reporting this to the maintainers of com.headius.backport9.modules.Modules
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Sending Logstash logs to /logstash-7.8.0/logs which is now configured via log4j2.properties
[2020-07-09T03:34:15,756][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2020-07-09T03:34:15,892][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"7.8.0", "jruby.version"=>"jruby 9.2.11.1 (2.5.7) 2020-03-25 b1f55b1a40 OpenJDK 64-Bit Server VM 14.0.1+7 on 14.0.1+7 +indy +jit [linux-x86_64]"}
[2020-07-09T03:34:18,102][INFO ][org.reflections.Reflections] Reflections took 133 ms to scan 1 urls, producing 21 keys and 41 values
[2020-07-09T03:34:19,510][INFO ][logstash.outputs.elasticsearch][main] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://192.168.2.212:9200/]}}
[2020-07-09T03:34:20,039][WARN ][logstash.outputs.elasticsearch][main] Restored connection to ES instance {:url=>"http://192.168.2.212:9200/"}
[2020-07-09T03:34:20,534][INFO ][logstash.outputs.elasticsearch][main] ES Output version determined {:es_version=>7}
[2020-07-09T03:34:20,553][WARN ][logstash.outputs.elasticsearch][main] Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>7}
[2020-07-09T03:34:20,789][INFO ][logstash.outputs.elasticsearch][main] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//192.168.2.212:9200"]}
[2020-07-09T03:34:20,913][INFO ][logstash.javapipeline ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>250, "pipeline.sources"=>["/logstash-7.8.0/config/es.conf"], :thread=>"#<Thread:0xc30b833 run>"}
[2020-07-09T03:34:20,962][INFO ][logstash.outputs.elasticsearch][main] Using default mapping template
[2020-07-09T03:34:21,135][INFO ][logstash.outputs.elasticsearch][main] Attempting to install template {:manage_template=>{"index_patterns"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s", "number_of_shards"=>1}, "mappings"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}
[2020-07-09T03:34:22,618][INFO ][logstash.javapipeline ][main] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[2020-07-09T03:34:22,919][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2020-07-09T03:34:23,178][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
您好2020
/logstash-7.8.0/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated
{
"host" => "localhost.localdomain",
"@version" => "1",
"@timestamp" => 2020-07-08T19:34:39.221Z,
"message" => "您好2020"
}
呵呵
{
"host" => "localhost.localdomain",
"@version" => "1",
"@timestamp" => 2020-07-08T19:35:24.898Z,
"message" => "呵呵"
}
然后再web端查看
我们可以看到,就在ES上可以查看了。
显然,这种的输入是我们一直在手敲,是不方便的,所以我们可以把文件中的内容输出至ES。
file输入插件
[root@localhost bin]# vim /logstash-7.8.0/config/es.conf
input {
file {
path => "/etc/passwd" # 输入这个文件中的内容
start_position => "beginning" # begin 是从头开始读,end从末尾读,即只读新的内容
}
}
output {
stdout {}
elasticsearch {
hosts => "192.168.2.212:9200"
index => "logstash-%{+YYYY.MM.dd}"
}
}
[root@localhost bin]# ./logstash -f /logstash-7.8.0/config/es.conf
查看kibana显示效果