服务器维护,服务器代维,安全设置,漏洞扫描,入侵检测服务

dirtysea 发表于 2019-4-25 17:13:03

使用Graylog收集Docker日志

日志收集比较流行的方案有
[*]Elasticsearch+Graglog
[*]Elasticsearch+Logstash+Kibana 也就是ELK

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

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

[*]graylog官方提供了将本身部署在Docker的支持

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

[*]创建一个目录用来部署graylog,本文假设目录为/data/graylog,以下所有操作都是在/data/graylog中进行的。
[*]初始化目录和配置文件
#创建数据目录mkdir -p ./graylog/data#创建配置文件目录mkdir -p ./graylog/configcd ./graylog/config#直接下载官方推荐配置文件wget https://raw.githubusercontent.com/Graylog2/graylog2-images/2.1/docker/config/graylog.conf#日志配置文件wget https://raw.githubusercontent.com/Graylog2/graylog2-images/2.1/docker/config/log4j2.xml修改下载完的graylog.conf中的root_timezone为:
root_timezone = +08:00改为GMT+0800中国时区。

[*]新建docker-compose.yml来供docker-compose快速启动完整服务,文件内容如下:
version: '2'services:# MongoDB: https://hub.docker.com/_/mongo/mongodb:    image: mongo:3.6.10    volumes:      - ./logs/mongo_data:/data/db# Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/6.6/docker.htmlelasticsearch:    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.6.1    volumes:      - ./logs/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    mem_limit: 1g# Graylog: https://hub.docker.com/r/graylog/graylog/graylog:    image: graylog/graylog:3.0    volumes:      - ./logs/graylog_journal:/usr/share/graylog/data/journal    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://61.155.158.42:9000/    links:      - mongodb:mongo      - elasticsearch    depends_on:      - mongodb      - 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
文件保存后通过
docker-compoes up启动整个服务,如果没有问题的话,会看到graylog webserver started的终端输出消息。
访问 http://{server}:9090/
会看到graylog的web界面,使用用户名admin,密码:admin 来登录后台,至此部署完成。
系统配置
[*]input配置
graylog的日志收集通过定义input对象来完成,在graylogweb管理界面按照如下图片进入input对象配置:

//upload-images.jianshu.io/upload_images/5421228-77ab944e5f8958b1.png

进入Input配置界面

选择GELF UDP协议来新建一个输入器(input)

//upload-images.jianshu.io/upload_images/5421228-c574241eac1af1b3.png

选择正确的Input类型


填好相关属性,新建:

//upload-images.jianshu.io/upload_images/5421228-4341d9862dc69028.png

Input详细配置


至此graylog就可以开始收集日志了

[*]Docker配置
如果docker通过命令行启动,可以在run命令中加上如下参数:
docker run --log-driver=gelf --log-opt gelf-address=udp://{graylog服务器地址}:12201--log-opt tag=<当前容器服务标签,用来供graylog查询的时候进行分类><IMAGE> <运行命令>如果通过docker-compose命令,则可以在docker-compose.yml中加入相关配置,以下用tomcat容器举例:
version: '2'services:tomcat:    image: tomcat:7    volumes:         - /etc/localtime:/etc/localtime         - /etc/timezone:/etc/timezone         - /data/tomcat-adtp/logs:/usr/local/tomcat/logs         - /data/tomcat-adtp/webroot:/usr/local/tomcat/webapps/ROOT    environment:         - JAVA_OPTS=-Xmx1g         - JAVA_OPTS=-Xms3g    ports:      - "80:8080"    logging:      driver: "gelf"      options:      gelf-address: "udp://graylogserver:12201"      tag: front-tomcat容器启动的时候可能会有下面这个提示:
tomcat_1| WARNING: no logs are available with the 'gelf' log driver可以无视这个警告,日志还是会继续发送过去的。到这里为止我们可以在graylog的web后台中看到tomcat所产生日志了。
后续虽然日志已经可以集中收集了,但是有些日志还是不会以我们理想的方式收集的,比如Java程序的异常堆栈、Hibernate的格式化sql等等,因为这种日志并不是一行一个的,而是多行一个整体,但是Docker不会知道这个,而是一行一个把日志发送到了graylog,导致一个完整的堆栈分散的存储到了graylog中,这样显然不是我们想要看到的结果,在这里我们可以使用一种比较折衷的方法,让Java程序自己将这种多行日志发送到graylog,剩下的日志继续由Docker处理,具体做法如下:
由于本人在目前系统中使用的logback,可以使用特定的appender把日志发送到graylog,我相信log4j或者是其他相关的日志框架也都有类似的配置。修改logback的配置文件,添加指定的log appender:
<appender name="gelf" class="me.moocar.logbackgelf.GelfUDPAppender">      <remoteHost>192.168.31.8</remoteHost>      <port>12201</port>      <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">            <layout class="me.moocar.logbackgelf.GelfLayout">                <!--An example of overwriting the short message pattern-->                <shortMessageLayout class="ch.qos.logback.classic.PatternLayout">                  <pattern>%ex{short}%.100m</pattern>                </shortMessageLayout>                <!-- Use HTML output of the full message. Yes, any layout can be used (please don't actually do this)-->                <fullMessageLayout class="ch.qos.logback.classic.PatternLayout">                  <pattern>%d{MM-dd HH:mm:ss.SSS} [%thread] %-5level \(%F:%L\) - %msg %n</pattern>                </fullMessageLayout>                <useLoggerName>true</useLoggerName>                <useThreadName>true</useThreadName>                <useMarker>true</useMarker>                <includeFullMDC>true</includeFullMDC>                <fieldType>requestId:long</fieldType>                <!--Facility is not officially supported in GELF anymore, but you can use staticFields to do the same thing-->                <staticField class="me.moocar.logbackgelf.Field">                  <key>tag</key>                  <value>business-server</value>                </staticField>            </layout>      </encoder>    </appender>    <root>      <level value="info"/>      <appender-ref ref="gelf"/>    </root>这样logback会自动把日志发送到graylog,异常堆栈信息也不会分散了,这个功能需要一个第三方的logback扩展支持,github地址在这里
结束至此,搭建一个graylog并且收集Docker日志集中管理的方案就完成了,希望能够帮到看这篇文章的你。



作者:JeryZen
链接:https://www.jianshu.com/p/25e310596559
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
页: [1]
查看完整版本: 使用Graylog收集Docker日志