转载:ELK filebeat原生处理日志时间

本文转载自:【BigManing的博客】学习防丢
http://blog.youkuaiyun.com/qq_27818541/article/details/108063235

前言

项目有个需求:filebeat(v7.7)采集日志的时间替换为日志时间。通过调研,网上都是通过logstash来转换的,大概如下步骤(原理):

filter{
 
  grok{
     // 1 取出时间值 给 一个新字段
     patterns_dir => "./patterns"
     match => { "message" => ["%{IP:source_Ip},%{NUMBER:source_Port},%{IP:dest_Ip},%{NUMBER:dest_Port},%{MYPATTERN:create_Time}"]}
  }
  date {
      // 2 只要时间字段匹配这个格式 就赋值给@timestamp。
     match => [ "create_Time", "yyyy-MM-dd HH:mm:ss:ssssss" ]
     target => "@timestamp"
  }
}


解决办法:filebeat原生支持

在调研无望之际,全局阅览filebeat官网,终于在processor配置里找到了方法。主要是使用script 、timestamp 这两个属性。

script 作用是提取log里的时间值,并赋值给一个字段
timestamp作用是把一个字段值格式化为时间戳。这样采集时间戳就替换成了log里的时间。

例如 我的日志长这样

2020-08-05 16:21:51.824 [第10行 虚拟]


1
添加下面配置

processors:
  ...
  - script:
      lang: javascript
      id: my_filter
      tag: enable
      source: >
        function process(event) {
            var str= event.Get("message");
            var time =str.split(" ").slice(0,2).join(" ");
            event.Put("start_time",time);
        }
 
  - timestamp:
      # 格式化时间值 给 时间戳 
      field: start_time
      # 使用我国东八区时间  解析log时间
      timezone: Asia/Shanghai
      layouts:
        - '2006-01-02 15:04:05'
        - '2006-01-02 15:04:05.999'
      test:
        - '2019-06-22 16:33:51'


输出结果为

{
  "@timestamp": "2020-08-05T08:21:51.824Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.7.0"
  },
  "message": "2020-08-05 16:21:51.824 [第10行 虚拟]",
  "ecs": {
    "version": "1.5.0"
  }
}


附测试时完整配置:

filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /etc/test/1.log
    reload.enabled: true
    reload.period: 10s
# 这里直接打印出来(测试使用)    
output.console:
  pretty: true
processors:
  - script:
      lang: javascript
      id: my_filter
      tag: enable
      source: >
        function process(event) {
            var str= event.Get("message");
            var time =str.split(" ").slice(0,2).join(" ");
            event.Put("start_time",time);
        }
  - timestamp:
      field: start_time
      timezone: Asia/Shanghai
      layouts:
        - '2006-01-02 15:04:05'
        - '2006-01-02 15:04:05.999'
      test:
        - '2019-06-22 16:33:51'


注意事项

timezone大全

更多时区看这里

本文中timezone说明

很多朋友问到timezone的问题,我这里详细描述下。

@timestamp 这个字段 系统自带的,默认时间就是采集log的UTC时间 。例如 现在时间是2020-12-30 18:59:58.234 ,那么他的值为2020-12-30T10:59:58.234Z

现在我们手动替换@timestamp为日志时间(东八区),需要将时间字符串解析成UTC时间,赋值给@timestamp,那么我们必须显示的指定timezone 信息。

指定timezone后的表现

log时间字符串:2020-08-05 16:21:51.824
重新赋值的@timestamp值: 2020-08-05T08:17:11.535Z (正确)
未指定timezone后的表现

log时间字符串:2020-08-05 16:21:51.824
重新赋值的@timestamp值: 2020-08-05T16:17:11.535Z (默认使用了UTC零时区解析)
 

<think>嗯,用户想了解ELK如何抓取Kubernetes Pod日志,并且设置每天自动新建索引。首先,我需要回忆之前的对话历史。用户之前已经询问过类似的问题,我之前给出了使用Fluentd作为日志采集工具,配置Elasticsearch索引模板和ILM策略的方法。现在用户再次提问,可能希望得到更详细的步骤或者不同的方法? 用户提供的站内引用中有提到Kafka-manager、EFK方案、Exporter配置以及Filebeat的链接。虽然用户的问题是关于ELK的,但引用中的EFK和Filebeat可能相关。EFK中的F指的是Fluentd或Fluent Bit,而Filebeat也是常用的日志采集工具。用户可能想知道是否有其他方法,比如使用Filebeat代替Fluentd? 用户特别提到是否支持每天自动新建索引,这可能涉及到索引的滚动策略,比如使用时间戳后缀或者ILM策略。之前的回答中已经涵盖了Fluentd配置时间分片和ILM,但用户可能需要更明确的教程步骤。 需要确定用户的具体环境,比如是否已经使用Filebeat或者Fluentd,但用户没有说明,所以应该提供两种方法的配置。同时,用户提到Kubernetes,所以配置应该适合容器化环境,比如DaemonSet或Sidecar模式。 用户引用的[4]是Filebeat的官方文档,可能用户对Filebeat感兴趣。因此,除了之前的Fluentd方法,还需要补充Filebeat的配置方法,如何设置Filebeat的索引自动创建。 另外,索引的生命周期管理也很重要,需要解释如何配置ILM策略确保每天自动创建新索引,并删除旧索引。可能需要分步骤说明,包括Elasticsearch中的索引模板、ILM策略设置,以及Kibana中的索引模式配置。 还要考虑用户可能的错误,比如时区问题导致索引日期不符合预期,或者缓冲区的配置不当导致日志丢失。在教程中需要提醒这些注意事项,并提供验证方法,比如如何检查索引是否按天生成,如何查询日志等。 最后,用户可能需要相关的问题,比如如何调整索引的分片数,如何处理日志字段的解析问题,或者如何扩展ELK的性能。需要准备好这些相关问题,帮助用户进一步了解。</think>根据Kubernetes日志采集需求与Elasticsearch索引管理规范,以下是ELK抓取Pod日志并实现每日自动建索引的完整实现方案: ### 一、日志采集架构选型对比 | 工具 | 资源消耗 | 处理能力 | Kubernetes集成度 | 适用场景 | |------------|----------|----------|------------------|------------------| | **Fluentd** | 较高 | 强 | 原生支持 | 复杂日志处理场景 | | **Filebeat**| 低 | 中等 | 需定制配置 | 轻量级采集需求 | #### 方案选择建议: 1. 复杂字段处理选Fluentd(支持ruby插件)[^2] 2. 资源敏感场景选Filebeat(内存占用减少40%)[^4] ### 二、Fluentd方案实现步骤 #### 1. DaemonSet部署配置(增强版) ```yaml # fluentd-daemonset.yaml apiVersion: apps/v1 kind: DaemonSet spec: template: spec: containers: - name: fluentd image: fluent/fluentd-kubernetes-daemonset:v1.14-debian-elasticsearch7-1 env: - name: FLUENT_ELASTICSEARCH_INDEX_PREFIX value: "k8s-${ENV}-%Y.%m.%d" # 按日分片索引 - name: FLUENT_ELASTICSEARCH_LOGSTASH_FORMAT value: "false" # 禁用默认logstash格式 volumeMounts: - mountPath: /var/log name: varlog ``` #### 2. 日志解析增强配置 ```xml <filter kubernetes.**> @type parser key_name log reserve_data true <parse> @type multi_format <pattern> format json time_key timestamp </pattern> <pattern> format none </pattern> </parse> </filter> ``` ### 三、Filebeat方案实现(基于引用[4]优化) #### 1. ConfigMap核心配置 ```yaml # filebeat-config.yml filebeat.inputs: - type: container paths: - /var/log/containers/*.log processors: - add_kubernetes_metadata: host: ${NODE_NAME} matchers: - logs_path: "/var/log/containers/" output.elasticsearch: hosts: ["${ES_HOST}"] indices: - index: "filebeat-k8s-%{+yyyy.MM.dd}" # 动态索引名称 when.equals: kubernetes.namespace: "prod" ``` #### 2. DaemonSet部署文件 ```yaml # filebeat-daemonset.yaml apiVersion: apps/v1 kind: DaemonSet spec: template: spec: containers: - name: filebeat image: docker.elastic.co/beats/filebeat:7.15.1 volumeMounts: - name: config mountPath: /usr/share/filebeat/filebeat.yml subPath: filebeat.yml ``` ### 四、索引自动创建双保险机制 #### 1. Elasticsearch索引模板 ```bash PUT _template/k8s_logs_template { "index_patterns": ["k8s-*-*", "filebeat-k8s-*"], "settings": { "number_of_shards": 3, "index.lifecycle.name": "k8s_daily_policy", "index.format": 1 } } ``` #### 2. ILM策略配置 ```bash PUT _ilm/policy/k8s_daily_policy { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_age": "24h", # 强制24小时滚动 "max_size": "50gb" } } }, "delete": { "min_age": "30d", "actions": {"delete": {}} } } } } ``` ### 五、日志采集验证方法 #### 1. 索引生成验证 ```bash # 查看当日索引 GET _cat/indices/k8s-prod-2023.08.17?v # 验证索引设置 GET k8s-prod-2023.08.17/_settings ``` #### 2. 日志追溯测试 ```bash # 查询特定命名空间日志 POST k8s-prod-2023.08.17/_search { "query": { "term": { "kubernetes.namespace": "payment" } } } ``` ### 六、性能调优参数 | 参数 | Fluentd推荐值 | Filebeat推荐值 | 作用说明 | |------------------------|---------------|----------------|------------------------| | flush_interval | 5s | 10s | 缓冲刷新间隔 | | chunk_limit_size | 8MB | 10MB | 单批次数据量限制 | | queue.type | persisted | mem | 队列持久化方式 | | thread_count | 4 | 2 | 处理线程数 | ### 七、常见问题解决方案 **问题1:索引未按日生成** - 检查项: 1. 节点时间同步状态 2. Fluentd/Filebeat时区配置 3. ILM策略生效状态 **问题2:日志字段丢失** - 解决方案: ```xml <filter **> @type record_transformer enable_ruby true <record> full_message ${record.to_json} </record> </filter> ``` --- [^1]: Kafka集群管理工具CMAK的容器化部署方法 [^2]: Fluentd日志字段转换的Ruby插件实现 [^3]: Kubernetes监控指标采集规范 [^4]: Filebeat在容器环境的配置最佳实践 --相关问题-- 1. 如何实现基于日志级别的差异化存储策略? 2. 怎样配置跨集群的日志聚合查询? 3. 如何通过ILM实现日志的冷热分层存储?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值