RSS Feed

Yeni nesil log tutma

December 10, 2011 by Oğuz Yarımtepe

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.


No Comments »

No comments yet.

Leave a Reply

Your email address will not be published. Required fields are marked *