Blog
ให้ Docker เก็บ Log ไว้ที่ Syslog ดีกว่าไม่ทำอะไรเลย ฉบับแบบเข้าใจง่าย

ให้ Docker เก็บ Log ไว้ที่ Syslog ดีกว่าไม่ทำอะไรเลย ฉบับแบบเข้าใจง่าย

poc_ep_3

หากเพื่อน ๆ น้อง ๆ คนไหนกำลังแวะมาอ่านบทความนี้ อยากบอกว่าบทความนี้จะมาอธิบายและขั้นตอนการติดต่อรวมถึงการใช้งานพื้นฐาน โดยจะอธิบายองค์ประกอบคร่าว ๆ

โดยส่วนใหญ่แล้ว กรณีที่น้อง ๆ มีการรัน Docker Container แล้วต้องการตรวจสอบ สถานะการแสดงผลของ Logs ส่วนใหญ่จะต้องทำการ ใช้คำสั่ง

docker logs <container_id>

แต่เมื่อเราทำการสั่งลบ Container เราก็ไม่รู้จะไปค้นหา Log ที่มีการรัน Container จากไหนในเมื่อมันถูกลบไปแล้ว

วิธีสำหรับการ อ่านเขียน Log แบบดั่งเดิม

docker inspect --format='{{.LogPath}}' <container_id>
/var/lib/docker/containers/<container_id>/<container_id>-json.log

ที่น่าเศร้าเสียใจไปกว่านั้น ไฟล์นี้จะถูกลบไปพร้อมกับ Container ทันที แปลว่ามีความเป็นไปได้ที่อาจจะต้องทำการเขียน Automate File บางอย่างในตัวอย่าง เช่น

docker logs -f <container_id> >& logs/file.log

แต่จะดีกว่าไหม หากมีตัวช่วยทำให้เราง่ายต่อการใช้ชีวิตและสามารถ Scale ด้วยเช่นกัน ในกรณีที่ต้องการ POC Architecture x86 and Arm ก็ไม่มีปัญหา เพราะเราขอเสนอ …

linuxserver พระเจ้าของเราในวันนี้

เป็น Community ที่ชื่นชอบใช้ Docker ในการใช้งาน Linux Server เป็นหลักซึ่งสามารถเข้ามาช่วยเหลือเราได้กับสถานะการณ์ที่เราเจออยู่ โดยผมจะอ้างอิง images ตัวนึงชื่อว่า “syslog-ng” โดยน้องค่อนข้างเบาและเหมาะสำหรับการติดตั้งเพื่อประหยัดเวลาในการใช้งานรวมถึงหยืดหยุ่นต่อการนำไปขยาย

อธิบายให้เข้าใจง่าย ๆ เมื่อใดที่เราต้องการใช้งาน syslog แบบ images or container ก็ไม่มีปัญหา รวมถึงวิธีการสื่อสารระยะไกลเช่น Server 2 ตัวที่มีการรับส่งข้อมูลก็ง่ายเช่นเดียวกัน ตัวอย่าง

version: "2.1"
services:
  syslog-ng:
    image: lscr.io/linuxserver/syslog-ng:latest
    container_name: syslog-ng
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/London
    volumes:
      - /path/to/config:/config
      - /path/to/log:/var/log #optional
    ports:
      - 514:5514/udp
      - 601:6601/tcp
      - 6514:6514/tcp
    restart: unless-stopped

เรามาพูดถึงการตั้งค่าพื้นฐานกันก่อนเลยดีกว่า

ดูแล้วงงอยากได้ผลลัพธ์เลย เราก็มีเช่นกัน โดยเคสนี้จะยกตัวอย่างเพียงแค่ Database 1 ประเภท ได้แก่ Postgres เท่านั้น

version: '3.3'
 
services:
  postgres:
    image: postgres:12
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

ตัวอย่างในการเรียกใช้งาน Docker Compose Postgres Version 12 แต่เมื่อเราจะต้องการให้ทำการ แสดง Log ออกจาก Container เราจะต้องมีการเพิ่มคำสั่งเข้าไปอีก

version: '3.3'
 
services:
  postgres:
    image: postgres:12
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    ports:
      - "<port>:5432"
    logging:
      driver: syslog
      options:
        syslog-address: "udp://127.0.0.1:514"

จะเห็นว่าเรามีการเพิ่ม Logging และบอกว่าเราให้ syslog ส่งออกไปตาม UDP ของเรา เรามาดูว่าหากเราใช้ images “linuxserver/syslog-ng” จะเป็นอย่างไรกัน

version: '3.3'
 
services:
  postgres:
    image: postgres:12
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    ports:
      - "<port>:5432"
    logging:
      driver: syslog
      options:
        syslog-address: "udp://127.0.0.1:514"
 
  syslog:
    image: linuxserver/syslog-ng:3.38.1
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Bangkok
    volumes:
      - "./logs:/var/log"
    ports:
      - "514:5514/udp"

ลองทำการรัน Docker Compose ของเราได้เลย

docker-compose up -d

ตัวอย่างของ File ที่เราจะได้รับ

2023-01-11T18:40:15.000+07:00 xxx.xxx.xxx.x HOST=xxx.xxx.xxx.x HOST_FROM=xxx.xxx.xxx.x LEGACY_MSGHDR="postgres[1576]: " MESSAGE="PostgreSQL Database directory appears to contain a database; Skipping initialization" PID=1576 PROGRAM=postgres SOURCE=s_network_udp \
2023-01-11T18:40:15.000+07:00 xxx.xxx.xxx.x HOST=xxx.xxx.xxx.x HOST_FROM=xxx.xxx.xxx.x LEGACY_MSGHDR="postgres[1576]: " MESSAGE="2023-01-11 18:40:15.668 UTC [1] LOG:  starting PostgreSQL 12.13 (Debian 12.13-1.pgdg110+1) on aarch64-unknown-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit" PID=1576 PROGRAM=postgres SOURCE=s_network_udp \
2023-01-11T18:40:15.000+07:00 xxx.xxx.xxx.x HOST=xxx.xxx.xxx.x HOST_FROM=xxx.xxx.xxx.x LEGACY_MSGHDR="postgres[1576]: " MESSAGE="2023-01-11 18:40:15.669 UTC [1] LOG:  listening on IPv4 address \"0.0.0.0\", port 5432" PID=1576 PROGRAM=postgres SOURCE=s_network_udp \
2023-01-11T18:40:15.000+07:00 xxx.xxx.xxx.x HOST=xxx.xxx.xxx.x HOST_FROM=xxx.xxx.xxx.x LEGACY_MSGHDR="postgres[1576]: " MESSAGE="2023-01-11 18:40:15.669 UTC [1] LOG:  listening on IPv6 address \"::\", port 5432" PID=1576 PROGRAM=postgres SOURCE=s_network_udp \
2023-01-11T18:40:15.000+07:00 xxx.xxx.xxx.x HOST=xxx.xxx.xxx.x HOST_FROM=xxx.xxx.xxx.x LEGACY_MSGHDR="postgres[1576]: " MESSAGE="2023-01-11 18:40:15.677 UTC [1] LOG:  listening on Unix socket \"/var/run/postgresql/.s.PGSQL.5432\"" PID=1576 PROGRAM=postgres SOURCE=s_network_udp \
2023-01-11T18:40:15.000+07:00 xxx.xxx.xxx.x HOST=xxx.xxx.xxx.x HOST_FROM=xxx.xxx.xxx.x LEGACY_MSGHDR="postgres[1576]: " MESSAGE="2023-01-11 18:40:15.734 UTC [28] LOG:  database system was shut down at 2023-01-11 18:34:46 UTC" PID=1576 PROGRAM=postgres SOURCE=s_network_udp \
2023-01-11T18:40:15.000+07:00 xxx.xxx.xxx.x HOST=xxx.xxx.xxx.x HOST_FROM=xxx.xxx.xxx.x LEGACY_MSGHDR="postgres[1576]: " MESSAGE="2023-01-11 18:40:15.785 UTC [1] LOG:  database system is ready to accept connections" PID=1576 PROGRAM=postgres SOURCE=s_network_udp

เพียงเท่านี้ก็เป็นอันเสร็จเรียบร้อยแล้ว

หากท่านชอบและรู้สึกว่ามีประโยชน์ รบกวนแชร์และแบ่งปันให้ผู้ที่สนใจและควรจะได้รับการเข้าถึงบทความนี้ แล้วพบกันใหม่ครับ