[容器化技术之十] 日志监控

一、Docker日志处理机制

  当启动一个容器的时候,它其实是docker daemon的一个子进程,docker daemon可以拿到容器里面进程的标准输出,拿到标准输出后,它会通过自身一个LogDriver模块来处理,LogDriver支持的方式很多,可以写到本地的文件(默认方式),可以发送到syslog等。


  Docker默认会手机应用程序的标准输出存储到一个json.log文件中,文件的格式类似下面这种:

{"log":"2020-02-24T09:07:23.178+0000 I COMMAND  [conn18] command graylog.$cmd command: update { update: \"sessions\", 
ordered: true, $db: \"graylog\" } numYields:0 reslen:59 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, 
Database: { acquireCount: { w: 1 } }, Collection: { acquireCount: { w: 1 } } } protocol:op_query 107ms\n","stream":"stdout",
"time":"2020-02-24T09:07:23.178711207Z"}

  如果深究其日志位置,每个容器的日志默认都会以 json-file 的格式存储于 /var/lib/docker/containers/<容器id>/<容器id>-json.log下,以一行一个作为一条JSON数据存储。Docker的这种日志存储方式是可以配置的,具体参数可以在执行run启动容器的时候通过log-driver进行配置,具体配置请参考log-driverhttps://docs.docker.com/config/containers/logging/configure/#supported-logging-drivers




二、Docker日志驱动

  Docker默认使用了json-file driver作为log driver,而gelf则是示例使用的log driver。

当容器数量比较多,或者是采用类似swarm集群部署Docker的时候,各种日志分散存在各个json.log文件中,当查找问题或者进行相关统计的时候,分散的日志是很不友好的,所以我们需要一个能够集中管理Docker日志的工具。

1、Graylog

  相信大部分的人都用过或者听说国ELK这个强大的日志栈架构,这里要使用的graylog和ELK非常相似,算是后起之秀。

为什么要选择graylog作为Docker的日志收集平台?

  • Docker原生支持graylog协议,直接将日志发送到graylog(通过gelf协议)
  • graylog官方提供了将本身部署在Docker的支持

2、Graylog部署

  graylog官方提供了Dockerfile供开发者快速在Docker上部署日志系统,在这个Docker Hub的地址中,也提供了docker-compose.yml来快速部署整个graylog栈,包括mongodbElasticSearch,而不需要分别单独进行部署。

==> Docker Hub Graylog官方地址

(1)创建目录
  创建一个目录用来部署graylog,假设为/root/graylog,以下所有操作都是在该目录中进行的。


(2)初始化目录和配置文件

# 创建数据目录
mkdir -p ./graylog/data
# 创建配置文件目录
mkdir -p ./graylog/config
cd ./graylog/config
# 直接下载官方推荐配置文件
wget https://raw.githubusercontent.com/Graylog2/graylog-docker/2.5/config/graylog.conf
wget https://raw.githubusercontent.com/Graylog2/graylog-docker/2.5/config/log4j2.xml

  有可能出现下载不到的情况,这时因为DNS污染的原因,参考修改Hosts临时解决GitHub的raw.githubusercontent.com无法链接的问题即可正常下载。


(3)修改下载完的graylog.conf中的root_timezone为GMT_0800中国时区

root_timezone - Etc/GMT-8



(4)新建docker-compose.yml来供docker-compose快速启动完整服务
配置内容如下:

version: '2'
services:
  # MongoDB: https://hub.docker.com/_/mongo/
  mongodb:
    image: mongo:3
    volumes:
      - mongo_data:/data/db

  # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/6.x/docker.html
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.5.1
    volumes:
      - es_data:/usr/share/elasticsearch/data
    environment:
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      # Disable X-Pack security: https://www.elastic.co/guide/en/elasticsearch/reference/6.x/security-settings.html#general-security-settings
      - xpack.security.enabled=false
      - xpack.watcher.enabled=false
      - xpack.monitoring.enabled=false
      - xpack.security.audit.enabled=false
      - xpack.ml.enabled=false
      - xpack.graph.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 512M

  # Graylog: https://hub.docker.com/r/graylog/graylog/
  graylog:
    image: graylog/graylog:2.5
    volumes:
      - graylog_journal:/usr/share/graylog/data/journal
      #- /home/codeman/graylog/config:/usr/share/graylog/data/config
    environment:
      - GRAYLOG_PASSWORD_SECRET=somepasswordpepper
      # Password: admin
      - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
      # 这个地址需要配置成你要访问的地址,比如你的容器部署在192.168.1.2,你需要配置成http://192.168.1.2:9000/api,否则访问会报错
      - GRAYLOG_WEB_ENDPOINT_URI=http://192.168.27.135:9000/api
    links:
      - mongodb:mongo
      - elasticsearch
    depends_on:
      - mongodb
      - elasticsearch
    ports:
      # Graylog web interface and REST API
      # web界面端口
      - 9000:9000
      # gelf收集日志的端口,如果需要添加graylog收集器,可以新增暴露出来的端口
      # Syslog TCP
      - 514:514
      # Syslog UDP
      - 514:514/udp
      # GELF TCP
      - 12201:12201
      # GELF UDP
      - 12201:12201/udp

# Volumes for persisting data, see https://docs.docker.com/engine/admin/volumes/volumes/
volumes:
  mongo_data:
    driver: local
  es_data:
    driver: local
  graylog_journal:
    driver: local



(5)启动整个服务

docker-compose up


  如果启动没有问题,会看到graylog server up and running的终端输出消息

  访问htp://IP:9000/会看到graylog的web界面,使用admin/admin登陆,至此部署已完成。

  登陆

  第一次加载速度比较慢,因为要初始化配置加载数据等



(6)Graylog系统配置

  加载完成后,进入search页面,发现没有显示什么数据


  graylog的日志收集通过定义input对象来完成,在graylog web管理界面进入input对象配置,选择GELF UDP协议来新建一个输入器(input),可以看成是对日志收集的监控,System -> Input -> GELF UDP -> Launch new input

  出现弹窗,编辑配置信息,保存后,就可以开始收集日志了

  但是发现配置的input状态还是fail,重新打开弹窗编辑,将绑定地址改为0.0.0.0

  这时候再看input的状态,已经不报失败了

  点击Start input,启动对日志的输入监听



(7)验证服务
  graylog已经部署启动配置完了,这时就需要测试输入日志来验证服务是否可正常展示收集日志,创建一个不断输出日志的容器,命令如下:

docker run --log-driver=gelf --log-opt gelf-address=udp://{graylog服务器地址}:12201 \
--log-opt tag=<当前容器服务标签,用来供graylog查询的时候进行分类> <IMAGE> <运行命令>

  使用示例:

docker run -d \
--log-driver=gelf \
--log-opt gelf-address=udp://localhost:12201 \
--log-opt tag="{{.ImageName}}/{{.Name}}/{{.ID}}" \
busybox sh -c 'while true; do echo "Hello, this is A"; sleep 10; done;'

  由于这里已经指定将日志发送到udp://localhost:12201,所以使用docker logs查看容器日志时,会显示配置的日志驱动不支持读取日志,如下如图所示:


  进入graylog的web管理界面查看日志信息,可以看到日志时间内容,通过勾选左侧的菜单还可以看到更多的信息

  点击单条日志也可以看到完整的日志详情



(8)使用docker-compose配置容器日志
  如果通过docker-compose命令,则可以在docker-compose.yml中加入相关配置,以下用nginx容器举例。新建一个nginx的目录,在目录中新建一个docker-compose.yml文件,内容如下:

version: '2'
services:
   nginx:
     image: nginx:latest
     ports:
       - "80:80"
     logging:
       driver: "gelf"
       options:
          gelf-address: "udp://192.168.27.135:12201"
          tag: front-nginx 

  同样使用docker-compose up启动,启动后可能有下面的提示:


  但是可以无视这个警告,日志还是会发送过去的,这时可以在graylog的web后台中看到nginx所产生的日志了,为了让nginx产生日志,访问下nginx

  可以看到在浏览器发起HTTP请求产生的nginx日志了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • Docker从2013年发布第一个版本以来,已经火遍全球,技术迭代也比较频繁,其周边产品和技术也越来越丰富。Doc...
    归海听雪阅读 12,284评论 7 44
  • 一、Docker-Compose简介   Docker-Compose项目是Docker官方的开源项目,负责实现对...
    无剑_君阅读 882评论 0 1
  • 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个...
    mrZhao丶阅读 313评论 0 0
  • Docker日志 Docker会默认收集应用程序的标准输出存储到一个json.log文件中,文件的格式类似下面这种...
    JeryZen阅读 16,742评论 4 18
  • 我认识一个人呀,不见了呀,找不到了。我怎么会这么孤独呀。 印象最深刻的一句话呀,不会因为我打乱计划的。 这是计划的...
    c_loser阅读 131评论 0 0