1. Docker 日志


  • 当启动一个容器的时候,它其实是 docker daemon 的一个子进程,docker daemon 可以拿到你容器里面进程的标准输出,拿到标准输出后,它会通过自身的一个 LogDriver 模块来处理,LogDriver 支持的方式很多,可以写到本地的文件(默认方式),可以发送到 syslog 等。
  • Docker 会默认收集应用程序的标准输出存储到一个 json.log 文件中。
  • Docker 日志存储方式是可配置的,具体参数可以在执行 run 启动容器的时候通过 log-driver 进行配置,具体配置参考 log-driver(https://docs.docker.com/config/containers/logging/configure/#supported-logging-drivers)。

    2. Graylog


  • graylog 和 ELK 非常的相似,算是后起之秀。

    选择 graylog 的原因

  • Docker 原生支持 graylog 协议,直接将日志发送到 graylog(通过 gelf 协议)。

  • graylog 官方提供了将本身部署在 Docker 的支持。

    3. Graylog 部署


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

官方地址:https://hub.docker.com/r/graylog/graylog/

  1. 创建一个目录用来部署 graylog,假设目录为 /root/graylog,以下所有操作都是在 /root/graylog 中进行的。
  2. 初始化目录和配置文件

    1. # 创建数据目录
    2. mkdir -p ./graylog/data
    3. # 创建配置文件目录
    4. mkdir -p ./graylog/config
    5. cd ./graylog/config
    6. # 直接下载官方推荐配置文件
    7. wget https://raw.githubusercontent.com/Graylog2/graylog-docker/2.5/config/graylog.conf
    8. # 日志配置文件
    9. wget https://raw.githubusercontent.com/Graylog2/graylog-docker/2.5/config/log4j2.xml
  3. 修改下载完的 garylog.conf 中的 root_timezone 为 GMT+0800 中国时区。

    1. root_timezone=Asia/Shanghai
  4. 新建 docker-compose.yml 来提供 docker-compose 快速启动完整服务。(内容如下)

    1. version: '2'
    2. services:
    3. # MongoDB: https://hub.docker.com/_/mongo/
    4. mongodb:
    5. image: mongo:3
    6. volumes:
    7. - mongo_data:/data/db
    8. # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/6.x/docker.html
    9. elasticsearch:
    10. image: docker.elastic.co/elasticsearch/elasticsearch:6.5.1
    11. volumes:
    12. - es_data:/usr/share/elasticsearch/data
    13. environment:
    14. - http.host=0.0.0.0
    15. - transport.host=localhost
    16. - network.host=0.0.0.0
    17. # Disable X-Pack security: https://www.elastic.co/guide/en/elasticsearch/reference/6.x/security-settings.html#general-security-settings
    18. - xpack.security.enabled=false
    19. - xpack.watcher.enabled=false
    20. - xpack.monitoring.enabled=false
    21. - xpack.security.audit.enabled=false
    22. - xpack.ml.enabled=false
    23. - xpack.graph.enabled=false
    24. - "ES_JAVA_OPTS=-Xms256m -Xmx256m"
    25. ulimits:
    26. memlock:
    27. soft: -1
    28. hard: -1
    29. mem_limit: 256M
    30. # Graylog: https://hub.docker.com/r/graylog/graylog/
    31. graylog:
    32. image: graylog/graylog:2.5
    33. volumes:
    34. - graylog_journal:/usr/share/graylog/data/journal
    35. - ./graylog/config:/usr/share/graylog/data/config
    36. environment:
    37. # CHANGE ME!
    38. - GRAYLOG_PASSWORD_SECRET=somepasswordpepper
    39. # Password: admin
    40. - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
    41. # 这个地址需要配置成你要访问的地址,比如你的容器部署在192.168.1.2,你需要配置成http://192.168.1.2:9000/api,否则访问会报错
    42. - GRAYLOG_WEB_ENDPOINT_URI=http://192.168.100.249:9000/api
    43. links:
    44. - mongodb:mongo
    45. - elasticsearch
    46. depends_on:
    47. - mongodb
    48. - elasticsearch
    49. ports:
    50. # Graylog web interface and REST API
    51. # web界面端口
    52. - 9000:9000
    53. # gelf收集日志的端口,如果需要添加graylog收集器,可以新增暴露出来的端口
    54. # Syslog TCP
    55. - 514:514
    56. # Syslog UDP
    57. - 514:514/udp
    58. # GELF TCP
    59. - 12201:12201
    60. # GELF UDP
    61. - 12201:12201/udp
    62. # Volumes for persisting data, see https://docs.docker.com/engine/admin/volumes/volumes/
    63. volumes:
    64. mongo_data:
    65. driver: local
    66. es_data:
    67. driver: local
    68. graylog_journal:
    69. driver: local
  5. 启动整个服务。

    docker-compose up
    
    • 如果没有问题的话,会看到 graylog webserver started 的终端输出消息。
  6. 访问 http://ip:9000/ ,会看到 graylog 界面,账户密码:admin/admin。

    4. Graylog 系统配置


input 配置

  • graylog 的日志收集是通过定义 input 对象来完成的。
  • 选择 System -> Inputs -> GELF UDP
  • 填写相关属性,保存。

image.png

Docker 配置

  • 如果 docker 通过命令行启动,可以在 run 命令中加入如下参数:

    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 get-address=udp://localhost:12201 --log-opt tag="{{.ImageName}}/{{.Name}}/{{.ID}}" busybox sh -c 'while true: do echo "Hello, this is A."; sleep 10; done;'
      
  • 如果通过 docker-compose 命令,则可以在 docker-compose.yml 中加入相关配置,以 nginx 容器举例:

    version: '2'
    services:
    nginx:
      image: nginx:latest
      ports:
        - "80:80"
      logging:
        driver: "gelf"
        options:
          gelf-address: "udp://192.168.100.249:12201"
          tag: front-nginx
    
    • 容器启动的时候可能会发生下面提示:

      WRANNING: no logs are available with the 'gelf' log driver
      
    • 可以无视这个警告,日志还是会继续发送过去的。