2013-05-30 4 views
6

मैं एक जटिल वितरित सेवा विकसित कर रहा हूं जो पुनरावृत्ति सिंक्रनाइज़ेशन प्रक्रिया बनाता है। यह विभिन्न सूचना प्रणालियों में हर 10 सेकंड की व्यावसायिक संस्थाओं को सिंक्रनाइज़ करता है। एक पुनरावृत्ति में व्यावसायिक वस्तुओं की वर्तमान स्थिति (ग्राहकों, सामान, कुछ ग्राहक और माल विवरण इत्यादि की गिनती) को पुनः प्राप्त करने के लिए 3 डी पार्टी सेवा कॉल का समूह शामिल है, स्थानीय डीबी से पूछताछ करें और फिर उनके बीच मतभेद प्राप्त करें और इसे सुचारू बनाएं, इसे सिंक्रनाइज़ करें मतभेद।जटिल सिंक्रनाइज़ेशन प्रक्रिया को कैसे लॉग करें?

पुनरावृत्तियों के विभिन्न प्रकार हैं। वे तेज़ होते हैं (केवल वस्तुओं के सेट में परिवर्तन) और धीमे पुनरावृत्तियों (डेटा की पूर्ण समीक्षा)। फास्ट हर 10 सेकंड होते हैं और धीमे दिन में एक बार होते हैं।

तो, मैं एनएलओजी का उपयोग करके इस प्रक्रिया को कैसे लॉग कर सकता हूं? मैं डेटा संग्रह करने के लिए SQLite का उपयोग कर रहा हूँ। लेकिन मैं लॉग के लिए डीबी डिजाइन में फंस गया हूँ।

तो मैं हर यात्रा के प्रवाह को प्रवेश करना चाहते हैं: 3 डी पक्ष सेवा 2. क्वेरी वस्तुओं की वर्तमान स्थिति के लिए स्थानीय डेटाबेस के लिए वस्तुओं की वर्तमान स्थिति के लिए 1. अनुरोध 3. मतभेद सूची 4. आह्वान बाहरी जाओ अपर्याप्त डेटा 5 सेवा अपर्याप्त डेटा

के लिए स्थानीय डेटाबेस अपडेट करें लेकिन लॉग इन करने के लिए कई प्रकार की जानकारी है इसलिए मैं इसे केवल TEXT फ़ील्ड में नहीं डाल सकता।

फिलहाल मैं लॉग के लिए इस तरह के ढांचे को उपयोग कर रहा हूँ:

CREATE TABLE [Log] (
    [id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    [ts] TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    [iteration_id] varchar, 
    [request_response_pair] varchar, 
    [type] VARCHAR NOT NULL, 
    [level] TEXT NOT NULL, 
    [server_id] VARCHAR, 
    [server_alias] VARCHAR, 
    [description] TEXT, 
    [error] Text); 

तो हर सेवा अनुरोध और प्रतिक्रिया description और request_response_pair को कहते हैं हर अनुरोध के लिए हर प्रतिक्रिया जोड़ने के लिए एक महत्वपूर्ण है।

यहाँ मेरी NLog config है:

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" internalLogFile="D:\nlog.txt" internalLogLevel="Trace"> 
    <targets> 
    <target name="Database" xsi:type="Database" keepConnection="false" 
      useTransactions="false" 
      dbProvider="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.82.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" 
      connectionString="Data Source=${basedir}\SyncLog.db;Version=3;" 
      commandText="INSERT into Log(iteration_id, request_response_pair, type, level, server_id, server_alias, description, error) values(@Iteration_id, @Request_response_pair, @Type, @Loglevel, @server_id, @server_alias, @Description, @Error)"> 
     <parameter name="@Type" layout="${message}"/> 
     <parameter name="@Loglevel" layout="${level:uppercase=true}"/> 
     <parameter name="@Request_response_pair" layout="${event-context:item=request_response_pair}"/> 
     <parameter name="@Iteration_id" layout="${event-context:item=iteration_id}"/> 
     <parameter name="@server_id" layout="${event-context:item=server_id}"/> 
     <parameter name="@server_alias" layout="${event-context:item=server_alias}"/> 
     <parameter name="@Description" layout="${event-context:item=description}"/> 
     <parameter name="@Error" layout="${event-context:item=error}"/> 
    </target> 
    </targets> 
    <rules> 
    <logger name="*" minlevel="Trace" writeTo="Database" /> 
    </rules> 
</nlog> 

यहाँ मैं कैसे लॉग ऑन है:

namespace NLog 
{ 
    public static class LoggerExtensions 
    { 
     public static void InfoEx(this Logger l, string message, Dictionary<string, object> contextParams) 
     { 
      LogEventInfo eventInfo = new LogEventInfo(LogLevel.Info, "", message); 
      foreach (KeyValuePair<string, object> kvp in contextParams) 
      { 
       eventInfo.Properties.Add(kvp.Key, kvp.Value); 
      } 

      l.Log(eventInfo); 
     } 

     public static void InfoEx(this Logger l, string message, string server_id, string server_alias, Dictionary<string, object> contextParams = null) 
     { 
      Dictionary<string, object> p = new Dictionary<string, object>(); 
      p.Add("server_id", server_id); 
      p.Add("server_alias", server_alias); 
      if (contextParams != null) 
      { 
       foreach (KeyValuePair<string, object> kvp in contextParams) 
       { 
        p.Add(kvp.Key, kvp.Value); 
       } 
      } 

      l.InfoEx(message, p); 
     } 
    } 
} 

मैं प्रवेश स्तर के बारे में पता है, लेकिन मैं यह सब वर्बोज़ लॉग जरूरत है, तो मैं जानकारी के रूप में यह लॉग इन करें। मुझे कोई जटिल, संरचित लॉग लॉग इन करने का कोई ट्यूटोरियल नहीं मिल रहा है। केवल सादा गूंगा लॉग मैसेज।

+8

मुझे खेद है, लेकिन आपका प्रश्न वास्तव में क्या है? – Dirk

+0

मैं लॉगिंग के लिए एंटरप्राइज़ लाइब्रेरी का उपयोग करता हूं। ईएल के साथ आप लॉग इन/ट्रेस ऑन कर सकते हैं: इवेंट व्यूअर, डाटाबेस, एक्सएमएल, फ्लैट फाइल, और बिना किसी परिवर्तन के आपके कोड पर, केवल आपके app.config (web.config) पर। आप प्रकार, प्राथमिकता, ect द्वारा फ़िल्टर भी कर सकते हैं। http://msdn.microsoft.com/en-us/library/ff648549.aspx – Max

उत्तर

1

मुझे लगता है कि, आप सामान्य "लॉग चीजों के लिए" लॉग "के बारे में बात कर रहे हैं, इसलिए हमारे पास हमारे वर्कफ़्लो (त्रुटियों/प्रदर्शन) का निरीक्षण करने की आवश्यकता है, तो हमारे पास कुछ देखने के लिए कुछ है।" मुझे लगता है कि आप लॉग का मतलब नहीं है उदा। "हमें लेखांकन की जानकारी चाहिए और लॉग हमारे डोमेन डेटा का हिस्सा है और वर्कफ़्लो में शामिल है।"

और जो मुझे आपके पोस्टिंग से मिला, उससे आप लॉग पर बैकएंड स्टोरेज प्रारूप के बारे में चिंता कर रहे हैं, ताकि आप बाद में उन्हें संसाधित कर सकें और निदान के लिए उपयोग कर सकें?


तब मैं अनुशंसा करता हूं कि आप लॉगिंग कोड डोमेन विनिर्देशों का आजादी दें।

प्रश्न: आपके द्वारा बनाए गए लॉग कैसे संसाधित किए जाएंगे? क्या आपको वास्तव में उन जगहों तक पहुंचने की ज़रूरत है ताकि आपको एक संरचित दृश्य प्रदान करने के लिए डेटाबेस की आवश्यकता हो? क्या यह किसी भी तरह से प्रासंगिक है कि आप अपने लॉग कितनी तेजी से फ़िल्टर कर सकते हैं? या फिर वे एक बड़े लॉग-विश्लेषक आवेदन में समाप्त हो जाएंगे, फिर भी कुछ बुरा हुआ जब यह केवल दूसरे सप्ताह में चलाया जाता है?

मेरी राय में, सबसे बड़े कारणों आप लॉग में किसी भी डोमेन बारीकियों से बचना चाहते हैं कि "लॉग कोई बात बिगड़ जाए, तो काम करना चाहिए" और "लॉग के बाद चीजें बदल काम करना चाहिए" कर रहे हैं।

लॉग्स लॉग इन करें खुद असफल हो सकता है लिखने के लिए, चीजों को जाना है, तो गलत

आप "Request_response_pair" की तरह डोमेन विशिष्ट मानों के लिए अपनी लॉग तालिका में कॉलम हैं, तो और कोई जोड़ी है काम करना चाहिए तो (जैसे अगर यह एक सूचकांक क्षेत्र है)। बेशक, आप सुनिश्चित कर सकते हैं कि आपके डीबी-डिज़ाइन में गैर-शून्य कॉलम और कोई प्रतिबंध नहीं है, लेकिन एक कदम वापस लें और पूछें: आप अपने लॉग डेटाबेस में संरचना क्यों चाहते हैं? लॉग यथासंभव विश्वसनीय के रूप में काम करने के लिए हैं, इसलिए किसी भी प्रकार का टेम्पलेट जिसे आप उन्हें दबाते हैं, उपयोग मामलों को प्रतिबंधित कर सकते हैं या आप महत्वपूर्ण जानकारी लॉग इन करने में सक्षम नहीं हो सकते हैं। के बाद चीजों

बदल

लॉग्स काम करना चाहिए आप का पता लगाने और बगों या प्रदर्शन में सुधार के लिए लॉग की जरूरत है, इसका मतलब है कि आप नियमित रूप से से लॉग तुलना करेंगे खास तौर पर अगर "से के बाद लॉग के लिए" परिवर्तन से पहले " परिवर्तन"। यदि आपको अपने लॉग डेटाबेस की संरचना को बदलने की आवश्यकता है, क्योंकि आपने अपना डोमेन डेटा बदल दिया है, तो आपको लॉग की तुलना करने की आवश्यकता होने पर यह आपको चोट पहुंचाएगा।

सच है, यदि आप डेटा संरचना परिवर्तन करते हैं, तो आपको शायद लॉग विश्लेषक जैसे कुछ टूल अपडेट करने की आवश्यकता है, लेकिन आमतौर पर लॉगिंग/विश्लेषण कोड का एक बड़ा हिस्सा है जो वास्तविक संरचना के लिए पूरी तरह से अज्ञेयवादी है डोमेन।


कई सिस्टम (जटिल सहित) के साथ रह सकते हैं "सिर्फ एक सरल स्ट्रिंग लॉग ऑन" और बाद में उपकरणों लिखने स्ट्रिंग के अलावा फिर से लेने के लिए, अगर वे फ़िल्टर या लॉग कार्रवाई करने के लिए की जरूरत है।

अन्य सिस्टम सरल स्ट्रिंग कुंजी/मूल्य जोड़े में लॉग लिखते हैं। लॉग फ़ंक्शन स्वयं डोमेन विशिष्ट नहीं है लेकिन केवल एक स्ट्रिंग डिक्शनरी स्वीकार करता है और इसे लिखता है (या इससे भी आसान, एक पैराम स्ट्रिंग [] जिसमें पैरामीटर की संख्या भी होनी चाहिए और आप प्रत्येक दूसरे पैरामीटर को कुंजी के रूप में उपयोग करते हैं - यदि आप नहीं हैं उस प्रस्ताव से डर :- डी)।

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

संबंधित मुद्दे