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

หากเพื่อน ๆ น้อง ๆ คนไหนกำลังแวะมาอ่านบทความนี้ อยากบอกว่าบทความนี้จะมาอธิบายและขั้นตอนการติดต่อรวมถึงการใช้งานพื้นฐาน โดยจะอธิบายองค์ประกอบคร่าว ๆ
โดยส่วนใหญ่แล้ว กรณีที่น้อง ๆ มีการรัน 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
เพียงเท่านี้ก็เป็นอันเสร็จเรียบร้อยแล้ว
หากท่านชอบและรู้สึกว่ามีประโยชน์ รบกวนแชร์และแบ่งปันให้ผู้ที่สนใจและควรจะได้รับการเข้าถึงบทความนี้ แล้วพบกันใหม่ครับ