Master journalctl: pahami log systemd

Systemd adalah service pengelolaan alat baru. Dibuat awalnya oleh Red Hat, memungkinkan untuk mengelola service dengan lebih baik melalui proses terpusat yang memantau dan meluncurkan service sesuai kebutuhan. Tetapi systemd juga mencakup sistem penampung, sistem cron, cara untuk menyediakan direktori sementara ke service dengan cara yang aman dan juga sistem pencatatan – di situlah kita akan fokus di sini.

Memahami log itu penting: jika Anda pernah jatuh di server yang memiliki bug atau diretas, umumnya satu-satunya cara Anda untuk memahami apa yang terjadi adalah melalui log. Aplikasi utama yang akan kita gunakan adalah journalctl maka nama artikelnya. Jadi dengarkan baik-baik karena pada hari yang tepat, Anda mungkin senang mengetahui cara kerjanya.

Di mana log systemd disimpan? Dan dalam format apa itu disimpan?

Kami akan mengambil asumsi Anda memiliki sistem normal, karena systemd dapat dikustomisasi untuk berada di tempat yang luar biasa. Selain itu, beberapa distribusi Linux seperti Ubuntu 16.04 menonaktifkan logging persisten secara default, yang mencegah systemd melakukan tugasnya dengan benar. Jika Anda memiliki distribusi seperti itu, edit file /etc/systemd/journald.conf, ubah Storage=auto menjadi Storage=persistent dan terakhir, reboot.

Jadi, Anda biasanya akan menemukan file log systemd di /var/log/journal. Sistem penjurnalan itu sendiri merupakan service yang disebut sistem-jurnal.service. Mari kita coba daftar file di direktori ini:

# ls /var/log/journal/ -R
/var/log/journal/:
15e43c1734090ac7fbea6b40fcd99d31
 
/var/log/journal/15e43c1734090ac7fbea6b40fcd99d31:
[email protected]~
[email protected]410099a19.journal
[email protected]~
[email protected]fe36ac2810e0.journal
user-1000.journal
[lots of other files like the ones above...]

Karena saya ingin Anda terus membaca, saya harus mempersingkat output karena berisi banyak file (dalam contoh saya, lebih dari 60 file), maaf tentang itu! Tergoda untuk membukanya mungkin?

# head --bytes=512 /var/log/journal/15e43c1734090ac7fbea6b40fcd99d31/[email protected]
b58569fe1fb13e9dbc1b0e0-0000000000000001-0007fe36ac2810e0.journal
?s,q?n/FLz???Ulz?l?]????
?_?b???z????o?y1KN ?i?eO??W?u?  ?=?x0?L?d?7??X4n#?e? d3l?
p??o|MFO:?!qs?.tK??R???1?|5  ????$?g??#?S??;??B7???????t???Y????mN?q????ZQ
?Yv?e?????BD?C?? wF??d|
?2?? 7???????[??Un?=8????c?2=p?&?"   ?0
????*????_??  ???
5?????yk?G? ?6?|??u??w: #12?Y??
3      TU;???'?jX??2?x`?=??[[email protected]
[email protected]?_?>??3S???,lR?.?$?g?L???s?/E??M1??q???

Hei, lihat, itu tidak benar-benar terlihat seperti file log biasa yang Anda lihat, kan? Jangan khawatir, file ini tidak rusak, Anda baru saja menemukan aspek systemd: systemd menyimpan file dalam format biner. Itu sebabnya ini sekecil mungkin: data terstruktur seperti waktu atau lokasi disimpan langsung dalam biner, yang umumnya membutuhkan lebih sedikit byte daripada teks. Tapi itu bukan satu-satunya alasan.

systemd tidak hanya menyimpan baris log. Tujuannya adalah untuk membuat pemantauan dan eksplorasi log lebih mudah. Untuk membantu tugas ini, pesan log sebenarnya adalah baris teks yang disertai dengan data seperti tingkat keparahan log (peringatan, error, dll.), atau bahkan bidang yang hanya berguna untuk aplikasi Anda (misalnya, URL diminta).

# journalctl --output=verbose --all
PRIORITY=6
_UID=0
_GID=0
_CAP_EFFECTIVE=3fffffffff
_BOOT_ID=ee4cc2ce7e8273aaffb5fc59c873ce7b
_MACHINE_ID=bc422e0feaab64bb7dd218c24e6830e5
_HOSTNAME=linux
SYSLOG_FACILITY=3
SYSLOG_IDENTIFIER=systemd
UNIT=dnf-makecache.service
_TRANSPORT=journal
_PID=1
_COMM=systemd
_EXE=/usr/lib/systemd/systemd
_CMDLINE=/usr/lib/systemd/systemd --switched-root --system --deserialize 76
_SYSTEMD_CGROUP=/init.scope
_SYSTEMD_UNIT=init.scope
_SYSTEMD_SLICE=-.slice
_SELINUX_CONTEXT=system_u:system_r:init_t:s0
CODE_FILE=src/core/job.c
CODE_LINE=795
CODE_FUNCTION=job_log_status_message
MESSAGE_ID=a76e08846f5f0971371dbb11126e62e1
MESSAGE=Started dnf makecache.
# journalctl --catalog --lines=3000 --pager-end "_TRANSPORT=kernel"    RESULT=done
_SOURCE_REALTIME_TIMESTAMP=1532886335471422

Saya telah memberi tahu Anda bahwa ada banyak bidang (di sini ada 25 bidang, atau 29 menghitung cap waktu), semua cuplikan di atas hanya untuk satu pesan log! Manfaat besar adalah Anda dapat menjalankan pencarian dengan memfilter bidang apa pun dalam pesan log ini. Ini benar-benar memungkinkan Anda untuk pemfilteran tingkat lanjut.

Salah satu filter paling jelas yang Anda inginkan adalah memfilter menurut service. Seperti yang Anda lihat di atas, ada bidang UNIT sehingga Anda dapat dengan mudah memfilter untuk mendapatkan hanya pesan log dari satu service. Saya akan memberi tahu Anda lebih banyak tentang itu nanti.

Tetapi jumlah data ini juga berarti sesuatu yang lain: dalam hampir semua kasus, Anda tidak akan pernah membuka file log secara manual dan Anda tidak akan pernah menyentuh folder /var/log/journal. Anda akan menggunakan journalctl untuk tugas apa pun yang terkait dengan logging. Tidak ada rotasi log seperti itu, semuanya diatur oleh waktu pesan log.

Selain itu, jumlah bidang akan tergantung pada seberapa baik integrasi systemd dalam aplikasi Anda. Semakin banyak bidang yang berisi pesan log, semaki
n baik. Untuk service sistem dasar, systemd sudah melakukan integrasi yang baik tetapi untuk aplikasi dan service lain, kualitas integrasi sangat bervariasi. Biasanya, ini akan menjadi lebih baik seiring waktu karena orang terbiasa dengan systemd.

Oke, sekarang saatnya menemukan fitur journalctl.

Perintah yang paling sering digunakan untuk journalctl

Perintah pertama yang mungkin ingin Anda lihat adalah perintah yang menunjukkan log kernel Linux. Ya, systemd juga menangani penyimpanan log kernel, jadi Anda juga bisa mendapatkan log dari boot sebelumnya. Berikut adalah perintahnya:

# journalctl --catalog --lines=3000 --pager-end "_TRANSPORT=kernel"

Ini menunjukkan Anda pager di mana Anda dapat melihat pesan terakhir. Anda dapat menggulir hingga 3.000 baris terakhir menggunakan tombol panah (↑ / ) atau Page Up / Page Down. Flag –catalog menginstruksikan journalctl untuk menunjukkan konteks di sekitar baris log, seperti reboot komputer atau, dalam konteks lain, service berhenti/mulai. Saya selalu menempatkan tanda ini karena konteks selalu penting, ini membantu untuk mengetahui di mana situasi baris log muncul, sehingga Anda dapat menebak mengapa Anda mendapatkan baris log ini.

Sekarang, mungkin Anda hanya ingin melihat baris log dari boot saat ini:

# journalctl --catalog --lines=35000 --pager-end --boot "_TRANSPORT=kernel"

Perhatikan argumen command line –boot berfungsi di semua situasi, tidak hanya dengan log kernel. Jika Anda lebih suka memulai dari awal:

# journalctl --catalog --boot "_TRANSPORT=kernel"

Saya tidak tahu apakah itu kasus Anda, tetapi saya sudah cukup dengan log kernel! Dan bagaimana dengan gambaran umum engine Anda?

# journalctl --catalog --lines=3000 --pager-end

Wow, ada banyak hal yang terjadi di sistem Anda! Sedikit penyaringan akan sangat membantu di sini. Salah satu filter yang paling sering digunakan adalah mencocokkan service tertentu (seperti server SSH atau server HTTP Anda), nama file unit systemd untuk service SSH adalah sshd.service, jadi:

# journalctl --catalog --lines=3000 --pager-end --unit=sshd.service

Itu keren, bukan? Yah itu hanya dapat digunakan jika Anda tahu nama servicenya – tetapi dalam banyak kasus, Anda tidak tahu nama service itu. Jika Anda berada dalam situasi seperti itu, Anda mungkin menginginkan daftar service, deskripsi, dan statusnya:

# systemctl list-units --type=service

Oke, masalah ini sekarang terpecahkan. Namun terkadang, Anda memiliki pesan error yang Anda dapatkan dari sistem eksternal seperti situs web Anda sendiri atau dari aplikasi di desktop Anda. Jadi, Anda mungkin ingin mencari kata atau kalimat tertentu dalam pesan log. Sejak systemd v237, sekarang mungkin.

Di journalctl, pencarian tidak peka huruf besar/kecil jika kata yang Anda cari semuanya dalam huruf kecil. Jadi jika Anda mencari port kata, itu juga akan mencari port kata dengan huruf kapital. Sebuah contoh:

# journalctl --catalog --lines=3000 --pager-end --grep="port"

Sekarang, jika Anda mencari kata seperti CPU, itu hanya akan mencari CPU dengan huruf besar semua, tidak akan mencari cpu.

# journalctl --catalog --lines=3000 --pager-end --grep="CPU"

Anda ingat pesan error dari sistem eksternal? Umumnya, pesan-pesan ini berisi stempel waktu. Untuk memfilter pesan log, Anda mungkin ingin menggunakan stempel waktu itu. journalctl dapat mencantumkan Anda semua pesan log sejak tanggal dan waktu tertentu dengan argumen –sejak:

# journalctl --catalog --since="2018-07-30 09:30:00"

Jika sistem eksternal itu jauh atau menggunakan stempel waktu UTC, Anda akan ingin memfilter berdasarkan tanggal dan waktu UTC dan menampilkan di terminal stempel waktu UTC sehingga Anda tidak perlu mengonversinya di kepala Anda, yang cenderung menjadi benar-benar membingungkan. Untuk melakukannya, Anda harus menambahkan UTC setelah string waktu dalam argumen –sejak. Anda kemudian perlu menambahkan tanda –utc. Jadi, misalnya:

# journalctl --catalog --since="2018-07-30 10:45:00 UTC" --utc

Perhatikan bahwa Anda dapat menggunakan flag –utc saja, dalam hal ini pada dasarnya akan menampilkan semua tanggal dan waktu dalam zona waktu UTC.

# journalctl --catalog --lines=3000 --pager-end --utc

Log dikelola lebih baik dengan journalctl

Seperti yang Anda lihat dengan semua perintah sebelumnya, penjurnalan systemd membuat pemfilteran dan debugging lebih mudah karena Anda dapat memilih melalui semua baris log menggunakan satu perintah, journalctl. Beberapa dari Anda mungkin tahu zaman kuno di mana Anda harus membuka setiap file secara manual di /var/log untuk mendapatkan gambaran umum tentang masalah dan apa yang terjadi. Dengan semua tips yang Anda pelajari di sini, Anda a
kan memiliki alat yang solid untuk melihat pesan log Anda seperti yang ANDA inginkan.

Related Posts