2013-07-10 10 views
9

यह वास्तव में एक आम सवाल है, लेकिन मैं काम का जवाब पाने में सक्षम नहीं हूं। यहां मेरी कॉन्फ़िगरेशन फ़ाइल है:log4net: गतिशील रूप से लॉगर फ़ाइल नाम कैसे सेट करें?

<?xml version="1.0" encoding="utf-8"?> 
<log4net> 
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> 
    <file value="CraneUserInterface.log" /> 
    <appendToFile value="true" /> 
    <maxSizeRollBackups value="90" /> 
    <rollingStyle value="Size" /> 

    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date - %message%newline" /> 
    </layout> 
    </appender> 

    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="RollingFile" /> 
    </root> 

लेकिन मुझे रन टाइम पर वास्तविक लॉगिंग फ़ाइल नाम निर्धारित करने की आवश्यकता है। मुझे here का एक अच्छा उदाहरण मिला, लेकिन जब मैं GetIterators() पर कॉल द्वारा लौटाए गए संग्रह के माध्यम से लूप करने का प्रयास करता हूं, तो मुझे लगता है कि वह संग्रह खाली है।

मुझे "CraneUserInterface.log" नाम को "CraneUserInterface_1.log", या 2, या 3 में बदलने की आवश्यकता है, जो रन रन पर प्रोग्राम पढ़ता है। मैं उसे कैसे कर सकता हूँ?

यहाँ है कि नमूने में प्रस्तुत कोड का उपयोग करने में मेरी पहली पास है:

static bool ChangeLogFileName(string AppenderName, string NewFilename) 
{   
    // log4net.Repository.ILoggerRepository RootRep; 
    // RootRep = log4net.LogManager.GetRepository(); 
    log4net.Repository.ILoggerRepository RootRep = m_logger.Logger.Repository; 
    foreach (log4net.Appender.IAppender iApp in RootRep.GetAppenders()) 
    { 
    string appenderName = iApp.Name; 
    if (iApp.Name.CompareTo(AppenderName) == 0 
     && iApp is log4net.Appender.FileAppender) 
    { 
     log4net.Appender.FileAppender fApp = (log4net.Appender.FileAppender)iApp; 
     fApp.File = NewFilename; 
     fApp.ActivateOptions(); 
     return true; // Appender found and name changed to NewFilename 
    } 
} 
return false; // appender not found 
} 

धन्यवाद बहुत बहुत!

+0

दो बार पढ़ने के बावजूद, मुझे पता नहीं तुम क्यों ऐसा करना चाहते हैं होगा। –

+1

यह एक लैपटॉप में उपयोग के लिए है जो एक एनीलिंग संयंत्र में एक क्रेन के कैब में होगा। पौधे में 3 क्रेन हैं। चूंकि मैं पौधे में नहीं हूं, न ही मैं निकट भविष्य में रहूंगा, मेरे पास एक सिम्युलेटर है जो तीनों क्रेन बनने का नाटक करता है। इस कार्यक्रम के 3 उदाहरण एक ही समय में चल रहे होंगे। मुझे अलग-अलग 3 क्रेनों के लिए अलग-अलग घटनाओं को ट्रैक करने की ज़रूरत है, और मुझे शायद इस कार्यक्रम के दो उदाहरणों को एक ही लॉग फ़ाइल में लिखने के किसी भी मौके से बचने चाहिए। –

+0

मुझे लगता है कि मेरा आंत वृत्ति सही था। आप गलत समस्या को हल करने की कोशिश कर रहे हैं। –

उत्तर

4

आप इस फ़ंक्शन का उपयोग कर सकते हैं: इस फ़ंक्शन में पहले फ़ाइल कॉन्फ़िगरेशन जो आपने वेब कॉन्फ़िगर में सेट किया है और उसके बाद आप जो भी पथ चाहते हैं उसे जोड़ सकते हैं! तिथि की तरह! हमारे ग्राहक ! या .....

WebConfig:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="C:\\t4\\"/> 
    <appendToFile value="true"/> 
    <rollingStyle value="Composite"/> 
    <datePattern value="_yyyy-MM-dd.lo'g'"/> 
    <maxSizeRollBackups value="10"/> 
    <maximumFileSize value="1MB"/> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date User:%identity IP:%X{addr} Browser: %X{browser} Url: %X{url} [%thread] %-5level %c:%m%n"/> 
    </layout> 
</appender> 

फंक्शन:

public static void ChangeFileLocation(string _CustomerName,string _Project) 
{ 
    XmlConfigurator.Configure(); 
    log4net.Repository.Hierarchy.Hierarchy h =(log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository(); 

    foreach (IAppender a in h.Root.Appenders) 
    { 
     if (a is FileAppender) 
     { 
      FileAppender fa = (FileAppender)a; 
      string sNowDate= DateTime.Now.ToLongDateString(); 
      // Programmatically set this to the desired location here 
      string FileLocationinWebConfig = fa.File; 
      string logFileLocation = FileLocationinWebConfig + _Project + "\\" + _CustomerName + "\\" + sNowDate + ".log"; 

      fa.File = logFileLocation; 
      fa.ActivateOptions(); 
      break; 
     } 
    } 
} 

और इस तरह परिणाम: C: \ टी -4 \ TestProject \ Customer1 \ शनिवार, 31 अगस्त, 2013.log

+0

कृपया कई प्रश्नों के सटीक उत्तर को पोस्ट न करें - वे या तो वास्तव में फिट नहीं हैं या प्रश्न एक डुप्लिकेट है और इसे इस तरह फ़्लैग किया जाना चाहिए – kleopatra

7

फ़ाइल नाम (रनटाइम पर) गतिशील 'टैग' को परिभाषित करने के लिए "% संपत्ति" का उपयोग करने के बारे में क्या?

<file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" /> 

यहां बताई गई है: Best way to dynamically set an appender file path

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