docker部署elk日志采集系統(tcp方式)


一、elk 概念

ELK是 Elasticsearch、Logstash、Kibana的簡稱,這三者是核心套件,但並非全部。

Elasticsearch:實時全文搜索和分析引擎,提供搜集、分析、存儲數據三大功能。Elasticsearch是一套開放REST和JAVA API等結構提供高效搜索功能,可擴展的分布式系統。它構建於Apache Lucene搜索引擎庫之上。

Logstash:用來搜集、分析、過濾日志的工具。它支持幾乎任何類型的日志,包括系統日志、錯誤日志和自定義應用程序日志。它可以從許多來源接收日志,這些來源包括 syslog、消息傳遞(例如 RabbitMQ)和JMX,它能夠以多種方式輸出數據,包括電子郵件、websockets和Elasticsearch。

Kibana:基於Web的可視化圖形界面,用於搜索、分析和可視化存儲在 Elasticsearch指標中的日志數據。它利用Elasticsearch的REST接口來檢索數據,不僅允許用戶創建他們自己的數據的定制儀表板視圖,還允許他們以特殊的方式查詢和過濾數據。

二、docker 安裝 elk

1、拉鏡像,運行 

docker pull sebp/elk

docker run -d -it --name elk --restart always -p 5601:5601 -p 9200:9200 -p 5044:5044 -e ES_MIN_MEM=128m -e ES_MAX_MEM=2048m sebp/elk

5601 - Kibana web 接口
9200 - Elasticsearch JSON 接口
5044 - Logstash 日志接收接口

logstash有多種接受數據的方式,這里使用logback直接通過tcp的方式發送日志到logstash,還可以使用redis作為消息隊列對日志數據做一個中轉。

2、elasticsearch 報錯解決

elasticsearch啟動時可能遇到錯誤,報 elasticsearch用戶擁有的內存權限太小,至少需要262144。

解決方法:
sysctl -w vm.max_map_count=262144

查看結果:
sysctl -a|grep vm.max_map_count,顯示 vm.max_map_count = 262144

上述方法修改之后,如果重啟虛擬機將失效。可以在 /etc/sysctl.conf文件最后添加一行
vm.max_map_count=262144,即可永久修改。

三、配置elk采集日志(tcp方式)

1、配置 tcp方式發送日志

在服務的pom.xml中添加依賴

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
</dependency>

在 logback-spring.xml中添加 appender,發送日志到 logstash

<springProperty scope="context" name="springAppName" source="spring.application.name"/>    

<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>192.168.0.6: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": "${springAppName:-}",
                          "trace": "%X{X-B3-TraceId:-}",
                          "span": "%X{X-B3-SpanId:-}",
                          "exportable": "%X{X-Span-Export:-}",
                          "pid": "${PID:-}",
                          "thread": "%thread",
                          "class": "%logger{40}",
                          "rest": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>

    <!-- 日志輸出級別 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE"/>
        <appender-ref ref="logstash" />
    </root>

2、配置 logstash 發送日志到 elasticsearch

由於 sebp/elk 中 logstash 的 input 默認采用 filebeat,這里采用tcp方式,所以首先需要進入elk容器中修改 input 的方式為 tcp。logstash默認會使用 etc/logstash/conf.d/ 中的配置文件。

啟動elk,進入容器:

#docker exec -it elk /bin/bash

進入 /etc/logstash/conf.d/ 配置目錄,修改 02-beats-input.conf 配置文件如下:

input {
    tcp {
        port => 5044
        codec => json_lines
    }
}

output {
    elasticsearch {
    hosts => ["localhost:9200"]
    }
}

修改完成后退出,重啟 elk 容器

#docker restart elk

3、配置kibana

啟動服務,日志就被發送到 logstash中了,訪問 localhost:5601 進入 kibana 界面。

配置 index pattern,點擊 Management ——> Index Patterns ——> Create index pattern 

 

 下面列出了兩個可選的index pattern,輸入logstash*,下一步。選擇時間@timestamp,這樣數據展示會以時間排序。

 

最后,在kabina 首頁查看采集到的日志

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM