问题描述

类似 Loki 的 promtail、 阿里云的 logtail 默认的日志采集方式都是按行采集,就是把每一行当做一条独立的日志。一般情况下没有问题。但是有的对于需要打印完整的堆栈异常的场景就很不适合。

异常堆栈:
图片.png

解决方案

json 序列化

那有什么解决方案呢?

我们可以在 json 序列化日志,把完整的日志封装到 json 中去,想下面这样:

{
    "text": "2022-01-21 07:42:34.191 | ERROR    | services:compare:229 - 1 validation error for ParseResultVO\nclip_result\n  value is not a valid dict (type=type_error.dict)\nTraceback (most recent call last):\n\n  ,alidation error for ParseResultVO\nclip_result\n  value is not a valid dict (type=type_error.dict)\nTraceback (most recent call last):\n\n  ,alidation error for ParseResultVO\nclip_result\n  value is not a valid dict (type=type_error.dict)\nTraceback (most recent call last):\n\n  ,alidation error for ParseResultVO\nclip_result\n  value is not a valid dict (type=type_error.dict)\nTraceback (most recent call last):\n\n  ,"
    "record": {
        "elapsed": { "repr": "0:00:16.725738", "seconds": 16.725738 },
        "exception": {
            "type": "ValidationError",
            "value": "1 validation error for ParseResultVO\nclip_result\n  value is not a valid dict (type=type_error.dict)",
            "traceback": true
        },
        "extra": {},
        "file": { "name": "services.py", "path": "/code/./services.py" },
        "function": "compare",
        "level": { "icon": "\u274c", "name": "ERROR", "no": 40 },
        "line": 229,
        "message": "1 validation error for ParseResultVO\nclip_result\n  value is not a valid dict (type=type_error.dict)",
        "module": "services",
        "name": "services",
        "process": { "id": 1, "name": "MainProcess" },
        "thread": { "id": 140684147231552, "name": "GreenThread-24" },
        "time": {
            "repr": "2022-01-21 07:42:34.191365+00:00",
            "timestamp": 1642750954.191365
        }
    }
}

但是这样最大的问题就是,我们失去了堆栈的二维信息,变成了一维平面了,看着特别难受费劲!!!

行首正则表达式

另一种方式:

我们判断每行的开头格式,只有以特定格式开头的行,才会被认为是一条新日志的开头!

一般来说,日志的开头都是以时间戳开头的,可以写正则表达式来判断!

当然也可以使用分隔符

在阿里云的 SLS 的演示

图片.png

  1. 先选择 完整正则模式
  2. 关闭单行模式
  3. 选一些有代表性的日志复制到 ”日志样例“ 那个框框中
  4. 点击自动生成,就会生成好对应的行首正则表达式

这样就好了

最终效果: 图片.png

参考文章:
使用完整正则模式采集日志


universe_king
3.4k 声望680 粉丝