ผู้ดูแลระบบ Linux มักจะต้องดูไฟล์ log ที่ถูกบันทึกหากพบเจอปัญหาและแก้ไข เนื่องจาก Linux และแอพพลิเคชันที่ทำงานบน Linux สามารถสร้างข้อความประเภทต่างๆ ได้ทั้งหมด ซึ่งจะถูกบันทึกไว้ในไฟล์บันทึกต่างๆ Linux ใช้ชุดของไฟล์ configuration ไดเร็กทอรี โปรแกรม คำสั่ง และเดมอน (daemons) เพื่อสร้าง จัดเก็บ และนำไฟล์กลับมาใช้จากบันทึกเหล่านี้ การรู้ว่าระบบเก็บไฟล์บันทึกไว้ที่ไหนและสามารถใช้คำสั่งที่เกี่ยวข้อง จะช่วยประหยัดเวลาระหว่างการแก้ไขปัญหาได้ (สำหรับระบบปฏิบัติการที่เราใช้ทดสอบคือ CentOS 8 , Ubuntu 20)
ขั้นตอนที่ 1 – การตรวจสอบตำแหน่งไฟล์บันทึกเริ่มต้น
ตำแหน่งเริ่มต้นสำหรับไฟล์บันทึกใน Linux คือ /var/log สามารถดูรายการไฟล์บันทึกในไดเร็กทอรีด้วยคำสั่งต่อไปนี้
ls -l /var/log
หากใช้กับระบบ CentOS จะปรากฎดังภาพ
ขั้นตอนที่ 2 – การดูเนื้อหาไฟล์ที่ถูกบันทึก
รายละเอียดต่อไปนี้คือไฟล์ที่ถูกบันทึกทั่วไปบางส่วนที่พบภายใต้คำสั่ง /var/log
- wtmp
- utmp
- dmesg
- messages
- maillog or mail.log
- spooler
- auth.log or secure
ไฟล์ wtmp และ utmp เป็นไฟล์ติดตามผู้ใช้ที่เข้าสู่ระบบและออกจากระบบ จะทำให้ไม่สามารถอ่านเนื้อหาของไฟล์เหล่านี้ได้โดยตรงโดยใช้คำสั่ง cat ในเทอร์มินัล จะมีคำสั่งเฉพาะอื่น ๆ แยกต่างหาก หากต้องการดูว่าใครกำลังล็อกอินเข้าสู่เซิร์ฟเวอร์ Linux ให้ใช้คำสั่ง who คำสั่งนี้รับค่าจากไฟล์ /var/run/utmp (สำหรับ CentOS และ Debian) หรือ /run/utmp (สำหรับ Ubuntu)
ขั้นตอนที่ 3 – การใช้ rsyslog Daemon
กลไกสำคัญสำหรับการบันทึกคือ rsyslog daemon บริการนี้รับผิดชอบในการฟังข้อความบันทึกจากส่วนต่างๆ ของระบบ Linux และกำหนดเส้นทางข้อความไปยังไฟล์บันทึกที่เหมาะสมในไดเร็กทอรี /var/log นอกจากนี้ยังสามารถส่งต่อข้อความบันทึกไปยังเซิร์ฟเวอร์ Linux อื่นได้อีกด้วย
ไฟล์การกำหนดค่า rsyslog
rsyslog daemon รับข้อมูลองค์ประกอบต่าง ๆ จากไฟล์ rsyslog.conf ที่อยู่ภายใต้ไดเร็กทอรี /etc ไฟล์ rsyslog.conf จะบอก rsyslog daemon ว่าจะบันทึกข้อความบันทึกไว้ที่ใดซึ่งเป็นคำสั่งที่มาจากสองส่วนภายในไฟล์ สามารถพบได้ที่ rsyslog.d/50-default.conf บน Ubuntu คำสั่งสองส่วนประกอบด้วยตัวเลือกและการดำเนินการ ทั้งสองส่วนคั่นด้วยช่องว่าง ส่วนที่เลือกจะระบุถึงแหล่งที่มาและความสำคัญของข้อความบันทึกคืออะไร และส่วนการดำเนินการบอกว่าจะทำอย่างไรกับข้อความ
ตัวเลือกจะถูกแบ่งออกเป็นสองส่วนอีกครั้งโดยคั่นด้วยจุด (.) ส่วนแรกก่อนจุดเรียกว่า facility (ต้นกำเนิดของข้อความ) และส่วนที่สองหลังจุดเรียกว่า priority (ระดับความรุนแรงของข้อความ) ทั้ง facility และ priority จะมีการดำเนินการร่วมกันเพื่อเป็นการบอก rsyslog ว่าต้องทำอย่างไรเมื่อมีการสร้างข้อความบันทึกที่ตรงกับเกณฑ์ที่กำหนด
คุณสามารถดูข้อความที่ตัดตอนมาจากไฟล์ CentOS /etc/rsyslog.conf ด้วยคำสั่งนี้
cat /etc/rsyslog.conf
เพื่อให้เข้าใจว่าทั้งหมดตามภาพด้านบนหมายถึงอะไร สามารถดูความหมายได้ ดังนี้
- auth หรือ authpriv: ข้อความที่มาจากเหตุการณ์การอนุญาตและความปลอดภัย
- kern: ข้อความใดๆ ที่มาจาก Linux kernel
- mail: ข้อความที่สร้างโดยระบบ mail ย่อย
- cron: ข้อความที่เกี่ยวข้องกับ Cron daemon
- daemon: ข้อความที่มาจาก daemons
- news: ข้อความที่มาจากระบบข่าวย่อยในเครือข่ายต่าง ๆ
- lpr: การพิมพ์ข้อความบันทึกที่เกี่ยวข้อง
- user: ข้อความบันทึกที่มาจากโปรแกรมผู้ใช้
- local0 ถึง local7: สงวนไว้สำหรับการใช้งานในเครื่อง
และนี่คือรายการที่มีการเรียงลำดับความสำคัญจากน้อยไปหามาก:
- debug: ข้อมูลการดีบักจากโปรแกรม
- info: ข้อความให้ข้อมูลที่เรียบง่าย – ไม่จำเป็นต้องดำเนินการใด ๆ
- notice: สภาวะที่อาจต้องได้รับการดูแล
- warn: คำเตือน
- err: ผิดพลาด
- crit: สภาพวิกฤติ
- alert: สภาวะที่ต้องการการแทรกแซงโดยทันที
- emerg: ภาวะฉุกเฉิน
หลังจากนี้จะเป็นการอธิบายถึงผลลัพธ์ต่าง ๆ ที่ได้จากไฟล์กัน
สิ่งนี่เป็นเพียงการบอก rsyslog daemon ให้บันทึกข้อความทั้งหมดที่มาจาก cron daemon ในไฟล์ชื่อ /var/log/cron เครื่องหมายดอกจัน (*) หลังจุดหมายความว่าข้อความที่มีลำดับความสำคัญทั้งหมดจะถูกบันทึก ในทำนองเดียวกัน หากมีการระบุ facility เป็นเครื่องหมายดอกจัน ก็จะหมายถึงแหล่งที่มาทั้งหมด
facility และ priority สามารถเกี่ยวข้องกันได้หลายวิธีในรูปแบบเริ่มต้น เมื่อมีการระบุลำดับความสำคัญเพียงรายการเดียวหลังจุด หมายความว่าเหตุการณ์ทั้งหมดที่เท่ากับหรือมากกว่าลำดับความสำคัญนั้นจะถูกดักไว้ ดังนั้นคำสั่งต่อไปนี้ทำให้ข้อความใด ๆ ที่มาจากระบบ mail ย่อย ที่มีลำดับความสำคัญของคำเตือนหรือสูงกว่าถูกบันทึกไว้ในไฟล์เฉพาะภายใต้ /var/log
การดำเนินการนี้จะบันทึกทุกข้อความเท่ากับหรือมากกว่าลำดับความสำคัญในการเตือน แต่จะทิ้งทุกอย่างไว้ด้านล่าง ดังนั้นข้อความที่มีข้อผิดพลาด ,อาจส่งผลร้ายแรง หรือการแจ้งเตือนต่าง ๆ ที่เกิดขึ้นจะถูกบันทึกไว้ในไฟล์นี้ด้วย นอกจากนี้การใช้เครื่องหมายเท่ากับ (=) หลังจุดจะทำให้บันทึกเฉพาะลำดับความสำคัญที่ระบุเท่านั้น ดังนั้นหากเราต้องการให้จับเฉพาะข้อความที่มาจากระบบย่อยของเมลต้องมีความระวัง
facility หลายรายการในบรรทัดเดียวกันสามารถคั่นด้วยเครื่องหมายจุลภาค แหล่งที่มาหลายรายการ (facility.priority) ในบรรทัดเดียวกันจะคั่นด้วยเครื่องหมายอัฒภาค เมื่อ action ถูกทำเครื่องหมายด้วยเครื่องหมายดอกจัน หมายถึงผู้ใช้ทั้งหมด นี่คือรายการในไฟล์ CentOS rsyslog.conf
CentOS จะบันทึกไว้ใน /var/log/secure การกำหนดค่าสำหรับ rsyslog อาจมาจากไฟล์ที่กำหนดเองอื่นๆ เช่นกัน ไฟล์องค์ประกอบต่าง ๆ แบบกำหนดเองเหล่านี้มักจะอยู่ในไดเร็กทอรีที่แตกต่างกันภายใต้ /etc/rsyslog.d ไฟล์ rsyslog.conf รวมไดเร็กทอรีเหล่านี้โดยใช้คำสั่ง $IncludeConfig
นี่คือลักษณะผลลัพธ์ที่อยู่ใน Ubuntu
ตรวจสอบเนื้อหาภายใต้ไดเร็กทอรี /etc/rsyslog.d ด้วย
สำหรับปลายทางของข้อความบันทึกไม่จำเป็นต้องเป็นไฟล์บันทึก สามารถส่งข้อความไปยังคอนโซลของผู้ใช้ได้ ในกรณีนี้ ฟิลด์การดำเนินการจะมีชื่อผู้ใช้(usernames) หากมีผู้ใช้มากกว่าหนึ่งรายต้องการรับข้อความ ชื่อผู้ใช้จะถูกคั่นด้วยเครื่องหมายจุลภาค หากจำเป็นต้องถ่ายทอดข้อความไปยังผู้ใช้ทุกคน ข้อความนั้นจะระบุด้วยเครื่องหมายดอกจัน (*) ในช่องการทำงาน
เนื่องจากการเป็นส่วนหนึ่งของระบบปฏิบัติการเครือข่าย rsyslog daemon ไม่เพียงบันทึกข้อความบันทึกในเครื่องเท่านั้น แต่ยังส่งต่อไปยังเซิร์ฟเวอร์ Linux อื่นในเครือข่ายหรือทำหน้าที่เป็นพื้นที่เก็บข้อมูลสำหรับระบบอื่นได้อีกด้วย daemon จะรับฟังข้อความบันทึกในพอร์ต UDP 514
ขั้นตอนที่ 4 – การสร้างและทดสอบข้อความบันทึกของตัวเอง
เราสามารถสร้างไฟล์บันทึกเองได้ เพื่อดำเนินการสร้างจะต้องทำดังต่อไปนี้
- เพิ่มข้อกำหนดคุณสมบัติไฟล์บันทึกในไฟล์ /etc/rsyslog.conf
- รีสตาร์ท rsyslog daemon
- ทดสอบการกำหนดค่าโดยใช้ logger utility
ในตัวอย่างต่อไปนี้ จะเพิ่มสองบรรทัดใหม่ในไฟล์ rsyslog.conf ของระบบ CentOS Linux ดังที่คุณเห็น ด้วยคำสั่งต่อไปนี้ แต่ละคำสั่งมาจากสิ่งอำนวยความสะดวกที่เรียกว่า local4 และมีลำดับความสำคัญที่แตกต่างกัน
vi /etc/rsyslog.conf
ถัดไป รีสตาร์ทเพื่อโหลดข้อมูลไฟล์ที่กำหนดค่าใหม่
/etc/init.d/rsyslog restart
หากต้องการสร้างข้อความบันทึกทันที logger application จะเรียกว่า
logger -p local4.info " This is a info message from local 4"
เมื่อดูภายใต้ไดเร็กทอรี /var/log จะแสดงให้เห็นถึงไฟล์ใหม่สองไฟล์ ขนาดของ local4info.log ไม่ใช่ศูนย์ ดังนั้นเมื่อเปิดมัน คุณจะเห็นข้อความถูกบันทึกไว้
cat /var/log/local4info.log
ขั้นตอนที่ 5 – การ Rotating log ไฟล์
เมื่อมีการเขียนข้อมูลลงในไฟล์บันทึกมากขึ้นเรื่อยๆ ข้อมูลเหล่านั้นก็ใหญ่ขึ้นเรื่อยๆ สิ่งนี้ทำให้เกิดปัญหาด้านประสิทธิภาพมากขึ้น นอกจากนี้การจัดการไฟล์ยังยุ่งยากอีกด้วย ทำให้ Linux ใช้แนวคิดในการหมุนเวียนไฟล์บันทึกแทนที่จะล้างข้อมูลหรือลบทิ้ง เมื่อหมุนเวียนบันทึก ไฟล์บันทึกใหม่จะถูกสร้างขึ้น และไฟล์บันทึกเก่าจะถูกเปลี่ยนชื่อและบีบอัดหรือไม่ก็ได้ ไฟล์บันทึกอาจมีเวอร์ชันเก่าเหลืออยู่หลายเวอร์ชันที่ออนไลน์อยู่ ไฟล์เหล่านี้จะย้อนกลับไปในช่วงระยะเวลาหนึ่งและจะแสดงถึงงานที่ค้างอยู่ เมื่อสร้าง Backlogs ครบตามจำนวนที่กำหนด การหมุนเวียนบันทึกใหม่จะทำให้ไฟล์บันทึกที่เก่าที่สุดถูกลบ
ไฟล์การกำหนดค่า logrotate
เช่นเดียวกับ rsyslog logrotate ยังขึ้นอยู่กับไฟล์กำหนดค่าและชื่อของไฟล์นี้คือ logrotate.conf มันอยู่ภายใต้ /etc
cat /etc/logrotate.conf
ตามค่าเริ่มต้น ไฟล์บันทึกจะถูกหมุนเวียนทุกสัปดาห์โดยเหลือสี่ไฟล์ที่ค้างอยู่ในสถานะออนไลน์ในแต่ละครั้ง เมื่อโปรแกรมทำงาน ไฟล์บันทึกใหม่ที่ว่างเปล่าจะถูกสร้างขึ้น และไฟล์เก่าจะถูกบีบอัด (เป็นทางเลือก) ข้อยกเว้นเพียงอย่างเดียวคือสำหรับไฟล์ wtmp และ btmp wtmp ติดตามการเข้าสู่ระบบ และ btmp ติดตามความพยายามเข้าสู่ระบบที่ไม่ถูกต้อง ไฟล์บันทึกทั้งสองนี้จะต้องหมุนเวียนทุกเดือน และจะไม่มีการส่งคืนข้อผิดพลาดหากพบไฟล์ wtmp หรือ btmp ก่อนหน้านี้
เนื้อหาของ rsyslog แสดงวิธีนำไฟล์บันทึกกลับมาใช้ซ้ำจำนวนหนึ่ง
cat /etc/logrotate.d/rsyslog
อย่างที่เห็น ไฟล์ข้อความจะถูกเริ่มต้นใหม่ทุกวันโดยเก็บบันทึกออนไลน์เป็นเวลา 4 วัน ไฟล์บันทึกอื่นๆ จะถูกหมุนเวียนทุกสัปดาห์ สิ่งที่น่าสังเกตก็คือคำสั่งหลังการหมุนเวียน นี่เป็นการระบุการดำเนินการที่เกิดขึ้นหลังจากการหมุนเวียนบันทึกทั้งหมดเสร็จสิ้น
ขั้นตอนที่ 6 – ทดสอบการหมุน (logrotate)
logrotate สามารถเรียกใช้ด้วยตนเองเพื่อรีไซเคิลไฟล์ตั้งแต่หนึ่งไฟล์ขึ้นไป และในการทำลักษณะนี้ต้องระบุไฟล์การกำหนดค่าที่เกี่ยวข้องเป็น argument ของคำสั่ง หากต้องการดูวิธีการทำงาน ต่อไปนี้เป็นรายการไฟล์บันทึกบางส่วนภายใต้ไดเร็กทอรี /var/log ในเซิร์ฟเวอร์ CentOS
ls -l /var/log
เนื้อหาบางส่วนของไฟล์ logrotate.conf มีลักษณะดังต่อไปนี้
cat /etc/logrotate.conf
ถัดไป รันคำสั่ง logrotate
logrotate -fv /etc/logrotate.conf
ข้อความจะถูกเลื่อนไปเมื่อมีการสร้างไฟล์ใหม่ หรือพบข้อผิดพลาด ฯลฯ เมื่อเรียบร้อยแล้วจะตรวจสอบไฟล์เมล ไฟล์ที่ปลอดภัย หรือข้อความใหม่ ได้
ls -l /var/log/mail*
ls -l /var/log/messages*
ls -l /var/log/secure*
จากรูปข้างต้น ไฟล์บันทึกใหม่ทั้งสามไฟล์ได้ถูกสร้างขึ้นแล้ว ไฟล์บันทึกเมลและไฟล์ที่ปลอดภัยยังคงว่างเปล่า แต่ไฟล์ข้อความใหม่มีข้อมูลบางส่วนอยู่แล้ว