Sayfalar

18 Mayıs 2017 Perşembe

C++ Boost.Log kütüphanesinin kullanımı (Boost Log Tutorial)

Boost C++ için geliştirilmiş içerik bakımından çok zengin bir kütüphaneler topluluğudur. Bu yazı kapsamında boost kütüphanelerinden birisi olan boost.Log kullanımına dair basit bir örnek gerçekleştirilmiştir. Log alma işlemi, bir yazılımın gerçekleştirdiği temel işlemler ile ilgili bazı bilgilerin dosyaya kaydedilmesidir. Böylelikle uygulama ile ilgili birşeyler yanlış gittiğinde log dosyasındaki veriler incelenerek uygulamanın davranışı analiz edilip gerekli düzeltmeler yapılmasına yardımcı olunabilir. Boost.Log kütüphanesini projemizde kullanabilmek için kaynak kodları indirip derlememiz gerekmektedir. Bunun sebebi; Boost kütüphanelerinden bazıları sadece header eklenerek kullanılabilir iken, bazı kütüphanelerin kullanılması için ise kaynak kodun derlenmesi gerekmektedir.


Boost derlenmesi gereken kütüphaneler listesi;





Bu yazı kapsamında boost.Log kütüphanesininin kullanımına dair basit bir örnek gerçekleştireceğiz. Bunun için ilk olarak boost kaynak kodlarını bilgisayarımıza indiriyoruz. Daha sonra bilgisayarımızdaki Visual Studio derleyicisinin komut satırını aşağıdaki gibi açıyoruz (x86,x64 ya da cross tool seçenekleri mevcut) ve boost dosyalarını indirdiğimiz klasöre yönlendiriyoruz.



Daha sonra komut satırına bootstrap yazıyoruz ve ilgili batch dosya çalışıp aynı klasörde b2.exe uygulaması oluşturuyor.



Akabinde ise komut satırına .\b2 yazıyoruz ve biraz zaman alacak olan derleme işlemimiz başlıyor, ve Boost C++ kütüphanelerimiz başarıyla derlenmiş oluyor. Derleme işleminin başarıyla gerçekleştiği mesajının altındaki mesajları da okuyacak olursanız, boost'u projenize eklediğinizde kullanacağımız include ve library dosya yolunu da bize belirtmiş oluyor.



Boost kaynak kodlarını başarıyla derledik ve boost_1_64_0\stage\lib klasöründe .lib dosyaları oluşturulduğunu göreceksiniz. Evet şimdi daha önce yapmış olduğum ağ paketlerini analiz eden C++ uygulamamıza, log alma özelliği ekleyelim. Bunun için Visual Studio'da ilgili dosya yollarını ekliyorum.

Project->Properties->C/C++-> Additional include  :    D:\boost_1_64_0;
Project->Properties->Linler-> Additional library     :    D:\boost_1_64_0\stage\lib;


Ve artık kodlamaya geçecek olursak, her zamanki gibi ilk iş projede kullanacağım header dosyalarını belirtiyorum.

#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/sources/severity_logger.hpp>


Daha sonra log verilerinin dosyaya yazılması için, dosyaya yönlendirme ve severity seviyesi ayarlama işlemlerini gerçekleştiriyoruz. (Yani önem derecesini belirtiyoruz) Önem dereceleri ağaşıdaki gibi ;

BOOST_LOG_SEV(lg, trace) << "A trace severity message";
BOOST_LOG_SEV(lg, debug) << "A debug severity message";
BOOST_LOG_SEV(lg, info) << "An informational severity message";
BOOST_LOG_SEV(lg, warning) << "A warning severity message";
BOOST_LOG_SEV(lg, error) << "An error severity message";
BOOST_LOG_SEV(lg, fatal) << "A fatal severity message";

Örneğin; trace seviyesini ayarlarsak, tüm loglar alınacak anlamına gelirken, seviye olarak warning seçersek sadece warning,error ve fatal etiketli loglar kaydedilecek anlamına geliyor. Bu da istediğimiz zaman asıl ilgilenmek istediğimiz loglara yoğunlaşabilmemize imkan sağlıyor.


int main(int argc, char **argv)
{
...

boost::log::add_file_log("sample.log");

boost::log::core::get()->set_filter
(
boost::log::trivial::severity >= boost::log::trivial::warning
);



Daha önceki yazılarımda örneğini vermiş olduğum ve kaynak kodlarını paylaştığım libpcap uygulamasına log özelliğini ekledim ve bunun üzerine anlatımı gerçekleştireceğim. Örneğin; ağdan okuduğumuz her bir paketin büyüklüğü ve zaman bilgisini aşağıdaki gibi trace seviyesinde log a ekliyoruz.


Eğer gelen paket UDP ise port bilgilerini çıkarıp info seviyesinde log alıyoruz.



IP4 paketi olmayan paketleri ise warning seviyesinde log a ekliyoruz.




Ve sonuç olarak info ve warning seviyelerinde ayrı ayrı uygulamamızı çalıştırıp logları karşılaştıracak olursak; info seviyesi için info ve warning mesajları kaydediliyor iken warning seviyesinde info mesajları kaydedilmiyor.






Hiç yorum yok:

Yorum Gönder