loggie-io / loggie

A lightweight, cloud-native data transfer agent and aggregator
https://loggie-io.github.io/docs-en/
Apache License 2.0
1.24k stars 160 forks source link

采集pod的stdout,使用file sink时,模拟容器重启情况,发现日志丢失 #527

Open zzzyuan0 opened 1 year ago

zzzyuan0 commented 1 year ago

resources: limits: cpu: 200m memory: 200Mi requests: cpu: 50m memory: 50Mi

loggie 额外参数

extraArgs:

开启loggie日志输出至目录

log.enableFile: true

日志输出目录

log.directory: /log/today

日志输出文件名

log.filename: loggie.log

日志是否需要彩色

log.noColor: true

关闭stdout

log.enableStdout: false

日志最大备份文件数, 为1 (即日志轮转备份文件数,加上写入的日志文件共2文件)

log.maxBackups: 1

文件最大大小 20M

log.maxSize: 20

log.maxAge: 7

log.level: debug 日志等级

log.jsonFormat: true 日志是否json格式化

挂载额外的数据卷

extraVolumeMounts:

额外的卷

extraVolumes:

环境变量

extraEnvs: {}

时区

timezone: Asia/Shanghai

nodeSelector: {} affinity: {}

tolerations:

更新策略 onDelete/RollingUpdate

updateStrategy: type: RollingUpdate

config: loggie: reload: enabled: true period: 10s monitor: logger: listeners: filesource: period: 10s filewatcher: period: 5m reload: period: 10s sink: period: 10s queue: period: 10s pipeline: period: 10s discovery: enabled: true kubernetes: containerRuntime: containerd rootFsCollectionEnabled: true parseStdout: false dynamicContainerLog: true typePodFields: logconfig: "${_k8s.logconfig}" namespace: "${_k8s.pod.namespace}" nodename: "${_k8s.node.name}" podname: "${_k8s.pod.name}" poduid: "${_k8s.pod.uid}" containername: "${_k8s.pod.container.name}" http: enabled: true port: 9196

默认配置

defaults: sources:

zzzyuan0 commented 1 year ago

我去该目录下 /var/log/pods/default_log-gen-deployment-d8bb8d84d-9hvwx_a0c83a1f-a7cd-49d7-b89f-b5017619cd49/my-container/0.log 是可以找到缺失的那部分日志的

zzzyuan0 commented 1 year ago

通过观察,他写db是两秒一次,偏移量每次写都有变化,但是他写文件是30秒一次?? 这一点是很奇怪的,虽然暂时看到代码两秒默认值应该是1s一次,暂时没找到是哪儿出现问题了。

ethfoo commented 1 year ago

问题原因: file sink是写buffer,当达到一定大小或者超时时间后,才会flush真正写入到磁盘中。

ethfoo commented 1 year ago

可优化点:

  1. 将https://github.com/loggie-io/loggie/blob/main/pkg/sink/file/writer.go#L28 中的默认参数暴露,可通过调整小buffer大小或者超时时间,可以减少这种异常场景的日志丢失
  2. 由于当前file sink考虑到性能原因,是异步写入后,即commit,此时是否可以优化成flush后,才会commit写入offset(预计需要优化当前核心代码框架逻辑,支持异步的方式)