跳转至

日志切分处理

Loggie可使用transformer interceptor来进行日志的切分和处理,将日志数据进行结构化的提取,同时可以对提取后的字段进行处理。
建议先了解Loggie内部日志数据schema设计

需求场景

最主要的是对日志进行切分解析提取和处理。

比如以下日志:

01-Dec-2021 03:13:58.298 INFO [main] Starting service [Catalina]

我们可能会需要将其中的日期、日志级别解析出来,最终形成:

{
   "time": "01-Dec-2021 03:13:58.298",
   "level": "INFO",
   "message": "[main] Starting service [Catalina]"
}

这种结构化的数据,存储的时候便于过滤查询,或者根据日志里的时间来排序,而不是采集的时间戳,或者根据日志级别进行一些过滤,可以方便查询到ERROR级别的日志等等。
当然不仅仅是像以上tomcat的运维类日志,还有诸如业务的一些订单等等日志,都有类似的需求和使用场景。

关于stdout日志的解析提取

以下示例仅提供日志切分处理的参考思路,如果你需要提取容器标准输出的原始日志,请参考采集容器日志

配置示例

日志切分处理在Loggie Agent端或者Loggie中转机侧均可,取决于我们是否需要中转机,以及希望日志处理这种CPU密集型的计算是分布在Agent上,由各个节点承担,还是希望在中转机集群中集中进行。

下面以采集tomcat服务的access日志为例,展示如何对access日志进行字段切分。

简单起见,示例使用CRD实例配置下发在Agent,同时使用dev sink直接输出处理结果展示。

创建tomcat deployment

参考

创建logconfig

配置logconfig如下所示:

Example

apiVersion: loggie.io/v1beta1
kind: LogConfig
metadata:
  name: tomcat
  namespace: default
spec:
  selector:
    labelSelector:
      app: tomcat
    type: pod
  pipeline:
    sources: |
      - type: file
        name: access
        paths:
        - /usr/local/tomcat/logs/localhost_access_log.*.txt

    interceptors: |
        - type: transformer
          actions:
            - action: regex(body)
              pattern: (?<ip>\S+) (?<id>\S+) (?<u>\S+) (?<time>\[.*?\]) (?<url>\".*?\") (?<status>\S+) (?<size>\S+)

    sink: |
      type: dev
      printEvents: true
      codec:
        type: json
        pretty: true

这里我们在transformer interceptors里,配置了regex action,针对access日志进行正则提取。

原始的access日志大概如下所示:

10.244.0.1 - - [31/Aug/2022:03:13:40 +0000] "GET / HTTP/1.1" 404 683

经过transformer处理后,我们可以通过kubectl -nloggie logs -f <loggie-pod-name> --tail=100来查看输出的日志。

转换后的event示例如下:

{
    "status": "404",
    "size": "683",
    "fields": {
        "logconfig": "tomcat",
        "namespace": "test1",
        "nodename": "kind-control-plane",
        "podname": "tomcat-85c84988d8-frs4n",
        "containername": "tomcat"
    },
    "ip": "10.244.0.1",
    "id": "-",
    "u": "-",
    "time": "[31/Aug/2022:03:13:40 +0000]",
    "url": "\"GET / HTTP/1.1\""
}