Azure Web应用执行部署槽交换时如何排除特定文件夹不参与交换
Azure Web 应用部署槽交换目录排除问题解答
核心结论
Azure App Service 的部署槽交换逻辑默认是全站点内容同步,原生不支持配置排除特定文件夹不参与交换,你遇到的日志目录随槽交换错位的问题,可以通过以下几种适配方案解决:
方案1:将日志写入槽专属的持久化路径
- Linux 容器版 Azure Web App 自带每个槽独立的持久化存储目录
$HOME/LogFiles,该目录内容不会随槽交换发生迁移,你可以直接修改 PHP 应用的日志配置,将日志写入路径指向$HOME/LogFiles/[自定义应用目录]即可。 - 如果你需要自定义日志存储路径,可以借助槽专属应用设置实现路径隔离:
- 分别进入生产槽、预发布槽的配置页,添加键名为
APP_LOG_PATH的应用设置,生产槽设值为/home/site/logs/prod,预发布槽设值为/home/site/logs/staging,添加时务必勾选「部署槽设置」选项,保证该配置不会随槽交换被同步。 - 修改 PHP 应用的日志配置,读取
APP_LOG_PATH环境变量作为日志写入根目录,应用启动时会自动适配当前槽的日志路径。
- 分别进入生产槽、预发布槽的配置页,添加键名为
方案2:将日志输出到容器标准流
自定义 Docker 镜像场景下,你可以修改 PHP 配置,将应用日志直接输出到 stdout 和 stderr,Azure App Service 会自动收集所有容器标准输出的日志,存储到对应槽的专属日志存储中,完全不受槽交换影响。你可以直接在对应槽的「日志流」页面查看实时日志,也可以配置诊断设置将日志归档到存储账号、Log Analytics 等服务,归档日志会自动区分槽来源。
方案3:启动脚本自动适配槽专属日志路径
如果你不想修改现有应用的日志路径配置,可以在容器的启动脚本中新增逻辑:读取 Azure 自动注入的槽标识环境变量 WEBSITE_SLOT_NAME(值为当前槽的名称),启动时创建 /var/www/html/logs/${WEBSITE_SLOT_NAME} 目录,再将应用的默认日志目录软链接到该路径,保证不同槽的日志实际写入到不同物理路径,槽交换后软链接会随容器重启重新生成,不会出现日志错位问题。
内容的提问来源于stack exchange,提问作者Youssef CH
相关产品推荐
相关产品推荐

