graylog收集日志有好几种方式,此文主要介绍通过Content Pack收集Docker Nginx日志信息并展示在graylog控制台上

安装Content Pack

  1. 首先在官网搜索一款叫做nginx-docker的Content Pack下载到本地,下载下来的文件是一个JSON文件,此处附上Content Pack地址:Graylog3 nginx + Docker content pack

📎content_pack.json

  1. 接下来需要将下载的JSON文件上传到graylog

  1. 上传完成后下面列表就会出现nginx-docker内容包了,但是此时还不能使用,需要先进行安装

  1. 安装完成后会自动新增一个input udp的通道了,需要在安装graylog的时候配置这个端口与宿主机中的通讯,同时也要让防火墙放行端口,云服务器也需要放行才可以让外界访问

  1. 这些stream也是内容包内置的,主要用来筛选一些nginx日志用的,在这里还可以修改日志流发送到哪个索引中(elasticsearch索引名称)

  1. 最后需要验证外部是否能够正常连接这个UDP端口,可以使用nc命令验证,这个软件不是系统自带的,需要手动安装一下
sudo yum install nc # Centos

sudo apt install netcat # Ubuntu Deepin

nc -vuz IP或域名 端口号

以下是连接成功的示例

Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 110.110.110.110:12201.
Ncat: UDP packet sent successfully
Ncat: 1 bytes sent, 0 bytes received in 2.01 seconds.


配置 nginx.conf

主要只需要修改nginx的日志格式为json格式就可以了,可以直接在nginx.conf文件中修改,也可以新建一个*.conf的文件放在conf.d目录下面,这里就直接写在nginx.conf文件中了

http {

  log_format gelf_json escape=json '{ "timestamp": "$time_iso8601", '
         '"remote_addr": "$remote_addr", '
         '"connection": "$connection", '
         '"connection_requests": $connection_requests, '
         '"pipe": "$pipe", '
         '"body_bytes_sent": $body_bytes_sent, '
         '"request_length": $request_length, '
         '"request_time": $request_time, '
         '"response_status": $status, '
         '"request": "$request", '
         '"request_method": "$request_method", '
         '"host": "$host", '
         '"upstream_cache_status": "$upstream_cache_status", '
         '"upstream_addr": "$upstream_addr", '
         '"http_x_forwarded_for": "$http_x_forwarded_for", '
         '"http_referrer": "$http_referer", '
         '"http_user_agent": "$http_user_agent", '
         '"http_version": "$server_protocol", '
         '"remote_user": "$remote_user", '
         '"http_x_forwarded_proto": "$http_x_forwarded_proto", '
         '"upstream_response_time": "$upstream_response_time", '
         '"nginx_access": true }';

  access_log /var/log/nginx/access.log gelf_json;
	error_log  /var/log/nginx/error.log warn;
  
  # 省略其他配置...
  
  # 主机
  include /etc/nginx/conf.d/*.conf;
}

配置 Nginx compose文件

需要修改docker日志的驱动方式,graylog收集到的日志也就是在这里配置发送过去的

version: '3.7'
services:
  nginx:
    hostname: nginx
    image: nginx:1.16.1
    container_name: nginx
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./conf:/etc/nginx/conf.d
      - ./html:/usr/share/nginx/html
    #  - /data/logs/nginx:/var/log/nginx # 这个不能配置
    ports:
      - "80:80"
      - "443:443"
    logging:
      driver: gelf
      options:
        gelf-address: "udp://172.18.0.6:12201" # 不能使用docker主机名,只能是域名或者是IP
        tag: nginx # 指定标签,在graylog可以通过tag:nginx进行搜索
    networks:
      - docker-network

networks:
  docker-network:
    name: docker-network
    driver: bridge

配置完成之后执行命令启动Nginx就可以了,然后就可以在graylog看到实时了

docker-compse up -d

温馨提示

构建nginx容器的时候不能将容器中的日志再映射到宿主机中了,否则graylog收集到的日志不能按照nginx.conf配置的json格式进行转换,所有的日志信息都将在存储在message字段中,不利于我们检索日志,后期也无法利用grafana软件进行请求分析,为了更清晰的说明,下面两张图就是映射了容器中的日志到宿主机和没有映射的效果图,因为之前在这上面踩了不少坑。

第一张图是没有进行日志映射的结果,可以看到nginx.conf配置的json格式,每一个字段都能被graylog解析了

第二张图是将容器中的日志映射到了宿主机中,可以看到nginx.conf配置的json都没有被解析到,所有的日志信息都被解析成一个json字符串存储在message字段了

参考文档

本文主要参考了该内容包作者写的示例文档,在这里也感谢作者的辛苦付出

the NEW Marketplace - Graylog Community

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐