2013-06-17 5 views
6

क्या एप्लिकेशन चल रहा है, जबकि फ़ाइलappender के लिए लॉगफाइल का नाम बदलना संभव है? यह कुछ बार/दिन किया जाएगा।रनटाइम के दौरान कुछ बार लॉगफाइल का नाम बदलें

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

उदाहरण के लिए: जब उपयोगकर्ता डिवाइस AB0124 पर काम करता है, तो मैं AB0124.log नामक लॉगफाइल पर लिखना चाहता हूं। जब वह उस डिवाइस पर काम करना समाप्त कर देता है और डिवाइस XY5618 पर शुरू होता है, तो मैं XY5618.log

में पढ़ता हूं कि मैंने एक संदर्भ-संपत्ति (here और here और कई अन्य पोस्ट) का उपयोग करना संभव है। , लेकिन आपको लॉगर बनाने से पहले संपत्ति सेट करनी होगी। तो, कक्षा में लॉगर बनाने के बजाय, मैं संपत्ति सेट करने के बाद अपनी विधि में एक बना देता हूं। लेकिन अब तक, कुछ भी लॉग नहीं हुआ है।

जब मैं कॉन्फ़िगरेशन में हार्डकोड किए गए फ़ाइल नाम को सेट करता हूं, तो यह काम कर रहा है। क्या मुझे यहां कुछ याद आ रही है?

Log4Net.config:

<appender name="StepsLogAppender" type="log4net.Appender.FileAppender"> 
    <filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="INFO"/> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    <file type="log4net.Util.PatternString" value="%property{LogPathModifier}" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date{dd/MM/yyyy - HH:mm:ss} - %message%newline" /> 
    </layout> 
</appender> 

<root> 
    <level value="ALL" /> 
    <appender-ref ref="StepsLogAppender" /> 
</root> 

सी #:

public void WriteStepInfo(string device, int step) 
{ 
    log4net.ThreadContext.Properties["LogPathModifier"] = string.Format("D:\\StepsDevice_{0}.txt", device); 
    var log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
    log.Info(string.Format("Device {0} - step {1}.", device, step)); 
} 

और AssemblyInfo.cs में:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)] 

उत्तर

7

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

public void WriteStepInfo(string device, int step) 
{ 
    var h = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository(); 
    foreach (IAppender a in h.Root.Appenders) 
    { 
     if (a.Name == "StepsLogAppender") 
     { 
      FileAppender fa = (FileAppender)a; 
      var logFileLocation = string.Format(".\\Logs\\Device_{0}.log", device); 

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

    Log.Info(string.Format("Device {0} - step {1}. Different file for each device", device, step)); 
} 
+0

उदाहरण के लिए धन्यवाद। वास्तव में मुझे क्या चाहिए! – AngieM

+0

यह सबसे अच्छा कार्यान्वयन है जो मैंने पाया ... धन्यवाद ... – Emerson

1

यो आप अपने आवेदन से log4net.config फ़ाइल खोल सकते हैं और नाम बदल सकते हैं। फिर फ़ाइल को सहेजें (log4net.config) और लॉगिंग फ़ाइल बदल दी जाएगी।

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