这篇文章上次修改于 750 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

GrayLog是目前主流的日志管理软件之一,用户可使用该软件查看和分析实时日志,今天以Docker的方式部署一个GrayLog系统试试看。

安装环境

docker的安装方式不多赘述,之前的教程有Docker-Web虚拟化环境使用
根据官方文档,GrayLog的必要环境为以下几点:

 Java(>=8)
 Elasticsearch(6.x或7.x)
 MongoDB(4.0、4.2或4.4)

我们去DockerHub找对应版本并进行安装:

docker pull mongo:4.2
docker pull elasticsearch:6.8.19
docker pull graylog/graylog:4.1

启动环境

启动容器

docker run -idt --name mongo mongo:4.2
docker run -idt --name elasticsearch elasticsearch:6.8.19
docker run --link mongo --link elasticsearch -p 9000:9000 -p 12201:12201 -p 1514:1514 -p 5555:5555 -p 5140-5180:5140-5180 -p 5140-5180:5140-5180/udp  -e GRAYLOG_HTTP_EXTERNAL_URI="http://127.0.0.1:9000/" -e GRAYLOG_PASSWORD_SECRET=<接口token> -e GRAYLOG_ROOT_PASSWORD_SHA2=<admin密码> --name graylog -itd graylog/graylog:4.1

其中admin密码生成和token生成需要用到以下命令

# 生成token
pwgen -N 1 -s 96
# admin密码生成
echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1

调试

打开docker日志调试容器

docker logs -f -t --tail 100 graylog

访问http://IP:9000,输入用户名密码登录系统

对接Nginx

编辑Nginx配置文件

vim /etc/nginx/nginx.conf
# 在http中添加以下内容
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
log_format graylog2_json escape=json '{ "timestamp": "$time_iso8601", '
                 '"remote_addr": "$remote_addr", '
                 '"remote_user": "$remote_user", '
                 '"body_bytes_sent": $body_bytes_sent, '
                 '"request_time": $request_time, '
                 '"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" }';
access_log syslog:server=127.0.0.1:5141,facility=local0,tag=nginx,severity=info graylog2_json;

用tcpdump查看是否有数据推送

tcpdump udp -n -vv port 5141 -i lo -X

打开GrayLog->System->Inputs
Select Input中选择Raw/Plaintext UDP,Launch new input,勾选Global,port为Nginx中配置的5141,填写完成后Save保存,Network IO出现数字是即为对接成功。
对接过程中可能会遇到recvBufferSize不匹配的情况,需要查看graylog日志进行调试,将Receive Buffer Size调整到合适的数字。