Linux üzerinde logları yönetmek için kullandığımız bazı araçlar vardır.
Rsyslog Nedir?
Linux sunucularda log toplamak için kullanılan bir yazılımdır. Genellikle merkezi log sunucusu oluşturmak için tercih edilir. Sistemdeki her olay syslog protokolü ile bu rsyslog üzerinden kayıt altına alınır. Şuan bir sektör standardı haline gelmiş ve hemen her dağıtımda aktif olarak kullanılmaktadır. Bunun en büyük nedeni sadece linux sistemler değil aynı zamanda windows ve switch, router gibi ağ çevresel birimlerinin de loglarını saklayabildiği için daha geniş bir kitleye hitap edebilmesi sayesindedir.
Syslog konfigürasyonu /etc/rsyslog.conf altında saklanır. Bunun yanı sıra özelleştirilmiş konfigürasyon dosyası oluşturmak isterseni /etc/rsyslog.d dizini altına konumlandırabiliriz.
Syslog Tanımları ve Seviyeler
Sistem tarafında tanımlı syslog facity kaynakları şunlardır.
Kaynak | Tanım |
---|---|
auth | giriş işlemleri |
cron | zamanlanmış görevler |
daemon | arkaplan hizmetleri |
kernel | çekirdek mesajları |
mail kayıtları | |
syslog | syslog’un kendisi ile ilgili kayıtlar |
lpr | yazıcı kayıtları |
ftp | dosya trasfer kayıtları |
local0 – local7 | kullanıcı tanımlı mesajlar |
Öncelik yani Severity/Priority sıralamaları ise şu şekilde (rule tanımındaki noktadan sonraki kısım)
Severity | Priority |
---|---|
Emerg | 0 |
Alert | 1 |
Crit | 2 |
Err | 3 |
Warn | 4 |
Notice | 5 |
Info | 6 |
Debug | 7 |
Logrotate Nedir?
Log kayıtlarının kendi başına bıraktığınızda sistemler çalıştığı sürece dosya boyutları büyüyecek ve diski dolduracaktır. Bunu önlemek için log rotasyonu tanımı yaparız. Bu tanıma göre belirli aralıklarla bu dosyalar yeniden yazılır, sayısı artırılır azaltılır ve sistemdeki log oranını belirli bir boyut/tarih içerisinde tutarız.
Logrotate dosyası için belirli bir oluşturma standardı yoktur. Burada log alınacak yazılım veya systemin önem derecesini göre özelleştirilmiş konfigürasyonlar oluşturulabilir. Konfigürasyon dosyasını yazarken bilinmesi gereken bazı argümanlar vardır.
Argüman | Tanım |
---|---|
daily | Log rotasyonunun her gün yapılacağını tanımlar. |
weekly | Log rotasyonunun haftalık yapılacağını tanımlar. |
monthly | Log rotasyonunun her ayın ilk günü yapılacağını tanımlar. |
yearly | Log rotasyonunun her yılın ilk günü yapılacağını tanımlar. |
rotate [adet] | Log dosyalarının kaç tane saklanacağı bilgisini burada veririz. |
create | Log dosyası rotasyona uğradıktan sonra aynı isimle yeni bir tane oluşturulmasını sağlar. |
nocreate | Rotasyon sonrasında aynı isimle yeni bir dosya oluşturulmasını engeller. |
dateext | Bu seçenek ile dosyalarımız YYYY/MM/DD formatına göre arşivlenir. |
dateformat | Dateext’in sunduğu tarih formatını kullanmak istemeyenler kendi formatlarını bu argüman ile belirtebilir. |
compress | Rotasyon sonrasında dosyanın gzip ile sıkıştırılmasını sağlar. |
missingok | Konfigürasyon için eklediğimiz log dosyası yoksa hata vermeden bir sonrakine geçer. Eğer bu seçeneği yazmazsak konfigürasyon için yazdığımız dosyalardan bir tanesi bile olmazsa logrotate hata verip rotate işlemini gerçekleştirmez. |
olddir | Rotasyona uğrayan dosyaları bu argüman ile farklı bir dizine gönderebiliriz. |
prerotate/endscript | Log rotation yapmadan önce yazmış olduğunuz bir scripti çalıştırır. |
postrotate/endscript | Log rotation yaptıktan sonra yazmış olduğunuz bir scripti çalıştırır. |
Rotasyon sonrasında mail atmak için kullanılabilir. | |
size | Dosyaları belirtilen büyüklüğe geldiğinde rotasyona alır. |
Konfigürasyon Tanımı
Logrotate için tanımlarımızı yapabileceğimiz bir dosya ve dizin bulunuyor. Linux işletim sistemlerinde varsayılan log rotasyonunu /etc/logratate.conf dosyasından görebilirsiniz. Sistem üzerinde çalışan yazılımların varsayılan dışına çıkan özel durumları varsa bunlar /etc/logrotate.d/ dizini altında konumlandırılır.
Örnek olarak bir dizinin log rotasyonuna uğramasını ele alalım. Bu rotasyon haftalık olarak 4 defa gerçekleşecek ve rotasyon sonrasında o günün tarihi ile dosyalar sıkıştırılacak. Bu süreçte eğer dizin içerisinde istenmeyen bir dosya varsa bu görmezden gelinecek.
$ mkdir /var/falancayazilim/
$ touch /var/falancayazilim/test.txt
Bu falancayazılım’a bir log rotasyonu hazırlamak istersek şu şekilde bir konfügrasyon dosyası oluşturabiliriz.
$ vi /etc/logrotate.d/falancayazilim.conf
/var/falancayazilim/*.txt {
rotate 4
weekly
create
compress
missingok
dateformat -%Y%m%d
}
Tanımı yaptıktan sonra sonuçları görmek için elbet bir hafta beklememize gerek yok. -d
--debug
parametresi ile konfigürasyon dosyasını kontrol edebiliriz.
$ logrotate -d /etc/logrotate.d/falancayazilim.conf
Rotasyon yapmak istiyorsak ise -f
--force
parametresini kullanabiliriz.
$ logrotate -fv /etc/logrotate.d/falancayazilim.conf
not: -v
parametresi verbose yani çıktıları ekrana basması için eklenmiştir.
Journalctl nedir?
Linux sistemlerde sistem ve arka planda çalışan her programın log kayıtlarına bu komut üzerinden ulaşabiliriz. Journalctl’in en büyük faydalarından biri log kayıtlarını istenilen saat dilimine göre gösterebilmesi, bunun için sistemden timedatectl komutu ile tarih/saat ayarını yapmış olmanız gerekiyor.
Temel olarak journalctl komutu sistemdeki tüm logları önümüze serer. Buradan aradığımız özel bir kısım var ise grep komutu ile birlikte çalıştırdığımızda direk onlara ulaşabilir yahut head, less gibi komutlarla sadece baş ve sondan kesme işlemi yapabiliriz.
Son boot işleminden sonra oluşan logları görmek için journalctl komutuna –b parametresini eklememiz gerekir. Daha önceki loglar için ise parametrenin yanına ilgili boot kaydının referans değerini girerek çağırabiliriz. Geçmiş boot loglarını görmek, açılışta karşılaşılan bir sorun olduğunda log kayıtlarını karşılaştırıp durumu hakkında fikir yürütmemizi sağlayabilir.
Geçmiş bootları görüntülemek için kullanacağımız komut journalctl –list-boots komutudur. Bu komuttan önce sistem tarafında /var/log içerisine journal dizini oluşturulmalı ve journalctl’in konfigürasyon dosyasında saklama ayarları yapılmalıdır.
$ mkdir –p /var/log/journal
$ vi /etc/systemd/journald.conf
[Journal] alanı altındaki Storage alanının yanına persistent yazılmalı
Belirli zaman aralığında logları görmemiz de mümkün. Bunun için since ve until komutlarını kullanıyoruz. Gireceğimiz zaman dilimi sadece tarih veya tarih/saat olabilir. Format olarak YYYY-MM-DD HH:MM:SS şekildedir.
$ journalctl –since “01.03.2020 12:45:30” --until “03.03.2020 24:00”
$ journalctl –since yesterday
$ journalctl –since 10:00 –until “1 hour ago”
Servis durumlarını kontrol etmek için o alanda da filtreleme yapmamız gerekebilir. Bunun için -u
parametresini kullanacağız.
$ journalctl –u nginx.service
Aynı zamanda bu parametreleri beraber de kullanabiliriz.
$ journalctl –u nginx.service --since 06:00
Servisleri kontrol etmenin yanı sıra bu servislerin oluşturduğu child processleri de kontrol edebiliriz. Bunun için _PID
parametresini kullanırız. İlgili process’e ait PID değeri üzerinden filtreleme yapılabiliyor.
$ journalctl _PID=12555
Ayrıca belirli kullanıcılar ve grublar bazında bakmak istenirse _UID
ve _GID
komutlarıyla bu loglara da ulaşılabilir.
$ journalctl _UID=1000
Journal tarafında hangi user ve grupların loglandığı görmek için -F
parametresini kullanmamız gerekiyor. Bu konuda daha fazla bilgi almak için man systemd.journal-fields komutu yeterli olacaktır.
$ journalctl –F _UID --> journal’da depolanan kullanıcı id’lerini getirir.
Patika vererek filtreleme yapmamız mümkün.
$ journalctl /usr/bin/bash
Kernelden gelen mesajları görüntülemek için -k
yahut bu mesajlar dmegs içerisinde toplandığı için -dmegs komutunu kullanabiliriz.
$ journalctl –k
$ journalctl –k –b 5 --> 5 boot önceki kernel mesajlarını okumamızı sağlar
Logları tek tek okumak ve ayıklamak yerine öncelik verip sadece o öncelik üzerindeki kayıtları okumamız mümkün. Bunun için -p
parametresini kullanıyoruz.
$ journalctl –p err –b --> boot sırasındaki error ve üstü etikete sahip kısımları okumamızı sağlar.
Öncelik sırası için buraya tıklayın.
Yaptığımız log aramalarını json formatında çıktı olarak alabiliriz. Bunun için -o
komutu ile json yazmamız yeterli. Hatta daha güzel formatta bir çıktı almak istiyorsak json-prety
kullanabiliriz.
$ journalctl -b -u nginx -o json
cat | Mesaj alanında kendisini gösterir. |
---|---|
export | Taşıma yahut yedeklemede kullanılabilecek binary format |
json | Tek satırsa standart JSON dosyası |
json-prety | Daha okunabilir JSON formatı |
json-sse | Server-Sent ile uyumlu JSON formatı |
short | Default syslog çıktı stili |
short-iso | ISO 8601 wallclock zaman damgalı çıktı formatı |
short-monotonic | Tekdüze zaman damgaları ile birlikte standart format |
short-precise | Mikro saniyekesinliği ile default format |
verbose | Girdi için uygun tüm journal alanlarını gösteren format |
Loglar üzerinde yapılan son işlemleri izlemek için -n
komutu kullanılır. Bu komut tail komutu ile benzerlik gösterir.
$ journalctl –n
$ journalctl –n 20 --> son 20 kayıtı gösterir.
Devam eden logları takip etmek için -f
komutunu kullanmamız yeterli, bu komut sayesinde akışı (flow) yakalayabiliriz.
$ journalctl -f
Logların disk üzerinde ne kadar alan işgal ettiğinini --disk-usage
komutu ile inceleyebiliriz.
$ journalctl –-disk-usage
Logların büyümesi ile ilgili seçeneklere /etc/systemd/journald.conf
doyasında ayar yapamız yeterli olacaktır.
SystemMaxUse=: Logların kaplayacağı maksimum disk alanını belirler
SystemKeepFree=: Loglar kayıt edilirken sistemde bırakılması gereken boş alan miktarıdır
SystemMaxFileSize=: Dosyalar rotate olmadan önce ilgili dosyaların ne kadar büyüyebileceğini belirler.
RuntimeMaxUse=: Geçici hafıza /run üzerinde kullanılabilir maksimum disk kapasitesini belirler.
RuntimeKeepFree=: Diğer kullanıcılar için geçici hafıza üzerine veri yazılırken ayrı tutulacak alanı belirler.
RuntimeMaxFileSize=: Geçici hafıza /run üzerinde yer alan log dosyasının rotate edilmeden önce ulaşabileceği maksimum kapasiteyi belirler.