TL; DR :如何在ELK日志解析中最好地支持多个多行模式?
随着Docker,Python和ELK的普及,人们会认为,将经过正确分析的Python注销从docker注销到ELK会非常简单,但是我找不到令人满意的方法。
我有一个docker swarm-mode集群,运行着许多应用程序和服务的混合,包括traefik,nginx,MongoDB,Postgres和许多Python 3服务。我有filebeat收集所有docker日志并将它们直接传送到ES集群。除处理多行输出外,此方法效果很好。
Python的多行堆栈跟踪通常如下所示(在周围环境中):
2018-08-14 06:47:20,390:1:MainThread:INFO:gunicorn.error: Shutting down: Master
2018-08-14 07:15:05,181:9:ThreadPoolExecutor-0_0:ERROR:gunicorn.error: Error handling request /test?text=123&throw=1
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/gthread.py", line 279, in handle
keepalive = self.handle_request(req, conn)
File "/usr/local/lib/python3.6/dist-packages/gunicorn/workers/gthread.py", line 328, in handle_request
respiter = self.wsgi(environ, resp.start_response)
File "/usr/local/lib/python3.6/dist-packages/hug/interface.py", line 100, in __call__
return __hug_internal_self._function(*args, **kwargs)
File "/apps/tester/test.py", line 11, in inner
raise RuntimeError
RuntimeError
2018-08-14 07:15:05,184:9:ThreadPoolExecutor-0_0:INFO:gunicorn.access: 10.255.0.2 - - [14/Aug/2018:07:15:05 +0000] "GET /test?text=123&throw=1 HTTP/1.1" 500 0 "-" "-"
2018-08-14 21:53:20,846:9:MainThread:INFO:gunicorn.error: Worker exiting (pid: 9)
我可以使用类似以下的内容正确解析Python堆栈跟踪:
multiline.pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}:"
multiline.negate: true
multiline.match: after
这可以正确地将所有不是以时间戳开头的行换成那些以时间戳开头但会完全弄乱所有非Python日志的行。
我可以从堆栈跟踪中获取一个合理的多行集合:
multiline.pattern: "^ |\t"
multiline.negate: false
multiline.match: after
,但是它将丢失堆栈跟踪的最后一行(不缩进)。
没有一种机制允许其他模式启用(或从中选择)多个潜在的多行规则集之一,似乎应对来自不同服务的多种日志格式的唯一方法是不从{{ 1}},但要为Python日志使用其他docker日志记录驱动程序。我可以将logstash添加到混合中,并通过不同的docker驱动程序将其用于Python日志。这样做可以正常工作,因为它确实允许我使用不同的多行模式,但有两个缺点:
1)Logstash和Filebeat的模板和字段完全不同。
2)这给了我2种多行模式,但是如果我需要3种或更多模式,则无法在更多端口上添加更多logstash进程真正可扩展。
必须有更好的方法来支持多个多行模式。
想法:
1)我可以使用另一位探矿者从Python容器的不同日志位置收集数据,但是我找不到让docker的日志驱动程序对某些容器使用不同位置的方法。
2)我可以使用标签来区分不同类型的日志格式,从而区分多行要求,但是filebeat似乎无法在标签上进行过滤。