Aracılığıyla paylaş


Mesaj Kayıtlarını Yapılandırma

Bu konuda, farklı senaryolar için ileti günlüğünü nasıl yapılandırabileceğiniz açıklanmaktadır.

İleti Günlüğünü Etkinleştirme

Windows Communication Foundation (WCF), iletileri varsayılan olarak günlüğe kaydetmez. İleti günlüğünü etkinleştirmek için, izleme kaynağına bir izleme dinleyicisi System.ServiceModel.MessageLogging eklemeniz ve yapılandırma dosyasındaki <messagelogging> öğenin özniteliklerini ayarlamanız gerekir.

Aşağıdaki örnek, günlüğe kaydetmeyi etkinleştirmeyi ve ek seçenekleri belirtmeyi gösterir.

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging">
      <listeners>
         <add name="messages"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData="c:\logs\messages.svclog" />
        </listeners>
    </source>
  </sources>
</system.diagnostics>

<system.serviceModel>
  <diagnostics>
    <messageLogging
         logEntireMessage="true"
         logMalformedMessages="false"
         logMessagesAtServiceLevel="true"
         logMessagesAtTransportLevel="false"
         maxMessagesToLog="3000"
         maxSizeOfMessageToLog="2000"/>
  </diagnostics>
</system.serviceModel>

İleti günlüğü ayarları hakkında daha fazla bilgi için bkz. İzleme ve İleti Günlüğü için Önerilen Ayarlar.

Kullanmak istediğiniz dinleyicinin adını ve türünü belirtmek için kullanabilirsiniz add . Örnek yapılandırmada Dinleyici "messages" olarak adlandırılır ve standart .NET Framework izleme dinleyicisini (System.Diagnostics.XmlWriterTraceListener) kullanılacak tür olarak ekler. kullanıyorsanız System.Diagnostics.XmlWriterTraceListener, yapılandırma dosyasında çıkış dosyasının konumunu ve adını belirtmeniz gerekir. Bu, initializeData günlük dosyasının adına ayarlayarak yapılır. Aksi takdirde, sistem bir istisna fırlatır. Günlükleri varsayılan bir dosyaya yayan özel bir dinleyici de uygulayabilirsiniz.

Uyarı

İleti günlüğü disk alanına eriştiğinden, belirli bir hizmet için diske yazılan ileti sayısını sınırlamanız gerekir. İleti sınırına ulaşıldığında, Bilgi düzeyinde bir izleme oluşturulur ve tüm ileti günlüğü etkinlikleri durur.

Kaydetme düzeyi ve ek seçenekler, Kaydetme Düzeyi ve Seçenekler bölümünde ele alınmaktadır.

switchValue özniteliği bir source yalnızca izleme için geçerlidir. switchValue izleme kaynağı için aşağıdaki gibi bir System.ServiceModel.MessageLogging öznitelik belirtirseniz, bunun hiçbir etkisi olmaz.

<source name="System.ServiceModel.MessageLogging" switchValue="Verbose">
</source>

İzleme kaynağını devre dışı bırakmak istiyorsanız, bunun yerine öğesinin logMessagesAtServiceLevel, logMalformedMessagesve logMessagesAtTransportLevel özniteliklerini messageLogging kullanmanız gerekir. Tüm bu öznitelikleri false olarak ayarlamalısınız. Bu, önceki kod örneğindeki yapılandırma dosyası kullanılarak, Yapılandırma Düzenleyicisi kullanıcı arabirimi aracılığıyla veya WMI kullanılarak yapılabilir. Yapılandırma Düzenleyicisi aracı hakkında daha fazla bilgi için bkz . Yapılandırma Düzenleyicisi Aracı (SvcConfigEditor.exe). WMI hakkında daha fazla bilgi için bkz. Tanılama için Windows Yönetim Araçları'nın kullanılması.

Loglama Düzeyleri ve Seçenekleri

Gelen iletiler için günlük kaydı, ileti oluşturulduktan hemen sonra, ileti hizmet düzeyinde kullanıcı koduna geçmeden hemen önce ve hatalı biçimlendirilmiş iletiler algılandığında gerçekleşir.

Giden iletiler için günlüğe kaydetme işlemi, ileti kullanıcı kodundan ayrıldıktan hemen sonra ve ileti kabloya gönderilmeden hemen önce gerçekleşir.

WCF, iletileri hizmet ve aktarım olarak iki farklı düzeyde günlüğe kaydeder. Hatalı biçimlendirilmiş iletiler de günlüğe kaydedilir. Üç kategori birbirinden bağımsızdır ve yapılandırmada ayrı olarak etkinleştirilebilir.

logMessagesAtServiceLevel öğesinin logMalformedMessages, logMessagesAtTransportLevel ve messageLogging özniteliklerini ayarlayarak günlük kayıt düzeyini denetleyebilirsiniz.

Hizmet Düzeyi

Bu katmanda günlüğe kaydedilen iletiler kullanıcı kodunu girmek (alırken) veya bırakmak (gönderilirken) üzeredir. Filtreler tanımlanmışsa, yalnızca filtrelerle eşleşen iletiler günlüğe kaydedilir. Aksi takdirde, hizmet düzeyindeki tüm iletiler günlüğe kaydedilir. Güvenilir Mesajlaşma iletileri dışında altyapı iletileri (işlemler, eş kanal ve güvenlik) de bu düzeyde günlüğe kaydedilir. Akışlı iletilerde yalnızca başlıklar günlüğe kaydedilir. Ayrıca, güvenli iletiler bu düzeyde şifresi çözüldükten sonra günlüğe kaydedilir.

Taşıma Katmanı

Bu katmanda günlüğe kaydedilen iletiler, hat üzerinden taşıma için veya sonrasında kodlanmaya veya çözülmeye hazırdır. Filtreler tanımlanmışsa, yalnızca filtrelerle eşleşen iletiler günlüğe kaydedilir. Diğer durumda, aktarım katmanındaki tüm iletiler günlüğe kaydedilir. Güvenilir mesajlaşma iletileri de dahil olmak üzere tüm altyapı iletileri bu katmanda günlüğe kaydedilir. Akışlı iletilerde yalnızca başlıklar günlüğe kaydedilir. Ayrıca, HTTPS gibi güvenli bir aktarım kullanılmadığı takdirde, güvenli iletiler bu düzeyde şifrelenmiş olarak günlüğe kaydedilir.

Yanlış Biçimlendirilmiş Düzey

Yanlış biçimlendirilmiş iletiler, işlemenin herhangi bir aşamasında WCF yığını tarafından reddedilen iletilerdir. Yanlış biçimlendirilmiş iletiler as-isgünlüğe kaydedilir: böyleyse, düzgün olmayan XML ile vb. şifrelenir. maxSizeOfMessageToLog CDATA olarak günlüğe kaydedilecek iletinin boyutunu tanımladı. Varsayılan olarak, maxSizeOfMessageToLog 256K'ya eşittir. Bu öznitelik hakkında daha fazla bilgi için Diğer Seçenekler bölümüne bakın.

Diğer Seçenekler

Kullanıcı, günlük düzeylerine ek olarak aşağıdaki seçenekleri belirtebilir:

  • İletinin Tamamını Günlüğe Kaydet (logEntireMessage öznitelik): Bu değer, iletinin tamamının (ileti üst bilgisi ve gövdesi) günlüğe kaydedilip kaydedilmediğini belirtir. Varsayılan değer false'dir, yani yalnızca üst bilgi günlüğe kaydedilir. Bu ayar, hizmet ve taşıma mesajı kayıt seviyelerini etkiler.

  • Günlüğe kaydedilecek en fazla ileti (maxMessagesToLog öznitelik): Bu değer, günlüğe kaydedilecek en fazla ileti sayısını belirtir. Tüm iletiler (hizmet, aktarım ve yanlış biçimlendirilmiş iletiler) bu kotaya göre sayılır. Kotaya ulaşıldığında bir izleme gönderilir ve günlüğe ek ileti kaydedilmez. Varsayılan değer 10000'dir.

  • Günlüğe kaydedilecek mesajın en büyük boyutu (maxSizeOfMessageToLog öznitelik): Bu değer, bayt cinsinden günlüğe kaydedilecek mesajların boyut üst sınırını belirtir. Boyut sınırını aşan iletiler günlüğe kaydedilmez ve bu ileti için başka etkinlik gerçekleştirilmez. Bu ayar tüm izleme düzeylerini etkiler. ServiceModel izleme açıksa, kullanıcıya bildirmek amacıyla ilk loglama noktasında (ServiceModelSend* veya TransportReceive) bir Uyarı düzeyi iz kaydı oluşturulur. Hizmet düzeyi ve aktarım düzeyi iletileri için varsayılan değer 256K, hatalı biçimlendirilmiş iletiler için varsayılan değer ise 4K'dır.

    Dikkat

    Bellekte serileştirmeden önce hesaplanan ileti boyutu, maxSizeOfMessageToLog ile karşılaştırılan ileti boyutudur. Bu boyut, günlüğe kaydedilen ileti dizesinin gerçek uzunluğundan farklı olabilir ve birçok durumda gerçek boyuttan daha büyüktür. Sonuç olarak, iletilerin günlüğe kaydedilmesi mümkün olmayabilir. Özniteliğin beklenen ileti boyutundan maxSizeOfMessageToLog 10% daha büyük olmasını belirterek bu gerçeği hesaba katabilirsiniz. Ayrıca, hatalı biçimlendirilmiş iletiler günlüğe kaydedilirse, ileti günlükleri tarafından kullanılan gerçek disk alanı tarafından maxSizeOfMessageToLogbelirtilen değerin 5 katına kadar olabilir.

Yapılandırma dosyasında hiçbir izleme dinleyicisi tanımlanmamışsa, hangi günlük düzeyi belirtilmiş olursa olsun, günlük çıktısı oluşturulmaz.

Bu bölümde açıklanan öznitelikler gibi ileti günlüğü seçenekleri, Windows Yönetim Araçları (WMI) kullanılarak çalışma zamanında değiştirilebilir. Bu, şu Boole özelliklerini kullanıma sunan AppDomainInfo örneğine erişilerek yapılabilir: LogMessagesAtServiceLevel, LogMessagesAtTransportLevelve LogMalformedMessages. Bu nedenle, ileti günlüğü için bir izleme dinleyicisi yapılandırırken, bu seçenekleri yapılandırmada false olarak ayarlarsanız, daha sonra uygulama çalışırken true olarak değiştirebilirsiniz. Bu, çalışma zamanında ileti günlüğünü etkili bir şekilde etkinleştirir. Benzer şekilde, yapılandırma dosyanızda ileti günlüğünü etkinleştirirseniz WMI kullanarak çalışma zamanında devre dışı bırakabilirsiniz. Daha fazla bilgi için bkz. Tanılama için Windows Yönetim Araçları kullanma.

source İleti günlüğündeki alan, iletinin hangi bağlamda günlüğe kaydedildiği belirtir: bir istek iletisi gönderirken/alırken, istek yanıtı veya 1 yönlü istek için, hizmet modelinde veya aktarım katmanında ya da hatalı biçimlendirilmiş bir ileti söz konusu olduğunda.

Hatalı biçimlendirilmiş iletiler için, sourceMalformed'ya eşittir. Aksi takdirde, kaynak bağlama göre aşağıdaki değerlere sahiptir.

İstek/Yanıt için:

Katman İstek Gönder Alma İsteği Yanıt Gönder Yanıt Al
Hizmet Modeli katmanı Hizmet

Seviye

Gönder

İstek
Hizmet

Seviye

Alın

İstek
Hizmet

Seviye

Gönder

Yanıt
Hizmet

Seviye

Alın

Yanıt
Taşıma katmanı Taşıma

Gönder
Taşıma

Alın
Taşıma

Gönder
Taşıma

Alın

Tek Yönlü İstek için:

Katman İstek Gönder Alma İsteği
Hizmet Modeli katmanı Hizmet

Seviye

Gönder

Datagram
Hizmet

Seviye

Alın

Datagram
Taşıma katmanı Taşıma

Gönder
Taşıma

Alın

İleti Filtreleri

İleti filtreleri yapılandırma bölümünün yapılandırma öğesinde messageLoggingdiagnostics tanımlanır. Bunlar hizmet ve taşıma düzeyinde uygulanır. Bir veya daha fazla filtre tanımlandığında, yalnızca filtrelerden en az biriyle eşleşen iletiler günlüğe kaydedilir. Hiçbir filtre tanımlanmamışsa, tüm iletiler geçer.

Filtreler tam XPath söz dizimini destekler ve yapılandırma dosyasında göründükleri sırayla uygulanır. Dizimsel olarak yanlış bir filtre yapılandırma özel durumuyla sonuçlanır.

Filtreler ayrıca özniteliğini nodeQuota kullanarak bir güvenlik özelliği de sağlar. Bu özellik, XPath DOM'daki filtreyle eşleşecek şekilde incelenebilen en fazla düğüm sayısını sınırlar.

Aşağıdaki örnek, yalnızca SOAP üst bilgisi bölümüne sahip iletileri kaydeden bir filtrenin nasıl yapılandırıldığını gösterir.

<messageLogging logEntireMessage="true"
    logMalformedMessages="true"
    logMessagesAtServiceLevel="true"
    logMessagesAtTransportLevel="true"
    maxMessagesToLog="420">
    <filters>
        <add nodeQuota="10" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
                 /soap:Envelope/soap:Header
        </add>
     </filters>
</messageLogging>

Filtreler iletinin gövdesine uygulanamaz. İletinin gövdesini işlemeye çalışan filtreler, filtre listesinden kaldırılır. Bunu gösteren bir olay da yayımlanır. Örneğin, aşağıdaki filtre filtre tablosundan kaldırılır.

<add xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">/s:Envelope/s:Body[contains(text(), "Hello")]</add>

Özel Dinleyici Yapılandırma

Ek seçeneklerle özel bir dinleyici de yapılandırabilirsiniz. Özel dinleyici, günlüğe kaydetmeden önce iletilerden uygulamaya özgü PII öğelerini filtrelemede yararlı olabilir. Aşağıdaki örnekte özel dinleyici yapılandırması gösterilmektedir.

<system.diagnostics>
   <sources>
     <source name="System.ServiceModel.MessageLogging">
           <listeners>
             <add name="MyListener"
                    type="YourCustomListener"
                    initializeData="c:\logs\messages.svclog"
                    maxDiskSpace="1000"/>
           </listeners>
     </source>
   </sources>
</system.diagnostics>

type özniteliğinin, türün nitelikli bir derleme adına ayarlanması gerektiğini bilmelisiniz.

Ayrıca bakınız