ELK统一日志系统搭建
ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件,但并非全部。
Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据
项目使用版本(基于Linux系统搭建):
- elasticsearch-7.3.0
下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-linux-x86_64.tar.gz
- kibana-7.3.0
下载地址:https://artifacts.elastic.co/downloads/kibana/kibana-7.3.0-linux-x86_64.tar.gz
- logstash-7.3.0
下载地址:https://artifacts.elastic.co/downloads/logstash/logstash-7.3.0.tar.gz
Elasticsearch搭建
下载Elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-linux-x86_64.tar.gz
解压Elasticsearch
tar -zxvf elasticsearch-7.3.0-linux-x86_64.tar.gz
修改Elasticsearch的配置文件
cd elasticsearch-7.3.0/config/ vim elasticsearch.yml
由于默认的配置文件全注释掉了,所以直接在文件末尾添加。
注意:不同的版本对应的配置可以不一致,对照一下注释掉的文档是否包含以下配置。
# 如果需要部署集群,集群需要同样的集群名 cluster.name: my-application # 每个node的名字需要唯一 node.name: node-1 # 注意一定要是路径后面加上/var/lib/elasticsearch/nodes,要不然无法加入集群,单机不需要 # path.data: /var/lib/elasticsearch/nodes # path.logs: /var/log/elasticsearch # 配置服务器的内网地址,有文档配置的0.0.0.0或localhost,但是后面出现了问题,暂未研究什么原因 network.host: 192.168.0.146 # 配置端口号,默认9200 http.port: 9200 # 配置集群节点,多个服务器["node-1", "node-2"] cluster.initial_master_nodes: ["node-1"] # discovery.seed_hosts: ["192.168.0.146", "192.168.0.147", "192.168.0.148"] # 解决跨域 http.cors.enabled: true http.cors.allow-origin: "*"
启动Elasticsearch
其中/config/jvm.options为启动的JVM配置,默认为-Xms1g -Xmx1g …该配置根据自己的实际需求修改。
注意:启动时,不可以使用root用户。
进入Elasticsearch上级这里我们创建一个elsearch用户
# 创建elsearch组 groupadd elsearch useradd elsearch(用户名) -g elsearch(组名) -p elsearch(密码) # 给新创建用户文件夹执行权限 chown -R elsearch:elsearch /usr/local/elasticsearch-7.3.0 # 切换elsearch用户 su elsearch
进入bin目录
sh elasticsearch &
启动成功后,访问 http://192.168.0.146:9200/ ,得到以下截图,表示启动成功。
安装ElasticSearch的Head插件
注意:安装head需要安装node和npm
下载地址:https://github.com/mobz/elasticsearch-head.git
下载后执行:
# 安装module npm install # 运行head插件 npm run start
访问界面 http://192.168.0.146:9100/ 得到以下界面,(我的以下界面,已经添加了日志)
常见的问题
- 使用root用户启动,需要切换elsearch用户启动。
[2019-08-25T19:30:25,587][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-1] uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-7.3.0.jar:7.3.0] at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-7.3.0.jar:7.3.0] at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.3.0.jar:7.3.0] at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-7.3.0.jar:7.3.0] at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.3.0.jar:7.3.0] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[elasticsearch-7.3.0.jar:7.3.0] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.3.0.jar:7.3.0] Caused by: java.lang.RuntimeException: can not run elasticsearch as root at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:105) ~[elasticsearch-7.3.0.jar:7.3.0] at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:172) ~[elasticsearch-7.3.0.jar:7.3.0] at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:349) ~[elasticsearch-7.3.0.jar:7.3.0] at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.3.0.jar:7.3.0] ... 6 more
具体参考:https://blog.csdn.net/u013083576/article/details/78499884 (这篇博客整理的比较全面,遇到了再补充)
Logstash搭建
Logstash下载
下载Logstash
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.3.0.tar.gz
解压Logstash
tar -zxvf logstash-7.3.0.tar.gz
stash第一个事件
Logstash管道有两个必需元素,输入和输出,以及一个可选元素filter。 输入插件使用来自源的数据,过滤器插件在您指定时修改数据,输出插件将数据写入目标。
要测试Logstash安装成功,运行最基本的Logstash管道。 执行以下的命令
bin/logstash -e 'input { stdin { } } output { stdout {} }'
-e标志使您可以直接从命令行指定配置。
通过在命令行指定配置,可以快速测试配置,而无需在迭代之间编辑文件。
示例中的管道从标准输入stdin获取输入,并以结构化格式将输入移动到标准输出stdout。
启动Logstash后,等到看到“Pipeline main started”,然后在命令提示符下输入hello world,显示的如下:
hello world { "host" => "VM_0_13_centos", "message" => "hello world", "@version" => "1", "@timestamp" => 2019-07-02T06:26:28.684Z }
配置logstash输出到elasticsearch
修改logstash的安装目录的config目录下的logstash-sample.conf文件
cd logstash-7.3.0/config/ vim logstash-sample.conf
修改完配置如下:
input { beats { port => 5044 } tcp { port => 4569 codec => "json" } } output { if[appname] != "" { elasticsearch { hosts => ["http://192.168.0.146:9200"] index => "%{[appname]}-%{+YYYY.MM.dd}" } } else { elasticsearch { hosts => ["http://192.168.0.146:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } } }
更多配置参照官网教程:https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html
其中:
- beats为结合filebeat使用。
- tcp为通过tcp协议的通道。注意codec为json格式。por为请求的端口号。
- elasticsearch 为输出到elasticsearch ,也可以配置其他。更多详细见下面文档
配置详细解释
可以参考该logstash手册:https://doc.yonyoucloud.com/doc/logstash-best-practice-cn/get_start/hello_world.html
logstash结合filebeat使用
logstash结合filebeat
在分布式系统中,一台主机可能有多个应用,应用将日志输出到主机的指定目录,这时由logstash来搬运日志并解析日志,然后输出到elasticsearch上。由于于
logstash是java应用,解析日志是非的消耗cpu和内存,logstash安装在应用部署的机器上显得非常的笨重。最常见的做法是用filebeat部署在应用的机器上,logstash单独部署,然后由
filebeat将日志输出给logstash解析,解析完由logstash再传给elasticsearch。
下载filebeat,下载命令如下:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.0-linux-x86_64.tar.gz tar -zxvf filebeat-7.3.0-linux-x86_64.tar.gz cd /filebeat-7.3.0-linux-x86_64/
vim filebeat.yml修改配置:
filebeat.inputs: - type: log enabled: true paths: - /var/log/service.log output.logstash: hosts: ["192.168.1.146:5044"]
主要配置的是日志的搜集目录为/var/log/service.log,这个目录是应用service输出日志的文件。输出到logstsh的地址为192.168.1.146
启动filebeat,执行以下命令:
sudo chown root filebeat.yml sudo ./filebeat -e >filebeat.log 2>&1 &
这样日志就传输到了logstash, 然后通过logstash输出到elasticsearch
具体效果需要结合Kibana或者通过elasticsearch-head查看
SpringCloud + logstash结合logbak使用
在pom文件引用
<!--logback日志--> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>5.2</version> </dependency>
在resources添加logbak的配置文件 logback-spring.xml:
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds"> <!-- 定义参数 --> <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" /> <!-- 控制台打印设置 --> <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!-- logstash设置 --> <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <param name="Encoding" value="UTF-8"/> <!-- logstash服务器ip --> <remoteHost>192.168.0.146</remoteHost> <!-- logstash tcp 端口--> <port>4569</port> <!-- <filter class="com.program.interceptor.ELKFilter"/>-->//引入过滤类 <!-- encoder is required --> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" > <customFields>{"appname":"ceshi"}</customFields> // 索引名 </encoder> </appender> <root level="info"> <appender-ref ref="consoleAppender" /> <appender-ref ref="logstash"/> </root> </configuration>
其中{“appname”:“ceshi”} 对应logstash配置文件中的appname,为创建的索引名。
可以在Kibana索引管理中根据名称进行分区搜索。根据自己的需求来,这里只做演示。
编写测试方法:
@Slf4j @RestController public class TestController { @RequestMapping(value = "/test") public String test(String id) { log.info("这是一个日志测试的controller"); return "这是一个日志测试的controller"; } }
请求该方法,在Kibana中便可搜索到这条消息。(我这里做了接口拦截日志,展示的有些不一致,这里只做效果展示用)
Kibana搭建
kibana作为ElastciSearch的数据查询展示界面,集成了很多的功能,本文主要讲述如下部署kibana。
下载Kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.3.0-linux-x86_64.tar.gz
解压Kibana
tar -zxvf kibana-7.3.0-linux-x86_64.tar.gz
修改Kibana的配置文件
cd kibana-7.3.0/config/ vim kibana.yml
修改配置文件如下:
# 端口 server.port: 5601 # 指定本机ip让外部能访问 server.host: "0.0.0.0" # 请求数据指向的elasticsearch服务器 elasticsearch.hosts: ["http://192.168.0.146:9200"]
配置完启动kibana,进入bin目录执行
sh kibana &
访问http://192.168.0.146:5601, 得到以下页面,代表启动成功。
查看通过logstash传输的日志列表
配置索引模式
查看日志
本文就到这里了,这里只是简单的介绍了ELK的基础安装使用,更多的高级功能,还需要小伙伴自己去挖掘。
如果有什么问题,欢迎留言讨论。