Docker日志收集新方案:log-pilot

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 今天,我们将隆重介绍一款新的docker日志收集工具:fluentd-pilot。你可以在每台机器上部署一个fluentd-pilot实例,就可以收集机器上所有Docker应用日志。fluentd-pilot具有如下特性 一个单独fluentd进程,收集机器上所有容器的日志。

今天,我们将隆重介绍一款新的docker日志收集工具:log-pilot Github项目地址:https://github.com/AliyunContainerService/log-pilot 你可以在每台机器上部署一个log-pilot实例,就可以收集机器上所有Docker应用日志。log-pilot具有如下特性

  1. 一个单独log进程,收集机器上所有容器的日志。不需要为每个容器启动一个log进程
  2. 支持文件日志和stdout。docker log dirver亦或logspout只能处理stdout,log-pilot不光支持收集stdout日志,还可以收集文件日志。
  3. 声明式配置。当你的容器有日志要收集,只要通过label声明要收集的日志文件的路径,无需改动其他任何配置,log-pilot就会自动收集新容器的日志。
  4. 支持多种日志存储方式。无论是强大的阿里云日志服务,还是比较流行的elasticsearch组合,甚至是graylog,log-pilot都能把日志投递到正确的地点。
  5. 开源。log-pilot完全开源,代码在这里。如果现有的功能不满足你的需要,欢迎提issue,如果能贡献代码就更好了。

快速启动

下面我们先演示一个最简单的场景:我们先启动一个log-pilot,再启动一个tomcat容器,让log-pilot收集tomcat的日志。为了简单起见,这里先不涉及sls或者elk,如果你想在本地玩玩,只需要有一台运行docker的机器就可以了。

首先启动log-pilot。要注意的是,以这种方式启动,由于没有配置后端使用的日志存储,所有收集到的日志都会直接输出到控制台,所以主要用于调试。

打开终端,输入命令:

docker run --rm -it \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /:/host \
    --privileged \
    registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.1

Screen_Shot_2017_02_08_at_10_15_18_PM

你会看到log-pilot启动的日志。别关终端。新开一个终端启动tomcat。tomcat镜像属于少数同时使用了stdout和文件日志的docker镜像,非常适合这里的演示。

docker run -it --rm  -p 10080:8080 \
-v /usr/local/tomcat/logs \
--label aliyun.logs.catalina=stdout \
--label aliyun.logs.access=/usr/local/tomcat/logs/localhost_access_log.*.txt \
tomcat

先解释下这里的配置。aliyun.logs.catalina=stdout告诉log-pilot这个容器要收集stdout日志,aliyun.logs.access=/usr/local/tomcat/logs/localhost_access_log.*.txt则表示要收集容器内/usr/local/tomcat/logs/目录下所有名字匹配localhost_access_log.*.txt的文件日志。后面会详细介绍label的用法。

如果你在本地部署tomcat,而不是在阿里云容器服务上,-v /usr/local/tomcat/logs也需要,否则log-pilot没法读取到日志文件。容器服务自动做了优化,不需自己加-v了。

log-pilot会监控Docker容器事件,发现带有aliyun.logs.xxx容器的时候,自动解析容器配置,并且开始收集对应的日志。启动tomcat之后,你会发现log-pilot的终端立即输出了一大堆的内容,其中包含tomcat启动时输出的stdout日志,也包括log-pilot自己输出的一些调试信息。

Screen_Shot_2017_02_08_at_10_27_59_PM
你可以打开浏览器访问刚刚部署的tomcat,你会发现每次刷新浏览器,在log-pilot的终端里都能看到类似如下的记录。其中message后面的内容就是从/usr/local/tomcat/logs/localhost_access_log.XXX.txt里收集到的日志。

使用Elasticsearch+Kibana

首先我们要部署一套Elastichsearch+Kibana,前面的文章里介绍过如何在阿里云容器服务里部署ELK,你可以参照文章在容器服务上直接部署,或者按照Elasticsearch/Kibana的文档直接在机器上部署,这里不再赘述。假设已经部署好了这两个组件。

如果你还在运行刚才启动的log-pilot,先关掉,使用下面的命令启动,执行之前,注意先把ELASTICSEARCH_HOST ELASTICSEARCH_PORT两个变量替换成你实际使用的值。ELASTICSEARCH_PORT一般是9200

docker run --rm -it \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /:/host \
    -e FLUENTD_OUTPUT=elasticsearch \
    -e ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST} \
    -e ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT} \
    --privileged \
    registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.1

相比前面启动log-pilot的方式,这里增加了三个环境变量:

  • FLUENTD_OUTPUT=elasticsearch: 把日志发送到elasticsearch
  • ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST}: elasticsearch的域名
  • ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT}: elasticsearch的端口号

继续运行前面的tomcat,再次访问,让tomcat产生一些日志,所有这些新产生的日志都讲发送到elasticsearch里。打开kibana,这时候你应该还看不到新日志,需要先创建index。log-pilot会把日志写到elasticsearch特定的index下,规则如下

1. 如果应用上使用了标签aliyun.logs.tags,并且tags里包含target,使用target作为elasticsearch里的index,否则
2. 使用标签aliyun.logs.XXX里的XXX作为index

在前面tomcat里的例子里,没有使用aliyun.logs.tags标签,所以默认使用了accesscatalina作为index。我们先创建index access

Screen_Shot_2017_02_09_at_8_08_23_PM

创建好index就可以查看日志了。

Screen_Shot_2017_02_09_at_8_09_01_PM

在阿里云容器服务里使用log-pilot

容器服务是最适合log-pilot运行的地方,专门为log-pilot做了优化。要在容器服务里运行log-pilot,你需要做的仅仅是使用下面的编排文件创建一个新应用。

pilot:
  image: registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.1
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - /:/host
  privileged: true
  environment:
    FLUENTD_OUTPUT: elasticsearch #按照你的需要替换 
    ELASTICSEARCH_HOST: ${elasticsearch} #按照你的需要替换
    ELASTICSEARCH_PORT: 9200
  labels:
    aliyun.global: true

接下来,你就可以在要收集日志的应用上使用aliyun.logs.xxx标签了。

Label说明

启动tomcat的时候,我们声明了这样下面两个,告诉log-pilot这个容器的日志位置。

--label aliyun.logs.catalina=stdout 
--label aliyun.logs.access=/usr/local/tomcat/logs/localhost_access_log.*.txt 

你还可以在应用容器上添加更多的标签

  • aliyun.logs.$name = $path

    • 变量name是日志名称,具体指随便是什么,你高兴就好。只能包含0-9a-zA-Z_-
    • 变量path是要收集的日志路径,必须具体到文件,不能只写目录。文件名部分可以使用通配符。/var/log/he.log/var/log/*.log都是正确的值,但/var/log不行,不能只写到目录。stdout是一个特殊值,表示标准输出
  • aliyun.logs.$name.format,日志格式,目前支持

    • none 无格式纯文本
    • json: json格式,每行一个完整的json字符串
    • csv: csv格式
  • aliyun.logs.$name.tags: 上报日志的时候,额外增加的字段,格式为k1=v1,k2=v2,每个key-value之间使用逗号分隔,例如

    • aliyun.logs.access.tags="name=hello,stage=test",上报到存储的日志里就会出现name字段和stage字段
    • 如果使用elasticsearch作为日志存储,target这个tag具有特殊含义,表示elasticsearch里对应的index

扩展log-pilot

对于大部分用户来说,log-pilot现有功能足以满足需求,如果遇到没法满足的场景怎么办?

  1. https://github.com/AliyunContainerService/log-pilot/issues 提交issue
  2. 直接改代码,再提pr

地址

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
723 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
3月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
406 3
|
17天前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
1月前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
64 5
|
1月前
|
存储 监控 安全
什么是事件日志管理系统?事件日志管理系统有哪些用处?
事件日志管理系统是IT安全的重要工具,用于集中收集、分析和解释来自组织IT基础设施各组件的事件日志,如防火墙、路由器、交换机等,帮助提升网络安全、实现主动威胁检测和促进合规性。系统支持多种日志类型,包括Windows事件日志、Syslog日志和应用程序日志,通过实时监测、告警及可视化分析,为企业提供强大的安全保障。然而,实施过程中也面临数据量大、日志管理和分析复杂等挑战。EventLog Analyzer作为一款高效工具,不仅提供实时监测与告警、可视化分析和报告功能,还支持多种合规性报告,帮助企业克服挑战,提升网络安全水平。
|
2月前
|
存储 JSON 网络协议
Docker面试整理-如何查看和管理Docker容器的日志?
通过本文的介绍,我们了解了如何查看和管理Docker容器的日志,包括使用 `docker logs`命令、配置日志驱动、设置日志选项和集中日志管理。掌握这些技能,不仅可以在面试中展示专业水平,也能在实际工作中高效
427 3
|
3月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1784 14
MySQL事务日志-Redo Log工作原理分析
|
2月前
|
存储 Linux Docker
centos系统清理docker日志文件
通过以上方法,可以有效清理和管理CentOS系统中的Docker日志文件,防止日志文件占用过多磁盘空间。选择合适的方法取决于具体的应用场景和需求,可以结合手动清理、logrotate和调整日志驱动等多种方式,确保系统的高效运行。
239 2
|
2月前
|
消息中间件 存储 监控
微服务日志监控的挑战及应对方案
【10月更文挑战第23天】微服务化带来模块独立与快速扩展,但也使得日志监控复杂。日志作用包括业务记录、异常追踪和性能定位。