vlambda博客
学习文章列表

K8S日志收集:容器日志输出JSON,自动采集至ES

以腾讯云的容器服务为例,将容器内日志输出到腾讯云的日志服务(基于 ES)

环境信息

  • 应用:基础镜像是 nginx,运行静态页面

  • K8S: 1.18

核心流程:日志打印到容器标准输出 -> 采集容器标准输出到 ES

1. 将 Nginx 的日志输出格式设置为 JSON

修改 /etc/nginx/nginx.conf文件,将日志输出为 JSON 格式。(其实就是构建一个 JSON 字符串)

 
   
   
 
http {##... log_format log_json '{"@timestamp": "$time_local", ' '"remote_addr": "$remote_addr", ' '"referer": "$http_referer", ' '"request": "$request", ' '"status": $status, ' '"bytes": $body_bytes_sent, ' '"agent": "$http_user_agent", ' '"x_forwarded": "$http_x_forwarded_for", ' '"gzip_ratio": "$gzip_ratio",' '"scheme": "$scheme",' '"request_method": "$request_method",' '"request_time": "$request_time"' ' }';
access_log /var/log/nginx/access.log log_json;##...}

如果想拿到镜像中默认的 nginx 配置,可以通过 docker cp 命令获取。

接着,修改 dockerfile,新增 挂载 nginx 配置文件的行。

 
   
   
 
FROM nginx:xxxxxxxxWORKDIR /usr/share/nginx/htmlADD etc/nginx/nginx.conf /etc/nginx/nginx.confEXPOSE 80

在 nginx 镜像中,日志文件是输出到标准输出(/dev/stdout)的,所以不需要特别指定。

$ docker exec -it 4071569c24ff ls -lh /var/log/nginx/total 0lrwxrwxrwx 1 root root 11 Dec 17 23:01 access.log -> /dev/stdoutlrwxrwxrwx    1 root     root          11 Dec 17 23:01 error.log -> /dev/stderr
docker build 新的镜像,部署到 K8S 上后,请求几条数据,可以查看容器的日志输出效果为:
$ docker logs 4071569c24ff{"@timestamp""07/Mar/2021:19:11:28 +0800""remote_addr""127.0.0.1""referer""-""request""GET /gitbook/gitbook-plugin-splitter/splitter.js HTTP/1.1""status"200"bytes"3864"agent""Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)""x_forwarded""111.206.198.24""gzip_ratio""-","scheme""http","request_method""GET","request_time""0.000" }
2. 创建日志收集规则

在【容器服务】->【日志规则】中,新增一个日志采集规则,选择上述应用对应的工作负载。

设置输出模式为 JSON

K8S日志收集:容器日志输出JSON,自动采集至ES

3. 设置索引

在日志服务页面,找到上面 设置的日志集,设置索引。

先访问自己的服务,生成几条日志,这样可以使用下图中的【自动配置】功能。

效果

在 检索分析 中可以查找日志,也可以创建仪表盘。

用户访问的数据,10秒左右就可以查到,效果不错。

腾讯云容器服务在产品融合这块做的不错,把 日志服务 和 容器服务 打通了。