ส่ง Docker log ไปหา GCP logging
ผมใช้งาน docker ใน server ตัวเองประจำแล้วจะเข้ามาดู log แต่ละครั้งก็ต้อง ssh เข้าไป ซึ่งในบ้างครั้งมันก็ไม่สะดวกเอาซะเลย เวลาระบบมีปัญหาก็จะถามหา logs กัน ซึ่งจะให้ทีม dev ทำการ ssh เข้ามาดู log แบบเราก็ไม่ได้ เพราะมันไม่ปลอดภัย
เลยคิดว่าเอา Docker logs สำหรับแอพที่เราต้องการขึ้นไปยัง Google cloud logging ดีกว่า เราก็แค่เพิ่มทีม dev ให้ไปดู logs บนนั้นแทนเพราะมันมีหน้าตาด้วย จะได้ดูง่ายๆ
มาดูวิธีการทำกัน Let's go
Create a service account in Google Cloud
มาสร้าง service account เพื่อไว้อ่าน logs กันก่อนให้ไปที่ IAM & Admin > Service accounts
กดสร้าง Service account จากนั้นใส่ชื่อที่ต้องการลงไป
กำหนด Role ตามนี้ Logs writer และ Monitoring Metric Writer
เราจะได้ server account ขึ้นมา ให้คลิกเมนูขวาสุด แล้วเลือก Manage key
ทำการสร้าง key ใหม่ขึ้นมา
เลือก JSON จากนั้นเราจะได้ไฟล์ json
มาเก็บไว้ให้ดี ห้ามหาย ห้ามหลุดออกไป
Configure the docker daemon
ต่อมาให้เรากลับมาที่ server เรามาทำการเพิ่มการตั้งค่าให้ docker นั้นส่ง logs ไปยัง gcp โดยการแก้ไขไฟล์ /etc/docker/daemon.json
ถ้าไม่มีก็สร้างขึ้นมา แล้วใส่เนื้อหาตามนี้
{
"log-driver": "gcplogs",
"log-opts": {
"gcp-project": "function61-logs",
"mode": "non-blocking",
"max-buffer-size": "2m"
}
}
แก้ไข "function61-logs"
เป็นชื่อ gcp project id ของเรา
ต่อมาให้เรานำไฟล์ service account json ที่ได้มาเก็บไว้ที่ /etc/docker/googlecloud-serviceaccount.json
แล้วพิมพ์คำสั่งตามด้านล่าง
$ mkdir -p /etc/systemd/system/docker.service.d
$ echo -e "[Service]\nEnvironment=GOOGLE_APPLICATION_CREDENTIALS=/etc/docker/googlecloud-serviceaccount.json\n" > /etc/systemd/system/docker.service.d/gcplogging.conf
$ systemctl daemon-reload
$ systemctl restart docker
จากนั้นทำการตรวจสอบ docker ว่ามันเรียกไฟล์ gcplogging.conf ไว้แล้ว
$ systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/docker.service.d
└─gcplogging.conf
Active: active (running) since Fri 2022-10-21 15:12:14 +07; 3 weeks 5 days ago
เมื่อดู docker info
ก็จะพบว่าเราได้ทำการเพิ่ม logging driver เป็น gcplogs แล้ว
$ docker info --format '{{.LoggingDriver}}'
gcplogs
Configure docker-compose
ต่อมาดูวิธีการเขียนไฟล์ docker-compose.yml ให้มันส่ง logs ไปยัง gcplogs
version: "3.8"
services:
awesome-app:
image: nginx:alpine
logging:
driver: gcplogs
View logs on GCP logging
ลองมาดู logs ที่ gcp จะได้ดังภาพ โดยตัว query จะเป็นประมาณนี้
severity=DEFAULT
json_payload.container.name="/proxy_nginx_1"
ในส่วนของ json_payload.container.name
ให้เปลี่ยนชื่อตาม container name ของเรา
จบปิ้ง... :)
Thanks:
- https://joonas.fi/2019/01/06/how-to-configure-gcplogs-for-docker/
- https://docs.docker.com/config/containers/logging/gcplogs/