本地运行Django服务配置Watchtower后出现ERR_CONNECTION_REFUSED错误
问题原因
- 你当前的配置将
django根日志的输出仅绑定到了watchtowerhandler,本地开发环境如果网络无法正常访问AWS CloudWatch接口时,Django启动过程中产生的所有INFO级别日志都会触发同步上报请求,阻塞服务主线程,导致服务实际并未启动完成,所以访问时会返回ERR_CONNECTION_REFUSED。 - 你看不到控制台报错的原因也正是因为Django的所有日志都被发往了CloudWatch,没有输出到本地控制台,你误以为服务启动无异常。
- 将日志键改为
watchtower后,只有watchtower组件自身的日志会走上报逻辑,Django框架的日志还是沿用默认的控制台输出,不会触发阻塞,所以服务可以正常启动。
解决方案
- 方案1:本地开发环境关闭watchtower上报
仅在部署到AWS环境时启用watchtower handler,本地开发只保留console handler,示例配置:import os ENVIRONMENT = os.getenv("ENV", "development") HANDLERS = ["console"] if ENVIRONMENT == "production": HANDLERS.append("watchtower") LOGGING = { # 其余原有配置保持不变 'loggers': { 'django': { 'level': 'INFO', 'handlers': HANDLERS, 'propagate': True, }, }, } - 方案2:配置watchtower异步上报避免阻塞
在watchtower handler配置中添加use_queues: True参数,启用异步队列上报日志,不会阻塞主线程:
同时建议在'watchtower': { 'level': 'INFO', 'class': 'watchtower.CloudWatchLogHandler', 'boto3_session': boto3_session, 'log_group': 'StagingBeagleApi', 'stream_name': 'ApplicationLogStream', 'formatter': 'aws', 'use_queues': True, # 新增异步上报配置 },djangologger的handlers中保留console,方便本地排查问题:'django': { 'level': 'INFO', 'handlers': ['console', 'watchtower'], 'propagate': True, }, - 方案3:排查本地AWS网络连通性
确认本地配置的AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_REGION参数正确,且本地网络可以正常访问对应区域的CloudWatch接口,没有被防火墙、代理拦截。
内容的提问来源于stack exchange,提问作者Cyzanfar
相关产品推荐
相关产品推荐

