Günlüğe kaydetme en iyi uygulamaları [kapalı]


323

İnsanların gerçek uygulamalarda izleme ve günlük kaydını nasıl ele aldıkları hakkında hikayeler almak istiyorum. Yanıtınızı açıklamanıza yardımcı olabilecek bazı sorular.

çerçeveler

Hangi çerçeveleri kullanıyorsunuz?

  • log4net
  • System.Diagnostics.Trace
  • System.Diagnostics.TraceSource
  • Günlük uygulama bloğu
  • Diğer?

İzleme kullanıyorsanız, Trace.Correlation.StartLogicalOperation uygulamasını kullanıyor musunuz?

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?

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:

  • System.Windows - tüm WPF ayarları
  • System.Windows.Animation - özellikle Animasyon için geçersiz kıl.

Dinleyiciler

Hangi günlük çıktılarını kullanıyorsunuz?

  • Metin dosyaları
  • XML dosyaları
  • Olay günlüğü
  • Diğer?

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?

İzlenimi

Günlükleri görüntülemek için hangi araçları kullanıyorsunuz?

  • Not Defteri
  • Kuyruk
  • Etkinlik göstericisi
  • Systems Center Operations Manager / Microsoft Operations Manager
  • WCF Hizmet İzleme Görüntüleyicisi
  • Diğer?

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?

Özel performans sayaçları ne olacak?


3
Bunun gibi soruları 300 upvotes ile kapatan kişilerin bir wiki formatı önerebilmelerini veya programmers.stackexchange'te yayın göndermelerini veya bu tür bir soru hoş karşılanmazsa Quora'yı önerebilmeleri yararlı olacaktır. Açıkçası soru aslında çok yapıcı, sadece StackOverflow'un istediği kriterlere uymuyor. programmers.stackexchange.com/questions/57064/… 24 yukarı oy veriyor. Belki StackOverflow bir şey eksik?
Niall Connaughton

Bu soru Soru-Cevap formatını ihlal ederse, soru ile değil Soru-Cevap Formatıyla YANLIŞ BİR ŞEY VAR. Bazen bir sorunun kapatılması gerekip gerekmediği kararı verilen cevapların bir fonksiyonu olabilir, bazı açık uçlu sorular tartışmaya davet eder, ancak diğerleri kullanıcıları bu gibi değerli içerik sağlamaya davet eder!
Matthias Wolf

1
Bu soru - özellikle en iyi cevap - Birisi bu şekilde kullanmak isterse muhtemelen bir blog yazısı için mükemmel bir temel oluşturur ... Nesnel bir soru olarak, gerçekten uymuyor - açıkça bir saman anketi olarak yapılandırıldı - ancak aşağıda bazı iyi bilgiler, dolayısıyla kilit.
Shog9

Yanıtlar:


232

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.


Bilginize: Bir dosyanın microsoft izlemesinin çökmesine neden olan bir sorunla karşılaştım. Aynı dosyaya birden çok işlem (veya iş parçacığı) yazma ve bunlar çakışırsa, günlük dosyasında bir dosya sistemine özel erişim kilitleme hatası alırsınız.
Jay

1
System.Diagnostics altyapısı iş parçacığı için güvenlidir; varsayılan davranış çerçevenin kilitlenmesidir, ancak kendi kilitlemenizi sağlarsanız TraceListener.IsThreadSafe'yi geçersiz kılabilirsiniz. Bkz. Msdn.microsoft.com/en-us/library/… . Birden çok işlem için normalde ayrı dosyalara yazabilirsiniz, ancak Service Trace Viewer'ın birden fazla izleme dosyasını yükleyebileceğini (örneğin birden çok makineden) ve bunları ActivityId ile ilişkilendirebileceğini unutmayın.
Sly Gryphon

1
İstisnaları günlüğe kaydetmek için TraceEvent () nasıl kullanılacağını önerebilirsiniz?
Dmitriy Sosunov

1
Bayrağı ile derlenmiş kodun nadiren üretildiği üretim ortamlarında kullanılamaz hale getiren, System.Diagnostics.Tracesüslendiği en büyük dezavantajlardan biri değil mi? [Conditional("TRACE")]TRACE
Asbjørn Ulsberg

2
@asbjornu Visual Studio'daki varsayılan Release derleme yapılandırmasında TRACE tanımlanmıştır (Release derlemeleri için kapatılan DEBUG'dir); Ancak komut satırından bina oluşturuyorsanız, onu açmanız gerekir.
Sly Gryphon

40

Benim durumumda platform esnekliği (masaüstü .Net / Compact Framework, 32/64-bit) bakış açısıyla gelen log4net'i tavsiye eden koroya katılmak zorundayım.

Bununla birlikte, onu bir özel etiket API'sına sarmak büyük bir anti-modeldir . log4net.ILoggerarasında .Net muadili olan Commons açılıyor sarıcı API kavrama zaten sizin için minimize edilir, böylece zaten, ve herhangi bir kontrol vazgeçerek değil çünkü genellikle bile bir endişe değil bir Apache kütüphane, aynı zamanda tarihi: çatal o eğer zorunlu.

Gördüğüm çoğu ev sarıcı kütüphanesi, bir veya daha fazla hata liiti işliyor:

  1. Başka bir seçicilik kazanımı için sınıf başına önerilen kaydedici modelinin ince çözünürlüğünü kaybeden genel bir singleton logger (veya eşdeğer olarak statik bir giriş noktası) kullanmak .
  2. ExceptionBirden fazla soruna yol açan isteğe bağlı argümanı gösterememe :
    • Bir istisna günlüğü politikasının sürdürülmesi daha da zorlaşır, bu nedenle istisnalarla tutarlı bir şekilde hiçbir şey yapılmaz.
    • Tutarlı bir politikada bile, istisnanın bir dizeye biçimlendirilmesi, verileri zamanından önce kaybeder. ILayoutOlay zincirini belirlemek için bir istisna üzerinde ayrıntılı inceleme yapan özel bir dekoratör yazdım .
  3. Ortaya çıkarmak için başarısız özelliklereIsLevelEnabled alanları veya günlük seviyeleri kapalı olduğunda biçimlendirme kodu atlama olanağı atar.

1
Log4j çevresindeki bir (korkunç) şirket içi ambalajını biraz daha az korkunç bir şeye dönüştürmekle görevlendirildim. Global statik giriş noktasını ortadan kaldırmaya çalıştım ama vuruldum. Gerçekten anlamýyorum. Bizim kurulumumuzda, log4j o kadar ağır bir şekilde genişletilmiş ve bükülmüş ki, gerçekten sadece bir olay dağıtıcısı olarak kullanılıyor; sadece birini kullanıyoruz çünkü birisi "bunun için log4j'yi nasıl kullanabiliriz?" diye sordu. Log4'ü doğrudan kullanın ya da sadece kendi çerçevenizi yazın. Orta yol acı vericidir.
Adam Jaskiewicz

25
Log4net'i sarmamanızı tavsiye etmiyorum. İnce bir sağlayıcı modeli API ile sarmak, sınıf kütüphanelerinizin kullanıcılarının en sevdikleri günlük çerçevesini takmalarını sağlar. Tabii ki YMMV, ama bunu "büyük bir anti-model" olarak tanımlamak biraz dogmatik. Ayrıca, "bir hatalar litanı" olan sarmalayıcı kütüphaneleri olması, iyi yazılmış bir sarmalayıcıya karşı iyi bir argüman değildir.
Joe

1
Anti-desen çağırmak her zaman% 100 kötü bir fikir olduğu anlamına gelmez - sadece dikkatli değilseniz kendinizi köşeye boyama eğilimi yaratır. Ayrıca, ILog / LogManager, log4net derlemesinde bir araya getirilen commons-logging görüntüsünde iyi yazılmış bir sarmalayıcı mini kütüphanesidir, ancak ayıklanmasının ve CLR için uygun bir commons günlüğüne dönüştürülmesinin bir nedeni yoktur.
Jeffrey Hantin

18

Asp.net'te sık sık gelişmiyorum, ancak kaydediciler söz konusu olduğunda en iyi uygulamaların evrensel olduğunu düşünüyorum. İşte yıllar boyunca öğrendiğim loglama hakkındaki rastgele düşüncelerimden bazıları:

çerçeveler

  • Logger uygulamasını API'nizden ayırabilmeniz için slf4j (veya kendi rulo) gibi bir logger soyutlama çerçevesi kullanın. Bir dizi logger çerçevesinin gelip gittiğini gördüm ve çok fazla uğraşmadan yeni bir çerçeve benimsemek daha iyi.
  • Çeşitli çıktı biçimlerini destekleyen bir çerçeve bulmaya çalışın.
  • Eklentileri / özel filtreleri destekleyen bir çerçeve bulmaya çalışın.
  • Harici dosyalar tarafından yapılandırılabilen bir çerçeve kullanın, böylece müşterileriniz / tüketicileriniz günlük çıktısını kolayca değiştirebilir, böylece ticari günlük yönetimi uygulamaları tarafından kolayca okunabilir.
  • Özel günlük kaydı düzeylerinde denize gitmediğinizden emin olun, aksi takdirde farklı günlük kaydı çerçevelerine geçemeyebilirsiniz.

Kaydedici Çıkışı

  • Günlüğe ilişkin felaket hatalarıyla karşılaşabilecek XML / RSS stil günlüklerinden kaçınmaya çalışın. Bu önemlidir çünkü kayıt cihazınız kapanış </xxx>etiketini yazmadan güç düğmesi kapatılırsa günlüğünüz bozulur.
  • Günlük konuları. Aksi takdirde, programınızın akışını izlemek çok zor olabilir.
  • Günlüklerinizi uluslararası hale getirmeniz gerekiyorsa, bir geliştiricinin yalnızca İngilizce (veya seçtiğiniz dil) giriş yapmasını isteyebilirsiniz.
  • Bazen SQL sorgularına günlük ifadeleri ekleme seçeneğine sahip olmak, hata ayıklama durumlarında cankurtaran olabilir. Gibi:
    - Sınıfı Çağırma: com.foocorp.foopackage.FooClass: 9021
    Foo'DAN SEÇ *;
  • Sınıf düzeyinde günlük kaydı istiyorsunuz. Normalde kaydedicilerin statik örneklerini istemezsiniz - mikro optimizasyona değmez.
  • Günlüğe kaydedilen istisnaları işaretlemek ve kategorilere ayırmak bazen yararlı olabilir çünkü tüm istisnalar eşit yaratılmaz. Kritik durumlar hakkında bildirim göndermesi gereken bir günlük monitörünüz varsa, önemli istisnaların bir alt kümesini bilmek faydalıdır.
  • Çoğaltma filtreleri görme ve sabit diskinizi korur. Gerçekten aynı günlük ifadesini 10 ^ 10000000 kez tekrarlamak istiyor musunuz? Sadece şöyle bir mesaj almak daha iyi olmaz mıydı: This is my logging statement - Repeated 100 times

Ayrıca bu soruya bakın .


5
çoğaltma filtreleri harika bir fikir
Paul Stovell

kırık etiket sorunu üzerinde anlaşmak için kullanılan, ancak en iyi XML yazarları zaten XML kullanmadan (yani, kök öğe yok) tam XML kullanmayın böylece XML DOM yüklemeden oturum açabilirsiniz.
Yaygın

Yıllardır XML günlüğü üzerinde gidip geliyorum. Şimdi, bana aşırı geliyor. Bir uygulamanın durumunun RSS beslemesine ihtiyacım olursa, bir günlük izleme yardımcı programıyla daha iyi uygulandığını düşünüyorum.
Elijah

RSS konusunda hemfikirim. Girişi daha iyi anlamanıza izin veren görselleştirme araçları hakkında daha fazla düşünüyorum. metin dosyaları ile genellikle bir satıra bir giriş tutmak istersiniz; ancak bazen yığın izleri veya serileştirilmiş nesneler eklemek istersiniz. burada bir XML günlüğü (WCF tarafından kullanıldığı gibi) kullanışlı oluyor
Paul Stovell

SQL sorgularının enstrümantasyonundan bahsetmek için +1. Bu, veritabanı izleri ile uygulama izlerinin korelasyonu için gerçekten çok yararlıdır. Bunu DAL'ımda manuel olarak yapıyorum, ama merak ediyorum bu teknik için ne tür bir araç desteği var?
Constantin

17

Ekmek ve tereyağım Java olduğu için .Net günlük kaydı hakkında yorum yapmak için nitelikli değilim, ancak son 8 yılda günlük kayıtlarımızda bir göç yaşadık, sorunuza faydalı bir benzetme bulabilirsiniz.

JVM içindeki her evre tarafından kullanılan bir Singleton logger ile başladık ve tüm süreç için logging seviyesini ayarladık. Bu, sistemin çok belirli bir bölümünde bile hata ayıklamak zorunda kalsaydık, büyük günlüklerle sonuçlandı, bu nedenle bir numaralı ders günlüklemenizi bölümlendirmektir.

Günlükçünün şu anki enkarnasyonu, biri varsayılan olarak tanımlanan birden çok örneğe izin verir. Farklı günlük kaydı düzeylerine sahip çok sayıda alt günlük oluşturmayı başlatabiliriz, ancak bu mimarinin en kullanışlı yönü, günlük özelliklerini değiştirerek tek tek paketler ve sınıflar için günlük oluşturma yeteneğidir. İkinci ders, kodu değiştirmeden davranışını geçersiz kılmak için esnek bir sistem oluşturmaktır.

Log4J'nin etrafına sarılmış Apache commons-logging kütüphanesini kullanıyoruz.

Bu yardımcı olur umarım!

* Düzenle *

Aşağıdaki Jeffrey Hantin'in gönderisini okuduktan sonra, dahili günlük kaydımızın gerçekte ne olduğunu not almam gerektiğini fark ettim. Şimdi esasen bir fabrika ve kesinlikle doğru özellikler dosyasını (eski nedenlerden dolayı varsayılan konuma taşınmamış) kullanarak çalışan bir günlükçü almak için kullanılır. Komut satırında günlüğe kaydetme yapılandırma dosyasını belirtebildiğinizden, daha da zayıf hale geleceğinden şüpheleniyorum ve yeni bir uygulama başlatıyorsanız, kaydediciyi sarmayı bile zahmet etmemeniz gerektiğine dair ifadesine kesinlikle katılıyorum.


Cevap için teşekkürler. çocuk günlüklerini manuel olarak kodda mı (yani, sabit kodlanmış mı) veya bir tür otomatik / örtük şey aracılığıyla mı oluşturuyorsunuz?
Paul Stovell

Hayır ... bir paket veya sınıf için logging.properties dosyalarına bir günlük yapılandırması eklersek, bu yapılandırma başına günlüğe kaydedilir, ancak özel olarak yapılandırılmamış herhangi bir paket veya sınıf varsayılan düzeylerde günlüğe kaydedilir.
Steve Moyer

9

Log4Net'i, günlük örneği için tek bir paketleyici ile günlük sağlayıcısı olarak kullanıyoruz (singleton inceleniyor olsa da, iyi bir fikir olup olmadıklarını sorgulayarak).

Aşağıdaki nedenlerle seçtik:

  • Çeşitli ortamlarda basit yapılandırma / yeniden yapılandırma
  • Çok sayıda önceden oluşturulmuş ekleyici
  • Kullandığımız CMS'lerden biri zaten yerleşikti
  • Çok sayıda günlük düzeyi ve çevresindeki yapılandırmalar

Bahsetmeliyim ki, bu bir ASP.NET geliştirme açısından konuşuyor

.NET çerçevesinde olan Trace'i kullanmanın bazı avantajlarını görebiliyorum, ancak üzerinde tamamen satılmadım, çünkü esas olarak çalıştığım bileşenler gerçekten herhangi bir İzleme çağrısı yapmıyor. Sık kullandığım tek şey System.Net.Mailsöyleyebileceğim şey.

Bu yüzden log4net'i saran bir kütüphanemiz var ve kodumuzda böyle şeylere ihtiyacımız var:

Logger.Instance.Warn("Something to warn about");
Logger.Instance.Fatal("Something went bad!", new Exception());

try {
  var i = int.Parse("Hello World");
} catch(FormatException, ex) {
  Logger.Instance.Error(ex);
}

Yöntemler dahilinde, günlük kaydı düzeyinin etkin olup olmadığını kontrol etmek için bir kontrol yaparız, bu nedenle log4net API'sine yedekli çağrılarınız olmaz (bu nedenle Debug etkinleştirilmezse, hata ayıklama ifadeleri yok sayılır), ancak biraz zaman aldığımda Çekleri kendiniz yapabilmeniz için bunları açığa çıkarmak için güncelleyeceğim. Bu, değerlendirme yapılmaması gerektiğinde yapılmasını önleyecektir, örneğin:

Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

Bu olacak:

if(Logger.DebugEnabled) Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

(Biraz çalışma süresi kazanın)

Varsayılan olarak iki konumda oturum açarız:

  1. Web sitesinin dosya sistemi (sunulmayan bir dosya uzantısında)
  2. Hata ve Önemli için e-posta gönderme

Dosyalar her gün ya da 10mb (IIRC) yuvarlanarak yapılır. EventLog'u, genellikle bir site vermek istediğimizden daha yüksek güvenlik gerektirebileceğinden kullanmayız.

Not Defteri günlükleri okumak için iyi çalışıyor buluyorum.


Günlük çerçeveleri, singleton'un yanlış kullanım olmadığı birkaç durumdan biridir.
mmcdole

Kaydedicinizin çevresine bir bağlam sağlamak istiyorsanız olabilir. Ama eşzamanlılık ile başa çıkmak yardımcı oluyor
Aaron Powell

7
Kesinlikle singleton rip olurdu. Kesinlikle tek bir örneğiniz olabilir (tercihen IOC / DI kabında). Ben de bir durdurucu içine günlük taşımak için çalışacağım ....
yfeldblum

2
Tek bir örneğin hayranı da değil. Her sınıfa benzersiz adda bir logger vermeyi tercih ediyorum, bu nedenle günlük başına modül bazında yukarı veya aşağı çevirmeyi kolaylaştırmak kolay.
Jeffrey Hantin

8

Hangi çerçeveleri kullanıyorsunuz?

Günlük uygulama bloğunun bir karışımını ve .Net çerçeve bitleri etrafında çalışan özel bir günlük yardımcısını kullanıyoruz. LAB, servis yöntemi giriş / çıkışı için ayrı genel izleme dosyaları ve beklenmedik sorunlar için belirli hata dosyaları dahil oldukça geniş günlük dosyaları verecek şekilde yapılandırılmıştır. Yapılandırma, hata ayıklama yardımı için tarih / saat, iş parçacığı, PId vb. İle tam istisna ayrıntısı ve yığınını (beklenmeyen bir istisna durumunda) içerir.

Özel günlük yardımcısı Trace.Correlation'ı kullanır ve özellikle WF'de günlük kaydı bağlamında kullanışlıdır. Örneğin, bir dizi ardışık iş akışını çağıran bir durum makinemiz var. Bu çağrı aktivitelerinin her birinde başlangıcı (StartLogicalOperation kullanarak) kaydederiz ve sonunda mantıksal işlemi bir gereric return olay işleyicisi ile durdururuz.

Bu, faaliyet yürütme sırasına göre If / Else şubesi kararları vb.

Hangi günlük çıktılarını kullanıyorsunuz?

Metin dosyaları ve XML dosyaları kullanıyoruz. Metin dosyaları uygulama bloğu üzerinden yapılandırılır, ancak WF hizmetimizden de XML çıktılarımız var. Bu, genel iş türü istisnalarının yanı sıra çalışma zamanı olaylarını (kalıcılık vb.) Metin dosyaları gün ve boyuta göre yuvarlanan günlüklerdir (1MB'ın toplam boyutunun bir rollover noktası olduğuna inanıyorum).

Günlükleri görüntülemek için hangi araçları kullanıyorsunuz?

Hangi çıktı grubuna baktığımıza bağlı olarak Not Defteri ve WCF Service Trace Viewer'ı kullanıyoruz. WCF Service Trace Viewer, çıktı kurulumunuzu doğru şekilde yaptıysanız ve çıktıyı okumayı çok daha kolay hale getirebilirse gerçekten çok kullanışlıdır. Bununla birlikte, kabaca hatanın nerede olduğunu biliyorsanız - sadece iyi açıklamalı bir metin dosyasını okumak da iyidir.

Günlükler tek bir dizine gönderilir ve daha sonra kaynak hizmete bağlı olarak alt dizinlere bölünür. Kök dizin, erişimini bir destek kullanıcı grubu tarafından kontrol edilen bir web sitesi aracılığıyla gösterilir. Bu, talepleri ortaya koymadan ve üretim verileri için uzun bürokrasi işlemlerinden geçmeden üretim günlüklerine bakmamızı sağlar.


6

Aracın yazarları olarak, elbette .NET uygulamalarını günlüğe kaydetmek ve izlemek için SmartInspect kullanıyoruz . Genellikle canlı günlük kaydı için adlandırılmış kanal protokolünü ve son kullanıcı günlükleri için (şifreli) ikili günlük dosyalarını kullanırız. SmartInspect Konsolu'nu görüntüleyici ve izleme aracı olarak kullanıyoruz.

Aslında orada .NET için oldukça az sayıda günlük çerçevesi ve araçları var. DotNetLogging.com'da farklı araçlara genel bir bakış ve karşılaştırma var .


5

Cevaplarda çok sayıda harika öneri var.

En iyi genel uygulama, günlüğü kimin okuyacağını düşünmektir. Benim durumumda, istemci sitesinde bir yönetici olacak. Bu yüzden onlara hareket edebilecekleri bir şey veren mesajlar kaydediyorum. Örneğin, "Uygulama başlatılamıyor. Bunun nedeni genellikle ......"


1

Web uygulamalarımızda log4net kullanıyoruz.

XML yapılandırma dosyasını değiştirerek çalışma zamanında günlüğü özelleştirebilme özelliği, bir uygulama çalışma zamanında arızalandığında ve daha fazla bilgi görmeniz gerektiğinde çok kullanışlıdır.

Ayrıca, günlüğe kaydedilecek belirli sınıfları veya öznitelikleri hedeflemenizi sağlar. Hatanın nerede oluştuğu hakkında bir fikriniz olduğunda bu çok kullanışlıdır. Klasik bir örnek, sadece SQL'in veritabanına gittiğini görmek istediğiniz NHibernate'dir.

Düzenle:

Tüm olayları bir veritabanına ve İzleme sistemine yazıyoruz. Hatalar veya istisnalar için kullandığımız olay günlüğü. Özel raporlar oluşturabilmemiz ve kullanıcıların doğrudan uygulamadan istedikleri takdirde günlüğü görüntüleyebilmeleri için çoğu olayı bir veritabanına kaydediyoruz.


Nasıl kullandığınız hakkında daha fazla bilgi verebilir misiniz? Bir dosyaya veya olay günlüğüne mi oturum açıyorsunuz? Yuvarlanan bir günlük dosyası mı? Güvenli hale getirmek veya yedeklemek için ne yapıyorsunuz? Gerçek hayattaki kullanımla ilgileniyorum.
Paul Stovell

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.