9.06.2020

journalctl ile loglara erişmek

systemd ile gelen başka bir araç da journalctl komutu. Varsayılan olarak çıkışını less komutu ile sayfalandırıyor (tüm less kısayolları geçerli). Sayfalama yapmamaması için --no-pager kullanılabilir, ama bu ciddi miktarda çıktı üreteceğinden sadece --no-pager ile kullanmak mantıklı/pratik değil. Hiçir parametre kullanmadan çalıştırınca varsayılan olarak en eski kayıtlar yukarıda, aşağıya gittikçe daha yenileri gösterecek şekilde listeleme yapar.

$ journalctl
-- Logs begin at Mon 2018-05-21 18:00:03 +03, end at Tue 2020-06-09 17:38:48 +03. --
May 21 20:59:27 localhost.localdomain kernel: Linux version 4.16.3-301.fc28.x86_64 (mockbuild@bkerne>
May 21 20:59:27 localhost.localdomain kernel: Command line: BOOT_IMAGE=/vmlinuz-4.16.3-301.fc28.x86_

Varsayılan olarak tarih kısmında yıl gösterilmez. Tarih bilgisini göstermek için --output=short-iso parametresi kullanılabilir.

$ journalctl -b --output=short-iso
2020-04-09T10:23:01+0000 localhost.localdomain solr[860]: Started Solr server on port 8983 (pid=999). Happy searching!
2020-04-09T10:23:01+0000 localhost.localdomain su[866]: pam_unix(su-l:session): session closed for user solr


Sırayı tersine çevirmek (en yeni kayıtlar yukarıda, aşağıya doğru daha eski kayıtları gösterecek şekilde) göstermesi için -r (reverse) kullanılabilir. Bu durumda yine sayfalama yapacaktır.

Eğer kayıtlar silinmemişse işletim sisteminin kurulduğu ilk günden bugüne kadar kayıtları gösterecektir. Bunun yerine herhangi bir tarihten sonrası, ya da herhangi bir açılıştan sonrası gösterilebilir. Öncelikle sistemdeki açılışları bilmek için tüm açılışları --list-boots parmetresiyle görebiliriz.

$ journalctl --list-boots
-63 b98547c039284c9dbd71c029316c09e4 Mon 2018-05-21 20:59:27 +03—Mon 2018-05-21 18:17:11 +03
-62 160231536b4148cfb98ed0b37a301813 Wed 2018-07-04 16:07:22 +03—Wed 2018-07-04 16:46:48 +03
-61 0e8d3a7031924ed3a4a8b47fdd30107e Wed 2018-08-15 16:07:10 +03—Wed 2018-08-15 16:27:05 +03
-60 ccf2109a7ec54f2a949eb156a95adb79 Tue 2018-09-25 14:27:04 +03—Wed 2018-09-26 08:13:28 +03
-59 37577ce61f3a44ac96c32ee35824263e Mon 2018-10-15 09:40:47 +03—Mon 2018-10-15 13:17:31 +03
-58 d9805c69dc0d4a72a185e256a284a299 Mon 2018-10-22 09:25:03 +03—Mon 2018-10-22 12:08:36 +03

Burada listelenecek açılışlar last reboot komutuyla eşleşir. Yukarıdaki satır (en küçün negatif ID) en eski açılış olup şu anki açılış 0 ID'si ile en altta listelenir. ID'si ile herhangi bir açılışın kayıtlarına erişmek için örneğin -b -63 şeklinde en eski açılışa ait loglar listelenebilir. Mevcut açılış için -b 0 ya da sadece -b kullanılabilir.

Kayıtların içinde anahtar kelimesi araması yapmak için bu komutun çıktısı grep'e aktarılabileceği gibi -g parametresi ile bu iş arka planda da yapılabilir (büyük küçük harf duyarlı olmadan, aynen grep ile -i kullanılmış gibi).

$ journalctl -b -g usb

Sadece bir birimin (unit) ya da hizmetin kayıtlarını görmek için -u ile birlikte birim adı yazılabilir.

$ journalctl -b -u lightdm

Unit isimleri için

$ systemctl list-units

kullanılabilir.

Sadece çekirdek (kernel) kayıtları için -k anahtarı kullanılır.

$ journalctl -b -k
Haz 09 16:59:19 localhost.localdomain kernel: Linux version 5.3.16-300.fc31.x86_64 (mockbuild>
Haz 09 16:59:19 localhost.localdomain kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5>
Haz 09 16:59:19 localhost.localdomain kernel: Disabled fast string operations

Çıkış formatını değiştirmek için -o ile birlikte short, verbose, json, json-pretty ve cat kullanılabilir.

$ journalctl -b -u lightdm -o cat
Starting Light Display Manager...
Started Light Display Manager.
pam_unix(lightdm-greeter:session): session opened for user lightdm by (uid=0)
gkr-pam: unable to locate daemon control file

Tüm journalctl logları /var/log/journal konumunda depolanır. journald hizmetinin ayarları da /etc/systemd/journald.conf dosyasında tutulur. Örneğin logları dosya boyutu kısıtlaması olmaksızın tutmak için başındaki # sembolü kaldırılarak Storage=persistent yapılabilir. Bundan sonra systemd-journald unit'i tekrar başlatılmalıdır.

$ sudo systemd restart systemd-journald

Mevcut boyutlar hakkında bilgi için

$ journalctl -b -u systemd-journald

ve

$ journalctl --disk-usage

kullanılabileceği gibi

$ du /var/log/journal -h

de kullanılabilir. Çok yer kaplayan logları silerek yer kazanmak istersek

$ journalctl --vacuum-size=2G

ya da

$ journalctl --vacuum-time=1years

ve hatta

$ journalctl --vacuum-files=10

kullanılabilir. Ayrıca conf dosyasındaki şu ayarlar da işe yarayabilir:

Storage: persistent ise geriye dönük kayıtlar hatırlanır. Auto olursa
SystemMaxUse : kayıtlar için kullanılabilecek azami disk alanı
SystemKeepFree : kayıtlar yazılırken bırakılması gereken asgari boş disk alanı
SystemMaxFileSize : Yeni dosyaya geçmeden her kayıt dosyasının en fazla ne kadar büyüyebileceği (persistent modu)
RuntimeMaxUse: Persistent olmayan mod volatile (uçucu, geçici) mod olarak isimlendiriliyor. Bu modda en fazla ne kadar disk alanı kullanılabileceği (/run/log/journal içinde)
RuntimeKeepFree : Uçucu modda asgari boş bırakılması gereken disk alanı boyutu (/run/log/journal içinde).
RuntimeMaxFileSize : Uçucu modda bir kayıt dosyasının yeni bir dosyaya geçmeden ne kadar büyüyebileceği (/run/log/journal içinde)

Varsayılan olarak sıkıştırma kullanılır denmiş, 512 byte'tan büyük girişler için [3]. Değiştirmek için Compress=1k gibi bir değerin girilebileceğinden bahsedilmiş.

journal kayıtlarının hata seviyeleri (log levels) öncelikler (priority) olarak bilinir. Şu öncelikler vardır:
  1. "emerg" (0)
  2. "alert" (1)
  3. "crit" (2)
  4. "err" (3)
  5. "warning" (4)
  6. "notice" (5)
  7. "info" (6)
  8. "debug" (7)
Sadece hata mesajlarını görmek için
$ journalctl -b -p 3
veya anahtar kelime kullanarak
$ journalctl -b -p err
kullanılabilir. Ayrıca acil alamr (alert), kritik (crit) ve hata (err) mesajlarını görmek istiyorsak aralık da belirtebiliriz:
$ journalctl -b -p 1..3
Bir zaman aralığında oluşan kayıtlarla ilgileniyorsak --since ve --until parametereleri aşağıdaki gibi kullanılabilir.

$ journalctl --since "2015-06-01 15:00" --until "2015-06-31 23:59"

Varsayılan olarak zaman bilgileri yerel sistem saati olarak kabul edilir. Ayrıca aşağıdaki gibi kelimeler de kullanılabilir:

$ journalctl --since yesterday
$ journalctl --since 09:00 --until "1 hour ago"

Bir kullanıcı tarafından çalıştırılan süreçlere ait hata kayıtları için kullanıcı id'si kullanılarak sorgu yapılabilir. Öncelikle ilgili kullanıcı hesabının id'sini elde etmek gerek. Örneğin rtkit hesabı için
$ id rtkit
ile uid bilgisi öğrenilir, daha sonra aşağıda kullanılır:
$ journalctl _UID=133
En son 10 kaydı göstermek için

$ journalctl -n 10

Hizmetlerden birini başlatırken oluşan hata mesajlarında kayıtlara
 
$ journalctl -xe
 
ile bakmamız önerilir. Burada -x anahtarı açıklamaları eklemesini, -e ise doğrudan en sona gitmesini söyler.

Canlı olarak oluşan loglara bağlanmak için de -f anahtarı kullanılabilir.

$ journalctl -f

---

Hiç yorum yok: