日志切分处理¶
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\""
}