我被要求在 Azure 中设计一个解决方案,其中我们的应用程序在 Azure VM(Ubuntu)上使用 docker compose 作为 docker 容器运行。
应用程序日志到stdout,要求是收集这些stdout日志,将其推送到Azure并能够在Azure控制台中查看。
我们考虑使用 Azure Monitor Agent (AMA) 来执行此操作,但我们找不到任何指出从 stdout 收集日志的文档。
我们还考虑过将日志写入日志文件并收集这些有足够文档可用的日志,但在这种方法中,我们不希望承担轮换日志文件的负担。
我们需要一个解决方案,可以从标准输出中选取日志并将其转发到 azure 控制台。
我们只想使用云原生解决方案,因为我们不想有单独的实例来运行 ELK 堆栈或 Grafana 等。
此外,当我们跨云平台(Azure、AWS、GCP)部署应用程序时,我们不想使用任何客户端库,并且希望跨平台保持代码库相同
要从 Azure VM 上的 Docker 容器中运行的应用程序的标准输出收集日志,并在 Azure 控制台中查看日志,而不使用其他第三方服务或客户端库,可以将 Azure Monitor 与 Log Analytics Agent(以前称为Azure Monitor 代理或 AMA)。尽管已弃用,Log Analytics Agent 仍然支持从 Docker 容器收集日志并将其推送到 Azure Monitor。
在 Azure VM 上安装 Log Analytics 代理 对于 windows 虚拟机 对于 Linux 虚拟机
在 Azure 中创建 Log Analytics 工作区。该工作区将用于存储和分析您的日志。
az monitor log-analytics workspace create --resource-group <your-resource-group> --workspace-name <your-workspace-name> --location <your-region>
将 Docker 配置为记录到文件 - 编辑 Docker 守护程序配置文件(通常位于 Linux 上的
/etc/docker/daemon.json
),以确保日志以 Log Analytics 代理可以读取的方式存储
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
配置 Log Analytics 代理以监视 Docker 日志文件
代理配置将取决于您使用的是 Windows 还是 Linux。在这里,我将使用 Linux,代理配置文件通常位于
/etc/opt/microsoft/omsagent/conf/omsagent.d/
在此目录中创建一个新文件
containerlogs.conf
<source>
type tail
path /var/lib/docker/containers/*/*.log
pos_file /var/opt/microsoft/omsagent/run/containers.log.pos
tag oms.container.log.*
format json
read_from_head true
</source>
对于窗户,
C:\ProgramData\Docker\containers\<container_id>\<container_id>-json.log
。调整代理配置以进行相应监控在您的工作区中相应地设置数据收集规则。将其指向您在代理配置中设置的路径收集日志。
完成后,使用 Azure 门户中的 Log Analytics 查询工具运行查询以检查容器中最新的 10 个日志条目,以确保收集日志。
ContainerLog
| limit 10
顺便说一句,请确保网络和防火墙设置允许 VM 与 Azure Monitor 通信。