wcf करन डमीज़ के लिए एज़ूर लॉग, या डब्ल्यूसीएफ डाटा सर्विसेज फ़िल्टर कैसे फ़िल्टर करें




वाटर फिल्टर मशीन प्राइस (3)

मैं WADLogsTable में अपने Azure लॉग देख रहा हूं और परिणामों को फ़िल्टर करना चाहता हूं, लेकिन मैं इस बारे में अनजान हूं कि ऐसा कैसे करें। एक टेक्स्टबॉक्स है जो कहता है:

"लौटाई गई इकाइयों को सीमित करने के लिए डब्ल्यूसीएफ डाटा सर्विसेज फ़िल्टर दर्ज करें"

"डब्ल्यूसीएफ डाटा सर्विसेज फ़िल्टर" का सिंटैक्स क्या है? निम्नलिखित मुझे एक अवैध ValueType त्रुटि देता है जो कह रहा है "निर्दिष्ट मान अमान्य है।":

Timestamp gt '2011-04-20T00:00'

क्या मैं भी करीब हूँ? क्या कहीं कोई आसान वाक्यविन्यास संदर्भ है?


मेरे द्वारा स्वीकार किए गए उत्तर ने मुझे विजुअल स्टूडियो के माध्यम से सीधे तालिका में पूछताछ करने में अत्यधिक मदद की। आखिरकार, मुझे एक और मजबूत समाधान की आवश्यकता थी। मैंने सी # में कुछ कक्षाओं को विकसित करने के लिए यहां प्राप्त युक्तियों का उपयोग किया जो मुझे टेबल क्वेरी करने के लिए LINQ का उपयोग करने देता है। यदि यह इस प्रश्न को देखने वाले लोगों के लिए उपयोगी है, तो यहां लगभग मोटे तौर पर मैं अपने Azure लॉग से कैसे पूछता हूं।

"WADLogsTable" तालिका में सभी डेटा का प्रतिनिधित्व करने के लिए Microsoft.WindowsAzure.StorageClient.TableServiceEntity से विरासत प्राप्त करने वाली कक्षा बनाएं:

public class AzureDiagnosticEntry : TableServiceEntity
{
    public long EventTickCount { get; set; }
    public string DeploymentId { get; set; }
    public string Role { get; set; }
    public string RoleInstance { get; set; }
    public int EventId { get; set; }
    public int Level { get; set; }
    public int Pid { get; set; }
    public int Tid { get; set; }
    public string Message { get; set; }
    public DateTime EventDateTime
    {
        get
        {
            return new DateTime(EventTickCount, DateTimeKind.Utc);
        }
    }
}

Microsoft.WindowsAzure.StorageClient.TableServiceContext से विरासत में प्राप्त एक वर्ग बनाएं और नए परिभाषित डेटा ऑब्जेक्ट क्लास का संदर्भ लें:

public class AzureDiagnosticContext : TableServiceContext
{
    public AzureDiagnosticContext(string baseAddress, StorageCredentials credentials)
        : base(baseAddress, credentials)
    {
        this.ResolveType = s => typeof(AzureDiagnosticEntry);
    }

    public AzureDiagnosticContext(CloudStorageAccount storage)
        : this(storage.TableEndpoint.ToString(), storage.Credentials) { }

    // Helper method to get an IQueryable.  Hard code "WADLogsTable" for this class
    public IQueryable<AzureDiagnosticEntry> Logs
    {
        get
        {
            return CreateQuery<AzureDiagnosticEntry>("WADLogsTable");
        }
    }
}

मेरे पास एक सहायक विधि है जो कॉन्फ़िगरेशन सेटिंग्स से CloudStorageAccount बनाता है:

public CloudStorageAccount GetStorageAccount()
{
    CloudStorageAccount.SetConfigurationSettingPublisher(
        (name, setter) => setter(RoleEnvironment.GetConfigurationSettingValue(name)));
    string configKey = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString";
    return CloudStorageAccount.FromConfigurationSetting(configKey);
}

मैं CloudStorageAccount AzureDiagnosticContext से AzureDiagnosticContext हूं और अपने लॉग से पूछताछ करने के लिए इसका उपयोग करता हूं:

public IEnumerable<AzureDiagnosticEntry> GetAzureLog(DateTime start, DateTime end)
{
    CloudStorageAccount storage = GetStorageAccount();
    AzureDiagnosticContext context = new AzureDiagnosticContext(storage);
    string startTicks = "0" + start.Ticks;
    string endTicks = "0" + end.Ticks;
    IQueryable<AzureDiagnosticEntry> query = context.Logs.Where(
        e => e.PartitionKey.CompareTo(startTicks) > 0 &&
             e.PartitionKey.CompareTo(endTicks) < 0);
    CloudTableQuery<AzureDiagnosticEntry> tableQuery = query.AsTableServiceQuery();
    IEnumerable<AzureDiagnosticEntry> results = tableQuery.Execute();
    return results;
}

यह विधि Timestamp बजाय Timestamp पर फ़िल्टर करने के लिए गौरव के जवाब में प्रदर्शन युक्ति का लाभ उठाती है।

यदि आप परिणामों को केवल तारीख से अधिक फ़िल्टर करना चाहते हैं, तो आप लौटाए गए IEnumerable फ़िल्टर कर सकते हैं। लेकिन, शायद IQueryable फ़िल्टर करके बेहतर प्रदर्शन प्राप्त होगा। आप अपनी विधि में फ़िल्टर पैरामीटर जोड़ सकते हैं और इसे IQueryable.Where() कॉल कर सकते हैं। उदाहरण के लिए,

public IEnumerable<AzureDiagnosticEntry> GetAzureLog(
    DateTime start, DateTime end, Func<AzureDiagnosticEntry, bool> filter)
{
    ...
    IQueryable<AzureDiagnosticEntry> query = context.Logs.Where(
        e => e.PartitionKey.CompareTo(startTicks) > 0 &&
             e.PartitionKey.CompareTo(endTicks) < 0 &&
             filter(e));
    ...
}

अंत में, मैंने वास्तव में अन्य कक्षाओं से पूछताछ के लिए कार्यक्षमता का पुन: उपयोग करने के लिए इन कक्षाओं में से अधिकांश वर्गों को मूल कक्षाओं में आगे बताया, जैसे विंडोज इवेंट लॉग संग्रहित करना।


यह क्वेरी प्रारूप में होनी चाहिए:

Timestamp gt datetime'2011-04-20T00:00:00'

उस datetime को रखना याद रखना महत्वपूर्ण बात है।

यह हर बार मुझे यात्रा करता है, इसलिए मैं संदर्भ के लिए ओडाटा अवलोकन का उपयोग करता हूं।


नाइटफोर की प्रतिक्रिया में जोड़कर, आप निश्चित रूप से एक प्रश्न लिख सकते हैं जो टिमस्टैम्प द्वारा फ़िल्टर करता है लेकिन यह अनुशंसित दृष्टिकोण नहीं है क्योंकि "टाइमस्टैम्प" विशेषता पर पूछताछ पूर्ण तालिका स्कैन का कारण बन जाएगी। इसके बजाय PartitionKey विशेषता पर इस तालिका को क्वेरी करें। मैं यहां अन्य धागे से अपनी प्रतिक्रिया की प्रतिलिपि बना रहा हूं ( क्या मैं एक एज़ूर वेब / वर्कर रोल के लिए प्रदर्शन काउंटर को दूरस्थ रूप से कैप्चर कर सकता हूं ...? ):

"यहां एक महत्वपूर्ण बात यह है कि यह समझने के लिए कि इस तालिका (और अन्य डायग्नोस्टिक्स टेबल) को प्रभावी तरीके से कैसे पूछना है। डायग्नोस्टिक्स टेबल से हम जो चीजें चाहते हैं, उनमें से एक है डेटा को एक निश्चित अवधि के लिए लाने के लिए। हमारी प्राकृतिक वृत्ति टाइमस्टैम्प विशेषता पर इस तालिका से पूछताछ करें। हालांकि यह एक खराब डिजाइन विकल्प है क्योंकि आप एज़ूर टेबल में जानते हैं कि डेटा पार्टिशनकी और रोकी पर अनुक्रमित है। किसी अन्य विशेषता पर पूछताछ के परिणामस्वरूप पूर्ण तालिका स्कैन होगा जिससे आपकी तालिका में कोई समस्या होगी इसमें बहुत सारे डेटा शामिल हैं। इन लॉग तालिका के बारे में अच्छी बात यह है कि विभाजन बिंदु मूल्य उस समय दिनांक / समय का प्रतिनिधित्व करता है जब डेटा पॉइंट एकत्र किया गया था। मूल रूप से विभाजन कुंजी डेटटाइम के उच्च ऑर्डर बिट्स का उपयोग करके बनाई जाती है। (यूटीसी में)। इसलिए यदि आप किसी निश्चित तिथि / समय सीमा के लिए डेटा लाने के लिए थे, तो पहले आपको अपनी सीमा (यूटीसी में) के लिए टिकों की गणना करने की आवश्यकता होगी और फिर इसके सामने "0" प्रीपेड करें और अपनी क्वेरी में उन मानों का उपयोग करें। यदि आप आरईएस का उपयोग कर पूछताछ कर रहे हैं टी एपीआई, आप यूटीसी> 'और विभाजनशन ले ले' 0 <तिथि / समय में यूटीसी> 'में दिनांक / समय टिकों से विभाजनशन जीई' 0 <जैसे वाक्यविन्यास का उपयोग करेंगे।

मैंने टेबल स्टोरेज के खिलाफ डब्ल्यूसीएफ प्रश्नों को लिखने के बारे में एक ब्लॉग पोस्ट लिखा है जिसे आप उपयोगी पा सकते हैं: http://blog.cerebrata.com/specifying-filter-criteria-when-querying-azure-table-storage-using-rest-api/

इसके अलावा यदि आप डायग्नोस्टिक डेटा को देखने और प्रबंधित करने के लिए किसी तृतीय पक्ष टूल की तलाश में हैं, तो क्या मैं सुझाव दे सकता हूं कि आप हमारे उत्पाद एज़ूर डायग्नोस्टिक्स मैनेजर: / Products / AzureDiagnosticsManager पर एक नज़र डालें। यह टूल विशेष रूप से विंडोज़ एज़ूर डायग्नोस्टिक डेटा को सर्फिंग और प्रबंधित करने के लिए बनाया गया है।





azure-table-storage