System Logging — syslog และ journalctl บน Linux

Log คือหลักฐานสำคัญที่บอกว่าระบบทำอะไรไปบ้าง เมื่อเกิดปัญหา Log เป็นจุดแรกที่ System Administrator ต้องตรวจสอบ Linux มีสองระบบ Logging หลักที่ควรรู้จักคือ syslog ซึ่งเป็นระบบดั้งเดิมที่บันทึกเป็นไฟล์ข้อความ และ systemd Journal ที่เก็บ Log แบบ Binary พร้อมความสามารถค้นหาและกรองที่ยืดหยุ่นกว่า

บทความนี้อธิบายสถาปัตยกรรมของระบบ Logging บน Linux ตั้งแต่ syslog daemon (rsyslog/syslog-ng) และรูปแบบไฟล์ Log มาตรฐาน ไปจนถึงการใช้ journalctl อย่างละเอียดสำหรับ Server สมัยใหม่ที่ใช้ systemd

สถาปัตยกรรม System Logging

บน Linux สมัยใหม่ที่ใช้ systemd มีสองชั้นของ Logging ทำงานคู่กัน ชั้นแรกคือ systemd Journal ที่รวบรวม Log จากทุก Service ไว้ในรูปแบบ Binary ชั้นที่สองคือ syslog daemon (rsyslog หรือ syslog-ng) ที่รับ Log จาก Journal ต่อและบันทึกเป็นไฟล์ข้อความใน /var/log/

# ตรวจสอบ syslog daemon ที่ใช้งานอยู่
systemctl status rsyslog
systemctl status syslog-ng

# ดู Log daemon ที่ติดตั้งอยู่
dpkg -l | grep -E "rsyslog|syslog-ng"   # Debian/Ubuntu
rpm -qa | grep -E "rsyslog|syslog-ng"   # RHEL/Rocky

ไฟล์ Log มาตรฐานใน /var/log/

Linux มีไฟล์ Log มาตรฐานที่ควรรู้จักและตรวจสอบเป็นประจำ

# ไฟล์ Log สำคัญ
/var/log/syslog        # Ubuntu/Debian — Log ทั่วไปของระบบ
/var/log/messages      # RHEL/CentOS/Rocky — เทียบเท่า syslog
/var/log/auth.log      # Ubuntu — การ Login, sudo, SSH
/var/log/secure        # RHEL — เทียบเท่า auth.log
/var/log/kern.log      # Kernel messages
/var/log/dmesg         # Boot-time Kernel messages
/var/log/dpkg.log      # ประวัติการติดตั้ง Package (Debian)
/var/log/dnf.log       # ประวัติการติดตั้ง Package (RHEL ใหม่)
/var/log/nginx/        # Nginx access/error logs
/var/log/apache2/      # Apache logs
/var/log/mysql/        # MySQL/MariaDB logs

อ่าน Log ด้วย Command พื้นฐาน

# ดู Log ล่าสุด 50 บรรทัด
tail -50 /var/log/syslog

# ดู Log แบบ Real-time (follow)
tail -f /var/log/syslog
tail -f /var/log/auth.log

# ค้นหาใน Log
grep "ERROR" /var/log/syslog
grep "Failed password" /var/log/auth.log
grep "nginx" /var/log/syslog | tail -20

# ดู Log ช่วงเวลาที่กำหนด (ถ้า Log มี Timestamp)
grep "Apr 16" /var/log/syslog | grep "ERROR"

Syslog Priority และ Facility

syslog จัดแบ่ง Log ตาม Facility (ต้นกำเนิด) และ Priority (ความรุนแรง) ซึ่งใช้ในการกำหนด Routing ว่า Log ใดควรบันทึกที่ไหน

# Priority (เรียงจากมากไปน้อย)
# emerg   (0) — ระบบ Panic ใช้งานไม่ได้
# alert   (1) — ต้องแก้ไขทันที
# crit    (2) — Critical condition
# err     (3) — Error
# warning (4) — Warning
# notice  (5) — ปกติแต่ควรสังเกต
# info    (6) — ข้อมูลทั่วไป
# debug   (7) — Debug detail

# Facility ที่พบบ่อย
# kern    — Kernel
# user    — User-level
# mail    — Mail system
# daemon  — System daemon
# auth    — Authentication (sudo, login)
# cron    — Cron jobs

rsyslog Configuration

# ไฟล์ Config หลักของ rsyslog
# /etc/rsyslog.conf
# /etc/rsyslog.d/   — Drop-in configs

# ตัวอย่าง rsyslog.conf — กำหนดว่า Log ใดไปที่ไหน
# kern.*                    /var/log/kern.log
# auth,authpriv.*           /var/log/auth.log
# *.*;auth,authpriv.none    /var/log/syslog
# cron.*                    /var/log/cron.log

# Reload rsyslog หลังแก้ Config
sudo systemctl restart rsyslog

journalctl — ดู Log จาก systemd Journal

journalctl เป็นคำสั่งหลักสำหรับดู Log จาก systemd Journal ซึ่งรวบรวม Log จากทุก Service และ Kernel ไว้ในที่เดียว

# ดู Log ทั้งหมด (จากเก่าไปใหม่)
journalctl

# ดู Log แบบ Follow (real-time)
journalctl -f

# ดู Log ล่าสุด N บรรทัด
journalctl -n 50
journalctl -n 100 --no-pager

# ดู Log ตั้งแต่ Boot ล่าสุด
journalctl -b

# ดู Log Boot ก่อนหน้า (boot -1 = boot ที่แล้ว)
journalctl -b -1
journalctl -b -2

# ดูรายการ Boot ที่เก็บไว้
journalctl --list-boots

journalctl — กรอง Log ตาม Service

# ดู Log ของ Service เฉพาะตัว
journalctl -u nginx
journalctl -u mysql
journalctl -u sshd

# ดู Log แบบ Follow สำหรับ Service
journalctl -u nginx -f

# ดู Log หลาย Service พร้อมกัน
journalctl -u nginx -u php-fpm

# ดู Log ของ Service ตั้งแต่ Boot ล่าสุด
journalctl -u nginx -b

journalctl — กรองตามเวลา

# ดู Log ช่วงเวลาที่กำหนด
journalctl --since "2026-04-16 00:00:00"
journalctl --since "2026-04-16 00:00" --until "2026-04-16 23:59"
journalctl --since "1 hour ago"
journalctl --since "yesterday"
journalctl --since today

# ดู Log เฉพาะ Service ในช่วงเวลา
journalctl -u nginx --since "2026-04-16 10:00" --until "2026-04-16 12:00"

journalctl — กรองตาม Priority

# ดูเฉพาะ Error และสูงกว่า
journalctl -p err

# ดู Warning และสูงกว่า
journalctl -p warning

# ดู Critical errors ทั้งหมดตั้งแต่ Boot ล่าสุด
journalctl -p crit -b

# Priority values: emerg, alert, crit, err, warning, notice, info, debug
# หรือใช้ตัวเลข: 0 (emerg) ถึง 7 (debug)
journalctl -p 0..3    # emerg ถึง err

journalctl — รูปแบบ Output

# Output แบบ JSON (เหมาะกับการ Parse)
journalctl -u nginx -o json
journalctl -u nginx -o json-pretty

# Output แบบ Short (default)
journalctl -o short

# Output แบบ Verbose (ดู Field ทั้งหมด)
journalctl -o verbose

# ไม่ให้ Truncate บรรทัดยาว
journalctl --no-pager

# ส่ง Output ไปยัง grep
journalctl -u nginx | grep "error"
journalctl -b | grep -i "failed"

จัดการขนาด Journal

systemd Journal มีขนาดจำกัดตามค่า Config ถ้าไม่ตั้งค่าไว้จะใช้ค่าเริ่มต้นประมาณ 10% ของ Disk หรือ 4 GB แล้วแต่อะไรน้อยกว่า

# ดูขนาด Journal ปัจจุบัน
journalctl --disk-usage

# ลบ Log เก่ากว่า 2 สัปดาห์
sudo journalctl --vacuum-time=2weeks

# จำกัดขนาดไม่เกิน 500MB
sudo journalctl --vacuum-size=500M

# ตั้งค่าถาวรใน /etc/systemd/journald.conf
# SystemMaxUse=500M
# MaxRetentionSec=2week
sudo systemctl restart systemd-journald

ตั้งค่า Journal ให้ Persistent

ค่าเริ่มต้นของ systemd Journal บางระบบอาจเก็บ Log ไว้ใน /run/log/journal/ ซึ่งหายเมื่อ Reboot การตั้งให้ Persistent จะเก็บ Log ใน /var/log/journal/ แทน

# ตรวจสอบว่า Journal เก็บแบบ Persistent หรือไม่
ls /var/log/journal/

# เปิดใช้ Persistent Journal
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald

# หรือตั้งใน /etc/systemd/journald.conf
# Storage=persistent

logger — เขียน Log จาก Script

logger เป็นคำสั่งที่ช่วยให้ Shell Script เขียน Log เข้า syslog และ systemd Journal ได้โดยตรง เหมาะสำหรับ Script ที่ต้องการบันทึกความคืบหน้าหรือข้อผิดพลาด

# เขียน Log เข้า syslog
logger "Backup started"
logger -p user.error "Backup failed: disk full"

# ระบุ Tag (ชื่อ Process ใน Log)
logger -t backup-script "Database dump completed"

# ดู Log ที่เขียนด้วย logger
journalctl -t backup-script
grep "backup-script" /var/log/syslog

สรุป

Linux มีสองระบบ Logging คู่ขนานกัน ได้แก่ syslog daemon (rsyslog/syslog-ng) ที่บันทึก Log เป็นไฟล์ข้อความใน /var/log/ และ systemd Journal ที่เก็บ Log แบบ Binary พร้อมความสามารถค้นหาด้วย journalctl การใช้ journalctl -u servicename -f สำหรับติดตาม Log แบบ Real-time และ journalctl -p err -b สำหรับดู Error ตั้งแต่ Boot ล่าสุด เป็นทักษะพื้นฐานที่จำเป็นสำหรับ System Administrator ทุกคน

แนะนำบริการ DE

การจัดการ System Logging และ Troubleshoot ปัญหาบน Server จริงต้องการสิทธิ์เข้าถึงระบบอย่างเต็มที่ Cloud VPS ของ DE ให้ Root Access สมบูรณ์พร้อม OS ที่รองรับทั้ง rsyslog และ systemd Journal เหมาะสำหรับฝึก Log Analysis และ System Troubleshooting บน Server จริง

หากต้องการโฮสต์เว็บไซต์โดยมีระบบ Logging จัดการให้อัตโนมัติ Cloud Hosting ของ DE มีระบบ Error Log และ Access Log ที่เข้าถึงได้ผ่าน Control Panel โดยไม่ต้องจัดการ syslog เอง