จัดการข้อความบันทึกภายใต้ Systemd โดยใช้ Journalctl [คู่มือที่ครอบคลุม]
Systemd คือระบบที่ล้ำสมัยและตัวจัดการบริการสำหรับระบบ Linux: การแทนที่ init daemon ที่มีจุดประสงค์เพื่อเริ่มกระบวนการแบบขนานเมื่อบูตระบบ ขณะนี้ได้รับการสนับสนุนในการกระจายกระแสหลักในปัจจุบันจำนวนหนึ่ง รวมถึง Fedora, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS เป็นต้น
ก่อนหน้านี้ เราได้อธิบายเรื่องราวเบื้องหลัง 'init' และ 'systemd'; โดยที่เราพูดคุยกันว่า daemons ทั้งสองคืออะไร ทำไมทางเทคนิคจึงจำเป็นต้องแทนที่ 'init' ด้วย 'systemd' รวมถึงคุณลักษณะหลักของ systemd
ข้อดีหลักประการหนึ่งของ systemd เหนือระบบ init ทั่วไปอื่นๆ คือ การสนับสนุนการจัดการระบบแบบรวมศูนย์และการบันทึกกระบวนการโดยใช้เจอร์นัล ในบทความนี้ เราจะเรียนรู้วิธีจัดการและดูข้อความบันทึกภายใต้ systemd โดยใช้คำสั่ง journalctl ใน Linux
ข้อสำคัญ: ก่อนที่จะดำเนินการเพิ่มเติมในคู่มือนี้ คุณอาจต้องการเรียนรู้วิธีจัดการบริการและหน่วย 'Systemd' โดยใช้คำสั่ง 'Systemctl' รวมถึงสร้างและเรียกใช้ใหม่ หน่วยบริการใน systemd โดยใช้เชลล์สคริปต์ใน Linux อย่างไรก็ตาม หากคุณพอใจกับสิ่งที่กล่าวมาทั้งหมด โปรดอ่านต่อ
การกำหนดค่า Journald สำหรับการรวบรวมข้อความบันทึกภายใต้ Systemd
journald เป็น daemon ที่รวบรวมและเขียนรายการบันทึกประจำวันจากทั้งระบบ โดยพื้นฐานแล้วคือข้อความบูต ข้อความจากเคอร์เนลและจาก syslog หรือแอปพลิเคชันต่างๆ และจะจัดเก็บข้อความทั้งหมดไว้ในตำแหน่งศูนย์กลาง - ไฟล์เจอร์นัล
คุณสามารถควบคุมพฤติกรรมของ journald ผ่านทางไฟล์การกำหนดค่าเริ่มต้น: /etc/systemd/journald.conf ซึ่งสร้างขึ้นในเวลารวบรวม ไฟล์นี้มีตัวเลือกที่คุณสามารถเปลี่ยนค่าเพื่อให้เหมาะสมกับข้อกำหนดสภาพแวดล้อมในพื้นที่ของคุณ
ด้านล่างนี้เป็นตัวอย่างลักษณะของไฟล์ ดูโดยใช้คำสั่ง cat
cat /etc/systemd/journald.conf
See journald.conf(5) for details.
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
โปรดทราบว่าการติดตั้งแพ็คเกจต่างๆ และใช้การแยกการกำหนดค่าใน /usr/lib/systemd/*.conf.d/ และการกำหนดค่ารันไทม์สามารถพบได้ใน /run/systemd/journald.conf d/*.conf ซึ่งคุณอาจไม่จำเป็นต้องใช้
เปิดใช้งานการจัดเก็บข้อมูลบันทึกข้อมูลบนดิสก์
การกระจาย Linux จำนวนมากรวมถึง Ubuntu และอนุพันธ์เช่น Linux Mint ไม่ได้เปิดใช้งานการจัดเก็บข้อความบูตบนดิสก์แบบถาวรตามค่าเริ่มต้น
คุณสามารถเปิดใช้งานได้โดยตั้งค่าตัวเลือก “ที่เก็บข้อมูล ” เป็น “ถาวร ” ดังที่แสดงด้านล่าง สิ่งนี้จะสร้างไดเร็กทอรี /var/log/journal และไฟล์เจอร์นัลทั้งหมดจะถูกเก็บไว้ข้างใต้
sudo vi /etc/systemd/journald.conf
OR
sudo nano /etc/systemd/journald.conf
[Journal]
Storage=persistent
สำหรับการตั้งค่าเพิ่มเติม ให้ค้นหาความหมายของตัวเลือกทั้งหมดที่ควรกำหนดค่าในส่วน “[Journal]” โดยพิมพ์
man journald.conf
การตั้งเวลาระบบให้ถูกต้องโดยใช้คำสั่ง Timedatectl
เพื่อการจัดการบันทึกที่เชื่อถือได้ภายใต้ systemd ที่ใช้บริการเจอร์นัล ตรวจสอบให้แน่ใจว่าการตั้งค่าเวลารวมถึงเขตเวลานั้นถูกต้องบนระบบ
หากต้องการดูการตั้งค่าวันที่และเวลาปัจจุบันในระบบของคุณ ให้พิมพ์
timedatectl
OR
timedatectl status
Local time: Thu 2017-06-15 13:29:09 EAT
Universal time: Thu 2017-06-15 10:29:09 UTC
RTC time: Thu 2017-06-15 10:29:09
Time zone: Africa/Kampala (EAT, +0300)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
หากต้องการตั้งค่าเขตเวลาที่ถูกต้องและเวลาของระบบ ให้ใช้คำสั่งด้านล่าง
sudo timedatectl set-timezone Africa/Kampala
sudo timedatectl set-time “13:50:00”
การดูข้อความบันทึกโดยใช้คำสั่ง Journalctl
journalctl เป็นโปรแกรมอรรถประโยชน์ที่ใช้เพื่อดูเนื้อหาของ systemd Journal (ซึ่งเขียนโดยบริการ Journald)
หากต้องการแสดงบันทึกที่รวบรวมทั้งหมดโดยไม่มีการกรอง ให้พิมพ์
journalctl
-- Logs begin at Wed 2017-06-14 21:56:43 EAT, end at Thu 2017-06-15 12:28:19 EAT
Jun 14 21:56:43 tecmint systemd-journald[336]: Runtime journal (/run/log/journal
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuset
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpu
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuacct
Jun 14 21:56:43 tecmint kernel: Linux version 4.4.0-21-generic (buildd@lgw01-21)
Jun 14 21:56:43 tecmint kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-
Jun 14 21:56:43 tecmint kernel: KERNEL supported cpus:
Jun 14 21:56:43 tecmint kernel: Intel GenuineIntel
Jun 14 21:56:43 tecmint kernel: AMD AuthenticAMD
Jun 14 21:56:43 tecmint kernel: Centaur CentaurHauls
Jun 14 21:56:43 tecmint kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x01: 'x87 flo
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x02: 'SSE reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x04: 'AVX reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Enabled xstate features 0x7, context si
Jun 14 21:56:43 tecmint kernel: x86/fpu: Using 'eager' FPU context switches.
Jun 14 21:56:43 tecmint kernel: e820: BIOS-provided physical RAM map:
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000000000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000090000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001ff
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020000000-0x00000000201
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020200000-0x00000000400
ดูข้อความบันทึกตามบูท
คุณสามารถแสดงรายการหมายเลขการบู๊ต (สัมพันธ์กับการบู๊ตปัจจุบัน) ID และการประทับเวลาของข้อความแรกและสุดท้ายที่เกี่ยวข้องกับการบู๊ตด้วยตัวเลือก --list-boots
journalctl --list-boots
-1 9fb590b48e1242f58c2579defdbbddc9 Thu 2017-06-15 16:43:36 EAT—Thu 2017-06-15 1
0 464ae35c6e264a4ca087949936be434a Thu 2017-06-15 16:47:36 EAT—Thu 2017-06-15 1
หากต้องการดูรายการบันทึกประจำวันจากการบูตปัจจุบัน (หมายเลข 0) ให้ใช้สวิตช์ -b
เช่นนี้ (เหมือนกับเอาต์พุตตัวอย่างด้านบน)
journalctl -b
และหากต้องการดูเจอร์นัลจากการบูตครั้งก่อน ให้ใช้ตัวชี้สัมพันธ์ -1
พร้อมด้วยตัวเลือก -b
ดังด้านล่าง
journalctl -b -1
หรือใช้รหัสการบูตเช่นนี้
journalctl -b 9fb590b48e1242f58c2579defdbbddc9
การกรองข้อความบันทึกตามเวลา
หากต้องการใช้เวลาในรูปแบบเวลามาตรฐานสากล (UTC) ให้เพิ่มตัวเลือก --utc
ดังต่อไปนี้
journalctl --utc
เพื่อดูรายการทั้งหมดตั้งแต่วันที่และเวลาที่ระบุ เช่น วันที่ 15 มิถุนายน 2560 เวลา 08:15 น. พิมพ์คำสั่งนี้
journalctl --since "2017-06-15 08:15:00"
journalctl --since today
journalctl --since yesterday
การดูข้อความบันทึกล่าสุด
หากต้องการดูข้อความบันทึกล่าสุด (10 โดยค่าเริ่มต้น) ให้ใช้แฟล็ก -n
ดังที่แสดงด้านล่าง
journalctl -n
journalctl -n 20
การดูข้อความบันทึกที่สร้างโดยเคอร์เนล
หากต้องการดูเฉพาะข้อความเคอร์เนล ซึ่งคล้ายกับเอาต์พุตคำสั่ง dmesg คุณสามารถใช้แฟล็ก -k
journalctl -k
journalctl -k -b
journalctl -k -b 9fb590b48e1242f58c2579defdbbddc9
การดูข้อความบันทึกที่สร้างโดยหน่วย
หากต้องการดูรายการบันทึกประจำวันทั้งหมดสำหรับหน่วยใดหน่วยหนึ่ง ให้ใช้สวิตช์ -u
ดังนี้
journalctl -u apache2.service
หากต้องการลดค่าการบูตปัจจุบันเป็นศูนย์ ให้พิมพ์คำสั่งนี้
journalctl -b -u apache2.service
หากต้องการแสดงบันทึกจากการบู๊ตครั้งก่อน ให้ใช้สิ่งนี้
journalctl -b -1 -u apache2.service
ด้านล่างนี้เป็นคำสั่งที่มีประโยชน์อื่นๆ:
journalctl -u apache2.service
journalctl -u apache2.service --since today
journalctl -u apache2.service -u nagios.service --since yesterday
การดูข้อความบันทึกที่สร้างขึ้นโดยกระบวนการ
หากต้องการดูบันทึกที่สร้างโดยกระบวนการเฉพาะ ให้ระบุ PID เช่นนี้
journalctl _PID=19487
journalctl _PID=19487 --since today
journalctl _PID=19487 --since yesterday
การดูข้อความบันทึกที่สร้างโดยผู้ใช้หรือ ID กลุ่ม
หากต้องการดูบันทึกที่สร้างโดยผู้ใช้หรือกลุ่มใดกลุ่มหนึ่ง ให้ระบุรหัสผู้ใช้หรือกลุ่มในลักษณะนี้
journalctl _UID=1000
journalctl _UID=1000 --since today
journalctl _UID=1000 -b -1 --since today
การดูบันทึกที่สร้างโดยไฟล์
หากต้องการแสดงบันทึกทั้งหมดที่สร้างโดยไฟล์ (อาจเป็นไฟล์เรียกทำงาน) เช่น ไฟล์เรียกทำงาน D-Bus หรือไฟล์เรียกทำงาน bash เพียงพิมพ์
journalctl /usr/bin/dbus-daemon
journalctl /usr/bin/bash
การดูข้อความบันทึกตามลำดับความสำคัญ
คุณยังสามารถกรองเอาต์พุตตามลำดับความสำคัญของข้อความหรือช่วงลำดับความสำคัญได้โดยใช้แฟล็ก -p
ค่าที่เป็นไปได้คือ: 0 – เกิดขึ้นใหม่, 1 – แจ้งเตือน, 2 – คริติคอล, 3 – ผิดพลาด, 4 – คำเตือน, 5 – ประกาศ, 6 – ข้อมูล, 7 – ดีบัก):
journalctl -p err
หากต้องการระบุช่วง ให้ใช้รูปแบบด้านล่าง (โผล่ขึ้นมาเพื่อเตือน)
journalctl -p 1..4
OR
journalctl -p emerg..warning
ดูข้อความบันทึกแบบเรียลไทม์
คุณสามารถดูบันทึกในขณะที่เขียนด้วยตัวเลือก -f
(คล้ายกับฟังก์ชัน tail -f)
journalctl -f
การจัดการการจัดรูปแบบการแสดงผลวารสาร
หากคุณต้องการควบคุมการจัดรูปแบบเอาต์พุตของรายการบันทึกประจำวัน ให้เพิ่มแฟล็ก -o
และใช้ตัวเลือกเหล่านี้: cat, ส่งออก, json, json-pretty, json-sse, short, short-iso, สั้นซ้ำซาก, สั้นแม่นยำและละเอียด (ตรวจสอบความหมายของตัวเลือกในหน้าคน:
ตัวเลือก cat จะแสดงข้อความจริงของรายการบันทึกแต่ละรายการโดยไม่มีข้อมูลเมตาใดๆ (การประทับเวลา และอื่นๆ)
journalctl -b -u apache2.service -o cat
การจัดการเจอร์นัลบนระบบ
หากต้องการตรวจสอบความสอดคล้องภายในไฟล์เจอร์นัล ให้ใช้ตัวเลือก --verify
หากทุกอย่างเรียบร้อยดี ผลลัพธ์ควรระบุผ่าน
journalctl --verify
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal
491f68: Unused data (entry_offset==0)
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000003184-000551f9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000001fc8-000551f5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000d4f-000551f1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000001-000551f01cfcedff.journal
การลบไฟล์เจอร์นัลเก่า
คุณยังสามารถแสดงการใช้งานดิสก์ปัจจุบันของไฟล์เจอร์นัลทั้งหมดด้วยตัวเลือก --disk-usage
โดยแสดงผลรวมของการใช้ดิสก์ของไฟล์เจอร์นัลที่เก็บถาวรและใช้งานอยู่ทั้งหมด:
journalctl --disk-usage
หากต้องการลบไฟล์เจอร์นัลเก่า (เก็บถาวร) ให้รันคำสั่งด้านล่าง:
sudo journalctl --vacuum-size=50M #delete files until the disk space they use falls below the specified size
sudo journalctl --vacuum-time=1years #delete files so that all journal files contain no data older than the specified timespan
sudo journalctl --vacuum-files=4 #delete files so that no more than the specified number of separate journal files remain in storage location
หมุนเวียนไฟล์วารสาร
สุดท้ายแต่ไม่ท้ายสุด คุณสามารถสั่งให้เจอร์นัลหมุนไฟล์เจอร์นัลด้วยตัวเลือก --rotate
โปรดทราบว่าคำสั่งนี้จะไม่ส่งคืนจนกว่าการดำเนินการหมุนจะเสร็จสิ้น:
sudo journalctl --rotate
สำหรับคู่มือการใช้งานและตัวเลือกเชิงลึก โปรดดูที่หน้า man page ของ Journalctl ดังต่อไปนี้
man journalctl
ตรวจสอบบทความที่เป็นประโยชน์
- การจัดการกระบวนการและบริการการเริ่มต้นระบบ (SysViit, Systemd และ Upstart)
- Petiti – เครื่องมือวิเคราะห์บันทึกโอเพ่นซอร์สสำหรับ Linux SysAdmins
- วิธีการตั้งค่าและจัดการการหมุนบันทึกโดยใช้ Logrotate ใน Linux
- lnav – ดูและวิเคราะห์บันทึก Apache จาก Linux Terminal
แค่นั้นแหละสำหรับตอนนี้ ใช้คำติชมจากด้านล่างเพื่อถามคำถามหรือเพิ่มความคิดเห็นเกี่ยวกับหัวข้อนี้