美文网首页
使用Graylog统一收集Docker日志

使用Graylog统一收集Docker日志

作者: bysir | 来源:发表于2018-05-17 10:08 被阅读0次

    为什么选用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)登陆就能进入首页


    配置

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

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


    点击save之后它就会出现在页面下方

    点击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 Web刷新一下就能看到日志了


    错误恢复

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

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

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

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

    Google之, 找到两篇文章:

    总结一下就是

    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 3.3

    先挨着挨着看升级手册:
    https://docs.graylog.org/en/3.3/pages/upgrade/graylog-3.0.html

    • 将es image tag改为 5.6.13
    • 将graylog image tag改为3.3
    • 运行, 查看报错 解决问题.

    相关文章

      网友评论

          本文标题:使用Graylog统一收集Docker日志

          本文链接:https://www.haomeiwen.com/subject/nnstdftx.html