ค้นหาเว็บไซต์

จัดการข้อความบันทึกภายใต้ 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

ตรวจสอบบทความที่เป็นประโยชน์

  1. การจัดการกระบวนการและบริการการเริ่มต้นระบบ (SysViit, Systemd และ Upstart)
  2. Petiti – เครื่องมือวิเคราะห์บันทึกโอเพ่นซอร์สสำหรับ Linux SysAdmins
  3. วิธีการตั้งค่าและจัดการการหมุนบันทึกโดยใช้ Logrotate ใน Linux
  4. lnav – ดูและวิเคราะห์บันทึก Apache จาก Linux Terminal

แค่นั้นแหละสำหรับตอนนี้ ใช้คำติชมจากด้านล่างเพื่อถามคำถามหรือเพิ่มความคิดเห็นเกี่ยวกับหัวข้อนี้