问题描述
类似 Loki 的 promtail
、 阿里云的 logtail
默认的日志采集方式都是按行采集,就是把每一行当做一条独立的日志。一般情况下没有问题。但是有的对于需要打印完整的堆栈异常的场景就很不适合。
异常堆栈:
解决方案
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 的演示
- 先选择 完整正则模式
- 关闭单行模式
- 选一些有代表性的日志复制到 ”日志样例“ 那个框框中
- 点击自动生成,就会生成好对应的行首正则表达式
这样就好了
最终效果:
参考文章:
使用完整正则模式采集日志
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。