Bir süredir bir log sunucusu kurmanın derdindeydik. Benim açımdan okunabilir bir şekilde tutmak önemli idi. Konsoldan dosya dosya bir takım grep bash işlemleri ile gerektiğinde log analizi yapmak istemiyordum. Klasik yaklaşım syslog-ng ile bir sunucuda logları düz metin olarak tutmak idi. Necati Graylog2 ile MongoDB kullanarak log sunucusu kurduğundan bahsetmişti. Ben de güncel yaklaşımı biraz araştırayım dedim. Sonuç olarak Logstash + Graylog2 çözümüne vardım.Aslında önerilen yaklaşım bu ikisine ek olarak bir de Elasticsearch kullanmak. Sebebi de Graylog2′nin arşivleme özelliği üzerine kurulmamış olması. Elasticsearch ile arama ve arşivleme işini büyük (örneğin 5GB) veri tabanı boyutlarında hızlandırmak. Logstash bu işin hem sunucu hem de istemci tarafımda kullanılıyor.
Logu gönderilmek istenen sunucularda logstash çalıştırılarak Linux konsolundan bildiğimiz “tail” işlemi ile log dosyasına her eklenen satır ayar dosyasındaki çıktıya gönderiliyor. Sürekli bir takım kayıtların gönderileceği düşünülürse, gönderilecek kısmın doğrudan veritabanı değil de bir kuyruk olması daha mantıklı. Bu noktada Logstash, RabbitMQ gibi mesaj kuyruğu sistemleri ile haberleşebiliyor.Altta Apache’nin erişim loglarını gönderdiğim ayar dosyası var.
input {
file {
type => "apache-access"
path => "/var/log/apache2/other_vhosts_access.log"
}
}
output {
# Output events to stdout for debugging. Feel free to remove
# this output if you don't need it.
# stdout { }
# Ship events to the amqp fanout queue named 'rawlogs"
amqp {
host => "A.B.C.D"
exchange_type => "fanout"
name => "rawlogs"
}
}
A.B.C.D ile yazılan kısım RabbitMQ koşan ve log sunucusu görevi yapacak olan sunucunun IP adresi.
Logu gönderilecek olan kısımda java komutunun çalıştırılabilir olması gerekir.
Konsolda aşağıdaki komut ile ayar dosyasının okunup Apache erişim kayıtlarının mesaj kuyruğuna yollanması sağlanabilir.
sudo java -Dlog4j.debug -Dlog4j.configuration=file:/home/oguz/logstash/log4j.properties -jar logstash-1.0.17-monolithic.jar agent -f logstash.conf
Log sunucusu görevi görecek olan kısımda RabbiMQ yanında Graylog2 sunucusunun koşması gerekiyor. Graylog2 sunucusunun ve web arayüzünün kurulum ve çalıştırılması wikisinde gayet güzel anlatılıyor. Logstashın'da çalışıp RabbitMQ kuyruğundaki mesajları alıp Graylog2'nin anlayacağı Gelf biçiminde ona göndermesi gerekiyor. Ayar dosyası şu şekilde:
input {
amqp {
# ship logs to the 'rawlogs' fanout queue.
type => "all"
host => "A.B.C.D"
exchange_type => "fanout"
name => "rawlogs"
}
}
filter {
grok {
type => "apache-access" # for logs of type 'apache-access'
pattern => "%{COMBINEDAPACHELOG}"
}
date {
type => "apache-access"
timestamp => "dd/MMM/yyyy:HH:mm:ss Z"
}
}
{>
output {
#stdout { }
}>
gelf
{
host => "A.B.C.D"
}
}
Logstash burada Grok isimli filtreleme ile gelen mesajları biçimlendirip o şekilde kaydetmenizi sağlıyor. Graylog2 web arayüzünde de kaydedilen log kayıtlarını anlık olarak görmek mümkün. Arayüz gerçek zamanlı olarak size sonuç gösteriyor. Filtreleme yapıp arama yapmanız rahat. Hangi uçlardan ne mesajı görmeniz gayet kolay. Otomatik olarak uçlardan gelen logları size toplu olarak gösteriyor. İşin 5651 kısmı için böylesi bir yaklaşım uygun mudur pek emin değilim. Sorduğum arkadaşlar log kaydının metin olması, belli bir biçimi olması gerektiğini söyledi. Ben bu veri tabanının "dump" edilmiş halini imzalasam ve saklasam da 5651 için uygun olur diye düşünüyor idim. Böyle değilse bile Logstash sadece log dosyanızın sonuna eklenen satırları anlık olarak işlediğinden, hala elimizdeki log dosyalarını syslog-ng ile bir yerlerde saklamak mümkün. Bence bir web arayüzünden kaydı tutulan loglar ile ilgili neler olup bittiğini görmek için güzel bir çözüm.