使用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]