日志策略 - Nginx, NestJS, Pino
在 Nginx 中动态查看 IP 访问情况;
在 Pino 中动态查看用户访问情况。
Nginx
Nginx 的日志管理是运维和开发中非常重要的一环。通常分为访问日志 (access_log) 和 错误日志 (error_log)。
以下是关于 Nginx 日志记录方式及常用查看工具的详细说明:
一、 Nginx 日志记录方式
1. 记录到本地文件(最常用)
这是默认方式,Nginx 将每一条请求记录在服务器的磁盘文件中。
- 配置指令:
access_log和log_format。 - 自定义格式:可以自定义日志包含的字段(如 IP、时间、 请求路径、状态码、响应时间等)。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; - 现代推荐:现在很多场景推荐使用 JSON 格式 记录日志,方便程序直接解析(如 ELK、GoAccess)。
2. 记录到 Syslog
Nginx 可以将日志直接发送到系统日志服务(Syslog),便于集中管理。
- 配置示例:
access_log syslog:server=127.0.0.1:514,facility=local7,tag=nginx,severity=info;
3. 记录到标准输出 (stdout/stderr)
这在 Docker 或 Kubernetes 环境中非常常见。Nginx 将日志打到屏幕,由容器引擎(如 Docker Engine)捕获并存储。
- 实现方法:通常将日志文件软链接到
/dev/stdout。
二、 常用的查看与搜索工具
根据需求从简单到复杂,可以将工具分为以下几类:
1. 基础命令行工具(快、准、稳)
适用于快速排查问题,无需安装额外软件。
tail -f: 实时查看最新日志。tail -f /var/log/nginx/access.log
grep: 搜索特定关键词(如某个 IP 或 404 状态码)。grep "404" /var/log/nginx/access.log
awk: 统计与过滤。比如统计访问量前 10 的 IP。awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10
zgrep/zcat: 直接搜索压缩过的旧日志(.gz 文件)。
2. 实时交互式工具(推荐)
适用于需要可视化、但不想搭建复杂系统的场景。
- GoAccess (强烈推荐):
- 特点:极快,支持在 Linux 终端显示,也可以生成实时的 HTML 报告。
- 场景:想直观看到哪个 URL 访问最多、哪些 IP 异常、 响应时间分布等。
- Angie / Nginx VTS:
- 通过安装模块,在网页上实时查看 Nginx 的流量状态。
3. 集中式日志管理系统(企业级)
适用于多台服务器、需要长期存储和复杂检索的情况。
- ELK Stack (Elasticsearch, Logstash, Kibana):
- 行业标准。Logstash/Filebeat 收集日志,Elasticsearch 存储,Kibana 展示。
- 优点:功能极其强大,支持复杂的报表和搜索。
- Loki (Grafana Labs):
- 被称为“日志界的 Prometheus”,比 ELK 更轻量,适合 Kubernetes 环境。
- Graylog:
- 比 ELK 部署更简单,自带告警功能,非常适合管理 Syslog。
4. 云原生与分析工具
- 阿里日志服务 SLS / AWS CloudWatch: 如果在云上,直接使用云厂商提供的服务,省去运维成本。
- SQL 分析: 如果将日志导入 ClickHouse 或 StarRocks,可以用 SQL 进行亿级数据的秒级分析。