2011-12-07 11 views
22

Bir sinks::text_file_backend lavabo sahibim. Zaten birkaç döndürülmüş günlük dosyaları olduğunu varsayalım:Boost.Log - Döndürülmüş dosyalara eklemek için bir metin havuzu arka ucunu yapılandırma

myLog001.log, myLog002.log ve bu yüzden lavabo son döndürülmüş dosyaya yazmaya devam etmek istiyorum

üzerine - myLog002.log, içeriğinin eklenecek ve oradan rotasyona devam et.

Yalnızca keywords::open_mode = append bulmayı başarabildim, ancak bu yalnızca mevcut myLogX dosyalarının üstüne ekleniyor ve bunları daha büyük ve okunması zor bir hale getiriyor.

Bu Boost.Log'da yapılabilir mi?

cevap

14
işlevselliği metin lavaboya inşa edilmiştir Yani

ve the documentation belirli boyutlarda ve zaman zaman döndürmek için dosya adı deseni ve kurallar belirlemek için bir örnek içerir:

// The function registers file sink in the logging library 
void init_logging() 
{ 
    boost::shared_ptr<logging::core> core = logging::core::get(); 

    boost::shared_ptr<sinks::text_file_backend> backend = 
     boost::make_shared<sinks::text_file_backend>(
      // file name pattern 
      keywords::file_name = "file_%5N.log", 
      // rotate the file upon reaching 5 MiB size... 
      keywords::rotation_size = 5 * 1024 * 1024, 
      // ...or at noon, whichever comes first 
      keywords::time_based_rotation = sinks::file::rotation_at_time_point(12, 0, 0) 
     ); 

    // Wrap it into the frontend and register in the core. 
    // The backend requires synchronization in the frontend. 
    typedef sinks::synchronous_sink<sinks::text_file_backend> sink_t; 
    boost::shared_ptr<sink_t> sink(new sink_t(backend)); 

    core->add_sink(sink); 
} 

yapmak için görünüşte hiçbir yolu yoktur kütüphane bu kurulum ile mevcut dosyalara eklenir. Belgede "Döndürülmüş dosyaları yönetme" başlığının altında gösterildiği gibi sink'u oluşturmadan önce backend->scan_for_files(); numaralı telefonu aramanız gerekir, ancak bu yalnızca kitaplığın temizlenmeden önce önceki günlüklerin üzerine yazmasını engeller.

Bu konu Şubat 2013'te bir geliştirme posta listesinde ortaya çıktığında, kitaplık yazarı, geçerli tasarım kapsamında yapılamayan adding support for appending would be a nontrivial change açıkladığını açıkladı.

+0

Ben backend- kullanmak> scan_for_files(); Programımda, ancak bu koda başladığınızda program çöktü. Bunun hakkında bir fikrin var mı? –

+0

Rotasyon çalışıyor, ancak ekleme ne olacak? Bir program, her bir sonraki program için, günlük dosyası döndürme sınırlarına ulaşana kadar, son günlüğe eklenmelidir. Bu kod, her bir çalışmada yeni bir günlük dosyası oluşturur ve 'scan_for_files' ekleme eklenmesinin bir etkisi yoktur. – ixe013

+0

Haklısınız, Ixe013. Cevabımı değiştirdim. –

1

Metin dosyasını kullanmadan önce open_mode öğesini belirtmeniz gerekir. Varsayılan olarak Boost.Log, std :: ios_base :: trunc | std :: ios_base :: çıkışını, eski günlük dosyasını kesecek açık mod olarak kullanır.

Aşağıdaki parametrelerle örneğini text_file_backend oluşturabilirsiniz:

{ 
     boost::shared_ptr<sinks::text_file_backend> backend = 
      boost::make_shared<sinks::text_file_backend>(
       keywords::file_name = logger_file_path, 
       keywords::open_mode = std::ios_base::app|std::ios_base::out, 
       keywords::rotation_size = 5 * 1024 * 1024, 
       keywords::time_based_rotation = sinks::file::rotation_at_time_point(12, 0, 0)); 
     // Wrap it into the frontend and register in the core. 
     // The backend requires synchronization in the frontend. 
     typedef sinks::synchronous_sink<sinks::text_file_backend> sink_t; 
     boost::shared_ptr<sink_t> sink(new sink_t(backend)); 
     sink->set_formatter(logFmt); 
     core->add_sink(sink); 
    } 
İlgili konular