使用Graylog统一收集Docker日志

为什么选用Graylog?

日志收集比较流行的方案有

  • Elasticsearch+Graglog
  • Elasticsearch+Logstash+Kibana 也就是ELK

其实ELK更为出名, 但为什么我会选择Graylog?

  • Graylog技术栈小, 又是全家桶. 少使用了Logstash, 少学一个东西, life +1day.
  • Graylog的Inputs很强大, 图形化配置. Docker也支持GELF(Graylog Extended Log Format)的logging driver, 方便.

安装

参照官方文档编写以下文件:

docker-compose.yml

version: '2'
services:
  mongodb:
    image: mongo:3
    volumes:
      - /workspace/docker/volumes/graylog/mongo_data:/data/db
  elasticsearch:
    image: elasticsearch:5.5.1
    volumes:
      - /workspace/docker/volumes/graylog/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/5.5/security-settings.html#general-security-settings
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 1g
  graylog:
    image: graylog/graylog:2.4.4-1
    volumes:
      - /workspace/docker/volumes/graylog/graylog_journal:/usr/share/graylog/data/journal
    environment:
      - GRAYLOG_PASSWORD_SECRET=xxxxxxxxxxx
      - GRAYLOG_ROOT_PASSWORD_SHA2=xxxxxxxxxxxxxxx
      - GRAYLOG_WEB_ENDPOINT_URI=http://graylog.bysir.store/api
    links:
      - mongodb:mongo
      - elasticsearch:elasticsearch
    ports:
      # Graylog web interface and REST API
      - 9001:9000
      # GELF UDP
      - 12201:12201/udp
    depends_on:
      - mongodb
      - elasticsearch

运行它:

docker-compose up -d

访问Graylog的web界面 我这里是 http://graylog.bysir.store (使用nginx反向代理9001端口)

输入账号(admin)密码(admin)登陆就能进入首页


使用Graylog统一收集Docker日志_第1张图片

配置

点击 "System>Inputs", 选择DELF UDP之后点击Launch new input

使用Graylog统一收集Docker日志_第2张图片

选择Node(只有一个选项), 输入Title(可以随意输入)

使用Graylog统一收集Docker日志_第3张图片

点击save之后它就会出现在页面下方
使用Graylog统一收集Docker日志_第4张图片

点击 Start input, 成功开启后就能接受日志了.

测试

启动一个docker测试日志:

设置docker的log驱动为GELF

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;'

或者在Rancher配置

gelf-address=udp://localhost:12201
tag={{.ImageName}}/{{.Name}}/{{.ID}}
使用Graylog统一收集Docker日志_第5张图片

回到Graylog Web刷新一下就能看到日志了

使用Graylog统一收集Docker日志_第6张图片

错误恢复

有一天发现不能搜索新日志了, 引起原因好像是服务器磁盘满了, 然后清理了下服务器磁盘, 但是还是不能搜索.

胡搞一通(如删除Inputs, 重启graylog全家), 发现一个日志都搜索不到了, 猝.

在Inputs里和右上角看日志输入, 发现能接受到消息, 再看Indices也是有数据量的, 看es的容器日志发现没什么毛病, 再看graylog的容器日志发现还是没什么毛病.

突然发现小红点中有一个这样的警告: Deflector exists as an index and is not an alias.

Google之, 找到两篇文章:

  • How to fix “Deflector exists as an index and is not an alias” warning?
  • How to delete graylog_deflector?

总结一下就是

  1. 关闭Graylog
  2. 删除es中的索引: graylog_deflector, 你可以进入到es容器中运行curl -X DELETE 'http://127.0.0.1:9200/graylog_deflector'即可
  3. 重新运行Graylog

正常情况下就好了, 如果还不行, 你可以再试一下以下方法:

关闭graylog全家并且删除graylog和es挂载出来的两个文件夹es_datagraylog_journal, 再重启.

注意: 删除es_data会损失掉之前的日志文件, 如果日志很重要请谨慎操作. 同时一定别删除挂载出来的mongo_data, 不然包括账号等graylog配置都会被重置.

其他注意事项

大于32766byte的日志将写不进ES, 可在 http://host.com/system/indices/failures 看到以下错误: (whose UTF8 encoding is longer than the max length 32766)
这么解决呢? 不要写这么长的日志就对了.

你可能感兴趣的:(使用Graylog统一收集Docker日志)