如何在AKS中用Azure Monitor Agent采集容器内Neo4j的query.log/Log4j流
问题描述
我在Azure Kubernetes Service(AKS)集群中运行Neo4j数据库,Neo4j Pod会将query.log写入容器内的/logs/query.log路径。我希望通过Azure Monitor Agent(AMA)采集该日志并发送到Azure Log Analytics,实现集中式日志监控。
已尝试的操作:
- 启用容器Azure Monitor:通过Azure门户为AKS集群启用监控,在
kube-system命名空间以DaemonSet部署AMA。 - 创建ConfigMap配置AMA:在
kube-system创建名为container-azm-ms-agentconfig的ConfigMap,配置指定采集graph命名空间下neo4j容器的/logs/query.log。 - 应用ConfigMap:执行
kubectl apply -f ama-neo4j-config.yaml。
但query.log日志未出现在Log Analytics中,其他日志可正常采集,已知AMA无法直接访问容器内文件系统。
需求:
- 采集Neo4j容器内的
query.log或Log4j流日志到Azure Log Analytics - 尽可能不修改Neo4j容器镜像
- 可接受sidecar容器等最佳实践方案
解决方案
方案1:通过共享卷让AMA访问宿主机上的日志文件
AMA以DaemonSet运行在宿主机上,只能访问宿主机文件系统。可以通过emptyDir卷共享Neo4j的日志目录,让日志写入宿主机可访问的路径,再配置AMA采集该路径。
操作步骤:
- 修改Neo4j的Deployment/StatefulSet配置,添加emptyDir卷并挂载到容器的
/logs目录:
apiVersion: apps/v1 kind: StatefulSet metadata: name: neo4j namespace: graph spec: template: spec: volumes: - name: neo4j-logs emptyDir: {} containers: - name: neo4j image: neo4j:latest volumeMounts: - name: neo4j-logs mountPath: /logs
- 更新AMA的ConfigMap,指定采集宿主机上对应emptyDir的路径(用通配符匹配Pod的动态UID):
apiVersion: v1 kind: ConfigMap metadata: name: container-azm-ms-agentconfig namespace: kube-system data: config.yaml: | schema-version: v1 config-version: 1.0 logs: - name: neo4j-query-log enabled: true namespace: graph containerNames: - neo4j filePaths: - /var/lib/kubelet/pods/*/volumes/kubernetes.io~empty-dir/neo4j-logs/query.log
- 应用更新后的配置:
kubectl apply -f neo4j-statefulset.yaml kubectl apply -f ama-neo4j-config.yaml
方案2:将Neo4j日志重定向到容器标准输出(推荐)
AMA默认会采集容器的stdout/stderr流,无需额外配置即可将日志发送到Log Analytics。只需修改Neo4j的日志配置,将query.log内容输出到标准输出。
操作步骤:
- 创建ConfigMap存储自定义Log4j配置,将查询日志定向到stdout:
apiVersion: v1 kind: ConfigMap metadata: name: neo4j-log-config namespace: graph data: log4j2.xml: | <Configuration status="INFO"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{ISO8601} %-5p [%t] %c{2}: %m%n"/> </Console> </Appenders> <Loggers> <Logger name="org.neo4j.cypher" level="INFO"> <AppenderRef ref="Console"/> </Logger> <Root level="INFO"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
- 修改Neo4j的Deployment/StatefulSet,挂载该ConfigMap覆盖原有Log4j配置:
apiVersion: apps/v1 kind: StatefulSet metadata: name: neo4j namespace: graph spec: template: spec: volumes: - name: neo4j-log-config configMap: name: neo4j-log-config containers: - name: neo4j image: neo4j:latest volumeMounts: - name: neo4j-log-config mountPath: /var/lib/neo4j/conf/log4j2.xml subPath: log4j2.xml
- 应用配置:
kubectl apply -f neo4j-log-config.yaml kubectl apply -f neo4j-statefulset.yaml
方案3:使用Sidecar容器转发日志(复杂场景)
如果需要对日志做额外处理(如过滤、格式化),可以部署Sidecar容器(如Fluent Bit、Filebeat),挂载共享日志目录读取query.log,再直接发送到Azure Log Analytics。
核心要点:
- 用emptyDir共享Neo4j的
/logs目录给Sidecar容器 - 配置Sidecar读取
query.log,并设置输出到Azure Log Analytics的工作区ID和密钥 - 将Sidecar与Neo4j容器部署在同一个Pod中
验证方法
等待5-10分钟后,在Azure Log Analytics中查询对应日志:
- 方案1/3:查询
CustomLog表,筛选Type="neo4j-query-log" - 方案2:查询
ContainerLog表,筛选namespace_s="graph"且containerName_s="neo4j"
内容的提问来源于stack exchange,提问作者Jeffrey_Mutethia
相关产品推荐
相关产品推荐

