2014-07-01 14 views
5

Net 4.0 C# projesinde tüm TraceSources'e otomatik olarak eklenen TraceListener'ı nasıl tanımlayabilirim? Ben aksi belirtilmediği takdirde, tüm TraceSources tüm çıkışları alması gereken bir SharedListener kullanıyorumApp.config dosyasındaki tüm TraceSources için varsayılan TraceListener ekleme

<system.diagnostics> 
    <sharedListeners> 
     <add name="MyListener" type="MyListenerType,MyAssemblyName" /> 
    </sharedListeners> 
    <sources> 
     <source name="Class1" switchValue="All"> 
     <listeners><add name="MyListener"></add></listeners> 
     </source> 
     <source name="Class2" switchValue="All"> 
     <listeners><add name="MyListener"></add></listeners> 
     </source> 
     <source name="Class3" switchValue="All"> 
     <listeners><add name="MyListener"></add></listeners> 
     </source> 
     ... repeat for a gazillion classes ... 
    </sources> 
    <system.diagnostics> 

:

Şu anda böyle App.config dosyasında kullandığınız her adlandırılmış TraceSource listelemek gerekir. Yukarıdaki sözdizimi ile, bu her bir TraceSource için manuel giriş gerektirir.

Yeni bir TraceSource ile yeni bir sınıf tanıttığımda, App.Config dosyasını güncellemeliyim. Birden çok program bu derlemeyi kullanırsa, birden çok App.Config uygulamasını güncellemeliyim. Bu girdileri güncelleştirirken bir yazım hatası, herhangi bir hata üretmeyecek, yalnızca tüm iz çıkışını doğru kaynaktan atlayacak.

App.config üzerinden bir varsayılan TraceListener ayarlayabilmemin bir yolu var, böylece varsayılandan sapmak istersem, yalnızca belirli TraceSource'ları adlandırmam gerekir?

cevap

1

Makine yapılandırmasına varsayılan bir dinleyici ekleyebilirsiniz, ancak bu etkilemek istediğinizden daha fazla uygulamayı etkileyebilir.

+0

I * do * Listen Listen'ı paylaştı. Örneğimdeki 'MyListener' adlı Dinleyici, paylaşılan bir dinleyicidir, aksi takdirde eklerken ona isim veremezdim. (Bunu daha açık bir şekilde anlatmaya çalışacağım). Ancak mevcut yapılandırmayla, bu paylaşılan dinleyiciyi hala * her bir TraceSource * 'a eklemem gerekiyor. App.Config'teki her TraceSource ismini tekrar etmekten kaçınmak için bir yol arıyorum. – HugoRune

+0

Üzgünüm. Daha sonra, machine.config dosyasını değiştirmeniz veya uygulama başlangıcında kodlamanız gerekir, ancak bu, tüm bunları dinleyicilere eklemek için izleme kaynaklarının özel listesine ulaşmak için yansıma gerektirir. – MatthewMartin

3

Bunun için harika bir çözüm bulamadım, dolayısıyla yaptığım şey en azından TraceSource'ın oluşturulmasını merkezileştirdi. Sonra bu yeni oluşturulan kaynaklara app.config 'iz' dinleyicilerin herhangi ekleyebilirsiniz:

TraceSource toReturn = new TraceSource(name, filterLevel); 

//remove the default trace listener; don't 'clear' the listeners entirely, because that would undo changes made in app.config; this is a decent compromise 
toReturn.Listeners.Remove("Default"); 

//add all global trace listeners from the app.config 
toReturn.Listeners.AddRange(Trace.Listeners); 

return toReturn; 

Şimdi <system.diagnostics> \ <trace> \ <listeners> eklediğiniz herhangi dinleyiciler Bu kod ile oluşturduğunuz tüm iz kaynaklarına eklenecektir.

İlgili konular