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:CreateLogStreamlogs:PutLogEventslogs: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
相关产品推荐
相关产品推荐

