无法在 Azure 应用程序服务中启动我的 Web 应用程序,因为 Azure 监视器 opentelemetry SDK 尝试在 /var/log/ 目录中创建日志

问题描述 投票:0回答:1

我正在 Azure 应用服务上部署基于 python 的 Web 应用程序。这是从 Azure 容器注册表中提取的 docker 映像。

问题来自 Azure Monitor OpenTelmetry SDK 内部。 sdk 在以下目录中创建用于诊断日志记录的日志文件:

/var/log/applicationinsights/
(适用于基于 Linux 的 Web 应用程序)。从上面sdk中的以下代码可以看出这一点。该文件路径已硬编码在 sdk 中且不可配置。我使用 app_user 启动应用程序,它可以访问容器中与应用程序相关的卷,但不能访问上述目录。

 if not exists(_DIAGNOSTIC_LOG_PATH):
        makedirs(_DIAGNOSTIC_LOG_PATH)
    f_handler = logging.FileHandler(
        join(
            _DIAGNOSTIC_LOG_PATH, _DIAGNOSTIC_LOGGER_FILE_NAME
        )
    )
              

因此,应用程序不会以以下堆栈跟踪启动:

2024-10-25T04:33:34.877284066Z File "/usr/src/app/api/main.py", line 19, in <module> 
2024-10-25T04:33:34.877309466Z configure_azure_telemetry(option="basic") 
2024-10-25T04:33:34.877361967Z File "/usr/src/app/api/dependencies/instrumentation.py", line 11, in configure_azure_telemetry 
2024-10-25T04:33:34.877378367Z configure_basic_azure_monitor() 
2024-10-25T04:33:34.877383767Z File "/usr/src/app/doc_generator_api/dependencies/instrumentation.py", line 25, in configure_basic_azure_monitor 
2024-10-25T04:33:34.878324584Z configure_azure_monitor( 
2024-10-25T04:33:34.879013896Z File "/agents/python/azure/monitor/opentelemetry/_configure.py", line 98, in configure_azure_monitor 
2024-10-25T04:33:34.879018996Z _send_attach_warning() 
2024-10-25T04:33:34.879022896Z File "/agents/python/azure/monitor/opentelemetry/_configure.py", line 222, in _send_attach_warning 
2024-10-25T04:33:34.879026897Z AzureDiagnosticLogging.warning( 
2024-10-25T04:33:34.879030297Z File "/agents/python/azure/monitor/opentelemetry/_diagnostics/diagnostic_logging.py", line 87, in warning 
2024-10-25T04:33:34.879034197Z AzureDiagnosticLogging._initialize() 
2024-10-25T04:33:34.879037997Z File "/agents/python/azure/monitor/opentelemetry/_diagnostics/diagnostic_logging.py", line 68, in _initialize 
2024-10-25T04:33:34.879041897Z f_handler = logging.FileHandler( 
2024-10-25T04:33:34.879883312Z ^^^^^^^^^^^^^^^^^^^^ 
2024-10-25T04:33:34.879896112Z File "/opt/conda/lib/python3.11/logging/__init__.py", line 1181, in __init__ 
2024-10-25T04:33:34.879905312Z StreamHandler.__init__(self, self._open()) 
2024-10-25T04:33:34.879910112Z ^^^^^^^^^^^^ 
2024-10-25T04:33:34.879914512Z File "/opt/conda/lib/python3.11/logging/__init__.py", line 1213, in _open 
2024-10-25T04:33:34.879919112Z return open_func(self.baseFilename, self.mode, 
2024-10-25T04:33:34.879923612Z ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
2024-10-25T04:33:34.879928513Z PermissionError: [Errno 13] Permission denied: '/var/log/applicationinsights/applicationinsights-extension.log'


我尝试将上述目录的权限授予我的dockerfile中的app_user,但这似乎不起作用:

RUN mkdir -p /var/log/applicationinsights

# Set the permissions to allow writing
RUN chown -R ${APP_UID}:${APP_GID} /var/log/applicationinsights
RUN chmod -R 755 /var/log/applicationinsights

即使执行此操作后,目录:

/var/log/applicationinsights/
仍然由 Azure 应用服务中的 root 拥有。检查附件图片

linux azure sdk azure-web-app-service
1个回答
0
投票

您遇到的错误消息

Permission denied
表示 Azure Monitor OpenTelemetry SDK 正在尝试在
/var/log/applicationinsights/
目录中创建日志文件。该目录是在SDK中设置的,无法更改。

由于您的应用程序以非 root 用户身份运行

app_user
,因此它无权写入该目录。

  • 为了解决该问题,我在应用程序中的
    /home/logs
    处创建了一个自定义日志目录。因此,非root用户也可以访问它
    app_user
  • 我创建了从
    /var/log/applicationinsights
    /home/logs
    的链接,这会将开放遥测 SDK 尝试写入
    /var/log/applicationinsights
    的日志重定向到自定义日志目录。
  • 在我的 dockerfile 中添加了以下几行
RUN  mkdir  -p  /home/logs  &&  \
ln  -sf  /home/logs  /var/log/applicationinsights

我完整的Dockerfile

FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install Flask azure-monitor-opentelemetry
RUN mkdir -p /home/logs && \
    ln -sf /home/logs /var/log/applicationinsights
RUN useradd -m app_user && \
    chown -R app_user:app_user /home/logs
USER app_user
EXPOSE 8000
CMD ["python", "main.py"]

现在我的应用程序启动没有任何错误

enter image description here

日志流: enter image description here

这里的文件权限

rwxrwxrwx
显示所有用户都有读、写、执行权限,也就是说应用程序用户可以写入日志,没有权限问题。 enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.