En verimli iş parçacığı güvenli C ++ kaydedici nedir? [kapalı]


85

Performans açısından kritik çok iş parçacıklı bir uygulama üzerinde çalışıyorum. Rlog, Ace ve Boost günlüklerine baktım. Rlog'u seçtim çünkü en hızlı olanı okudum (günlük kaydı devre dışı bırakıldığında, en az ek yüke sahip).

Sahip olduğum sorun, sürüm modunda bile dosya adını, satır numarasını vb. Gösteriyor. Bana bu bilgiyi nasıl kapatacağımı söylerseniz, sorunum çözülebilir. Her durumda benim durumum için C ++ 'daki en verimli kaydedici nedir?


23
Hızla artışın her şeye sahip olduğu sonucuna varıyorum. Olmasa bile tekrar baktığınızda ortaya çıkacak!
Martin Beckett

21
Bunun neden kapalı olduğunu anlayamıyorum. Spesifik ve ölçülebilir bir soru sordu. Hangi derleyicinin kullanıldığını ihmal edersek, yalnızca bir "en verimli iş parçacığı güvenli C ++ kaydedici" olabilir. Stackoverflow bugünlerde ....
JohnJohn


Yanıtlar:


35

Maalesef şu anda oy veremiyorum. Söyleyebileceğim kadarıyla asla Apache log4cxx gibi saçmalık kullanmayın. Ciddi hatalar içerir.

  1. 0.9 dalının son sürümü 0.9.7'dir ve yine de bellek sızıntıları içerir çünkü sanal üyeleri olan her sınıfın sanal dtoru yoktur.
  2. En yeni sürüm 0.10.x, 0.9.x'ten çok fazla işlevsellik kaybetti ve geriye dönük olarak uyumlu değil. Kendi kodunuzun çoğunu yeniden yazmak zorunda kalıyorsunuz.
  3. Tüm proje sürdürülmemiş görünüyor. 0.11.xx sürümü 2 yıldır duyuruldu.

Bence destekle gitmelisin.


10
"sanal üyeleri olan her sınıfın sanal dtoru yoktur" buna inanmadı ve kontrol etmek zorunda kaldı. Apache'yi hayal kırıklığına uğratan.
ManuelSchneid3r

6
Şimdi olumsuz oy verebilirsiniz :)
Fund Monica's Lawsuit

5
>> "sanal üyelere sahip her sınıfın sanal dtoru yoktur" Bu harika olmasa da, bir soruna yol açtığı anlamına gelmez. Yalnızca sınıfların statik türlerinden ziyade dinamiklerine göre silinmesi bir sorundur. Bu tek başına bir sorun değildir ve herhangi bir hafızanın sızdırıldığı anlamına gelmez.
evilrix

2
sınıflar @evilrix sahip sanal üyelerini ama hiçbir sanal dtor. Sınıfların korumalı / özel yeni operatörleri yoktur. Aslında, bu asla serbest bırakılmaması gereken çok zayıf ve kötü bir koddur. Öyleyse ne demek istiyorsun?
kirsche40

@ kirsche40 Amacımın oldukça açık olduğunu düşündüm. Standardın nasıl ifade edildiğine dair açıklamamın hangi kısmını anlamadın? Yeniden ifade etmeme izin verin: Temel sınıf işaretçisi aracılığıyla silmeye çalışırsanız bu bir sorundur. Bu durumda, yıkıcı sanal değilse, davranış tanımsızdır. Standart bu noktada alışılmadık derecede açıktır. Söylediklerimin hiçbirinin, OP'nin bunu bir uygulama olarak kullandığını savunduğum anlamına gelmediğinden eminim.
evilrix


10

Ben de log4cxx ile başarı elde ettik http://logging.apache.org/log4cxx/index.html . Popüler Log4j kaydedicinin bir C ++ sürümüdür, bir conf dosyasıyla veya kodda yapılandırılması kolaydır. Devre dışı bırakıldığında ek yük minimum düzeydedir (yöntem çağrısı ve tamsayı karşılaştırması).

Günlüğe çıktı için model, tarih / saat ve bir mesaj kadar basit olabilen bir dönüştürme modeli ile tanımlanır. Ayrıca dosya boyutu sınırlamasını, rollover'ı vb. İşler. Ayrıca çeşitli hatalar ve kaynaklar için farklı desenler yapılandırabilirsiniz.


9

İşte rlog'un verdiği ekstra bilgileri (dosya adı, satır numarası vb.) Nasıl kapatabilirsiniz. main()İşlevinizde (veya herhangi bir yerde) rlog'u başlattığınızda , aşağıdakileri yapabilirsiniz:

rlog::RLogInit(argc, argv);
rlog::StdioNode slog (2, rlog::StdioNode::OutputColor);
slog.subscribeTo( RLOG_CHANNEL("error") );

İkinci argüman StdioNodebayrakların çıktıyı kontrol etmesidir. Olası işaretlerin tam listesi için rlog belgelerine (Doxygen ile oluşturulabilir) bakın. Buradaki örnekte, başka herhangi bir bilgi eklenmeden, rlog yalnızca çıktıyı önem derecesine göre renklendirir.


9

Logog sistemini düşünmek isteyebilirsiniz. logog tam olarak bu tür bir işlevsellik sunar, ancak Pantheios'un sahip olduğu örtük kod bağımlılıklarına sahip değildir. logog iş parçacığı açısından güvenlidir ve herhangi bir noktada ne tür mesajların günlüğe kaydedileceği üzerinde yüksek derecede kontrol sağlar.

Logog'un yazarı ve geliştiricisiyim, bu yüzden görüşüm biraz önyargılı. Ancak bunu uygulamadan önce rlog, Pantheios ve diğer kayıt sistemlerini gözden geçirdim.

https://github.com/johnwbyrd/logog .


Güncellenen bağlantı, not için teşekkürler.
johnwbyrd

4

Bazı ek yükler makrolarınızda / akışlarınızda olabilir. Günlüğe kaydetme devre dışı bırakıldığında, günlüğe kaydedilen dizeyi oluşturmamaya çok dikkat etmelisiniz.

Akışların ve?: Operatörünün akıllıca kullanımı, makrolarda olduğu gibi bunu yapmanıza izin verir.




2

C / C ++ dili için hızlı, kararlı ve iş parçacığı açısından güvenli bir günlük kitaplığı olan c-log kitaplığını ( https://github.com/0xmalloc/c-log) deneyin .


9
Maalesef c-log GPL kapsamındadır, bu da onu GPL uyumlu olmayan (örn. Tescilli ticari) yazılımlarla kullanamayacağınız anlamına gelir. Bu, birçok kullanıcı için kullanılamaz hale getirir.
chris

artık github.com/0xmalloc/c-log adresinde LİSANS yok Ticari ve kişisel kullanım için ücretsizdir.
user2538508

3
C-log'un yazarı mısınız? Öyleyse, yazılımınızın hangi lisans altında yayınlandığını açıkça belirtmenizi (Github sayfasında, benioku dosyasında ve kaynak kodundaki yorumlarda) şiddetle tavsiye ederim. Kamu malı olması gerekse bile (ki bunu önermiyorum!), Bunu açıkça belirtmelisiniz. Bununla birlikte, aralarından seçim yapabileceğiniz birçok "ticari dostu" (yani izin verilen) açık kaynak lisans vardır - en popüler olanları Apache, BSD veya MIT'dir.
chris

Sadece Linux mu? ( #include <pthread.h>...)
rustyx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.