2016-01-12 5 views
5

मेरे पास एक बहु थ्रेडेड सी # .NET 4.5 एप्लिकेशन चल रहा है।एनएलओजी लॉग संदेश छोड़ रहा है। .NET मुद्दा? मल्टी-थ्रेड मुद्दा?

मेरे स्थानीय विंडोज 7 लैपटॉप पर चल रहा है, एनएलओजी मेरे सभी संदेशों को लॉग करता है। मैं विजुअल स्टूडियो का उपयोग करके ऐप प्रकाशित करता हूं ... प्रकाशित ऐप को Windows Server 2008 में कॉपी करें ... और सर्वर पर ऐप चलाएं: परिणामस्वरूप लॉग संदेश लॉग इन हो जाते हैं। क्या कोई मुझे समझने में मदद कर सकता है कि क्यों और मैं इसे कैसे ठीक कर सकता हूं या एनएलओजी के विकल्प का सुझाव दे सकता हूं?

मैं बिना इस की कोशिश की है "async = सच"

<targets async="true"> 


    <target xsi:type="ColoredConsole" 
      name="ColoredConsole" 
      layout="${date} ${level} ${message} ${event-context:item=AlgID} " /> 

    <target name="xmlfile" xsi:type="File" 
      fileName="C:\QRT\Logs\LogEmiter.Nlog.xlog" keepFileOpen="true" 
      layout="${log4jxmlevent}" /> 

    <target xsi:type="File" 
      name ="LogFile" fileName="C:\QRT\Logs\QRTLog-${shortdate}.log" 
      layout ="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${threadid}|${threadname}|${event-properties:item=FromID}|${message}${exception:format=tostring} "/> 

    <target xsi:type="File" 
      name ="TapeLogFile" fileName="C:\QRT\Logs\QRTMarketLog.txt" 
      layout ="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${message}"/> 

    </targets> 
    <rules> 
     <!-- add your logging rules here --> 

     <logger name ="TapeLogFile" minlevel="Trace" writeTo="TapeLogFile" /> 
     <logger name ="TapeLogFile" minlevel="Trace" writeTo="ColoredConsole" final="true"/> 
     <logger name="*" minlevel="Trace" writeTo="ColoredConsole" /> 
     <logger name="*" minlevel="Trace" writeTo="xmlfile" /> 
     <logger name="*" minlevel="Trace" writeTo="LogFile" /> 


     <!-- 
     Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f" 
     <logger name="*" minlevel="Debug" writeTo="f" /> 
     --> 
     </rules> 
    </nlog> 

मैं संदेशों इस तरह से लॉग इन करें:

मेरे विन्यास फाइल इस प्रकार है

मेरी ठेठ कक्षा में, मैं करूंगा मेरे एनएलओजी हेल्पर क्लास को इस प्रकार शुरू करें:

private void InitliazlieLogger() 
    { 
     LogManager.ThrowExceptions = true; 
     m_logger = new NLogHelper(LogManager.GetCurrentClassLogger()); 
     m_logger.Set("FromID", "Email"); // Class setting. 
    } 

private void DoSomething(int _x) 
{ 
    m_logger.Debug ("Print this statement: {0}", _x); 
} 

मेरे पास एक एनएलओजी सहायक वर्ग है ...

public NLogHelper(Logger Logger) 
{ 
    m_logger = Logger; 
    m_properties = new Dictionary<string, object>(); 
} 

public void Debug(string Message, params object[] Args) 
     { 
      m_logger.Debug() 
       .Message(Message, Args) 
       .Properties(m_properties) 
       .Write(); 
      notify(Severity.Debug, Message); 
     } 

समस्या यह है कि कुछ लॉग संदेश बस छोड़ दिए गए हैं। मैंने अपनी खुद की लॉगिंग क्लास को जोड़ा जो फ़ाइल को मैन्युअल रूप से लिखा गया था और एनएलओजीहेल्पर.डेबग में एक कॉल डाला गया था और मैंने पाया कि मैंने जिस फाइल को मैन्युअल रूप से लिखा था, उसके पास लॉग संदेशों का एक पूरा सेट था लेकिन एनएलओजी आउटपुट कुछ गायब था।

फिर से, यह मेरे लैपटॉप पर काम करता है, लेकिन विंडोज सर्वर 2008 पर विफल रहता है। मेरे सर्वर में .NET 4.6.1 स्थापित है। मुझे लगता है कि मेरे विंडोज 7 मशीन पर केवल 4.5.2 है। क्या यह हो सकता है?

एक साइड नोट के रूप में: यदि मैं अपनी सभी स्रोत फ़ाइलों को सर्वर अपलोड करता हूं और सर्वर पर विजुअल स्टूडियो का उपयोग उसी कोड को संकलित करने के लिए करता हूं, तो एनएलओजी काम करता है?!

- कॉन्फ्यूज्ड।

धन्यवाद एड

+0

'm_logger.Debug()' लॉग इन करेगा जब स्रोत DEBUG मोड में होगा। यही है ना? इसका अर्थ यह है कि जब आप अपने सर्वर पर अपना स्रोत प्रकाशित करते हैं, तो उन बाइनरी रिलीज मोड में चल रही हैं। इसका मतलब है कि यह लॉगिंग के बयान को छोड़ देगा। क्या आपको नहीं लगता? – Savaratkar

+0

और आपने उल्लेख किया है कि, आपके सर्वर पर आपने अपना स्रोत वीएस से चलाया है, इस प्रकार आप इसे DEBUG मोड में फिर से चलाएंगे। सही? – Savaratkar

+0

आप सही हैं। मैंने सर्वर पर चलाने के कई तरीकों की कोशिश की है। मैंने पाया है कि "रिलीज" के लिए लक्ष्य प्रणाली पर "स्थापना" की आवश्यकता होती है जिससे कॉन्फ़िगरेशन फ़ाइल को ढूंढना मुश्किल हो जाता है, इसलिए अब मैं पूरी बिन/डीबग निर्देशिका की प्रतिलिपि बना रहा हूं। वैसे भी, Logger.Debug लॉग काम किया। यह Logger.Info था जो गायब थे। –

उत्तर

0

मैं निम्नलिखित कोड का उपयोग कर रहा है और काम कर ठीक।

public class ServerDataSource : IDataSource 
    { 
     private Logger _log; 
     public ServerDataSource() 
     { 
      _log = LogManager.GetLogger("ServerDataSource"); 
     } 
     public bool DoSomething() 
     { 
      try 
      { 
        _log.Info("Doing something"); 

      } 
      catch (Exception ex) 
      { 
       _log.Error("Error occurred" + ex.Message); 
      } 
     } 
} 

विन्यास था का पालन के रूप में

<configSections> 
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/> 
    </configSections> 

+0

LogManager.GetLogger और LogManager.GetCurrentClassLogger के बीच क्या अंतर है? क्या आप बहु थ्रेडेड हैं? क्या आपने async का उपयोग किया था? –

+0

LogManager.GetCurrentClassLogger() वर्तमान वर्ग नाम के साथ लॉगर ऑब्जेक्ट को प्रारंभ करता है, लेकिन LogManager.GetLogger ("ServerDataSource") आपके द्वारा पैरामीटर में दिए गए नाम के साथ लॉगर ऑब्जेक्ट को प्रारंभ करता है। जहां तक ​​मुझे पता है कि लॉगर्स थ्रेड-सुरक्षित हैं। आप स्थिर चर के रूप में एक बार लॉगर बना सकते हैं। –

+0

हमम ... ठीक है। लेकिन ... आपने इसे स्थिर के रूप में घोषित नहीं किया :) ऐसा लगता है कि अंतर सिर्फ नामकरण में है। 'नीचे की रेखा यह है कि मैं इसे थोड़ा अलग तरीके से कार्यान्वित कर रहा हूं क्योंकि मुझे एक कस्टम चर की आवश्यकता है (ताकि मैं एक समान वर्ग के कई उदाहरणों के लिए exampleID आउटपुट कर सकूं ... जैसे StudentID)। 'अभी भी समझ में नहीं आता कि मेरा कार्यान्वयन सही क्यों नहीं है? –

1

संपादित करें: यह एक पूरा जवाब नहीं है। नीचे जवाब आधा समस्या हल हो गया। मैंने जो देखा नहीं था वह था कि लापता संदेश आईएनएफओ थे और डेबग नहीं थे। मेरे सभी INFO लॉग को DEBUG लॉग में कनवर्ट करना मेरे मुद्दों को ठीक करता है। ऐसा लगता है कि भले ही मैं अपनी स्थानीय मशीन पर आईएनएफओ लॉग आउटपुट कर सकता हूं, आईएनएफओ मेरे सर्वर पर काम करेगा। अभी भी रूट-कारण नहीं है। :(

ठीक है, मैंने सोचा कि कामकाजी प्रणाली (मेरा लैपटॉप विंडोज 7 चल रहा है) और सर्वर (विंडो सर्वर 2008 चल रहा है) के बीच एकमात्र अंतर विंडोज संस्करण और .NET संस्करण स्थापित था।

यह मुद्दा वास्तव में था, यह खोजने के लिए सिब्स के लिए धन्यवाद, तथ्य यह है कि सर्वर के पास कई हार्डवेयर सीपीयू थे और इसकी बहु-थ्रेडिंग मेरे लैपटॉप पर होने वाली वास्तविक बहु-थ्रेडिंग के करीब थी। एनएलओजी त्रुटि संदेश जारी कर रहा था लेकिन मैं उन्हें नहीं देख रहा था। यह खुद को लिखने की कोशिश कर रहा था।

तो मैं (Sibers) बदल दिया है:

<target xsi:type="File" 
     name ="LogFile" fileName="C:\QRT\Logs\QRTLog-${shortdate}.log" 
     layout ="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${threadid}|${threadname}|${event-properties:item=FromID}|${message}${exception:format=tostring} "/> 

को
<target name="asyncWrapper" xsi:Type="AsyncWrapper" queueLimit="20000"> 
     <target name="LogFile" 
      xsi:type="File" 
      fileName="C:\QRT\Logs\QRTLog-${shortdate}.log" 
      layout="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${threadid}|${threadname}|${event-properties:item=FromID}|${message}${exception:format=tostring} " 
      concurrentWrites="true" /> 
    </target> 

समस्या तय की। मैन ... जिसने मुझे एक महीने लिया! मैं हाथ से अपना खुद का लॉगर छोड़ने और लिखने वाला था।

-Ed

+0

मुझे आपके जैसे टिप्पणियों से बाहर निकलना पड़ता है: "मैं हाथ छोड़कर अपना खुद का लॉगर लिखने वाला था।" ठीक है, क्योंकि तब आपको * कोई समस्या नहीं होगी * अब! अगर केवल इतना आसान था। यह मानने के तर्क में त्रुटि "मैं इस मौजूदा चीज़ को काम करने के लिए नहीं मिल सकता, इसलिए एक बेहतर जवाब इसे स्वयं लागू करना है।" बस विशाल है। – Howiecamp

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