ส่ง 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/