Docker ELK + docker-compose + filebeat部署教程

前言

目前主流日志采集系統,采用elk + filebeat來實現,記錄一下部署的流程。

1. 所需資源:docker運行環境

2. 安裝鏡像sebp/elk

// 拉取鏡像
docker pull sebp/elk:7.12.0

3. 使用docker-compose啟動容器

  1. 安裝docker-compose
    詳見 https://docs.docker.com/compose/install/
  2. 創建掛載鏡像elk-data,記錄elasticsearch的存儲內容(以用于如果容器銷毀后重新創建,也可以重新加載數據)
docker volume create elk-data
  1. 創建掛載鏡像elk-log,記錄所有elk內的log日志
docker volume create elk-log
// 可以查看elk-log具體的掛載信息
sudo docker volume inspect elk-log
// 如果需要映射到/var/log下面
sudo mkdir /var/log/elk
sudo mount --bind /var/lib/docker/volumes/elk-log/_data /var/log/elk/
  1. 臨時啟動鏡像,用于copy配置文件下來
// 啟動鏡像
sudo docker run -d sebp/elk:7.12.0
// 創建應用目錄
mkdir /opt/elk
mkdir /opt/elk/elasticsearch
mkdir /opt/elk/logstash
mkdir /opt/elk/kibana
// cp出各個單服務的配置文件
sudo docker cp CONTAINER_ID:/opt/kibana/config/kibana.yml /opt/elk/kibana/.
sudo docker cp CONTAINER_ID:/etc/logstash/conf.d/30-output.conf /opt/elk/logstash/.
sudo docker cp CONTAINER_ID:/etc/logstash/conf.d/11-nginx.conf /opt/elk/logstash/.
sudo docker cp CONTAINER_ID:/etc/elasticsearch/elasticsearch.yml /opt/elk/elasticsearch/.
// 銷毀創建的容器
sudo docker stop CONTAINER_ID
sudo docker rm CONTAINER_ID
  1. 修改elasticsearch配置文件,/opt/elk/elasticsearch/elasticsearch.yml
## 結尾增加如下配置,用于啟用登錄權限(xpack安全驗證)
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
  1. 修改kibana的配置文件,/opt/elk/kibana/kibana.yml
## 增加中文配置
i18n.locale: "zh-CN"
## es 設置的kibana用戶名稱
elasticsearch.username: "kibana"
## es 設置的kibana用戶名稱,此處密碼是在后續進行設置,先預設admin1
elasticsearch.password: "admin1"
  1. 修改logstash的配置文件,/opt/elk/logstash/30-output.conf
## 修改為如下配置
output {
  elasticsearch {
    hosts => ["localhost"]
    manage_template => false
    index => "%{[fields][type]}-%{+YYYY.MM.dd}" ## 生成索引key
    user => "elastic"
    password => "admin1" ## admin1也是預設,后續會進行配置
  }
}
  1. 創建docker-compose.yml配置文件,并放置在/opt/elk/目錄下
elk:
    image: sebp/elk:7.12.0
    ports:
      - "5601:5601"
      - "9200:9200"
      - "5044:5044"
    volumes:
      - elk-data:/var/lib/elasticsearch
      - elk-log:/var/log
      - /opt/elk/kibana/kibana.yml:/opt/kibana/config/kibana.yml
      - /opt/elk/logstash/30-output.conf:/etc/logstash/conf.d/30-output.conf
      - /opt/elk/logstash/11-nginx.conf:/etc/logstash/conf.d/11-nginx.conf
      - /opt/elk/elasticsearch/elasticsearch.yml:/etc/elasticsearch/elasticsearch.yml
    environment:
      "ES_CONNECT_RETRY": "180" ## ES的啟動最大允許時間
      "ES_HEAP_SIZE": "4g" ## ES的最大堆內存
      "LS_HEAP_SIZE": "1g" ## logstash的最大堆內存
    restart: always
    privileged: true ## 使docker內的elk擁有外部root權限
  1. 啟動docker-compose
sudo docker-compose up -d elk
  1. 配置es密碼
## 進入容器內部
sudo docker exec -it CONTAINER_ID /bin/bash
## 執行命令,交互式設置密碼(注意保存好全部密碼)
sh /usr/share/elastic/bin/elasticsearch-setup-passwords interactive
## 和之前在kibana和logstash內的配置文件設置的密碼相同即可
  1. ES內置用戶介紹
Elastic內置用戶
elastic:內置超級用戶
kibana:僅可用于kibana用來連接elasticsearch并與之通信, 不能用于kibana登錄
logstash_system:用于Logstash在Elasticsearch中存儲監控信息時使用
  1. 此時已經可以登錄kibana了,http://IP:5601

4. 安裝filebeat & Log4j配置

1. log4j的xml配置,filebeat讀取固定格式的日志文件,解析到logstash內,此處展示一個推薦的log4j配置(其中LOG_PATTERN內的trace_id需要用到spring-cloud-sleuth,用于分布式鏈路追蹤)
<?xml version="1.0" encoding="UTF-8"?>
<!--日志級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,這個用于設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數-->
<configuration status="WARN" monitorInterval="30">

    <Properties>
        <!--格式化輸出-->
        <property name="LOG_PATTERN" value="%p|%d{yyyy-MM-dd HH:mm:ss:SSS}|%X{X-B3-TraceId}|%15.15t|%c:%L| %msg%n"></property>
        <!--項目名稱-->
        <property name="SERVICE_NAME" value="xxxx-service"></property>
        <!--日志路徑-->
        <property name="FILE_PATH" value="/var/logs"></property>
    </Properties>

    <!--先定義所有的appender-->
    <appenders>
        !--這個輸出控制臺的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--輸出日志的格式-->
            <PatternLayout charset="UTF-8" pattern="${LOG_PATTERN}"/>
        </console>
        <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔-->
        <RandomAccessFile name="RandomFileInfo" fileName="${FILE_PATH}/${SERVICE_NAME}/info.log"
                     filePattern="${FILE_PATH}/${SERVICE_NAME}/${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="UTF-8" pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RandomAccessFile>
        <RandomAccessFile name="RandomFileWarn" fileName="${FILE_PATH}/${SERVICE_NAME}/warn.log"
                     filePattern="${FILE_PATH}/${SERVICE_NAME}/${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="UTF-8" pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RandomAccessFile>
        <RandomAccessFile name="RandomFileError" fileName="${FILE_PATH}/${SERVICE_NAME}/error.log"
                     filePattern="${FILE_PATH}/${SERVICE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="UTF-8" pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RandomAccessFile>
    </appenders>
    <!--然后定義logger,只有定義了logger并引入的appender,appender才會生效-->
    <loggers>
        <!--打印Sql Debug日志-->
        <logger name="xxxxxxxxx.dao" level="debug"/>
        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="RandomFileInfo"/>
            <appender-ref ref="RandomFileWarn"/>
            <appender-ref ref="RandomFileError"/>
        </root>
    </loggers>
</configuration>
2. 機器上增加filebeat服務
  1. 按照filebeat官網的quickstart安裝
    https://www.elastic.co/guide/en/beats/filebeat/current/setup-repositories.html

  2. https://github.com/spujadas/elk-docker/tree/master/nginx-filebeat內的logstash-beats.crt 下載到本地,copy到/etc/filebeat/.

  3. 修改/etc/filebeat/路徑下的filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
     - /var/logs/xxxxx-service/info.log #修改為對應服務的日志地址
  fields:
     type: xxxxx-service-dev #輸出的index索引
- type: log
  enabled: true
  paths:
     - /var/logs/yyyyyy-service/info*.log
  fields:
     type: yyyyyy-service-dev
setup.template.settings:
  index.number_of_shards: 1
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
output.logstash:
  hosts: ["logstash_ip:5044"]
  ssl.certificate_authorities: ["/etc/filebeat/logstash-beats.crt"]
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
  1. 修改之前elk對應的/app/elk/logstash/11-nginx.conf,修改完畢后重啟elk的容器
## 在filter內增加如下配置,根據log4j的日志格式進行解析
grok {
    match => {"message" => "%{DATA:level}\|%{DATA:datetime}\|%{DATA:trace_id}\|%{DATA:thread_id}\|%{DATA:method_name}\|%{DATA:msg}$"}
    remove_field => ["message"]
  }
  1. 執行命令
sudo systemctl enable filebeat
sudo systemctl restart filebeat
3. elk上增加index索引
  1. elk上增加index索引,與剛剛filebeat內配置的filebeat.inputs.fields.type相同,需逐個配置
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容