2013-06-24 9 views
10

शीर्षक का तात्पर्य है कि मैं प्रत्येक एप्लिकेशन चलाने के लिए एक नई लॉग फ़ाइल कैसे बना सकता हूं? मुझे पता है कि इसे मिनट/घंटा/आदि के लिए कैसे किया जाए। लेकिन ऐप के लिए नहीं। चलानेप्रत्येक एप्लिकेशन के लिए नई लॉग फ़ाइल कैसे बनाएं

वहाँ क्या मैं अब के लिए है:

target name="Debug" archiveEvery="Hour" 
archiveFileName="${basedir}/logs/Debug.{#####}.txt" maxArchiveFiles="4" 
archiveNumbering="Sequence" xsi:type="File" fileName="${basedir}/logs/Debug.txt" 
layout="${date:format=HH\:mm\:ss} | ${level} | ${message} ${exception} 
${exception:format=stacktrace}" 

लेकिन असल में मैं न हर घंटे संग्रह करने के लिए की जरूरत है, क्या मैं चाहता हूँ जब मैं अपने अनुप्रयोग चलाने हर बार संग्रह करने के लिए है। वहाँ क्या मैं old forum में पाया जाता है, लेकिन मैं Cached_layout_renderer

उत्तर

22

मैं अपने आप को इस समस्या के पार आया, और यह मुझे काफी समय लगा यह पता लगाने की। मैंने पाया है कि अधिकांश उत्तरों में केवल समाधान का हिस्सा है और यह नहीं बताता कि यह कैसे/क्यों काम करता है ... यदि आपके पास थोड़ा अलग उपयोग केस है तो इसे अनुकूलित करना मुश्किल हो जाता है।

उदाहरण:

<target name="log" 
    xsi:type="File" 
    fileName="${basedir}/logs/log.${longdate:cached=true}.log" 
    layout="${message}" 
    archiveFileName="${basedir}/logs/archives/log.${shortdate}.{#}.log" 
    archiveAboveSize="5242880" 
    archiveEvery="Day" 
    archiveNumbering = "Rolling" 
    maxArchiveFiles="20" 
    /> 

स्पष्टीकरण

आप दोनों कैश्ड लेआउट प्रतिपादक और longdate चर का उपयोग करना पड़ता है। यह समझने के लिए कि यह क्यों काम करता है, आपको यह समझने की आवश्यकता है कि वे कैसे काम करते हैं, और वे कैसे बातचीत करते हैं।

longdate:

fileName="${basedir}/logs/log.${longdate}.log" 

अपनी लॉग नाम पर longdate चर का उपयोग करना काफी हर निष्पादन पर एक नया लॉग फ़ाइल की गारंटी देगा ... को छोड़कर यह एक नया लॉग फ़ाइल हर मिलीसेकंड भी दौरान बनाता है एक ही निष्पादन जो शायद सबसे दुर्लभ परिस्थितियों को छोड़कर वांछनीय नहीं है।

कैश्ड लेआउट प्रतिपादक:

fileName="${basedir}/logs/log.${shortdate:cached=true}.log" 

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

संयुक्त: कि निष्पादन समाप्त जब तक लॉगफ़ाइल (कैश को साफ़ करने

fileName="${basedir}/logs/log.${longdate:cached=true}.log" 

यह काम करता है क्योंकि यह निष्पादन प्रति पहले लॉग का मिलीसेकंड टाइमस्टैम्प लेता है, और फिर इसे कैश, और हमेशा का उपयोग करता है)। अगली बार जब आप इसे चलाते हैं (जब तक यह वही मिलीसेकंड नहीं है ... असंभव!) आपको एक नया मान कैश किया जाएगा, और एक नई लॉग फ़ाइल (लेकिन केवल एक!)।

+0

यह एक सहायक उत्तर है! धन्यवाद। – Mikey

+1

मुझे एक और तरीका मिला है - '$ {guid: cached = true} .log' – Kai

+0

@ मिर: यह एक बहुत अच्छा जवाब है। लेकिन जब यह काम नहीं कर रहा है तो मुझे एक मामला मिला है। यदि autoReload (https://github.com/nlog/NLog/wiki/Configuration-file#automatic-reconfiguration) सत्य पर सेट है और आप ऐप बंद किए बिना कॉन्फ़िगरेशन बदल रहे हैं तो यह वर्तमान लॉग बंद कर देगा और एक नया प्रारंभ करेगा। क्या इससे निपटने का कोई तरीका है? – IgorStack

5

उपयोग करने के लिए कैसे कैसे कैश्ड लेआउट रेंडरर का उपयोग करने का एक उदाहरण के लिए https://github.com/NLog/NLog/blob/master/tests/NLog.UnitTests/LayoutRenderers/Wrappers/CachedTests.cs देखें पता न।

मूल रूप से यह इस तरह इस्तेमाल किया जा सकता:

${cached:${variable}:cached=true} 
+0

पहली जगह किसी ने वास्तव में एक उदाहरण दिखाया, "ओह हाँ ने कैश किए गए लेआउट रेंडरर का उपयोग किया" – drzaus

+0

कैश लॉगिंग करते समय समय/दिनांक/परिवर्तनीय परिवर्तन करते समय नई लॉग फ़ाइल बनाने में मदद करने में मदद करता है ... लेकिन मेरा मानना ​​है कि पूछताछ करने वाले हर बार एक नई फाइल है जब निष्पादन योग्य चलाया जाता है। उदाहरण के लिए app.1.log, फिर app.2.log, ..., app.n.log। – Mir

7

एनएलओजी का फ़ाइल लक्ष्य अब एक संपत्ति संग्रहऑल्डफाइलऑनस्टार्टअप (NLog-3-2-0 Release) का समर्थन करता है।

archiveOldFileOnStartup="true" 

कि के साथ कुछ मुद्दों हो सकता है, लेकिन अगर केवल अनुप्रयोग का एक उदाहरण एक ही समय में चल रहा है, यह वांछित व्यवहार होना चाहिए।

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