1. 程式人生 > >docker 容器日誌集中 ELK + filebeat

docker 容器日誌集中 ELK + filebeat

docker 容器日誌集中 ELK

ELK 基於 ovr 網路下

docker-compose.yaml

version: '2'
networks:
  network-test:
    external:
      name: ovr0
services:
  elasticsearch:
    image: elasticsearch
    network-test:
      external:
    hostname: elasticsearch
    container_name: elasticsearch
    restart: always
    volumes:
      - /opt/elasticsearch/data:/usr/share/elasticsearch/data

  kibana:
    image: kibana
    network-test:
      external:    
    hostname: kibana
    container_name: kibana
    restart: always
    environment:
      ELASTICSEARCH_URL: http://elasticsearch:9200/
    ports:
      - 5601:5601

  logstash:
    image: logstash
    network-test:
      external:
    hostname: logstash
    container_name: logstash
    restart: always
    volumes:
      - /opt/logstash/conf:/opt/logstash/conf
    command: logstash -f /opt/logstash/conf/

  filebeat:
    image: prima/filebeat
    network-test:
      external:
    hostname: filebeat
    container_name: filebeat
    restart: always
    volumes:
      - /opt/filebeat/conf/filebeat.yml:/filebeat.yml
      - /opt/upload:/data/logs
      - /opt/filebeat/registry:/etc/registry

filebeat說明:
filebeat.yml 掛載為 filebeat 的配置檔案
logs 為 容器掛載日誌的目錄
registry 讀取日誌的記錄,防止filebeat 容器掛掉,需要重新讀取所有日誌

logstash 配置檔案如下:

第一種: 使用 patterns .

logstash.conf: (配置了二種輸入模式, filebeats, syslog)   

input {
    beats {
        port => 5044
        type => beats
    }

    tcp {
        port => 5000
        type => syslog
    }

}

filter {
  if[type] == "tomcat-log" {
    multiline {
      patterns_dir => "/opt/logstash/conf/patterns"
      pattern => "(^%{TOMCAT_DATESTAMP})|(^%{CATALINA_DATESTAMP})"
      negate => true
      what => "previous"
    }

    if "ERROR" in [message] {    #如果訊息裡有ERROR字元則將type改為自定義的標記
        mutate { replace => { type => "tomcat_catalina_error" } }
    }

    else if "WARN" in [message] {
        mutate { replace => { type => "tomcat_catalina_warn" } }
    }

    else if "DEBUG" in [message] {
        mutate { replace => { type => "tomcat_catalina_debug" } }
    }

    else {
        mutate { replace => { type => "tomcat_catalina_info" } }
    }

    grok{
      patterns_dir => "/opt/logstash/conf/patterns"
      match => [ "message", "%{TOMCATLOG}", "message", "%{CATALINALOG}" ]
      remove_field => ["message"]    #這表示匹配成功後是否刪除原始資訊,這個看個人情況,如果為了節省空間可以考慮刪除
    }
    date {
      match => [ "timestamp", "yyyy-MM-dd HH:mm:ss,SSS Z", "MMM dd, yyyy HH:mm:ss a" ]
    }
  }    

  if[type] == "nginx-log" {

    if '"status":"404"' in [message] {
        mutate { replace => { type => "nginx_error_404" } }
    }

    else if '"status":"500"' in [message] {
        mutate { replace => { type => "nginx_error_500" } }
    }

    else if '"status":"502"' in [message] {
        mutate { replace => { type => "nginx_error_502" } }
    }

    else if '"status":"403"' in [message] {
        mutate { replace => { type => "nginx_error_403" } }
    }

    else if '"status":"504"' in [message] {
        mutate { replace => { type => "nginx_error_504" } }
    }

    else if '"status":"200"' in [message] {
        mutate { replace => { type => "nginx_200" } }
    }
    grok {
      remove_field => ["message"]    #這表示匹配成功後是否刪除原始資訊,這個看個人情況,如果為了節省空間可以考慮刪除
    }
  }
}

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

    #stdout { codec => rubydebug }    #輸出到螢幕上
}

/opt/logstash/conf/patterns  下面存放 grok 檔案

grok-patterns:

USERNAME [a-zA-Z0-9._-]+
USER %{USERNAME}
INT (?:[+-]?(?:[0-9]+))
BASE10NUM (?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))
NUMBER (?:%{BASE10NUM})
BASE16NUM (?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+))
BASE16FLOAT \b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\.[0-9A-Fa-f]*)?)|(?:\.[0-9A-Fa-f]+)))\b

POSINT \b(?:[1-9][0-9]*)\b
NONNEGINT \b(?:[0-9]+)\b
WORD \b\w+\b
NOTSPACE \S+
SPACE \s*
DATA .*?
GREEDYDATA .*
QUOTEDSTRING (?
>(?<!\\)(?>"(?>\\.|[^\\"]+)+"|""|(?>'(?>\\.|[^\\']+)+')|''|(?>`(?>\\.|[^\\`]+)+`)|``)) UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12} # Networking MAC (?:%{CISCOMAC}|%{WINDOWSMAC}|%{COMMONMAC}) CISCOMAC (?:(?:[A-Fa-f0-9]{4}\.){2}[A-Fa-f0-9]{4}) WINDOWSMAC (?:(?:[A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2}) COMMONMAC (?:(?:[A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}) IPV6 ((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)? IPV4 (?<![0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9]) IP (?:%{IPV6}|%{IPV4}) HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b) HOST %{HOSTNAME} IPORHOST (?:%{HOSTNAME}|%{IP}) HOSTPORT (?:%{IPORHOST=~/\./}:%{POSINT}) # paths PATH (?:%{UNIXPATH}|%{WINPATH}) UNIXPATH (?>/(?>[\w_%[email protected]:.,-]+|\\.)*)+ TTY (?:/dev/(pts|tty([pq])?)(\w+)?/?(?:[0-9]+)) WINPATH (?>[A-Za-z]+:|\\)(?:\\[^\\?*]*)+ URIPROTO [A-Za-z]+(\+[A-Za-z+]+)? URIHOST %{IPORHOST}(?::%{POSINT:port})? # uripath comes loosely from RFC1738, but mostly from what Firefox # doesn't turn into %XX URIPATH (?:/[A-Za-z0-9$.+!*'(){},~:;[email protected]#%_\-]*)+ #URIPARAM \?(?:[A-Za-z0-9]+(?:=(?:[^&]*))?(?:&(?:[A-Za-z0-9]+(?:=(?:[^&]*))?)?)*)? URIPARAM \?[A-Za-z0-9$.+!*'|(){},[email protected]#%&/=:;_?\-\[\]]* URIPATHPARAM %{URIPATH}(?:%{URIPARAM})? URI %{URIPROTO}://(?:%{USER}(?::[^@]*)[email protected])?(?:%{URIHOST})?(?:%{URIPATHPARAM})? # Months: January, Feb, 3, 03, 12, December MONTH \b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b MONTHNUM (?:0?[1-9]|1[0-2]) MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9]) # Days: Monday, Tue, Thu, etc... DAY (?:Mon(?:day)?|Tue(?:sday)?|Wed(?:nesday)?|Thu(?:rsday)?|Fri(?:day)?|Sat(?:urday)?|Sun(?:day)?) # Years? YEAR (?>\d\d){1,2} HOUR (?:2[0123]|[01]?[0-9]) MINUTE (?:[0-5][0-9]) # '60' is a leap second in most time standards and thus is valid. SECOND (?:(?:[0-5][0-9]|60)(?:[:.,][0-9]+)?) TIME (?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9]) # datestamp is YYYY/MM/DD-HH:MM:SS.UUUU (or something like it) DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR} DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR} ISO8601_TIMEZONE (?:Z|[+-]%{HOUR}(?::?%{MINUTE})) ISO8601_SECOND (?:%{SECOND}|60) TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}? DATE %{DATE_US}|%{DATE_EU} DATESTAMP %{DATE}[- ]%{TIME} TZ (?:[PMCE][SD]T|UTC) DATESTAMP_RFC822 %{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME} %{TZ} DATESTAMP_OTHER %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{TZ} %{YEAR} # Syslog Dates: Month Day HH:MM:SS SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME} PROG (?:[\w._/%-]+) SYSLOGPROG %{PROG:program}(?:\[%{POSINT:pid}\])? SYSLOGHOST %{IPORHOST} SYSLOGFACILITY <%{NONNEGINT:facility}.%{NONNEGINT:priority}> HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT} # Shortcuts QS %{QUOTEDSTRING} # Log formats SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}: COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-) COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent} # Log Levels LOGLEVEL ([A-a]lert|ALERT|[T|t]race|TRACE|[D|d]ebug|DEBUG|[N|n]otice|NOTICE|[I|i]nfo|INFO|[W|w]arn?(?:ing)?|WARN?(?:ING)?|[E|e]rr?(?:or)?|ERR?(?:OR)?|[C|c]rit?(?:ical)?|CRIT?(?:ICAL)?|[F|f]atal|FATAL|[S|s]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?) # Java Logs JAVATHREAD (?:[A-Z]{2}-Processor[\d]+) JAVACLASS (?:[a-zA-Z0-9-]+\.)+[A-Za-z0-9$]+ JAVAFILE (?:[A-Za-z0-9_.-]+) JAVASTACKTRACEPART at %{JAVACLASS:class}\.%{WORD:method}\(%{JAVAFILE:file}:%{NUMBER:line}\) JAVALOGMESSAGE (.*) # MMM dd, yyyy HH:mm:ss eg: Jan 9, 2014 7:13:13 AM CATALINA_DATESTAMP %{MONTH} %{MONTHDAY}, 20%{YEAR} %{HOUR}:?%{MINUTE}(?::?%{SECOND}) (?:AM|PM) # yyyy-MM-dd HH:mm:ss,SSS ZZZ eg: 2014-01-09 17:32:25,527 -0800 TOMCAT_DATESTAMP 20%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}(?::?%{SECOND}) %{ISO8601_TIMEZONE} CATALINALOG %{CATALINA_DATESTAMP:timestamp} %{JAVACLASS:class} %{JAVALOGMESSAGE:logmessage} # 2014-01-09 20:03:28,269 -0800 | ERROR | com.example.service.ExampleService - something compeletely unexpected happened... TOMCATLOG %{TOMCAT_DATESTAMP:timestamp} \| %{LOGLEVEL:level} \| %{JAVACLASS:class} - %{JAVALOGMESSAGE:logmessage}


下面我們配置 容器日誌輸出:

docker裡,標準的日誌方式是用Stdout, docker 裡面配置標準輸出,只需要指定: syslog 就可以了。

對於 stdout 標準輸出的 docker 日誌,我們使用 logstash 來收集日誌就可以。

我們在 docker-compose 中配置如下既可:

      logging:
        driver: syslog
        options:
          syslog-address: 'tcp://logstash:5000'


但是一般來說我們都是檔案日誌,那麼我們就可以直接用filebeat

對於 filebeat 我們使用 官方的 dockerhub 的 prima/filebeat 映象。

官方的映象中,我們需要編譯一個filebeat.yml 檔案, 官方說明中有兩種方案:

第一是 -v 掛載 -v /path/filebeat.yml:/filebeat.yml

第二是 dockerfile 的時候

FROM prima/filebeat

COPY filebeat.yml /filebeat.yml

編譯一個 filebeat.yml 檔案。

filebeat.yml 支援單一路徑的 prospector, 也支援多個 prospector或者每個prospector多個路徑。

paths 可使用多層匹配, 如: /var/log/messages* , /var/log/* , /opt/nginx/*/*.log


例:

filebeat:
  prospectors:
    -
      paths:
          - "/data/logs/catalina.*.out"
      input_type: filebeat-log
      document_type: tomcat-log
    -  
      paths:
          - "/data/logs/nginx*/logs/*.log"
      input_type: filebeat-log
      document_type: nginx-log
    
  registry_file: /etc/registry/mark
      
output:
  logstash:
    hosts: ["logstash:5044"]

logging:
  files:
    rotateeverybytes: 10485760 # = 10MB


filebeat 需要在每臺需要採集的機器上面都啟動一個容器。

執行 docker-compose up -d 檢視啟動的 容器

載入 filebeat 模板

進入 elasticsearch 容器中  (  docker exec -it elasticsearch bash  )

curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json
    
curl -XPUT 'http://elasticsearch:9200/_template/filebeat?pretty' [email protected]


filebeat-index-template.json

{
  "mappings": {
    "_default_": {
      "_all": {
        "enabled": true,
        "norms": {
          "enabled": false
        }
      },
      "dynamic_templates": [
        {
          "template1": {
            "mapping": {
              "doc_values": true,
              "ignore_above": 1024,
              "index": "not_analyzed",
              "type": "{dynamic_type}"
            },
            "match": "*"
          }
        }
      ],
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "message": {
          "type": "string",
          "index": "analyzed"
        },
        "offset": {
          "type": "long",
          "doc_values": "true"
        },
        "geoip"  : {
          "type" : "object",
          "dynamic": true,
          "properties" : {
            "location" : { "type" : "geo_point" }
          }
        }
      }
    }
  },
  "settings": {
    "index.refresh_interval": "5s"
  },
  "template": "filebeat-*"
}


訪問 http://kibana-IP:5601 可以看到已經出來 kibana 了,但是還沒有資料


啟動一個 nginx 容器

docker-compose

  nginx:
    image: alpine-nginx
    networks:
      network-test:
    hostname: nginx
    container_name: nginx
    restart: always
    ports:
      - 80:80
    volumes:
      - /opt/upload/nginx/conf/vhost:/etc/nginx/vhost
      - /opt/upload/nginx/logs:/opt/nginx/logs

本地目錄 /opt/upload/nginx   必須掛載到 filebeat 容器裡面,讓filebeat 可以採集到。

可以看到 kibana 已經有資料出來了

相關推薦

docker 容器日誌集中 ELK + filebeat

docker 容器日誌集中 ELK ELK 基於 ovr 網路下 docker-compose.yaml version: '2' networks: network-test: external: name: ovr0 services:

elk-filebeat收集docker容器日誌

-xmx fresh container 配置 啟動應用 add 一行 docker oot 目錄 使用docker搭建elk filebeat安裝與配置 docker容器設置 參考文章 首發地址 使用docker搭建elk 1、使用docker-compose文件構建

docker容器日誌收集方案(方案一 filebeat+本地日誌收集)

filebeat不用多說就是掃描本地磁碟日誌檔案,讀取檔案內容然後遠端傳輸。 docker容器日誌預設記錄方式為 json-file 就是將日誌以json格式記錄在磁碟上 格式如下: {   "log": "2018-11-16 01:24:3

docker容器日誌收集方案(方案二 filebeat+syslog本地日誌收集)

與方案一一樣都是把日誌輸出到本地檔案系統使用filebeat進行掃描採集 不同的是輸出的位置是不一樣的 我們對docker進行如下設定 sudo docker service update  --log-driver syslog  pbblyrms

docker容器日誌收集方案(方案三 filebeat+journald本地日誌收集)

其實方案三和方案二日誌採集套路一樣,但是還是有點差別。 差別就在於日誌格式如下:   ​ 為了方便對比吧日誌貼上來 Nov 16 10:51:58 localhost 939fe968a91d[4721]: 2018-11-16 02:51:58.89

Graylog2實現Docker容器日誌收集

mongod daemon 修改 zip restart page bus name 日誌信息 Graylog2 是一個開源的日誌存儲系統,是由java語言編寫的server,能夠接收TCP,UDP,AMQP的協議發送的日誌信息,並且基於mongodb數據庫服務器快速存儲,

docker容器日誌收集方案彙總評價總結

docker日誌收集方案有太多,下面截圖羅列docker官方給的日誌收集方案(詳細請轉docker官方文件)。很多方案都不適合我們下面的系列文章沒有說。     經過以下5篇部落格的敘述簡單說下docker容器日誌採集方案 docker容器日誌收集方案(方案一 filebeat

docker容器日誌收集方案(方案N,其他中介軟體傳輸方案)

由於docker虛擬化的特殊性導致日誌收集方案的多樣性和複雜性下面接收幾個可能的方案 ​   這個方案各大公司都在用只不過傳輸方式大同小異 中介軟體使用kafka是肯定的,kafka的積壓與吞吐能力相當強悍,其實kafka就是專門為傳輸日誌設計的,鏈路當中可以對日誌進行壓縮等。 這裡與方案

docker容器日誌管理(清理)

前言 在使用docker容器時候,其日誌的管理是我們不得不考慮的事情。因為docker容器的日誌檔案會佔據大量的磁碟空間。下面介紹的就是對docker容器日誌的管理。 docker容器日誌清理 docker容器的日誌一般存放在/var/lib/dock

Docker容器日誌清理

docker容器導致主機磁碟空間滿了如何清理Docker容器日誌?如何找出docker容器日誌檔案容器日誌一般存放在/var/lib/docker下面,可使用如下命令檢視各個日誌的檔案大小ls -lh $(find /var/lib/docker/containers/ -n

檢視docker容器日誌

在沒有日誌監控系統的情況下,我們需要了解docker容器日誌輸出有沒有錯誤資訊,這個時候主要通過以下幾種辦法檢視日誌: 1、通過目錄掛載的方式 容器目錄掛載到宿主機目錄 docker run -it

docker容器日誌檔案檢視

目前工作的開發環境在docker中,所以如果在docker內部執行很多程式,如果想同時檢視內部程式的日誌,最好的方式是直接通過檢視外部docker的日誌檔案即可。在宿主機/var/lib/docker/containers/,,,,,下檢視對應的容器的日誌即可。

日誌系統之基於flume收集docker容器日誌

http://blog.csdn.net/yanghua_kobe/article/details/50642601 最近我在日誌收集的功能中加入了對docker容器日誌的支援。這篇文章簡單談談策略選擇和處理方式。 關於docker的容器日誌 docker 我就不多

Docker容器日誌管理最佳實踐

目錄 一 、Docker 引擎日誌 二、容器日誌 2.1、常用檢視日誌命令——docker logs 2.2 、Docker 日誌 驅動 三、 生產環境中該如何儲存容器中的日

Elk+filebeat收集docker集群swarm中的nginx和tomcat容器日誌信息

system 現在 mct ebe ack agent pda number tomcat容器 前言: 之前有說過elk收集nginx日誌,現在來說一下收集容器集群的日誌收集Elk的安裝這裏不在說了,上來直接懟,這裏是elk的服務器:的服務狀態:以及端口 Logstash

6.3.1版本elk+redis+filebeat收集docker+swarm日誌分析

.com 分享圖片 event nohup filebeat 區分 3.0.0 inpu con 最近公司比較忙,沒來的及更新博客,今天為大家更新一篇文章,elk+redis+filebeat,這裏呢主要使用與中小型公司的日誌收集,如果大型公司可以參考上面的kafka+zo

在CentOS上整合filebeat+ELK docker收集日誌

架構: Dcker 安裝 docker 需要Linux Kernels 不低於 3.10 並且是 64-bit 機器。 更新yum(centos低版本更新,高版本可以不用更新),避免安裝失敗。 更新完成 使用yum安裝docker 安裝完成 檢查是否安

日誌管理之 Docker logs - 每天5分鐘玩轉 Docker 容器技術(87)

docker 容器 教程 高效的監控和日誌管理對保持生產系統持續穩定地運行以及排查問題至關重要。在微服務架構中,由於容器的數量眾多以及快速變化的特性使得記錄日誌和監控變得越來越重要。考慮到容器短暫和不固定的生命周期,當我們需要 debug 問題時有些容器可能已經不存在了。因此,一套集中式的日誌管理

初探 ELK - 每天5分鐘玩轉 Docker 容器技術(89)

docker 教程 容器 在開源的日誌管理方案中,最出名的莫過於 ELK 了。ELK 是三個軟件的合稱:Elasticsearch、Logstash、Kibana。Elasticsearch一個近乎實時查詢的全文搜索引擎。Elasticsearch 的設計目標就是要能夠處理和搜索巨量的日誌數據。L

ELK 完整部署和使用 - 每天5分鐘玩轉 Docker 容器技術(90)

docker 教程 容器 上一節已經部署了容器化的 ELK,本節討論如何將日誌導入 ELK 並進行圖形化展示。幾乎所有的軟件和應用都有自己的日誌文件,容器也不例外。前面我們已經知道 Docker 會將容器日誌記錄到 /var/lib/docker/containers/<contariner