基于Graylog的容器日志监控

Docker日志

当一个容器启动的时候,它实际上是docker deamon的一个子进程,docker daemon能够拿到容器里面进程的标准输出,而后经过自身的LogDriver模块来处理,LogDriver支持的方式不少,默认写到本地文件,也能够发送到syslog等。 html

img

Docker会默认收集应用程序的标准输出到一个json.log文件中,以一行一条JSON存储数据,文件的格式以下:vue

{"log":"root@74205cdc7b53dd:/#ls\r\n","stream":"stdout","time":"xxx.155834526Z"}
{"log":"root@74205cdc7b53dd:/#ls\r\n","stream":"stdout","time":"xxx.255834528Z"}

Docker的这种日志存储方式能够在容器启动时经过指定log-driver进行配置,支持的log driver以下:nginx

img

Graylog日志管理

Graylog是一个开源的完整的日志管理工具,功能和ELK相似。Docker原生支持graylog协议,Graylog官方也提供了对Docker的支持,两者能够无缝衔接。Graylog官方提供了Dockerfile能够在Docker上部署日志系统,同时也提供了docker-compose.yml文件来快速部署整个graylog栈。
详细内容能够经过http://docs.graylog.org/en/3.1/pages/installation/docker.html 来查看。git

img

Graylog部署

1.在当前用户目录下建立graylog目录做为部署的工做目录:github

$ mkdir graylog
$ cd graylog

2.初始化目录和配置文件web

$ mkdir -p ./graylog/config
$ cd ./graylog/config
$ wget https://raw.githubusercontent.com/Graylog2/graylog-docker/3.1/config/graylog.conf
$ wget https://raw.githubusercontent.com/Graylog2/graylog-docker/3.1/config/log4j2.xml

#另外因为Graylog以ID 1100 定义了用户和用户组,
#致使Graylog在启动的时候可能会报config目录权限不足的错误,能够经过如下命令来解决
chown -R 1100:1100 ./graylog/config

3.修改配置文件, 上一步得到的graylog.conf文件是官方提供的默认配置,用户能够根据须要进行配置,好比配置中时区默认为UTC时区,能够将其改成中国时区docker

root_timezone = Asia/Shanghai

4.准备docker-compose.yml文件json

version: '3'
services:
  # MongoDB: https://hub.docker.com/_/mongo/
  mongo:
    image: mongo:3
    networks:
      - graylog
    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:7.5.0
    volumes:
      - es_data:/usr/share/elasticsearch/data
    environment:
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    deploy:
      resources:
        limits:
          memory: 1g
    networks:
      - graylog
  # Graylog: https://hub.docker.com/r/graylog/graylog/
  graylog:
    image: graylog/graylog:3.1
    volumes:
      - graylog_journal:/usr/share/graylog/data/journal
      - ./graylog/config:/usr/share/graylog/data/config
    environment:
      # CHANGE ME (must be at least 16 characters)!
      - GRAYLOG_PASSWORD_SECRET=somepasswordpepper
      # Password: admin
      - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
      - GRAYLOG_HTTP_EXTERNAL_URI=http://192.168.0.103:9000/
    networks:
      - graylog
    depends_on:
      - mongo
      - elasticsearch
    ports:
      # Graylog web interface and REST API
      - 9000:9000
      # Syslog TCP
      - 1514:1514
      # Syslog UDP
      - 1514:1514/udp
      # GELF TCP
      - 12201:12201
      # GELF UDP
      - 12201:12201/udp
networks:
  graylog:
    driver: bridge
# 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”启动服务, 服务正常启动后就能够经过http://ip:9000 进行访问graylog的Web界面,默认用户admin/admin。服务器

img

Graylog配置日志收集

Graylog的日志收集经过定义input来完成,在Graylog的Web管理页面的System tab下能够选择定义input来对日志进行收集markdown

img

进入input页面后选择input的类型,好比定义GELF UDP的input:

img

选择完成后点击 “Lanch new input”,就会进入详细的input配置,配置完成后保存就能够了

img

保存后一切正常的话,input就会进入RUNNING状态,这时就能够往这个input里面发送数据了,点击“Stop input”,input就会中止,数据的接收也会中止,“Stop input”会变成“Start input”,须要接受数据的时点击启动就能够了。

img

配置Docker容器发送数据到Graylog

配置Docker容器发送数据到Graylog时能够在运行docker run命令启动容器的时候加上以下参数:

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

具体示例:

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 "Graylog test message"; sleep 10; done;'

若是容器经过docker-compose命令启动能够在docker-compose.yml文件中加入如下配置:

logging:
  driver:"gelf"
  options:
    gelf-address:"udp://graylog服务器地址:12201"
    tag:"容器服务标签"

具体示例:

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

日志发送配置好以后就能够在的Search tab下搜索产看日志信息

img

相关文章
相关标签/搜索