머리말
docker의 기본 로그 드라이버는 json-file 이며 각 컨테이너는 /var/lib/docker/containers/containerID/containerID-json.log를 로컬로 생성하며 로그 드라이버는 확장을 지원합니다.이 장에서는 주로 Fluentd 드라이버 수집에 대해 설명합니다. 도커 로그.
Fluentd는 통합 로깅 계층을위한 오픈 소스 데이터 수집기입니다. Kubernetes, Prometheus, Envoy, CoreDNS 및 containerd에 이어 6 번째 CNCF 졸업 프로젝트입니다. 비교적 경량 인 Elastic logstash와 비교되는 경우가 많습니다. 유연하고 개발이 매우 뛰어납니다. 이 블로그를 쓰는 시점에서 github의 스타는 8.8k, 포크는 1k입니다.
전제
구성 파일 준비
docker-compose.yml
version: '3.7'
x-logging:
&default-logging
driver: fluentd
options:
fluentd-address: localhost:24224
fluentd-async-connect: 'true'
mode: non-blocking
max-buffer-size: 4m
tag: "kafeidou.{
{.Name}}" #配置容器的tag,以kafeidou.为前缀,容器名称为后缀,docker-compose会给容器添加副本后缀,如 fluentd_1
services:
fluentd:
image: fluent/fluentd:v1.3.2
ports:
- 24224:24224
volumes:
- ./:/fluentd/etc
- /var/log/fluentd:/var/log/fluentd
environment:
- FLUENTD_CONF=fluentd.conf
fluentd-worker:
image: fluent/fluentd:v1.3.2
depends_on:
- fluentd
logging: *default-logging
fluentd.conf
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<match kafeidou.*>
@type file
path /var/log/fluentd/kafeidou/${tag[1]}
append true
<format>
@type single_value
message_key log
</format>
<buffer tag,time>
@type file
timekey 1d
timekey_wait 10m
flush_mode interval
flush_interval 5s
</buffer>
</match>
<match **>
@type file
path /var/log/fluentd/${tag}
append true
<format>
@type single_value
message_key log
</format>
<buffer tag,time>
@type file
timekey 1d
timekey_wait 10m
flush_mode interval
flush_interval 5s
</buffer>
</match>
Fluentd에 필요하면 저장소 로그 디렉토리 및 사용 권한 부여에 준비 할 필요가 있으므로, 디렉토리 구성에 쓰기 권한이 있기 때문에.
디렉토리를 작성
mkdir /var/log/fluentd
실험적인 데모를 위해 여기에서 허가를 주시고 777을 직접 승인하십시오.
chmod -R 777 /var/log/fluentd
docker-compose.yml 및 fluentd.conf 디렉토리에서 명령을 실행합니다.
docker-compose up -d
[root@master log]# docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.
Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
To deploy your application across the swarm, use `docker stack deploy`.
Creating network "log_default" with the default driver
Creating fluentd ... done
Creating fluentd-worker ... done
로그 디렉토리를 확인하십시오. 해당 컨테이너 로그 파일이 있어야합니다.
[root@master log]# ls /var/log/fluentd/kafeidou/
fluentd-worker.20200215.log ${tag[1]}
이것은 나의 마지막 실험의 결과입니다. $ (tag [1]) 디렉토리가 생성됩니다. 이상하게도이 디렉토리에 두 개의 파일이있을 것입니다.
[root@master log]# ls /var/log/fluentd/kafeidou/\$\{tag\[1\]\}/
buffer.b59ea0804f0c1f8b6206cf76aacf52fb0.log buffer.b59ea0804f0c1f8b6206cf76aacf52fb0.log.meta
누구든지 이것을 이해한다면 함께 의사 소통을 환영합니다!
아키텍처 요약
Docker의 원래 로그를 사용하지 않는 이유는 무엇입니까?
먼저 원래 도커 로그의 아키텍처를 살펴 보겠습니다.
Docker는 로컬 /var/lib/docker/containers/containerID/containerID-json.log 경로에 각 컨테이너에 대한 로그 파일을 생성하여 docker 로그를 저장합니다.
위 그림에는 총 7 개의 컨테이너가 있는데, 7 개의 마이크로 서비스라고한다면 로그를 볼 필요가있을 때 이미 매우 불편하고 최악의 경우 3 대의 머신에서 각 컨테이너의 로그를 볼 필요가 있습니다. .
fluentd를 사용한 후의 차이점은 무엇입니까?
fluentd를 사용하여 도커 로그를 수집 한 후 컨테이너를 함께 집계 할 수 있습니다.이 기사에서 fluentd 구성 파일을 구성한 후 아키텍처를 살펴 보겠습니다.
fluentd는 fluentd가있는 머신의 로컬 디렉토리에 저장되도록 구성되어 있기 때문에 다른 머신의 컨테이너 로그를 fluentd가 위치한 머신의 로컬 디렉토리에 수집하는 효과가 있습니다.
fluentd는 로컬에서만 컨테이너 로그를 수집 할 수 있습니까?
Fluentd는 수집 된 로그를 실제로 다시 전송할 수 있습니다 (예 : elasticsearch와 같은 스토리지 소프트웨어).
유창한 유연성
fluentd가 할 수있는 일은 많습니다. Fluentd 자체는 전송 노드와 수신 노드로 사용할 수 있습니다. 또한 특정 로그를 필터링하고 특정 콘텐츠로 로그를 포맷하고 일치하는 특정 로그를 다시 전송할 수 있습니다. Docker 컨테이너 로그 수집의 효과.
에서 발생하는 네 개의 커피 콩 , 복제, 소스를 선언하십시오.
공개 계정 팔로우-> [Four Coffee Beans] 최신 콘텐츠 받기