TOP云提供高性价比云服务器租用,有中国内地/港澳台、海外等全球各地节点,TOP云国内云服务器只要有域名备案号就能直接用,无须重复备案;港澳台及海外云服务器不用备案,购买之后直接使用,省时省力省心。价格实惠,续费同价,2核2G5M仅需27元每月,8核8G50M仅需66元每月,更多配置套餐请进入下面网址了解:
TOP云总站云服务器:https://topyun.vip/server/buy.html
TOP云C站云服务器:https://c.topyun.vip/cart
在云服务器上记录 API 访问日志 是监控、调试和安全审计的重要手段。以下是完整的日志记录方案,涵盖 日志生成、存储、分析和长期归档 的最佳实践。
1. 日志记录的核心内容
API 访问日志通常需要记录以下关键字段:
字段 | 说明 |
---|---|
请求时间 | 请求到达服务器的时间戳(精确到毫秒) |
请求 IP | 客户端 IP(需注意代理或 CDN 的 X-Forwarded-For 头) |
请求方法 | HTTP 方法(GET/POST/PUT/DELETE) |
请求 URL | 完整的 API 路径(如 /api/v1/users) |
HTTP 状态码 | 服务器返回的状态码(如 200、404、500) |
响应时间 | 从请求接收到响应完成的时间(毫秒) |
User-Agent | 客户端浏览器或工具标识 |
请求头/体 | 关键头信息(如 Authorization)或请求参数(需脱敏) |
响应体 | 错误日志可记录部分响应内容(避免存储敏感数据) |
2. 日志记录的实现方式
(1) Web 服务器日志(Nginx/Apache)
如果 API 通过 Nginx 或 Apache 反向代理,可直接配置服务器日志格式。
Nginx 日志配置示例
http { log_format api_log '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' 'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"'; server { listen 80; server_name api.yourdomain.com; access_log /var/log/nginx/api_access.log api_log; error_log /var/log/nginx/api_error.log; location / { proxy_pass http://localhost:3000; # 转发到后端服务 } } }
日志字段说明:
$remote_addr:客户端 IP(需结合 X-Forwarded-For 获取真实 IP)。
$request_time:请求处理时间(秒)。
$upstream_*:代理到后端服务的耗时。
Apache 日志配置
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" api_log
CustomLog /var/log/apache2/api_access.log api_log
(2) 应用层日志(代码中记录)
如果 API 由后端服务(如 Node.js、Python、Java)直接处理,需在代码中记录日志。
Node.js 示例(Express + Winston)
const express = require('express');
const winston = require('winston');
// 配置 Winston 日志
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: '/var/log/api/access.log' }),
],
});
const app = express();
// 中间件:记录请求日志
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => { // 请求完成后记录日志
logger.info({
timestamp: new Date().toISOString(),
ip: req.headers['x-forwarded-for'] || req.ip,
method: req.method,
url: req.originalUrl,
status: res.statusCode,
responseTime: Date.now() - start + 'ms',
userAgent: req.headers['user-agent'],
});
});
next();
});
// 示例路由
app.get('/api/test', (req, res) => {
res.json({ message: 'Hello, API!' });
});
app.listen(3000, () => {
console.log('API running on port 3000');
});
Python Flask 示例(logging 模块)
from flask import Flask, request
import logging
app = Flask(__name__)
# 配置日志
logging.basicConfig(
filename='/var/log/api/access.log',
level=logging.INFO,
format='%(asctime)s - %(message)s'
)
@app.before_request
def log_request_info():
app.logger.info(
f"IP: {request.remote_addr} | "
f"Method: {request.method} | "
f"URL: {request.path} | "
f"User-Agent: {request.headers.get('User-Agent')}"
)
@app.after_request
def log_response_info(response):
app.logger.info(
f"Status: {response.status_code} | "
f"Response-Time: {response.calculate_response_time()}ms"
)
return response
@app.route('/api/test')
def test():
return {'message': 'Hello, API!'}
if __name__ == '__main__':
app.run(port=3000)
(3) 使用 API 网关日志
如果通过 API 网关(如 AWS API Gateway、阿里云 API 网关、Kong)管理 API,可直接启用网关的日志功能:
AWS API Gateway:启用 CloudWatch 日志。
阿里云 API 网关:开启访问日志投递到 OSS 或 SLS。
Kong:使用 kong-plugin-log-to-remote 插件将日志发送到 ELK 或 Kafka。
3. 日志存储与轮转
(1) 日志文件轮转(避免磁盘占满)
使用 logrotate 工具自动分割和压缩日志文件。
Nginx 日志轮转配置(/etc/logrotate.d/nginx)
/var/log/nginx/api_access.log { daily rotate 7 compress delaycompress missingok notifempty create 644 root root sharedscripts postrotate /usr/bin/killall -USR1 nginx endscript }
参数说明:
daily:每天轮转一次。
rotate 7:保留最近 7 天的日志。
compress:用 gzip 压缩旧日志。
应用日志轮转
如果使用 winston 或 logging 模块,可配置按大小或时间分割日志(如 winston-daily-rotate-file 插件)。
(2) 日志集中存储(ELK 或云服务)
ELK Stack(Elasticsearch + Logstash + Kibana):
用 Filebeat 收集服务器日志,发送到 Logstash 解析后存入 Elasticsearch,通过 Kibana 可视化。
云服务商日志服务:
阿里云 SLS、AWS CloudWatch Logs、腾讯云 CLS:直接采集服务器日志,提供查询和告警功能。
4. 敏感信息脱敏
日志中可能包含敏感数据(如 Authorization 头、用户密码),需脱敏处理:
正则替换:在日志记录前用正则隐藏敏感字段。
// Node.js 示例:隐藏 Authorization 头
const sanitizeHeaders = (headers) => {
return {
...headers,
authorization: headers.authorization ? '[REDACTED]' : undefined,
};
};专用脱敏工具:如 logstash-filter-mutate(ELK 生态)。
5. 日志分析与告警
(1) 查询与分析
grep/awk:快速过滤日志(如统计 500 错误):
grep ' 500 ' /var/log/nginx/api_access.log | wc -l
ELK/Kibana:可视化 API 调用趋势、错误率、响应时间分布。
(2) 告警配置
错误率告警:当 5xx 状态码比例超过阈值时触发告警(如通过 Prometheus + Alertmanager)。
慢请求告警:记录响应时间 >1s 的请求并告警。
6. 安全与合规
日志权限控制:限制日志文件访问权限(如 chmod 640 /var/log/api/*.log)。
日志保留策略:根据合规要求(如 GDPR)设置保留周期(通常 30-90 天)。
备份到异地:将日志定期同步到对象存储(如 AWS S3、阿里云 OSS)。
总结:API 日志记录 checklist
步骤 | 操作 |
---|---|
日志内容 | 记录时间、IP、方法、URL、状态码、响应时间等 |
记录方式 | Web 服务器日志(Nginx/Apache)或应用层代码(Winston/Logging) |
存储与轮转 | 使用 logrotate 或 ELK 自动管理日志文件 |
敏感信息 | 脱敏处理(如隐藏 Authorization 头) |
分析与告警 | 通过 ELK 或云服务实现查询和异常告警 |
安全合规 | 限制日志访问权限,定期备份 |
通过以上方案,你可以全面掌握 API 的访问情况,快速定位问题并保障系统安全。 🚀