随着容器技术的发展,使用 Docker 部署前端应用已经成为了趋势。在 Docker 部署前端应用的过程中,容器日志管理尤为重要。本文将介绍如何使用 Elasticsearch+Kibana 对 Docker 容器日志进行管理和分析。
Docker 容器日志
Docker 容器具有轻量级、快速启动、易于部署等优点。但是,容器的生命周期短暂,当容器被删除时,日志等信息也会被删除。
为了解决这个问题,Docker 提供了多种方式记录容器日志,包括:
- stdout/stderr 输出
- 持久化存储
- Docker 日志驱动
其中, Docker 日志驱动是最常用的方式。Docker 支持以下几种日志驱动:
- json-file
- syslog
- journald
- gelf
- fluentd
- awslogs
- splunk
- etwlogs
- none
我们可以通过 --log-driver
参数来指定日志驱动,例如:
docker run --log-driver=json-file nginx
在这种配置下,容器的日志将会被保存到 /var/lib/docker/containers/<container_id>/<container_id>-json.log
文件中。
Elasticsearch+Kibana
Elasticsearch 是一个分布式、RESTful 的搜索和分析引擎,Kibana是一个可视化分析平台,提供了 Dashboard、Visualize 和 Discovery 等功能。Elasticsearch+Kibana 组合可以用于实时分析、搜索和可视化各种复杂数据。
安装 ElasticSearch+Kibana
首先,我们需要安装 Elasticsearch 和 Kibana。Elasticsearch 建议使用版本 7.x 或以上,Kibana 不宜与 Elasticsearch 的主版本不同。
可以通过以下命令安装 Elasticsearch 和 Kibana:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:7.12.1 docker run -d --name kibana --link elasticsearch -p 5601:5601 kibana:7.12.1
其中,--link
参数用于连接 Elasticsearch 服务。
配置 Docker 日志驱动
要将 Docker 容器日志发送到 Elasticsearch,我们需先安装 docker-elk
工具。使用以下命令:
git clone https://github.com/deviantony/docker-elk.git cd docker-elk/ docker-compose up
然后,在 Docker 部署时,需指定日志驱动为 gelf
:
docker run -d \ --log-driver=gelf \ --log-opt gelf-address=udp://localhost:12201 \ --log-opt tag=mytag \ nginx:alpine
在这种配置下,Docker 容器日志将通过 Graylog Extended Log Format (GELF)
发送到 Elasticsearch,并附带 tag=mytag
作为标签。在 Kibana 中,我们可以通过这个标签来分析日志。我们还需配置 Elasticsearch 的索引模板,以正确解析容器日志的字段。在本文中,不再详述。
使用 Kibana 分析日志
打开浏览器,输入 http://localhost:5601
,进入 Kibana。
创建索引模板
在 Kibana 的 “Management” -> “Index Patterns”,创建一个新日志索引模板。在这个模板中,Docker 的日志格式以及其他日志信息必须正确设置。可以使用默认设置或者自定义模板,这里我们使用默认模板。
分析容器日志
直接在 Kibana 的搜索栏中用英文关键词搜索,如 nginx
,可以看到 Elasticsearch 服务立即搜索和查询所有匹配的日志,然后将日志以表格、图表等形式呈现出来。我们还可以使用标签等元数据对日志进行筛选和过滤。
总结
本文介绍了 Docker 容器日志的管理和 Elasticsearch+Kibana 的使用。通过这种方式,我们可以实时监控、分析和搜索 Docker 容器的日志,从而快速定位问题,优化前端应用的部署和运行。如果您对日志分析和 Docker 容器有更多的了解和实践经验,欢迎分享和讨论。
示例代码
docker-compose.yml
:
version: "3" services: elasticsearch: image: elasticsearch:7.12.1 ports: - "9200:9200" - "9300:9300" kibana: image: kibana:7.12.1 ports: - "5601:5601" depends_on: - elasticsearch logstash: image: logstash:7.12.1 volumes: - ./config:/usr/share/logstash/config/ depends_on: - elasticsearch command: ["-f", "/usr/share/logstash/config/logstash.conf"] web: image: nginx:1.19.9-alpine logging: driver: gelf options: gelf-address: udp://localhost:12201 tag: mytag ports: - "80:80" - "443:443"
logstash.conf
:
input { gelf { port => 12201 } } filter { if [source] =~ /docker/ { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] } } mutate { remove_field => [ "host", "timestamp", "input_type", "@version", "source", "offset" ] } } output { elasticsearch { hosts => ["http://elasticsearch:9200"] index => "docker-%{+YYYY.MM.dd}" document_type => "doc" } }
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b963acadd4f0e0ff1d97c1