一份日志采集接入教程:在 Kubernetes 用 DaemonSet 部署采集 Agent,配置采集源、多行合并与 JSON 字段抽取,并在控制台验证日志入库,附常见报错排查。
容器日志默认写到标准输出,由容器运行时收集。但生产环境里大量日志写在文件里——Java 应用的 application.log、Nginx 的 access.log、业务自己切的滚动日志。要采这些文件日志,最稳的做法是在每个节点上跑一个采集 Agent,用 DaemonSet 部署,让 Agent 以 hostPath 挂载的方式读到宿主机上的日志目录。这样每个节点一份 Agent,日志就近采集,不经过网络中转,采集端没有单点。
炬鲸的采集 Agent 支持 DaemonSet 一键部署。先在控制台「接入管理 → 数据接入」生成接入 Token,再把下面的 YAML 改好占位符后 apply:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: jujing-agent
spec:
selector:
matchLabels: { app: jujing-agent }
template:
metadata:
labels: { app: jujing-agent }
spec:
containers:
- name: agent
image: registry.jjhub.cn/jujing/agent:latest
env:
- name: JJHUB_TOKEN
value: "<your-token>"
volumeMounts:
- name: varlog
mountPath: /var/log
readOnly: true
- name: varlib
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath: { path: /var/log }
- name: varlib
hostPath: { path: /var/lib/docker/containers }
/var/log 挂载用于采集宿主机上的日志文件,/var/lib/docker/containers 用于关联容器标准输出。readOnly: true 是必须的:Agent 只读日志,不给它写权限是安全底线。
Agent 部署后,采集源和解析规则都在控制台配置,不用改 YAML。以采 Nginx 日志为例,配置一个采集源指向 /var/log/nginx/access.log,再配解析规则:
^\d{4}-\d{2}-\d{2} 日期开头),把后续行归入同一条日志access.log 里抽出 status、latency、uri,之后就能按字段过滤和聚合解析规则是事后可改的:改规则只影响新入库的日志,历史日志保持原样,不用重采。
配置完成后,到「日志检索」页按 service 或 host.name 过滤,看最近几分钟有没有新日志进来。如果查不到,按这个顺序排查:先看 Agent 是否 Running(kubectl get pods -l app=jujing-agent),再看 Agent 日志有没有 Token 报错(401/403 就是 Token 不对),最后确认采集路径在容器内确实存在(进容器 ls /var/log/nginx/)。确认收到后,给日志配上保留周期和冷热分层,日常排查的体验就完整了。