zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Nginx 发布 Docker 运行日志的方法

2023-09-27 14:24:14 时间

背景


公司这边想进行容器化负载均衡部署.
脚本很简单, 已经实现了, 但是发现我这边没有ELK也没有LOKI
又不太像切入到容器内部进行 获取日志信息.
所以我这边想了一个别的招来动态刷新日志.

思路

动态获取容器的日志目录
然后将目录动态替换到 nginx的autoindex的路径下.
然后重启一下nginx, 使用新的配置文件进行加载日志进行展示.

获取容器日志目录

这边部署的镜像是一直一个相同的名字. 跟端口号绑定: 所以我这边优先获取一个镜像的目录
docker inspect --format='{{.LogPath}}' app5201 |xargs dirname
命令比较简单, 主要是json格式的获取信息内容.
注意注意的是 一开始获取出来的是 log的文件, 通过 dirname 的方式获取到
文件具体的目录进行替换.

修改nginx配置文件以及启动

sed "s#applog#`docker inspect --format='{{.LogPath}}' aoo5201 |xargs dirname`#" /opt/nginx/applog.conf >/opt/nginx/appdockerlog.conf
cd /opt/nginx/
lsof -i:8080|awk '{print $2}' |xargs kill -9
./nginx -c appdockerlog.conf

简单讲解

1. sed 进行变量替换的时候 建议使用 soft quote, 这样的话就可以直接识别变量了.
   需要注意的是 变量替换时不建议使用 / 进行切分了
   建议换用 # 类似的符号进行切分, 因为 目录里面带 / 会导致命令失败.
   可以先定义变量, 可以在 ## 之间 添加`` 反引号包裹的命令来实现.
2. 注意sed -i 会修改当前文件, 会导致丢失模板, 所以建议从模板文件修改到其他目录里面去.
   这样命令可以重复使用.
3. 监控 端口, 停止 nginx的服务
4. 重启nginx服务

nginx 文件预览的模板

worker_processes 1;
user root;
events {
  worker_connections 1024;
}
http {
 include mime.types;
 sendfile on;
 charset utf8;
 gzip on;
 server {
    listen  8080;
    server_name localhost;
    location / {
      root applog/;
      autoindex on;
      autoindex_exact_size off;
      autoindex_localtime on;
    }
  }
}


nginx配置文件说明

建议增加 user root;的处理
容器的目录权限 nobody可能不好获取, 贸然修改容器的目录权限不太好.
建议在被替换的目录的末尾添加一个 / 这样的话 替换完 dirname 之后就正常可用了.