前言
在较老的k8s版本(1.6 1.7),官方的efk日志收集例子中 fluentd手机的日志,丢失了毫秒级的时间精度,当时为了项目需要,就自己重新做了镜像,现在官方的例子中,已经没有这个问题,于是趁着升级elastic search,就一并升级。
在老版本的模式中,k8s是通过dockerfile往镜像中复制特定的配置文件,然后用环境变量来控制部分参数,而新版中,用configmap来挂载配置文件,更加灵活了,改动细节参考这个。这就方便我们采集除了k8s容器以外的其他日志。
systemd监控
fluentd本身就有system的插件,而且k8s打包的镜像里也包含了该插件,Gemfile里又这行
1 | gem 'fluent-plugin-systemd', '~>1.0.1' |
在system.input.conf项下,加入以下配置,即可按照systemd的名称来采集日志
1 | <source> |
其中,
id,不能重复,
match,是匹配的参数,也就是 journalctl 的查询条件,可以在输入journalctl后按tab或者man来了解,关于各种条件的组合,查看这里
path pod文件的位置,唯一,而且要选择挂载宿主机的路径。
fields_strip_underscores fields_lowercase 这2个是字段转换的,去掉下划线和变成小写,不然在elastic search里,下划线开头的字段不能过滤。
read_from_head 建议加上
tag 标签,建议同一类的收集,用统一的前缀,后面方便通配符来做filter过滤
普通的文件监控
1 | <source> |
format_firstline
format1 这2个是日志的匹配正则,正则里的有名匹配项,会作为json的字段。
删除多余的字段
默认的采集配置中,又很多字段,可能在后期查询的时候并不会怎么用到。比如kubernetes的pod_id,一串乱码,明显没有pod名称好用,我们可以在推送到es之前就把他们删了。out.conf可以加入以下配置
1 |
|
bug注意点
在fluentd中,对于匹配嵌套字段和包含空格的字段,可以用以下的json path格式。
1 | $.key1[0].key2 ---> record["key1"][0]["key2"] |
然而,在1.3.1以前的版本中,如果在根路径中,包含点的key匹配有bug,会无法匹配,升级为1.3.1或者用普通模式来删除吧
1 | <filter kubernetes.**> |
多行插件在某些版本可能又问题,如果发现fluentd报错,或者es一只没收到。可以尝试先关闭了
1 | # Concatenate multi-line logs |
完整的yaml
1 | kind: ConfigMap |