Fluent-bit 正在截断 Java 应用程序日志,需要一个脚本来找出有问题的日志

问题描述 投票:0回答:1

我已阅读此 stackoverflow post

我遇到了与OP相同的问题,因为我的ECS容器服务中的一些日志由于其大小超过256 kb而被丢弃。 我想知道是否有人可以帮助理解如何使用 MathiasCodes 的以下日志,以便我可以对其进行调整

fluent-bit.conf: |
[SERVICE]
    Daemon                    Off
    Flush                     2
    Grace                     5
    Log_Level                 warn
    Parsers_File              parsers.conf
    HTTP_Server               ${HTTP_SERVER}
    HTTP_Listen               0.0.0.0
    HTTP_Port                 ${HTTP_PORT}
    storage.path              /var/fluent-bit/state/flb-storage/
    storage.sync              normal
    storage.checksum          off
    storage.max_chunks_up     128
    storage.backlog.mem_limit 5M
    scheduler.cap             30

@INCLUDE application-log.conf
@INCLUDE dataplane-log.conf
@INCLUDE host-log.conf

get-size.lua: |
      function cb_print(tag, timestamp, record)
          if record["log"] ~= nil then
              log_size = string.len(record["log"])
              record["log_size"] = log_size
              -- Print out all logs that are bigger than 255000 bytes
              if log_size > 255000 then
                  print(record["log"])
              end
          end
          return 1, timestamp, record
      end

application-log.conf: |
    [INPUT]
        Name                tail
        Tag                 application.*
        Exclude_Path        /var/log/containers/cloudwatch-agent*, /var/log/containers/fluent-bit*, /var/log/containers/aws-node*
        Path                /var/log/containers/*.log
        multiline.parser    java, docker, cri
        DB                  /var/fluent-bit/state/flb_container.db
        Mem_Buf_Limit       50MB
        Skip_Long_Lines     Off
        Refresh_Interval    5
        Rotate_Wait         30
        storage.type        filesystem
        Read_from_Head      ${READ_FROM_HEAD}

    [INPUT]
        Name                tail
        Tag                 application.*
        Path                /var/log/containers/cloudwatch-agent*
        multiline.parser    docker, cri
        DB                  /var/fluent-bit/state/flb_cwagent.db
        Mem_Buf_Limit       5MB
        Skip_Long_Lines     Off
        Refresh_Interval    30
        Read_from_Head      ${READ_FROM_HEAD}
    
    [FILTER]
        Name                lua
        Match               *
        script              get-size.lua
        call                cb_print

    [FILTER]
        Name                kubernetes
        Match               application.*
        Kube_URL            https://kubernetes.default.svc:443
        Kube_Tag_Prefix     application.var.log.containers.
        Merge_Log           On
        Merge_Log_Key       log_processed
        K8S-Logging.Parser  On
        K8S-Logging.Exclude Off
        Labels              On
        Annotations         Off
    
    [OUTPUT]
        Name                cloudwatch_logs
        Match               application.*
        region              ${AWS_REGION}
        log_group_name      /aws/containerinsights/${CLUSTER_NAME}/application
        log_stream_name     $(kubernetes['container_name'])-$(kubernetes['pod_name'])
        log_stream_template $kubernetes['container_name'].$kubernetes['pod_name']
        auto_create_group   On
        Retry_Limit         False

问题1: '|' 是什么意思符号在第 1 行做什么?

问题2: 我应该在哪里插入这个函数调用? 在输入和输出之间?

我尝试运行该脚本,但没有成功。

fluent amazon-cloudwatchlogs fluent-bit
1个回答
0
投票
  1. 符号“|”在yaml中标记它是多行内容

  2. 正确地将其插入输入和输出之间。这只是另一个过滤器

    [INPUT]
    Name                tail
    ...
    
    [FILTER]
    Name                lua
    Match               *
    script              get-size.lua
    call                cb_print
    
    [OUTPUT]
    Name                cloudwatch_logs
    ...
    

这就是我的脚本的实际样子。

  get-size.lua: |
function cb_print(tag, timestamp, record)
    if record["message"] ~= nil then
        log_size = string.len(record["message"])
        record["log_size"] = log_size
        if log_size > 255000 then
            -- Print only the first 500 bytes of the message
            print(string.sub(record["message"], 1, 500))
        end
    end
    return 1, timestamp, record
end

记录本身返回一个表。输出例如

table: 0x7fac475d22f3

所以不能直接读取。这就是为什么我通过

record["message"]
访问它。而且,当我将 Fluent-Bit 日志也记录到 CloudWatch 时,我还将打印输出消息限制为前 500 个字符。这样我就可以知道,这就是导致这种情况的原因,而没有实际显示整个巨大的日志。

© www.soinside.com 2019 - 2025. All rights reserved.