(轉)
1.ELK是什么?
ELK是由Elasticsearch、Logstash、Kibana這3個軟件的縮寫。
- Elasticsearch是一個分布式搜索分析引擎,穩定、可水平擴展、易於管理是它的主要設計初衷
- Logstash是一個靈活的數據收集、加工和傳輸的管道軟件
- Kibana是一個數據可視化平台,可以通過將數據轉化為酷炫而強大的圖像而實現與數據的交互將三者的收集加工,存儲分析和可視轉化整合在一起就形成了 ELK 。
2.ELK流程
ELK的流程應該是這樣的:Logback->Logstash->(Elasticsearch<->Kibana)
- 應用程序產生出日志,由logback日志框架進行處理。
- 將日志數據輸出到Logstash中
- Logstash再將數據輸出到Elasticsearch中
- Elasticsearch再與Kibana相結合展示給用戶
3.ELK官網
https://www.elastic.co/guide/index.html
4. 環境配置
4.1 基礎環境
- jdk 1.8
- Centos 7.0 X86-64
注意:ELK服務不能在root用戶開啟。需要重新創建用戶。
下載ELK相關服務壓縮包
創建ELK用戶和目錄並賦予權限,方便統一管理。
[root@localhost /]# mkdir elsearch
[root@localhost /]# groupadd elsearch
[root@localhost /]# useradd -g elsearch elsearch
[root@localhost /]# chown -R elsearch:elsearch /elsearch
[root@localhost /]# su elsearch
[elk@localhost /]$ cd elsearch
4.2 下載,然你也可以去官網找最新版的
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.tar.gz
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.tar.gz
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.2.2-linux-x86_64.tar.gz
我這里是以5.2.2為例來實現。
4.3 配置Elasticsearch
Elasticsearch是可以搭建集群,我這邊只是解壓后直接修改配置文件
elasticsearch.yml
cluster.name: es_cluster_1
node.name: node-1
path.data: /usr/local/services/elasticsearch-5.2.2/data
path.logs:/usr/local/services/elasticsearch-5.2.2/logs
network.host: 192.168.10.200
http.port: 9200
這里有個問題:jvm.option.這個里面設置的-xms和-xmx一定要注意,我自定義的都是512m。
啟動ElasticSearch,訪問http://192.168.10.200:9200/
看到如上的界面就代表啟動成功。
注意:安裝過程中出現一些問題。在這篇文章中已經都給我們解決了。
http://www.cnblogs.com/sloveling/p/elasticsearch.html
4.4 配置logstash
解壓
tar -zxvf /usr/local/services/logstash-5.2.2.tar.gz
- 1
測試配置,只是測試服務是否啟動。還有這個文件是沒有的,啟動時加上這個路徑就是以這個配置啟動
vi /usr/local/services/logstash-5.2.2/config/logstash.conf
input { stdin { } } output { stdout { codec => rubydebug {} } }
logstash以配置文件方式啟動有兩種:
- 列表內容 logstash -f logstash-test.conf //普通方式啟動
- logstash agent -f logstash-test.conf –debug//開啟debug模式
./bin/logstash -f ./config/logstash.conf --debug
啟動成功會看到如下的結果:
這是時候,我們在控制台隨便輸入都可以被收集
n"=>"1", "host"=>"localhost", "message"=>"我們都是好好"}}
{
"@timestamp" => 2017-08-18T05:45:25.340Z, "@version" => "1", "host" => "localhost", "message" => "我們都是好好" } [2017-08-18T13:45:26,933][DEBUG][logstash.pipeline ] Pushing flush onto pipeline [2017-08-18T13:45:31,934][DEBUG][logstash.pipeline ] Pushing flush onto pipeline
4.5 配置logstash
配置kibana
+ 解壓
[elsearch@localhost root]$ tar -zxvf /usr/local/services/kibana-5.2.2-linux-x86_64.tar.gz
打開配置
[elsearch@localhost root]$ vim /usr/local/services/kibana-5.2.2-linux-x86_64/config/kibana.yml
修改配置,最后最加
server.port: 8888
server.host: "192.168.10.200"
elasticsearch.url: "http://192.168.10.200:9200"
啟動
[elsearch@localhost root]$ /usr/local/services/kibana-5.2.2-linux-x86_64/bin/kibana &
訪問地址 http://192.168.10.200:8888
基本ELK的環境的搭建就ok了,我們接下來學習logback-ELK整合來收集JavaEE中的日志。
4.6 logback-ELK整合
4.6.1 本案列采用maven管理
pom.xml
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>4.11</version> </dependency> <!--實現slf4j接口並整合--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>net.logstash.log4j</groupId> <artifactId>jsonevent-layout</artifactId> <version>1.7</version> </dependency>
4.6.2配置logaback的配置文件
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑--> <property name="LOG_HOME" value="E:/logs" /> <!-- 控制台輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名--> <FileNamePattern>${LOG_HOME}/TestWeb.log_%d{yyyy-MM-dd}.log</FileNamePattern> <!--日志文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- show parameters for hibernate sql 專為 Hibernate 定制 --> <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" /> <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" /> <logger name="org.hibernate.SQL" level="DEBUG" /> <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" /> <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" /> <!--myibatis log configure--> <logger name="com.apache.ibatis" level="TRACE"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>192.168.10.200:8082</destination> <!-- encoder is required --> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" /> </appender> <!-- 日志輸出級別 --> <root level="INFO"> <!-- 只有添加stash關聯才會被收集--> <appender-ref ref="stash" /> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </configuration>
注意:logstash接收日志的地址 192.168.10.200:8082
4.6.3配置logstash-test.conf
vi logstash-test.conf
input {
tcp {
host => "192.168.10.200" port => 8082 mode => "server" ssl_enable => false codec => json { charset => "UTF-8" } } } output { elasticsearch { hosts => "192.168.10.200:9200" index => "logstash-test" } stdout { codec => rubydebug {} } }
啟動收集
./bin/logstash -f config/logstash-test.conf –debug
4.6.4配置Controller添加日志輸出
package com.example.demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class TestEndpoints { private final static Logger logger = LoggerFactory.getLogger(TestEndpoints.class); @GetMapping("/product/{id}") public String getProduct(@PathVariable String id) { String data = "{\"name\":\"李東\"}"; logger.info(data); return "product id : " + id; } @GetMapping("/order/{id}") public String getOrder(@PathVariable String id) { return "order id : " + id; } }
請求調用之后控制台的log
之后Kibana中就可以收集到log
{
"_index": "logstash-test", "_type": "logs", "_id": "AV3zu4jiJKLF9tWSjmZj", "_score": null, "_source": { "@timestamp": "2017-08-18T05:04:51.698Z", "level": "INFO", "port": 56525, "thread_name": "http-nio-8081-exec-10", "level_value": 20000, "@version": 1, "host": "192.168.10.165", "logger_name": "com.example.demo.TestEndpoints", "message": "{\"name\":\"李東\"}" }, "fields": { "@timestamp": [ 1503032691698 ] }, "sort": [ 1503032691698 ] }