我开发了一个Web应用程序,其中包含一个前端(VueJS应用程序)和后端(Flask Python3应用程序)。在生产模式下,我将使用docker和Kubernetes作为协调器。
我已经设置了Flask日志来登录目录中的两个不同文件
/var/log/appname
它工作正常。
问题是:在生产中,如果Kubernetes同时实例化多个后端,则每个容器都会产生自己的日志。
有没有办法集中只有一个文件的日志记录过程?
对不起,但我不是编排专家,也许没有理由提出这个问题。
谢谢。
答案 0 :(得分:0)
据我了解,我对将多个容器中的日志增强到一个文件中感到困惑,但数据却是复杂的。但是好的解决方案是附加额外的音量。
可以创建一个Docker / Kubernetes卷(或多个卷),这些卷指向这些日志文件在应用程序中的位置。通过利用Docker模板,可以在每个卷后缀服务任务ID(整数)。如果在同一主机上运行多个服务任务,则在卷名上添加后缀可以防止与日志记录有关的任何冲突。需要创建一个全局服务,该服务运行具有目录通配符支持的日志记录代理。最后,可以通过日志记录实用程序设置其他正则表达式,该实用程序会将文件的源目录转换为索引值。
以下示例显示了如何使用官方Tomcat图像来完成此操作。官方的Tomcat映像在/usr/local/tomcat/logs
中记录了多个文件,这与大多数Java应用程序非常相似。在该路径中,可以找到诸如catalina.2017-07-06.log
,host-manager.2017-07-06.log
,localhost.2017-07-06.log
,localhost_access_log.2017-07-06.txt
和manager.2017-07-06.log
之类的文件。
为安装/var/lib/docker/volumes:/logs/volumes
的日志记录实用程序创建全局服务。
为日志记录代理创建一个日志记录规则,该日志记录代理使用类似于以下一般示例的规则进行记录:"/log/volumes/*/_data/*.log"
。
使用基于卷的模板进行启动服务:
启动服务时,请使用以下参数:
docker service create \
-d \
--name prod-tomcat \
--label version=1.5 \
--label environment=prod \
--mount type=volume,src="{{.Task.Name}}",dst=/usr/local/tomcat/logs \
--replicas 3 \
tomcat:latest
如果两个副本都计划在同一节点上,则将在主机prod-tomcat.1.oro7h0e5yow69p9yumaetor3l
和prod-tomcat.2.ez0jpuqe2mkl6ppqnuffxqagl
上创建两个包含日志的卷。
只要日志记录代理支持通配符并通过检查inode(而不是文件)来处理任何日志轮换,则应该收集日志。
如果应用程序记录到多个位置,则尝试将日志符号链接到单个目录或为卷添加描述性名称。如果将描述性名称添加到卷名称,则将需要更新任何种类的提取以适应该更改。 (即使用grok
)
大多数记录器应收集文件路径以及日志内容。通过将日志文件所在的卷变成可索引字段,可以从这些类型的应用程序中搜索和汇总信息。这是一个使用grok
模式并创建两个新的可索引字段CONTAINER_NAME
和FILENAME
的示例。
match => { "path" => "/log/volumes/%{DATA:CONTAINER_NAME}/_data/%{GREEDYDATA:FILE_NAME}" }
CONTAINER_NAME
将与来自容器的stdout
流的输出相匹配,从而易于根据容器的日志进行过滤。
可以在swarm-elk repo中找到有关带有示例的更多信息。
有关日志记录过程的更多信息,您可以在这里找到:logging。