Güncelleme: İstediğiniz eksik dinleyicilerin bir kısmını sağlayan System.Diagnostics uzantıları için bkz. CodePlex'teki Essential.Diagnostics ( http://essentialdiagnostics.codeplex.com/ )
çerçeveler
S: Hangi çerçeveleri kullanıyorsunuz?
C: .NET 2.0'da yerleşik olarak bulunan System.Diagnostics.TraceSource.
Uygulamalar için güçlü, esnek, yüksek performanslı günlük kaydı sağlar, ancak birçok geliştirici yeteneklerinin farkında değildir ve bunları tam olarak kullanmaz.
Ek işlevselliğin yararlı olduğu veya bazen işlevin var olduğu, ancak iyi belgelenmediği bazı alanlar vardır, ancak bu, tüm günlük çerçevesinin (genişletilebilir olarak tasarlanan) atılması ve bazı popüler alternatifler gibi tamamen değiştirilmesi gerektiği anlamına gelmez. (NLog, log4net, Common.Logging ve hatta EntLib Logging).
Günlüğe kaydetme ifadelerini uygulamanıza ekleme ve tekerleği yeniden icat etme şeklinizi değiştirmek yerine, System.Diagnostics çerçevesini ihtiyacınız olan birkaç yerde genişlettik.
Bana öyle geliyor ki, diğer çerçeveler, hatta EntLib bile, Burada Invented Here Sendromundan muzdarip ve sanırım System.Diagnostics'te (günlük ifadelerini nasıl yazdığınız gibi) zaten iyi çalışan temelleri yeniden icat etmek için zaman harcadılar, var olan birkaç boşluğu doldurmak yerine. Kısacası, onları kullanmayın - onlara gerek yoktur.
Bilmediğiniz özellikler:
- Biçim dizesi ve bağımsız değişkenler alan TraceEvent aşırı yüklerinin kullanılması, parametrelerin Filter.ShouldTrace () başarılı olana kadar ayrı başvurular olarak tutulması nedeniyle performansa yardımcı olabilir. Bu, sistem onaylanan mesaj gerçekten günlüğe kaydedilene kadar parametre değerlerinde pahalı ToString () çağrılarının olmadığı anlamına gelir.
- Trace.CorrelationManager, aynı mantıksal işlemle ilgili günlük ifadelerini ilişkilendirmenizi sağlar (aşağıya bakın).
- VisualBasic.Logging.FileLogTraceListener günlük dosyalarına yazmak için iyidir ve dosya döndürmeyi destekler. VisualBasic ad alanında olsa da, sadece DLL dahil edilerek bir C # (veya başka bir dil) projesinde olduğu gibi kolayca kullanılabilir.
- TraceEvent'i birden çok argümanla ve boş veya boş biçim dizesiyle çağırırsanız, EventLogTraceListener'ı kullanırken, yerelleştirilmiş ileti kaynakları kullanıyorsanız, argümanlar doğrudan EventLog.WriteEntry () öğesine iletilir.
- Hizmet İzleme Görüntüleyicisi aracı (WCF'den) etkinlikle ilişkili günlük dosyalarının grafiklerini görüntülemek için yararlıdır (WCF kullanmasanız bile). Bu, birden fazla iş parçacığının / etkinliğin yer aldığı karmaşık sorunların hatalarını gidermenize gerçekten yardımcı olabilir.
- Tüm dinleyicileri silerek (veya Varsayılan'ı kaldırarak) ek yükten kaçının; aksi takdirde Varsayılan her şeyi izleme sistemine geçirir (ve tüm bu ToString () ek yüklerine neden olur).
Genişlemeye bakmak isteyebileceğiniz alanlar (gerekirse):
- Veritabanı izleme dinleyicisi
- Renkli konsol izleme dinleyicisi
- MSMQ / E-posta / WMI izleme dinleyicileri (gerekirse)
- Dinamik yapılandırma değişiklikleri için Trace.Refresh öğesini çağırmak için bir FileSystemWatcher uygulayın
Diğer Tavsiyeler:
Yapılandırılmış olay kimliklerini kullanın ve bir referans listesi tutun (örneğin bunları bir numarada belgeleyin).
Sisteminizdeki her (önemli) olay için benzersiz olay kimliklerine sahip olmak, belirli sorunları ilişkilendirmek ve bulmak için çok yararlıdır. Olay kimliklerini günlüğe kaydeden / kullanan belirli bir koda geri dönmek kolaydır ve yaygın hatalar için rehberlik sağlamayı kolaylaştırabilir, örneğin 5178 hatası veritabanı bağlantı dizenizin yanlış olduğu anlamına gelir.
Etkinlik kimlikleri, belirli kodları bilmeden kategorilere göre işlem yapmanıza olanak tanıyan bir tür yapıyı (e-posta ve HTTP'de kullanılan Yanıt Kodları Teorisine benzer) izlemelidir.
Örneğin, ilk basamak genel sınıfı detaylandırabilir: 'Başlat' işlemleri için 1xxx, normal davranış için 2xxx, etkinlik izleme için 3xxx, uyarılar için 4xxx, hatalar için 5xxx, 'Dur' işlemleri için 8xxx, ölümcül hatalar için 9xxx, vb.
İkinci basamak alanı detaylandırabilir, örneğin veritabanı bilgisi için 21xx (veritabanı uyarıları için 41xx, veritabanı hataları için 51xx), hesaplama modu için 22xx (hesaplama uyarıları için 42xx, vb.), Başka bir modül için 23xx, vb.
Atanmış, yapılandırılmış etkinlik kimlikleri de bunları filtrelerde kullanmanıza olanak tanır.
S: İzleme kullanıyorsanız, Trace.Correlation.StartLogicalOperation'ı kullanıyor musunuz?
C: Trace.CorrelationManager, günlük deyimlerini herhangi bir çok iş parçacıklı ortamda (bu günlerde hemen hemen her şeydir) ilişkilendirmek için çok yararlıdır.
İlişkilendirmek için her mantıksal işlem için en az bir kez ActivityId ayarlamanız gerekir.
Start / Stop ve LogicalOperationStack daha sonra basit yığın tabanlı bağlam için kullanılabilir. Daha karmaşık bağlamlar (örneğin eşzamansız işlemler) için TraceTransfer işlevini yeni ActivityId öğesine (değiştirmeden önce) kullanarak ilişkilendirmeye izin verir.
Hizmet İzleme Görüntüleyicisi aracı, etkinlik grafiklerini görüntülemek için yararlı olabilir (WCF kullanmasanız bile).
S: Bu kodu elle mi yazıyorsunuz, yoksa bunu yapmak için bir tür yönelimli programlama mı kullanıyorsunuz? Kod pasajını paylaşmak ister misiniz?
C: (a) oluşturulduğunda içeriği ayarlayan ve (b) atıldığında içeriği sıfırlayan bir kapsam sınıfı, örneğin LogicalOperationScope oluşturmak isteyebilirsiniz.
Bu, işlemleri otomatik olarak sarmak için aşağıdakine benzer bir kod yazmanıza olanak tanır:
using( LogicalOperationScope operation = new LogicalOperationScope("Operation") )
{
// .. do work here
}
Oluşturma sırasında kapsam ilk olarak gerekirse ActivityId ayarlayabilir, StartLogicalOperation'ı çağırabilir ve ardından bir TraceEventType.Start iletisi kaydedebilir. Dispose üzerinde bir Dur iletisi kaydedebilir ve sonra StopLogicalOperation'ı çağırabilir.
S: Eser kaynaklar üzerinde herhangi bir ayrıntı düzeyi sağlıyor musunuz? Örneğin, WPF TraceSources bunları çeşitli düzeylerde yapılandırmanıza izin verir.
C: Evet, sistemler büyüdükçe birden çok İzleme Kaynağı yararlı / önemlidir.
Muhtemelen tüm Uyarı ve yukarıdaki veya tüm Bilgi ve yukarıdaki mesajları tutarlı bir şekilde günlüğe kaydetmek istediğinizde, makul büyüklükteki bir sistem için Etkinlik İzleme (Başlat, Durdur vb.) Ve Ayrıntılı günlük kaydı hacmi çok fazla olur.
Hepsini açıp kapatan tek bir anahtara sahip olmak yerine, bu bilgileri bir seferde sisteminizin bir bölümü için açmanız yararlıdır.
Bu şekilde, genellikle günlüğe kaydetme (tüm uyarılar, hatalar vb.) İle ilgili önemli sorunları bulabilir ve ardından istediğiniz bölümleri "yakınlaştırabilir" ve bunları Etkinlik İzleme ve hatta Hata Ayıklama düzeylerine ayarlayabilirsiniz.
İhtiyacınız olan izleme kaynağı sayısı uygulamanıza bağlıdır, örneğin montaj veya uygulamanızın ana bölümü başına bir izleme kaynağı isteyebilirsiniz.
Daha da iyi ayarlanmış kontrole ihtiyacınız varsa, belirli yüksek ses düzeyli izlemeyi açmak / kapatmak için münferit boolean anahtarları ekleyin, örn. Ham mesaj dökümleri. (Veya WCF / WPF'ye benzer şekilde ayrı bir izleme kaynağı kullanılabilir).
Etkinlik İzleme için genel (diğer) günlüklemeye karşı ayrı izleme kaynaklarını da düşünebilirsiniz, çünkü filtreleri tam olarak istediğiniz şekilde yapılandırmak biraz daha kolay olabilir.
Farklı kaynaklar kullanılsa bile mesajların yine de ActivityId ile ilişkilendirilebileceğini unutmayın, bu yüzden ihtiyacınız olduğu kadar kullanın.
Dinleyiciler
S: Hangi günlük çıktılarını kullanıyorsunuz?
Bu, ne tür bir uygulama yazdığınıza ve günlüğe kaydedilen işlemlere bağlı olabilir. Genellikle farklı şeyler farklı yerlere gider (yani çoklu çıktılar).
Çıktıları genellikle üç gruba ayırırım:
(1) Olaylar - Windows Olay Günlüğü (ve izleme dosyaları)
Örneğin, bir sunucu / hizmet yazıyorsanız, Windows üzerinde en iyi uygulama Windows Olay Günlüğü'nü kullanmaktır (raporlanacak bir kullanıcı arayüzünüz yoktur).
Bu durumda, tüm Önemli, Hata, Uyarı ve (hizmet düzeyi) Bilgi olayları Windows Olay Günlüğü'ne gitmelidir. Bilgi düzeyi, bu tür üst düzey etkinlikler için ayrılmalıdır; olay günlüğüne gitmek isteyenler, örneğin "Hizmet Başlatıldı", "Hizmet Durduruldu", "Xyz'e Bağlı" ve hatta "Zamanlama Başlatıldı" , "Kullanıcı Oturum Açtı" vb.
Bazı durumlarda, olay günlüğüne yazma işlemini izleme sistemi aracılığıyla değil uygulamanızın yerleşik bir parçası haline getirmek isteyebilirsiniz (örneğin, Olay Günlüğü girişlerini doğrudan yazın). Bu, yanlışlıkla kapatılamayacağı anlamına gelir. (Yine de aynı olayı izleme sisteminizde not etmek istediğinizi unutmayın, böylece ilişkilendirebilirsiniz).
Buna karşılık, bir Windows GUI uygulaması genellikle bunları kullanıcıya bildirir (Windows Olay Günlüğüne de giriş yapsalar da).
Olaylar aynı zamanda ilgili performans sayaçlarına da sahip olabilir (örneğin hata sayısı / sn) ve Olay Günlüğüne doğrudan yazma, performans sayaçları, izleme sistemine yazma ve kullanıcıya raporlama yapmaları için koordine etmek önemli olabilir. Aynı zaman.
Bir kullanıcı belirli bir zamanda bir hata iletisi görürse, Windows Olay Günlüğü'nde aynı hata iletisini ve ardından izleme günlüğünde aynı zaman damgasıyla aynı olayı (diğer izleme ayrıntılarıyla birlikte) bulabilmeniz gerekir.
(2) Etkinlikler - Uygulama Günlüğü dosyaları veya veritabanı tablosu (ve izleme dosyaları)
Bu, sistemin web sayfası, borsa ticareti, sipariş alma, yapılan hesaplama vb. Gibi yaptığı düzenli etkinliktir.
Etkinlik İzleme (başlatma, durdurma vb.) Burada (doğru ayrıntı düzeyinde) yararlıdır.
Ayrıca, belirli bir Uygulama Günlüğü (bazen Denetim Günlüğü olarak da adlandırılır) kullanmak çok yaygındır. Genellikle bu bir veritabanı tablosu veya bir uygulama günlük dosyasıdır ve yapılandırılmış veriler (yani bir alan kümesi) içerir.
Uygulamanıza bağlı olarak işler burada biraz bulanıklaşabilir. İyi bir örnek, her isteği bir web günlüğüne yazan bir web sunucusu olabilir; benzer örnekler, her işlemin uygulamaya özgü ayrıntılarla birlikte günlüğe kaydedildiği bir mesajlaşma sistemi veya hesaplama sistemi olabilir.
Çok iyi olmayan bir örnek, borsa işlemleri veya bir müşteri siparişi sistemidir. Bu sistemlerde büyük olasılıkla önemli iş değerine sahip oldukları için etkinliği zaten kaydediyorsunuzdur, ancak bunları diğer eylemlerle ilişkilendirme ilkesi hala önemlidir.
Özel uygulama günlüklerinin yanı sıra, etkinlikler genellikle ilgili performans sayaçlarına da sahiptir, örneğin saniyedeki işlem sayısı.
Genel olarak, farklı sistemlerde faaliyetlerin günlüğe kaydedilmesini koordine etmelisiniz, yani performans sayacınızı arttırırken aynı zamanda uygulama günlüğünüze yazmanız ve izleme sisteminize giriş yapmanız gerekir. Hepsini aynı anda yaparsanız (veya kodda birbirinden hemen sonra), hata ayıklama sorunları daha kolaydır (hepsi kodun farklı zamanlarda / konumlarda ortaya çıkmasından daha kolaydır).
(3) Hata Ayıklama İzi - Metin dosyası veya XML veya veritabanı.
Bu, Ayrıntılı düzey ve altındaki bilgilerdir (örn. Ham veri dökümlerini açmak / kapatmak için özel boole anahtarları). Bu, bir sistemin bir alt aktivite düzeyinde ne yaptığının cesaretini veya ayrıntılarını sağlar.
Bu, uygulamanızın tek tek bölümleri (dolayısıyla çoklu kaynaklar) için açmak / kapatmak istediğiniz düzeydir. Bu olayların Windows Olay Günlüğü'nü karıştırmasını istemezsiniz. Bazen bir veritabanı kullanılır, ancak belirli bir süre sonra temizlenen yuvarlanan günlük dosyaları daha olasıdır.
Bu bilgiler ile Uygulama Günlüğü dosyası arasındaki büyük fark, yapılandırılmamış olmasıdır. Bir Uygulama Günlüğünde Kime, Kimden, Miktar vb. Alanlara sahip olsa da, ayrıntılı hata ayıklama izleri bir programcının koyduğu her şey olabilir, örneğin "X değerlerini kontrol etme = {değer}, Y = yanlış" veya " Tamam, tekrar deniyorum ".
Önemli bir uygulama, uygulama günlük dosyalarına veya Windows Olay Günlüğü'ne eklediğiniz şeylerin izleme sistemine aynı ayrıntılarla (ör. Zaman damgası) kaydedilmesini sağlamaktır. Bu, daha sonra araştırırken farklı günlükleri ilişkilendirmenizi sağlar.
Service Trace Viewer gibi karmaşık bir korelasyona sahip olduğunuz için belirli bir günlük görüntüleyiciyi kullanmayı planlıyorsanız, uygun bir biçimi, yani XML'i kullanmanız gerekir. Aksi takdirde, basit bir metin dosyası genellikle yeterince iyidir - daha düşük seviyelerde bilgiler büyük ölçüde yapılandırılmamıştır, bu nedenle dizilerin dökümlerini, yığın dökümlerini vb. Bulabilirsiniz. Daha yüksek düzeylerde daha yapılandırılmış günlüklerle ilişkilendirilebildiğiniz takdirde, işler iyi ol.
S: Dosya kullanıyorsanız, yuvarlanan günlükler mi yoksa yalnızca tek bir dosya mı kullanıyorsunuz? Günlükleri insanların tüketmesi için nasıl hazır hale getirirsiniz?
C: Dosyalar için genellikle günlük dosyalarını yönetilebilirlik açısından döndürmek istersiniz (System.Diagnostics ile VisualBasic.Logging.FileLogTraceListener kullanın).
Kullanılabilirlik tekrar sisteme bağlıdır. Yalnızca dosyalar hakkında konuşuyorsanız, o zaman bir sunucu / hizmet için, gerektiğinde dosyalara erişilebilir. (Windows Olay Günlüğü veya Veritabanı Uygulama Günlüklerinin kendi erişim mekanizmaları olacaktır).
Dosya sistemine kolay erişiminiz yoksa, bir veritabanına hata ayıklama izlemesi daha kolay olabilir. [yani bir TraceListener veritabanı uygulamak].
Bir Windows GUI uygulaması için gördüğüm ilginç bir çözüm, çalışırken bir "uçuş kaydedici" çok ayrıntılı izleme bilgilerini günlüğe kaydetti ve daha sonra hiçbir sorun olsaydı kapattığınızda o zaman sadece dosyayı sildi.
Ancak, çöktüyse veya bir sorunla karşılaştıysa, dosya silinmedi. Ya hatayı yakalarsa veya bir sonraki çalıştırıldığında dosyayı fark eder ve daha sonra harekete geçebilir, örneğin sıkıştırın (örn. 7zip) ve e-posta ile gönderin veya başka bir şekilde kullanılabilir hale getirin.
Günümüzde birçok sistem, arızaların otomatik olarak merkezi bir sunucuya raporlanmasını içerir (kullanıcılarla kontrol ettikten sonra, örneğin gizlilik nedenleriyle).
İzlenimi
S: Günlükleri görüntülemek için hangi araçları kullanıyorsunuz?
C: Farklı nedenlerle birden fazla günlüğünüz varsa, birden çok görüntüleyici kullanırsınız.
Notepad / vi / Notepad ++ veya başka bir metin düzenleyici, düz metin günlükleri için temeldir.
Karmaşık işlemleriniz, örneğin aktarım içeren faaliyetleriniz varsa, açıkça, Hizmet İzleme Görüntüleyicisi gibi özel bir araç kullanırsınız. (Ancak buna ihtiyacınız yoksa, bir metin düzenleyici daha kolaydır).
Genel olarak Windows Olay Günlüğüne üst düzey bilgiler kaydettiğimden, yapılandırılmış bir şekilde genel bir bakış elde etmenin hızlı bir yolunu sunar (güzel hata / uyarı simgelerini arayın). En azından günlük size bir başlangıç noktası verse de, yalnızca günlükte yeterli değilse metin dosyalarını aramaya başlamanız gerekir. (Bu noktada, günlüklerinizin koordine edilmiş girişlere sahip olduğundan emin olmak yararlı olur).
Genellikle Windows Olay Günlüğü, bu önemli olayları MOM veya OpenView gibi izleme araçları için de kullanılabilir hale getirir.
Diğerleri -
Bir Veritabanında oturum açarsanız, bilgileri filtrelemek ve sıralamak kolay olabilir (örneğin, belirli bir etkinlik kimliğini yakınlaştırma.
MS Excel (veya başka bir elektronik tablo programı). Bu, farklı değerlerin farklı sütunlara girmesi için doğru sınırlayıcılarla içe aktarabiliyorsanız yapılandırılmış veya yarı yapılandırılmış bilgileri analiz etmek için yararlı olabilir.
Hata ayıklama / sınamada bir hizmet çalıştırırken genellikle basitlik için bir konsol uygulamasında barındırırım Renkli bir konsol günlüğü yararlı buluyorum (örneğin hatalar için kırmızı, uyarılar için sarı, vb.). Özel bir izleme dinleyicisi uygulamanız gerekir.
Çerçevenin renkli bir konsol günlüğü veya bir veritabanı günlüğü içermediğini unutmayın, bu yüzden şu anda ihtiyacınız varsa bunları yazmanız gerekir (çok zor değil).
Birkaç çerçevenin (log4net, EntLib, vb.) Tekerleği yeniden icat etmek için zaman harcadığını ve metin dosyalarına, Windows Olay Günlüğüne ve XML dosyalarına her birinin kendi başına temel günlük kaydını, filtrelemeyi ve günlük kaydını yeniden uyguladığını gerçekten rahatsız ediyor farklı yol (günlük deyimleri her birinde farklıdır); daha sonra her biri, örneğin bir veritabanı kaydedicisinin kendi versiyonunu uyguladı, bunların çoğu zaten mevcuttu ve gereken tek şey System.Diagnostics için birkaç iz dinleyiciydi. Yinelenen çabaların büyük bir kaybı hakkında konuşun.
S: Bir ASP.NET çözümü oluşturuyorsanız, ASP.NET Health Monitoring'i de kullanıyor musunuz? İzleme çıktısını sağlık izleme olaylarına ekliyor musunuz? Trace.axd hakkında ne?
Bunlar gerektiğinde açılıp kapatılabilir. Trace.axd dosyasını bir sunucunun belirli şeylere nasıl yanıt verdiğini hata ayıklamak için oldukça yararlı buluyorum, ancak genellikle çok kullanılan bir ortamda veya uzun süreli izleme için kullanışlı değil.
S: Özel performans sayaçları ne olacak?
Profesyonel bir uygulama, özellikle de bir sunucu / hizmet için, hem Performans İzleyicisi sayaçları hem de Windows Olay Günlüğü'nde oturum açarak tam olarak kullanıldığını görmeyi umuyorum. Bunlar Windows'daki standart araçlardır ve kullanılmaları gerekir.
Kullandığınız performans sayaçları ve olay günlükleri için yükleyicileri eklediğinizden emin olmanız gerekir; bunlar kurulum sırasında oluşturulmalıdır (yönetici olarak kurulurken). Uygulamanız normal çalışıyorsa, yönetim ayrıcalıklarına sahip olmanız gerekmez (ve bu nedenle eksik günlükler oluşturamaz).
Bu, yönetici olmayan bir kişi olarak geliştirme uygulamaları yapmak için iyi bir nedendir (hizmetleri yüklemeniz gerektiğinde ayrı bir yönetici hesabınız vb.). Olay günlüğüne yazıyorsanız, .NET, ilk kez yazdığınızda otomatik olarak eksik bir günlük oluşturur; yönetici olmayan biri olarak geliştirirseniz, bunu erkenden yakalayacak ve bir müşteri sisteminizi yüklediğinde kötü bir sürprizden kaçınacak ve daha sonra yönetici olarak çalışmadığı için kullanamayacaksınız.