2011-08-05 11 views
9

मेरे पास एक सेवा अनुप्रयोग है जो स्टार्टअप पर एक XML फ़ाइल पढ़ता है और XML फ़ाइल में प्रत्येक प्रविष्टि के लिए थ्रेड प्रारंभ करता है। प्रत्येक थ्रेड एक वर्कर क्लास का एक उदाहरण बनाता है जिसके लिए थ्रेड को किसी थ्रेड विशिष्ट लॉग फ़ाइल में लॉग आउट करने की आवश्यकता होती है।प्रत्येक व्यक्तिगत थ्रेड के लिए एक व्यक्तिगत लॉग फ़ाइल में लॉगिंग

सेवाओं app.config मैं log4net विन्यास सेटिंग्स एक एक्सएमएल appender उपयोग करने के लिए निर्धारित किया है और फ़ाइल एक PatternString के रूप में निर्दिष्ट किया जाता है में नीचे दिखाया गया है:

<appender name="XmlAppender" type="log4net.Appender.FileAppender"> 
    <file type="log4net.Util.PatternString" value="D:\Temp\Logs\%property{LogName}.log" /> 
    <immediateFlush value="true"/> 
    <appendToFile value="true" /> 
    <layout type="log4net.Layout.SimpleLayout" /> 
</appender> 

के प्रत्येक उदाहरण के लिए एक धागा बंद कर दिया विधि में मजदूर वर्ग बनाया गया है, मुझे log4net.LogManager.GetLogger("MyLogger") विधि का उपयोग करके लॉगर मिलता है और फिर मैंने ThreadContext.Properties["LogName"] = "Log name prefix" का उपयोग कर वर्तमान थ्रेड पैटर्नस्ट्रिंग लॉगनाम संपत्ति सेट की है।

सभी फाइलें बनाई गई हैं, लेकिन जब लॉगर कहलाता है तो यह सभी संदेश को एक प्रतीत होता है यादृच्छिक फ़ाइल में लॉग करता है।

मैंने समाधान खोजने की कोशिश करते समय कुछ समय के लिए खोज की है या कुछ गलत जवाब दे रहा हूं लेकिन मुझे कोई भाग्य नहीं मिला है।

क्या किसी को पता है कि यह क्यों हो रहा है?

उत्तर

12

मुझे लगता है कि मैंने इस मुद्दे को पूरा किया है। चरण का पालन करें:

  • प्रत्येक थ्रेड पर लॉगर रेपॉजिटरी नामक एक व्यक्ति बनाएं।
  • लॉग फ़ाइल नाम के लिए ThreadContexts प्रॉपर्टी सेट करें।
  • भंडार को कॉन्फ़िगर करने के लिए XmlConfiguratior का उपयोग करें।
  • उस थ्रेड के लिए नामांकित लॉगर रेपॉजिटरी का उपयोग करके नामांकित लॉगर (XML कॉन्फ़िगरेशन फ़ाइल में) प्राप्त करने के लिए LogManager का उपयोग करें।

बदले में मुझे उस थ्रेड के लिए संबंधित फ़ाइल को इंगित करने वाला एक नया कॉन्फ़िगर किया गया लॉगर मिलता है। के रूप में यह मूल रूप से किया गया था और यहां पूर्णता के लिए दिखाया गया

एक्सएमएल विन्यास में एक ही है:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections>  
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <log4net> 
    <logger name="ProductionLogger"> 
     <appender-ref ref="XmlAppender"/>  
     <level value="ALL"/> 
    </logger> 
    <appender name="XmlAppender" type="log4net.Appender.FileAppender"> 
     <file type="log4net.Util.PatternString" value="D:\Temp\Logs\%property{LogName}.log" /> 
     <immediateFlush value="true"/> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.SimpleLayout" /> 
    </appender> 
    </log4net> 
</configuration> 

वालों बनाने के लिए कोड के नीचे है। प्रत्येक बार जब यह कोड चलाया जाता है तो यह अपने धागे में चलाया जाता है।

ILoggerRepository loggerRepository = LogManager.CreateRepository(logFileName + "Repository"); 
ThreadContext.Properties["LogName"] = logFileName; 
log4net.Config.XmlConfigurator.Configure(loggerRepository); 
ILog logger = LogManager.GetLogger(logFileName + "Repository", "ProductionLogger"); 

ऐसा लगता है कि अब तक कोई समस्या नहीं है। मैं फिलहाल इस समाधान के साथ आगे बढ़ रहा हूं लेकिन अगर मैं कुछ और पता लगाता हूं तो मैं इस पोस्ट को अपडेट कर दूंगा।

+1

बड़ा धन्यवाद! मुझे थ्रेडिंग और विभिन्न फाइलों में लॉगिंग के साथ एक ही समस्या थी। मैंने कई पदों और समाधानों को देखा, लेकिन केवल यह ही मुझे परेशान करता था। –

+0

बहुत बहुत धन्यवाद ... इस दृष्टिकोण ने मेरी समस्या हल की ... – Emerson

4

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

string repoName = String.Format("{0}Repository", logFileName); 

// Check for existing repository 
ILoggerRepository[] allRepos = LogManager.GetAllRepositories(); 
ILoggerRepository repo = allRepos.Where(x => x.Name == repoName).FirstOrDefault(); 

// If repository does not exist, create one, set the logfile name, and configure it 
if (repo == null) 
{ 
    repo = LogManager.CreateRepository(repoName); 
    ThreadContext.Properties[KEY_LOG_FILE] = logFileName; 
    log4net.Config.XmlConfigurator.Configure(repo); 
} 

// Set logger 
ILog logger = LogManager.GetLogger(repoName, logName); 
+1

आप बिना किसी कहां, FirstOrDefault को कॉल कर सकते हैं: 'allRepos.FirstOrDefault (x => x.Name == repoName); ' –

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