You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,实现集中式日志监控。

已尝试的操作:

  1. 启用容器Azure Monitor:通过Azure门户为AKS集群启用监控,在kube-system命名空间以DaemonSet部署AMA。
  2. 创建ConfigMap配置AMA:在kube-system创建名为container-azm-ms-agentconfig的ConfigMap,配置指定采集graph命名空间下neo4j容器的/logs/query.log。
  3. 应用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采集该路径。

操作步骤:

  1. 修改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
  1. 更新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
  1. 应用更新后的配置:
kubectl apply -f neo4j-statefulset.yaml
kubectl apply -f ama-neo4j-config.yaml

方案2:将Neo4j日志重定向到容器标准输出(推荐)

AMA默认会采集容器的stdout/stderr流,无需额外配置即可将日志发送到Log Analytics。只需修改Neo4j的日志配置,将query.log内容输出到标准输出。

操作步骤:

  1. 创建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>
  1. 修改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
  1. 应用配置:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:13:13