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 可视化。

  • 云服务商日志服务

    • 阿里云 SLSAWS 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 的访问情况,快速定位问题并保障系统安全。 🚀


不容错过
Powered By TOPYUN 云产品资讯