You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django应用日志无法上传至AWS CloudWatch求助

Django日志无法上传至AWS CloudWatch问题

本地日志可正常写入,但配置CloudWatch后仅能创建日志组,无法生成日志流;手动创建流后,日志仍无法上传。

配置代码

Django日志配置

logger_boto3_client = boto3.client(
    "logs",
    aws_access_key_id=CLOUDWATCH_AWS_ID,
    aws_secret_access_key=CLOUDWATCH_AWS_KEY,
    region_name=AWS_DEFAULT_REGION,
)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': "[cid: %(cid)s] [%(asctime)s.%(msecs)03d] %(levelname)s [%(name)s:%(lineno)s] [%(funcName)s] %(message)s",
            'datefmt': '%Y-%m-%d %H:%M:%S',
        },
    },
    'handlers': {
        'logger': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': str(BASE_DIR) + '/logs/test.log',
            'formatter': 'simple',
            'filters': ['correlation'],
        },
        'watchtower': {
            "level": "DEBUG",
            "class": "watchtower.CloudWatchLogHandler",
            "boto3_client": logger_boto3_client,
            "log_group": "DemoLogs2",
            # 不同环境使用不同流
            "stream_name": "logs",
            "formatter": "simple",
            'filters': ['correlation'],
        }
    },
    'filters': {
        'correlation': {
            '()': 'cid.log.CidContextFilter'
        },
    },
    'loggers': {
        'root': {
            'handlers': ['logger', 'watchtower'],
            'level': 'DEBUG',
            'filters': ['correlation'],
            'propagate': True,
        }
    }
}

应用日志调用方式

import logging

logger = logging.getLogger(__name__)
logger.info("log message.")

CloudWatch控制台状态

日志组DemoLogs2已成功创建,但无日志流自动生成;手动创建日志流后,日志依然无法上传至CloudWatch。


排查与解决方案

1. 验证IAM权限

确保AWS凭证对应的IAM用户拥有以下CloudWatch Logs核心权限:

  • logs:CreateLogStream
  • logs:PutLogEvents
  • logs:DescribeLogStreams

可通过直接调用boto3 API测试权限有效性:

import time

# 测试创建日志流
logger_boto3_client.create_log_stream(logGroupName="DemoLogs2", logStreamName="logs")
# 测试推送日志事件
logger_boto3_client.put_log_events(
    logGroupName="DemoLogs2",
    logStreamName="logs",
    logEvents=[{"timestamp": int(time.time()*1000), "message": "test log"}]
)

若调用报错,根据错误提示调整IAM权限策略。

2. 排查自定义过滤器异常

临时移除watchtower handler和root logger中的filters: ['correlation']配置,测试日志是否能正常上传。如果移除后日志成功推送,说明自定义CidContextFilter在处理日志时抛出异常,导致日志中断传递,需排查过滤器的实现代码。

3. 调整Watchtower配置细节

  • 尝试不传入自定义boto3_client,让Watchtower自动加载AWS凭证(通过环境变量、~/.aws/credentials文件等标准方式),避免凭证初始化逻辑出错。
  • 确认stream_name不包含CloudWatch禁止的特殊字符:: * ? " < > |
  • 设置batch_size=1强制立即上传日志,规避批量缓存导致的延迟问题:
"watchtower": {
    # ...其他配置
    "batch_size": 1,
}

4. 优化日志记录器配置

尝试直接为业务模块的日志记录器绑定CloudWatch handler,避免root logger的传播规则干扰:

'loggers': {
    'root': {
        'handlers': ['logger'],
        'level': 'DEBUG',
        'filters': ['correlation'],
        'propagate': True,
    },
    'your_app_module': {  # 替换为实际应用模块名
        'handlers': ['watchtower'],
        'level': 'DEBUG',
        'filters': ['correlation'],
        'propagate': False,
    }
}

内容的提问来源于stack exchange,提问作者rangarajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:55:18