我正在 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 拥有。检查附件图片。
您遇到的错误消息
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
的日志重定向到自定义日志目录。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"]
现在我的应用程序启动没有任何错误
日志流:
这里的文件权限
rwxrwxrwx
显示所有用户都有读、写、执行权限,也就是说应用程序用户可以写入日志,没有权限问题。