2011-09-13 18 views
5

में काम करता है मैं एनएलओजी के माध्यम से अपने आवेदन में लॉगिंग कर रहा हूं। मैं केवल एक मशीन पर एक अजीब मुद्दे का निदान करने के लिए कुछ लॉग इकट्ठा करने की कोशिश कर रहा हूं। मेरी 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"> 

    <targets> 
    <target name="logfile" xsi:type="File" fileName="${specialfolder:dir=PollingLogs:file=log.txt:folder=MyDocuments}" /> 
    </targets> 

    <rules> 
    <logger name="*" minlevel="Debug" writeTo="logfile" /> 
    </rules> 
</nlog> 

जब मैं अपने विकास मशीन पर चलने मैं सभी प्रवेश सही ढंग से हो रहा से, मेरे दस्तावेज़ फ़ोल्डर में बनाई गई एक log.txt फ़ाइल हो रही है। हालांकि, जब मैं ClickOnce के साथ एप्लिकेशन को तैनात करता हूं, तो कोई log.txt फ़ाइल नहीं बनाई जा रही है (जिसे मैं कम से कम पा सकता हूं)। कोई त्रुटि नहीं होती है, और मेरा ऐप सामान्य के रूप में चलता है, लेकिन कुछ भी नहीं हो रहा है।

मैं इस मुद्दे को डीबग करने के तरीके पर फंस गया हूं। क्या किसी के पास कोई अंतर्दृष्टि है जिसे वे क्लिकऑन पर्यावरण में सही तरीके से काम करने के लिए एनएलओजी प्राप्त करने में मदद के लिए साझा कर सकते हैं?

एक संदर्भ के रूप में, मेरी परियोजना में एनएलओजी संदर्भ स्थानीय प्रतिलिपि बनाने के लिए सेट है।

+0

जब कोई ऐप शुरू होता है तो मैं हमेशा लॉग पर लिखता हूं, और लॉगिंग विफल होने पर इसे पूरी तरह असफल कर देता है। इस तरह, मुझे पता है कि जब मैं ऐप को तैनात करता हूं - चाहे वेब या डेस्कटॉप - वह लॉगिंग काम कर रही है और जब मुझे इसकी ज़रूरत होगी तो वहां होगा। – DOK

+0

एनएलओजी सफल है या नहीं, तो आप कैसे पता लगा सकते हैं? – KallDrexx

+0

आप nlog config फ़ाइल में [internalLogFile = "nlog-error.log"] (http://nlog-project.org/wiki/Internal_logging) जोड़ने का प्रयास कर सकते हैं, और उसके बाद लॉग इन करने का प्रयास करते समय nlog स्वयं को अपवाद प्राप्त हो सकता है उस लॉग फ़ाइल में लॉगिंग त्रुटि लॉग करेगा – BrandonAGr

उत्तर

2

इस उपयोग को डीबग करने के लिए Sysinternal ProcessMon (फ्री)। यह अन्य बातों फ़ाइलों की कोशिश की accesses/एक प्रक्रिया से बना के बीच आप दिखा सकते हैं ...

लॉग इस तरह मैं ApplicationData या CommonApplicationData या LocalApplicationDataEnvironment.SpecialFolder से और नहीं MyDocuments का उपयोग कर की सिफारिश करेंगे के लिए ...

+2

ProcMon अच्छा होगा, आप यह सुनिश्चित करने के लिए जांच सकते हैं कि ऐप nlog कॉन्फ़िगरेशन फ़ाइल पढ़ रहा है जिसे आप पहले होने की उम्मीद करते हैं। शायद nlog config फ़ाइल क्लिकऑन ऐप के साथ तैनात नहीं किया गया था? – BrandonAGr

0

मैंने इस मुद्दे को एक परियोजना के साथ मारा जो मैं आज काम कर रहा था।

NLog.config फ़ाइल तो यह ठीक है जब आप वहां से चलाना अपने निर्माण निर्देशिका में कॉपी किया जा रहा है, लेकिन ClickOnce संस्थापक नहीं NLog.config फ़ाइल की तैनाती जब सॉफ्टवेयर स्थापित किया गया है कर रहे हैं।

यह आपके द्वारा देखे जाने वाले व्यवहार को बताता है: स्थापित प्रतिलिपि से चलाते समय, इसमें कोई लॉगिंग कॉन्फ़िगरेशन नहीं होता है। करता है क्योंकि exe.config फ़ाइल ClickOnce द्वारा तैनात हो

एकमात्र समाधान मैं अब तक मिल गया है, अपने app.config फ़ाइल में प्रवेश config मर्ज करने के लिए है - मैं बहुत खुशी NLog.config जोड़ने की कोशिश कर नहीं किया है इंस्टॉलर के लिए।

4

मुझे पता है कि यह थोड़ा देर हो चुकी है लेकिन यहां वर्णित एक और समाधान है: Configure log4net or NLog with XML from code हालांकि यह एक और सवाल का जवाब दे रहा है।

मुझे कलड्रेक्स द्वारा वर्णित एक ही समस्या थी। ,

public static XmlLoggingConfiguration SetNlogConfiguration() 
    { 
     var sr = new StringReader(NlogXmlConfigString1()); 
     var xr = XmlReader.Create(sr); 
     var config = new XmlLoggingConfiguration(xr, null); 
     return config; 
    } 

एक अलग विधि सिर्फ एक्सएमएल स्ट्रिंग रिटर्न में: क्या मैं बहुत NLog config (समान समाधान में कई परियोजनाओं) के बारे में चल फाइलों के साथ खुश तो एक NLogHelper वर्ग है जो एक विधि विन्यास लौट बनाया नहीं कर रहा हूँ मेरे मामले:

private static string NlogXmlConfigString1() 
    { 
     return @"<nlog xmlns='http://www.nlog-project.org/schemas/NLog.xsd\' 
         xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance\'> 
        <targets> 
         <target name='logfile' xsi:type='File' fileName='${specialfolder:file=My_Logger.txt:folder=Desktop}' /> 
        </targets> 

        <rules> 
        <logger name='*' minlevel='Info' writeTo='logfile' /> 
        </rules> 
       </nlog>"; 
    } 

अंत में, मैं सिर्फ प्रासंगिक वर्ग निर्माता में कॉन्फ़िगरेशन सेट:

NLog.LogManager.Configuration = NlogHelper.Helper.SetNlogConfiguration(); 

जाहिर है यह पुनर्संशोधित जा सकता है और आइटम एल की तरह और यदि आवश्यक हो तो फ़ाइल नाम पैरामीटर के रूप में पारित किया जा सकता है। कॉन्फ़िगरेशन एक्सएमएल को बस आपकी कॉन्फ़िगरेशन के साथ प्रतिस्थापित किया जा सकता है। रन-टाइम पर चुने गए एकाधिक कॉन्फ़िगरेशन को आसानी से निर्दिष्ट करने की संभावना भी प्रदान करता है।

मुझे यह पसंद है क्योंकि मुझे लगता है कि यह मुझे कोड में और तैनाती के दौरान एनएलओजी कॉन्फ़िगरेशन पर अधिक नियंत्रण देता है।

5

मुझे ClickOnce का उपयोग करके स्थापित किया गया है, तो आपके NLog.config को आपके प्रोग्राम में कॉपी नहीं किया जाएगा जब मुझे इस समस्या का उत्तर मिला।

आप में NLog.config फ़ाइल का चयन करने की जरूरत है अपने ProjectSolution Explorer का उपयोग करने और इस प्रकार अपने Properties सेट:

कार्रवाई बिल्ड: सामग्री

कॉपी आउटपुट निर्देशिका लिए: कॉपी हमेशा

अब जब आप ClickOnce का उपयोग करके तैनात करते हैं तो फ़ाइलों को भी कॉपी किया जाना चाहिए! :)