Journalctl ile Günlükleri Analiz Etmek

Systemd , Linux dağıtımlarının çoğunda öntanımlı olarak bulunmaktadır. Systemd’nin temel özelliklerinden biri, günlükleri toplama yöntemi ve bu günlükleri analiz etmek için sağladığı araçlardır.

Geleneksel olarak sysvinit sistemi sgünlükleri düz metin dosyaları halinde saklamaktadır. Bu dosyaları okumak ve analiz etmek için find, grep, cut ve diğer birçok komutun kullanılması gerekir.

Systemd, günlükleri daha fazla kaynaktan toplar, journalgünlüklerini ikili biçimde tutar ve günlükleri okumak, analiz etmek ve işlemek için size bir komut satırı aracı sunar.

Journald nedir? Journalctl nedir?

journald, günlükleri syslog gibi çeşitli günlük kaynaklarından toplayan systemd’deki daemon’dur.

journalctl, günlük günlükleriyle etkileşim kurmanıza izin veren komut satırı aracıdır.

Journalctl ile günlükleri okuyabilir, günlükleri gerçek zamanlı olarak izleyebilir, günlükleri zamana, hizmete, önem derecesine ve diğer parametrelere göre filtreleyebilirsiniz.

Sisteminizde günlük günlüklerinin etkin olup olmadığını kontrol edin

Bazı Linux dağıtımları, journal günlüklerini varsayılan olarak etkinleştirmez.

Journald günlüklerinin varsayılan konumu /var/log/journal dizinidir. Bu dizinin mevcut olduğundan emin olmalısınız. Değilse, kendiniz oluşturabilirsiniz.

huseying@pardus:~# cat /etc/systemd/journald.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See journald.conf(5) for details.

Sonra, /etc/systemd/journald.conf dosyasında storage değerinin auto veya persistent olarak ayarlandığından emin olun.

Journald.conf dosyası varsayılan değerleri gösterir. Dolayısıyla, girişlerin önünde bir # bulunsa bile, bunların kullanılan varsayılan ayarlar olduğu anlamına gelir. Herhangi bir şeyi değiştirmek isterseniz, o satırdan # işaretini kaldırmalısınız.

Journalctl ile günlükleri okuyun ve arayın

Terminalde sadece journalctl komutu verirseniz , journal günlük kronolojik sırada gösterilecektir.

# journalctl
Eyl 12 04:29:24 pardus kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009cfff] usable
Eyl 12 04:29:24 pardus kernel: BIOS-e820: [mem 0x000000000009d000-0x000000000009ffff] reserved
Eyl 12 04:29:24 pardus kernel: BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
Eyl 12 04:29:24 pardus kernel: BIOS-e820: [mem 0x0000000000100000-0x00000000b902ffff] usable
Eyl 12 04:29:24 pardus kernel: BIOS-e820: [mem 0x00000000b9030000-0x00000000cbefbfff] reserved
Eyl 12 04:29:24 pardus kernel: BIOS-e820: [mem 0x00000000cbefc000-0x00000000cbefcfff] ACPI NVS
Eyl 12 04:29:24 pardus kernel: BIOS-e820: [mem 0x00000000cbefd000-0x00000000d7f7efff] reserved
Eyl 12 04:29:24 pardus kernel: BIOS-e820: [mem 0x00000000d7f7f000-0x00000000d7fcefff] ACPI NVS
Eyl 12 04:29:24 pardus kernel: BIOS-e820: [mem 0x00000000d7fcf000-0x00000000d7ffefff] ACPI data
Eyl 12 04:29:24 pardus kernel: BIOS-e820: [mem 0x00000000d7fff000-0x00000000d80fffff] reserved

Karşınıza gelen ekranda aşağıdaki tuşlar yardımı ile hareket edebilirsiniz:

AnahtarAçıklama
Ok TuşuBir satır git
Aralık TuşuBir sayfa aşağı git
bBir sayfa yukarı git
gİlk satıra git
GSon satıra git
100g100. satıra git
/ stringMevcut konumdaki dizeyi ara
n / NSonraki veya önceki arama eşleşmesine git
qGünlüklerden çıkın

Günlükleri ters kronolojik sırayla göster

Fark ettiğiniz gibi, günlükler kronolojik sırayla gösterilir. Bu, depolanan en eski günlüklerin ilk önce görüntülendiği anlamına gelir.

Önce en son günlükleri görmek istiyorsanız, günlük günlüklerini şu seçenekle ters sırada görüntüleyebilirsiniz -r:

journalctl -r

Günlüğün yalnızca son N satırını görüntüle

Tüm günlükleri göstermek yerine, -n seçeneği kullanarak günlükten yalnızca belirli sayıda satırı görüntülemeyi seçebilirsiniz .

Örneğin, aşağıdaki komut, günlüklerin en son 25 satırını görüntüleyecektir:

journalctl -n 25

Günlük günlüklerini gerçek zamanlı olarak göster

Günlükleri gerçek zamanlı olarak görmek istiyorsanız -f parameresini kullanabilirsiniz :

journalctl -f

Tail komutunun -f seçeneği gibi , bu parametre günlükleri takip modunda gerçek zamanlı olarak görüntüleyecektir.

Gerçek zamanlı görünümden çıkmak için Ctrl + C komutunu kullanın.

Günlükleri UTC saatinde göster

Varsayılan olarak günlük günlükleri, sisteminizin yerel saatinde gösterilir. Sisteminizin saati UTC dışında bir saate ayarlanmışsa ve günlükleri UTC olarak görmek istiyorsanız, bunu --utcbayrağı kullanarak yapabilirsiniz .

journalctl --utc

Sadece çekirdek mesajlarını göster

Systemd , farklı kaynaklardan günlükler toplar. Yalnızca Linux çekirdek günlüklerini görmek istiyorsanız, -k parametresini kullanabilirsiniz .

journalctl -k
Eyl 12 04:29:24 pardus kernel: x86/PAT: Configuration [0-7]: WB  WC  UC- UC  WB  WC  UC- WT 
Eyl 12 04:29:24 pardus kernel: e820: last_pfn = 0xb9030 max_arch_pfn = 0x400000000
Eyl 12 04:29:24 pardus kernel: Base memory trampoline at [ffff9426c0097000] 97000 size 24576
Eyl 12 04:29:24 pardus kernel: Using GB pages for direct mapping
Eyl 12 04:29:24 pardus kernel: RAMDISK: [mem 0x35cb9000-0x36e53fff]
Eyl 12 04:29:24 pardus kernel: ACPI: Early table checksum verification disabled
Eyl 12 04:29:24 pardus kernel: ACPI: RSDP 0x00000000000F0120 000024 (v02 LENOVO)
Eyl 12 04:29:24 pardus kernel: ACPI: XSDT 0x00000000D7FCF188 0000D4 (v01 LENOVO TP-N1G   00000000 PTEC 00000002)
Eyl 12 04:29:24 pardus kernel: ACPI: FACP 0x00000000D7FF4000 0000F4 (v05 LENOVO TP-N1G   00001750 PTEC 00000002)

İpucu: Tüm günlük günlüklerini görmek için sudo kullanın

Systemd, hangi kullanıcıya hangi tür günlüklerin gösterileceği konusunda korumacıdır.

Normal bir kullanıcıysanız bazı günlükleri gösterebilir, ancak tüm günlükleri göstermeyebilir:

huseying@pardus:~$ journalctl -u ssh
Hint: You are currently not seeing messages from other users and the system.
      Users in the 'systemd-journal' group can see all messages. Pass -q to
      turn off this notice.
No journal files were opened due to insufficient permissions.
huseying@pardus:~$ 

Tüm günlüklere erişmek istiyorsanız, sudo kullanıcısıysanız sudo kullanmalısınız :

sudo journalctl -u ssh

Belirli bir önyükleme oturumundan mesajları göster

Bu journald’ın mükemmel bir özelliğidir. Journalctl komutu, seçeneği kullanarak belirli bir önyükleme oturumuna ait günlüklere erişmenizi sağlar.

Tüm önyükleme oturumlarını –list-boots parametresi ile listeleyebilirsiniz .

journalctl --list-boots

Çıktı, önyükleme oturumlarını önyükleme zamanı ve önyükleme oturumlarına atanmış bir tamsayı ile gösterecektir:

  -5 513008ead8464c23aab732a2feed5277 Sun 2020-07-12 20:43:38 IST—Sun 2020-07-12 22:40:02 IST
  -4 caff16e3f46a4479b5287fb9e294f610 Mon 2020-07-13 07:36:04 IST—Mon 2020-07-13 19:13:44 IST
  -3 5665f41cc50a4dec9955efacc2596d68 Mon 2020-07-13 20:30:55 IST—Mon 2020-07-13 22:20:34 IST
  -2 c7d17407b0bd476a930af503f64b6006 Tue 2020-07-14 07:58:41 IST—Tue 2020-07-14 18:50:04 IST
  -1 7ab5e04518ec455abe0e2c86fdaa46fa Tue 2020-07-14 21:19:27 IST—Tue 2020-07-14 22:42:11 IST
   0 91856e86d4ee4e828717913deb288568 Wed 2020-07-15 08:11:51 IST—Wed 2020-07-15 17:14:10 IST

Önyükleme oturumu 0, geçerli önyükleme oturumlarıdır. Önyükleme oturumu -1, son başlatılan oturumdur ve bu böyle devam eder.

journalctl -b -2

Bunu eski sistem günlüğü sisteminde yapmaya çalıştığınızı hayal edin!

Belirli bir systemd hizmeti için journal günlüklerini filtreleme

Filtreleme, journal günlüklerinin güçlü bir noktasıdır. Günlükleri systemd hizmetlerine göre filtreleyebilirsiniz.

journalctl -u service_name

Örneğin, SSH tarafından oluşturulan günlükleri görmek istiyorsanız, bunu şu şekilde kullanabilirsiniz:

journalctl -u ssh

Elbette listelemek istediğiniz systemd hizmet adını bilmeniz gerekir.

Belirli bir zaman aralığı için günlükleri filtreleme

Bu, journal günlüklerinin filtreleme özelliğinin başka bir örneğidir. Günlükleri belirli bir süre için filtreleyebilirsiniz, bunu yapmanın çeşitli yolları vardır.

Günlükleri filtrelemek için konuşma dili kullanabilirsiniz. Dün, bugün ve yarın gibi terimler kabul edilmektedir.

journalctl --since=yesterday --until=now

Ayrıca tarih veya tarih saat kombinasyonunu da belirtebilirsiniz:

journalctl --since "2020-07-10"

Tarih ve saatle birlikte bir dönem de belirtebilirsiniz:

journalctl --since "2020-07-10 15:10:00" --until "2020-07-12"

Saat 00:00:00 başlar ve gün ve tarihi belirler.

Geçmişte 1 saat 20 dakika belirtmek için -1s20min gibi göreli zamanı da kullanabilirsiniz.

Günlükleri UID, GID ve PID’ye göre filtreleyin

Bir sorunu gidermek için hata ayıklama yapıyorsanız, PID’sini kullanarak belirli bir işlem için günlükleri kontrol etmek isteyebilirsiniz.

Journal günlükleri ayrıca Kullanıcı Kimliği (UID), Grup Kimliği (GID) ve İşlem Kimliği (PID) üzerinden filtrelenebilir. Aşağıda bir örnek verilmiştir:

journalctl _PID=1234

İpucu: Daha özel günlük görüntüleme için birden fazla seçeneği birleştirin

İstenilen günlükleri görüntülemek için birkaç seçeneği birleştirebilirsiniz.

Örneğin, UTC zaman damgalarında yalnızca dünün SSH günlüklerini görmek istiyorsanız, şunu kullanabilirsiniz:

sudo journalctl -u ssh --since=yesterday --utc

Diğer bir yaygın kullanım, günlükleri önyükleme oturumlarına göre filtrelemektir. Mevcut oturumda yalnızca SSH günlüklerini görmek istiyorsanız, şunları kullanabilirsiniz:

sudo journalctl -u ssh -b0

Seçenekleri ihtiyacınıza göre birleştirebilirsiniz.

Journalctl -xe’yi son birkaç günlüğü görüntülemek için kullanma

Genellikle journalctl -xe komutunu kullanmayı öneren insanlarla karşılaşırsınız.

  • -e: Günlük günlüklerinin sonuna atla
  • -x: Günlük girişlerinde ek bilgi göster (varsa)

Bazı günlük girişlerinde, normal günlük görünümünde görüntülenmeyen ek bilgiler bulunur.
Eğer -x seçeneğini kullanırsanız bu tür bilgileri görüntüleyebilirsiniz.

Bunun gibi tek bir satır olarak gördüğünüz şey:

Jul 09 16:33:40 itsfoss systemd[1]: Started Run anacron jobs.

Aslında burada göründüğü gibi daha fazla bilgi içerebilir:

Jul 09 16:33:40 itsfoss systemd[1]: Started Run anacron jobs.
-- Subject: A start job for unit anacron.service has finished successfully
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- A start job for unit anacron.service has finished successfully.
-- 
-- The job identifier is 3702.

Ek bilgiler, bir hata veya günlük olayının bağlamını ve olası çözümleri açıklamaya yardımcı olur.

Journalctl ile günlüklerde yalnızca hataları göster

Mevcut oturumdaki tüm hataları göstermek için şunları kullanabilirsiniz:

journalctl -p 3 -xb
  • -p 3: öncelik 3 için günlükleri filtrele
  • -x: günlük hakkında ek bilgi sağlar (varsa)
  • b: son önyüklemeden beri (mevcut oturum olan)

Hata ayıklama veya uyarı veya hatta kritik düzey günlükleri almak için diğer öncelik düzeylerini de kullanabilirsiniz. Bu tabloda tüm öncelik seviyelerinini bulabilirsiniz.

ÖncelikKod
0emerg
1alert
2crit
3err
4warning
5notice
6info
7debug


Ayrıca, çeşitli önem dereceleri için günlükleri görüntüleyebilirsiniz. Örneğin, mevcut oturumdaki tüm uyarı, bildirim ve bilgi günlüklerini görmek istiyorsanız, şunları kullanabilirsiniz:

journalctl -p 4..6 -b0

Günlüklerin ne kadar disk alanı aldığını kontrol edin

Journald, çeşitli kaynaklardan günlükleri toplar ve hata ayıklama günlükleri dahil olmak üzere çeşitli düzeylerdeki günlükleri saklar. Doğal olarak, günlükleri tutmak analiz ve denetimde yardımcı olurken, önemli miktarda disk alanı kaplayabilirler.

Bu journalctl komutuyla günlük günlüklerinin ne kadar disk alanı kapladığını kontrol edebilirsiniz:

journalctl --disk-usage

Çıktıyı gördüğünüzde bir sürpriz (veya bir şok) yaşayabilirsiniz:

huseying@pardus:~# journalctl --disk-usage 
Archived and active journals take up 2.8G in the file system.

Yazının orijinalini buradan okuyabilirsiniz.