在Docker Orchestrator上进行生产日志记录

时间:2019-07-08 12:14:18

标签: python-3.x docker flask kubernetes

我开发了一个Web应用程序,其中包含一个前端(VueJS应用程序)和后端(Flask Python3应用程序)。在生产模式下,我将使用docker和Kubernetes作为协调器。

我已经设置了Flask日志来登录目录中的两个不同文件

/var/log/appname

它工作正常。

问题是:在生产中,如果Kubernetes同时实例化多个后端,则每个容器都会产生自己的日志。

有没有办法集中只有一个文件的日志记录过程?

对不起,但我不是编排专家,也许没有理由提出这个问题。

谢谢。

1 个答案:

答案 0 :(得分:0)

据我了解,我对将多个容器中的日志增强到一个文件中感到困惑,但数据却是复杂的。但是好的解决方案是附加额外的音量。

可以创建一个Docker / Kubernetes卷(或多个卷),这些卷指向这些日志文件在应用程序中的位置。通过利用Docker模板,可以在每个卷后缀服务任务ID(整数)。如果在同一主机上运行多个服务任务,则在卷名上添加后缀可以防止与日志记录有关的任何冲突。需要创建一个全局服务,该服务运行具有目录通配符支持的日志记录代理。最后,可以通过日志记录实用程序设置其他正则表达式,该实用程序会将文件的源目录转换为索引值。

以下示例显示了如何使用官方Tomcat图像来完成此操作。官方的Tomcat映像在/usr/local/tomcat/logs中记录了多个文件,这与大多数Java应用程序非常相似。在该路径中,可以找到诸如catalina.2017-07-06.loghost-manager.2017-07-06.loglocalhost.2017-07-06.loglocalhost_access_log.2017-07-06.txtmanager.2017-07-06.log之类的文件。

  1. 为安装/var/lib/docker/volumes:/logs/volumes的日志记录实用程序创建全局服务。

  2. 为日志记录代理创建一个日志记录规则,该日志记录代理使用类似于以下一般示例的规则进行记录:"/log/volumes/*/_data/*.log"

  3. 使用基于卷的模板进行启动服务:

    启动服务时,请使用以下参数:

    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.oro7h0e5yow69p9yumaetor3lprod-tomcat.2.ez0jpuqe2mkl6ppqnuffxqagl上创建两个包含日志的卷。

  4. 只要日志记录代理支持通配符并通过检查inode(而不是文件)来处理任何日志轮换,则应该收集日志。

  5. 如果应用程序记录到多个位置,则尝试将日志符号链接到单个目录或为卷添加描述性名称。如果将描述性名称添加到卷名称,则将需要更新任何种类的提取以适应该更改。 (即使用grok

  6. 大多数记录器应收集文件路径以及日志内容。通过将日志文件所在的卷变成可索引字段,可以从这些类型的应用程序中搜索和汇总信息。这是一个使用grok模式并创建两个新的可索引字段CONTAINER_NAMEFILENAME的示例。

    match => { "path" => "/log/volumes/%{DATA:CONTAINER_NAME}/_data/%{GREEDYDATA:FILE_NAME}" }
    
    
  7. CONTAINER_NAME将与来自容器的stdout流的输出相匹配,从而易于根据容器的日志进行过滤。

  

可以在swarm-elk repo中找到有关带有示例的更多信息。

有关日志记录过程的更多信息,您可以在这里找到:logging