2011-04-09 12 views
7

काम नहीं कर रहा है मैं अपने ऐप में लॉग इन करने के लिए log4net का उपयोग कर रहा हूं। मेरा FileAppender ठीक काम कर रहा है, लेकिन मुझे MemoryAppender के साथ समस्याएं आ रही हैं।log4net MemoryAppender

यहां मेरी कॉन्फ़िगरेशन फ़ाइल है।

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
<log4net> 
<appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
    <param name="File" value="Envision.log" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="Header" value="" /> 
    <param name="Footer" value="" /> 
    <param name="ConversionPattern" value="%d [%t] %-5p %m%n" /> 
    </layout> 
</appender> 
<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender"> 

</appender> 
<root> 
    <level value="ALL" /> 
    <appender-ref ref="LogFileAppender" /> 
    <appender-ref ref="MemoryAppender" /> 
</root> 
</log4net> 
</configuration> 

मैं कॉन्फ़िगरेशन फ़ाइल सेट अप करने के लिए इस कोड का उपयोग करता हूं।

FileInfo file = new FileInfo(configPath); 
log4net.Config.XmlConfigurator.Configure(file); 
file = null; 

जैसा कि मैंने कहा, फ़ाइल एपेंडर महान काम करता है। लेकिन मुझे कोई घटना नहीं मिल रही है। मैंने मेमोरी ऐपेंडर प्राप्त करने के लिए ऐसा कुछ करने का प्रयास किया है।

Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy; 
MemoryAppender mappender = hierarchy.Root.GetAppender("MemoryAppender") as MemoryAppender; 

मैं का उपयोग कर की कोशिश की है:

var events = mappender.GetEvents() 

कुछ प्रवेश करने के बाद, और घटनाओं हमेशा खाली है। मैंने कॉन्फ़िगरेशन फ़ाइल का उपयोग करने के बजाय फ़ाइल में FileAppender और MemoryAppender को सेट करने का प्रयास किया है, और मुझे वही मिलता है, FileAppender ठीक काम करता है, लेकिन मेमोरीएपेंडर से कोई भी ईवेंट नहीं मिल रहा है। उत्सुक अगर मैं MemoryAppender सही समझ रहा हूँ? मैंने एक थ्रेड स्थापित करने का भी प्रयास किया जो GetEvents को रिक्त नहीं होने के लिए जांच करता है, और लॉगिंग करते समय यह हमेशा खाली आता है। मैंने थ्रेसहोल्ड को Core.Level पर सेट करने का प्रयास किया है। मेमोरी ऐपेंडर पर सभी ने कुछ भी नहीं बदला है।

किसी भी दिशा के लिए धन्यवाद। मैंने चारों ओर देखा है, और मैंने देखी गई साइटों से, मैं यह नहीं बता सकता कि मैं अलग क्या कर रहा हूं।

यहां तक ​​कि कुछ भी सरल काम नहीं करता है। घटनाओं की लंबाई हमेशा शून्य होती है;

public partial class MainWindow : Window { 
    public MainWindow() { 
     InitializeComponent(); 

     MemoryAppender appender = new MemoryAppender(); 
     ILog logger = LogManager.GetLogger("foo"); 
     BasicConfigurator.Configure(appender); 

     logger.Error("Should work"); 
     var events = appender.GetEvents(); 
    } 
} 

उत्तर

1

मैंने इसे समझ लिया। मैं गलती से कॉम्पैक्ट फ्रेमवर्क। डीएलएल का उपयोग कर रहा था। एक बार मुझे एहसास हुआ कि मैंने .NET 2.0 संस्करण में स्विच किया है, जिसके कारण लॉग 4नेट नेमस्पेस के साथ कोई समस्या नहीं मिली है, इसलिए मैंने उस पर एक खोज की और मुझे एहसास हुआ कि मुझे अपने .NET Framework 4 क्लाइंट प्रोफाइल को .NET Framework 4 में बदलने की आवश्यकता है। अब मैं उम्मीदों के रूप में उम्मीद कर रहा हूँ।

1

आपके द्वारा पोस्ट किया गया सरल नमूना कोड लॉग 4नेट 1.2.10.0 का उपयोग करके मेरे लिए ठीक काम करता है।

मैं स्रोत डाउनलोड करने और डीबगर में इसके माध्यम से कदम उठाने की सलाह दूंगा। यह पहली बार थोड़ा मुश्किल लग सकता है, लेकिन आप अपने कोड में बहुत तेज़ी से उपयोग करते हैं और इसका पालन करना मुश्किल नहीं है। मैंने कई बार ऐसा किया है जब मुझे कस्टम बाधाओं और परिशिष्टों में समस्याएं थीं। यह वास्तव में समस्याओं को जल्दी से हल करने में मदद करता है और आपको लॉग 4नेट कैसे काम करता है इसकी एक बेहतर समझ देता है।

9

उन इसकी जरूरत है कि के लिए, यहाँ इसे कैसे करना प्रोग्राम के रूप में सी # में है:

using log4net; 
using log4net.Appender; 
// ... 
internal static MemoryAppender GetMemoLog<T>() where T: class 
{ 
    var memoLog = new MemoryAppender(); 
    ILog appendableLog = LogManager.GetLogger(typeof(T).Assembly, typeof(T)); 
    var repository = (log4net.Repository.Hierarchy.Hierarchy)appendableLog.Logger.Repository; 
    repository.Root.AddAppender(memoLog);    
    var logField = typeof(T).GetField("Log", BindingFlags.Static | BindingFlags.NonPublic); 
    if (logField != null) logField.SetValue(null, appendableLog); 
    return memoLog; 
} 

इसका मतलब यह है कि आप एक निजी स्थिर है:

var memoryAppender = new MemoryAppender(); 
var repository = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository(); 
repository.Root.AddAppender(memoryAppender); 
var events = memoryAppender.GetEvents(); 
+1

शानदार, धन्यवाद!मैं बस यूनिट परीक्षणों के लिए लॉग लाइनों (मेरे प्रोजेक्ट में मॉकिंग फ्रेमवर्क जोड़ने के बिना) को कैप्चर करना चाहता था, इसलिए मैंने आपका कोड अनुकूलित किया – CZahrobsky

1

मैं अपने इकाई परीक्षण में ऊपर राजेश के कोड का इस्तेमाल किया लॉग अपनी कक्षा पर क्षेत्र:

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

तो, में परीक्षण, यह बस है:

var memoLog = GetMemoLog<MyClass>(); 
// followed by test logic, and then... 
var events = memoLog.GetEvents();