日志格式与元信息字段

建议先了解Loggie内部日志数据schema设计

Loggie部署在不同的环境中,如果需要在原始的日志数据里,增加一些元信息,同时兼容已有的格式,可以参考如下的办法。

字段格式转换

使用schema interceptor

使用schema interceptor可以增加时间字段,以及pipelineName与sourceName字段。另外还可以对字段进行重命名,比如修改bodymessage
请参考schema interceptor

由于大部分情况下,我们需要全局生效,而不是仅仅只在某个pipeline里添加该interceptor,所以建议在系统配置的defaults中添加schema interceptor, 这样可以避免每个pipeline均需配置该interceptor。

loggie.yml

  1. loggie:
  2. defaults:
  3. interceptors:
  4. - type: schema
  5. name: global
  6. order: 700
  7. addMeta:
  8. timestamp:
  9. key: "@timestamp"
  10. remap:
  11. body:
  12. key: message

这里的name是为了增加标识,避免如果在pipeline中又新增schema interceptor会导致校验不通过。另外增加order字段为一个较小的值(默认为900),这样default里的interceptor会优先于pipeline里定义的其他interceptor执行。

使用transformer interceptor

tranformer提供了更丰富的功能,可以应对复杂日志的场景。
具体请参考transformer interceptor

添加元信息

添加fields自定义元信息

如果我们在source上配置了一些自定义的fields。

pipelines.yml

  1. pipelines:
  2. - name: local
  3. sources:
  4. - type: file
  5. name: demo
  6. paths:
  7. - /tmp/log/*.log
  8. fields:
  9. topic: "loggie"
  10. sink:
  11. type: dev
  12. printEvents: true
  13. codec:
  14. pretty: true

那么sink输出的为:

  1. {
  2. "fields": {
  3. "topic": "loggie",
  4. },
  5. "body": "01-Dec-2021 03:13:58.298 INFO [main] Starting service [Catalina]"
  6. }

当然我们也可以配置fieldsUnderRoot: true,让fields里的key:value和body同一层级。

pipelines.yml

  1. pipelines:
  2. - name: local
  3. sources:
  4. - type: file
  5. fields:
  6. topic: "loggie"
  7. fieldsUnderRoot: true
  8. ...
  1. {
  2. "topic": "loggie",
  3. "body": "01-Dec-2021 03:13:58.298 INFO [main] Starting service [Catalina]"
  4. }

添加日志采集file source的状态信息

在我们使用file source时,可能希望自动在日志原始数据里,增加一些日志采集的状态,比如采集的文件名称、采集的文件offsest等,file source提供了一个addonMeta配置,可快速enable。

示例:添加如下addonMeta,并设置为true。

file source

  1. sources:
  2. - type: file
  3. paths:
  4. - /var/log/*.log
  5. addonMeta: true

此时,采集的event会变成类似如下:

Example

  1. {
  2. "body": "this is test",
  3. "state": {
  4. "pipeline": "local",
  5. "source": "demo",
  6. "filename": "/var/log/a.log",
  7. "timestamp": "2006-01-02T15:04:05.000Z",
  8. "offset": 1024,
  9. "bytes": 4096,
  10. "hostname": "node-1"
  11. }
  12. }

具体字段含义可参考file source

增加Kubernetes元信息

在Kubernetes的场景中,采集的容器日志,为了在查询的时候,使用namespace/podName等信息进行检索,往往需要增加相关的元数据。

我们可以在系统配置的discovery.kubernetes中,配置额外的k8s fields字段。

可参考discovery

添加meta系统内置元信息

有一些Loggie系统内置的元信息,我们也希望发送给下游,这个时候,需要使用normalize interceptor中的addMeta processors。 (需要注意的是,该操作会对采集传输性能有一定影响,正常情况下,并不建议使用该方式)

pipelines.yml

  1. pipelines:
  2. - name: local
  3. sources:
  4. - type: file
  5. name: demo
  6. paths:
  7. - /tmp/log/*.log
  8. fields:
  9. topic: "loggie"
  10. interceptors:
  11. - type: normalize
  12. processors:
  13. - addMeta: ~
  14. sink:
  15. type: dev
  16. printEvents: true
  17. codec:
  18. pretty: true

配置了addMeta processor之后,默认会把所有的系统内置元信息输出。

默认Json格式输出示例如下:

Example

  1. {
  2. "fields": {
  3. "topic": "loggie"
  4. },
  5. "meta": {
  6. "systemState": {
  7. "nextOffset": 720,
  8. "filename": "/tmp/log/a.log",
  9. "collectTime": "2022-03-08T11:33:47.369813+08:00",
  10. "contentBytes": 90,
  11. "jobUid": "43772050-16777231",
  12. "lineNumber": 8,
  13. "offset": 630
  14. },
  15. "systemProductTime": "2022-03-08T11:33:47.370166+08:00",
  16. "systemPipelineName": "local",
  17. "systemSourceName": "demo"
  18. },
  19. "body": "01-Dec-2021 03:13:58.298 INFO [main] Starting service [Catalina]"
  20. }

当然,我们可能会觉得这些数据太多了,或者想对字段进行修改。我们就可以使用transformer interceptor里的action进行操作。