2009-08-27 13 views
46

में लॉग फ़ाइल इस log4net के लिए मेरे विन्यास है:प्राप्त करें log4net सी #

<log4net> 
    <appender name="MyLogger" type="log4net.Appender.RollingFileAppender"> 
     <file value="MyLog.log" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="20"/> 
     <maximumFileSize value="1000KB"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss},%p,%m%n" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="MyLogger" /> 
    </root> 
</log4net> 

सी # में मैं लॉग फ़ाइल का नाम (जो MyLog.log है) प्राप्त करने के लिए कोशिश कर रहा हूँ। मैंने गुस्सा किया और कई चीजों की कोशिश की लेकिन ऐसा करने में असफल रहा। कोई मदद?

धन्यवाद!

+0

आप कह रहे हैं कि आप प्राप्त करने की कोशिश में log4net config फ़ाइल को पार्स करने की कोशिश कर रहे फ़ाइल नाम आप लॉगिंग कर रहे हैं? सवाल यह स्पष्ट नहीं करता है। आप वास्तव में क्या करने की कोशिश कर रहे हैं, और समस्या क्या है? –

+0

मैं कॉन्फ़िगरेशन के इस भाग को प्राप्त करने का प्रयास कर रहा हूं "", मैं इसे स्वयं (अभी के लिए) पार्स करने से दूर जाने की कोशिश कर रहा हूं, क्योंकि मुझे लगता है कि एएसपी 4नेट का निर्माण हो सकता है ऐसा करने के लिए, केवल मुझे यह नहीं मिल रहा है। यदि नहीं, तो मुझे खुद को पार्सिंग करना होगा। – Carlo

उत्तर

78

समाधान आपकी स्थिति में काफी आसान है; बस इस कोड का प्रयोग करें:

var rootAppender = ((Hierarchy)LogManager.GetRepository()) 
             .Root.Appenders.OfType<FileAppender>() 
             .FirstOrDefault(); 

string filename = rootAppender != null ? rootAppender.File : string.Empty; 
+0

एक आकर्षण की तरह काम किया। धन्यवाद! – Carlo

+1

मैंने इसका इस्तेमाल किया। लेकिन (FileAppender) ((log4net.Repository.Hierarchy.Hierarchy) LogManager.GetRepository()) रूट में उपरोक्त समाधान में उल्लिखित परिशिष्टों की एक सरणी नहीं है। कोई विचार ??? – Sandeep

+0

उपयोगकर्ता762730 क्या आपने लॉगिंग कॉन्फ़िगर किया है? यदि कोई परिशिष्ट नहीं है तो ... – Yakeen

-1

मुझे उपरोक्त कोड काम नहीं मिला। इस के लिए मुझे

var filename= ((log4net.Appender.FileAppender)(((log4net.Appender.IAppender[])((((((log4net.Repository.Hierarchy.Hierarchy)((((log4net.Core.LoggerWrapperImpl)(log)).Logger).Repository)).Root).Hierarchy.Root).Appenders).SyncRoot))[0])).File

+12

वाह ... वह कोड वास्तव में दृढ़ दिखता है!मैं तुरंत ऐसे कोड को अविश्वास करता हूं जो ऐसा दिखता है। –

+0

जहां यह 'लॉग' इस भाग से आया है' (log4net.Core.LoggerWrapperImpl) (लॉग) '? –

0

काम अपने config एक < जड़ > नोड तो ऊपर समाधान आप के लिए काम नहीं करेगा नहीं है, तो। पढ़ते रहिये।

<log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="${LOCALAPPDATA}\Anonymous.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="2000KB" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
    </appender> 
    <logger name="AnonymousLog"> 
    <level value="All" /> 
    <appender-ref ref="RollingFileAppender" /> 
    </logger> 
</log4net> 

की इस फ़ाइल को पुन: प्राप्त:

string path = path = (LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders()[0] as FileAppender).File; 

(उम्मीद है कि) दुर्घटना प्रूफ संस्करण:

string path = null; 
if (LogManager.GetCurrentLoggers().Length > 0 && LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders().Length > 0) 
{ 
    path = (LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders()[0] as FileAppender).File; 
} 

अंत में, यदि आप log4net के साथ अटक जाते हैं अपने < appSettings में जोड़ना > अनुभाग:

<add key="log4net.Internal.Debug" value="true"/> 
6

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

using log4net; 
using log4net.Appender; 
using log4net.Repository; 

namespace MyNameSpace { 
public class MyClass { 

    private static readonly ILog logger = LogManager.GetLogger(typeof(MyClass)); 

    public String GetLogFileName() { 

     String filename = null; 

     IAppender[] appenders = logger.Logger.Repository.GetAppenders(); 
     // Check each appender this logger has 
     foreach (IAppender appender in appenders) { 
      Type t = appender.GetType(); 
      // Get the file name from the first FileAppender found and return 
      if (t.Equals(typeof(FileAppender)) || t.Equals(typeof(RollingFileAppender))) { 
       filename = ((FileAppender)appender).File; 
       break; 
      } 
     } 
     return filename; 
    } 
} 

}

+0

मुझे कुछ विशेष समायोजक/लॉगर की तलाश करने के लिए कुछ समायोजन के साथ यह पसंद है .. –

0
 String filename = null; 

     Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy; 
     Logger logger = hierarchy.Root; 

     IAppender[] appenders = logger.Repository.GetAppenders(); 

     // Check each appender this logger has 
     foreach (IAppender appender in appenders) 
     { 
      Type t = appender.GetType(); 
      // Get the file name from the first FileAppender found and return 
      if (t.Equals(typeof(FileAppender)) || t.Equals(typeof(RollingFileAppender))) 
      { 
       filename = ((FileAppender)appender).File; 
       break; 
      } 
     } 

     System.Diagnostics.Process.Start(filename); //for example, open file in notepad 
12

जब एक से अधिक फ़ाइल appenders होने, आप उन्हें नाम से प्राप्त करने के लिए चाहते हो सकता है। इसके अलावा appender पाने के लिए यकीन है कि भले ही यह रूट नोड द्वारा संदर्भित नहीं है बनाने के लिए, निम्न कोड में मदद करता है:

public static string GetLogFileName(string name) 
{ 
    var rootAppender = LogManager.GetRepository() 
            .GetAppenders() 
            .OfType<FileAppender>() 
            .FirstOrDefault(fa => fa.Name == name); 

    return rootAppender != null ? rootAppender.File : string.Empty; 
} 
+1

** इसे और अधिक वोट चाहिए! ** लघु, सुरुचिपूर्ण और नाम से परिशिष्ट में से किसी एक को चुनने की अनुमति। मैंने यहां देखे गए अधिकांश अन्य समाधानों में केवल पहला एपेंडर चुनें जो हमेशा सही नहीं होता है। प्रश्न के मुताबिक आप 'GetLogFileName ("MyLogger") ' – Matt

+2

का उपयोग करेंगे, केवल एक चीज जिसे मैं बदलूँगा' rootAppender ?File ?? का उपयोग करना है ?? string.Empty' (सी # 6 ** ['एल्विस' ऑपरेटर] (https://csharp.today/c-6-features-null-conditional-and-and-null-coalescing-operators/)) ** इसके बजाय 'rootAppender! = शून्य? rootAppender.File: string.Empty', जो छोटा है। – Matt