2008-11-21 8 views
31

कैसे करें (प्रोग्रामेटिक रूप से, xml कॉन्फ़िगरेशन के बिना) Log4Net के साथ एकाधिक लॉगर्स कॉन्फ़िगर करें? मुझे उन्हें विभिन्न फ़ाइलों को लिखने की आवश्यकता है।लॉग 4नेट: प्रोग्रामेटिक रूप से एकाधिक लॉगर्स (एकाधिक फ़ाइल एपेंडर के साथ)

उत्तर

39

This thread at the log4net Dashboard details an approach

एक छोटे से संक्षेप में, उम्मीद है कि बहुत ज्यादा कोड बंद फाड़ के बिना:

using log4net; 
using log4net.Appender; 
using log4net.Layout; 
using log4net.Repository.Hierarchy; 

// Set the level for a named logger 
public static void SetLevel(string loggerName, string levelName) 
{ 
    ILog log = LogManager.GetLogger(loggerName); 
    Logger l = (Logger)log.Logger; 

    l.Level = l.Hierarchy.LevelMap[levelName]; 
    } 

// Add an appender to a logger 
public static void AddAppender(string loggerName, IAppender appender) 
{ 
    ILog log = LogManager.GetLogger(loggerName); 
    Logger l = (Logger)log.Logger; 

    l.AddAppender(appender); 
} 

// Create a new file appender 
public static IAppender CreateFileAppender(string name, string fileName) 
{ 
    FileAppender appender = new 
     FileAppender(); 
    appender.Name = name; 
    appender.File = fileName; 
    appender.AppendToFile = true; 

    PatternLayout layout = new PatternLayout(); 
    layout.ConversionPattern = "%d [%t] %-5p %c [%x] - %m%n"; 
    layout.ActivateOptions(); 

    appender.Layout = layout; 
    appender.ActivateOptions(); 

    return appender; 
} 

// In order to set the level for a logger and add an appender reference you 
// can then use the following calls: 
SetLevel("Log4net.MainForm", "ALL"); 
AddAppender("Log4net.MainForm", CreateFileAppender("appenderName", "fileName.log")); 

// repeat as desired 
+0

मैंने XML कॉन्फ़िगरेशन दृष्टिकोण का उपयोग करने के बजाय, मेरी असेंबली में से एक के लिए यह दृष्टिकोण लिया है। जबकि फाइल जेनरेट की जाती है, किसी कारण से आईएलओजी लॉगिंग-संबंधित विधियां फाइलों को कुछ भी नहीं लिखती हैं। क्या नया एपेंडर प्रभावी होने के लिए कॉल करने का कोई तरीका है? मुझे इस तरह कुछ भी नहीं मिला है, फिर भी ... – Dave

+7

@ डेव: मुझे वही समस्या थी और इसे 'एल। रिपोजिटरी। कॉन्फ़िगर किया गया = सत्य;' 'ऐडएपेंडर' में जोड़कर हल किया गया। – Stephan

+0

@ स्टीफन धन्यवाद, मेरा मानना ​​है कि यह वही है जो मुझे इसे काम करने के लिए भी करना था। :) – Dave

3
using System; 
using Com.Foo; 
using System.Collections.Generic; 
using System.Text; 
using log4net.Config; 
using log4net; 
using log4net.Appender; 
using log4net.Layout; 
using log4net.Repository.Hierarchy; 


public class MyApp 
{ 


    public static void SetLevel(string loggerName, string levelName) 
    { 
     ILog log = LogManager.GetLogger(loggerName); 
     Logger l = (Logger)log.Logger; 

     l.Level = l.Hierarchy.LevelMap[levelName]; 
    } 

    // Add an appender to a logger 
    public static void AddAppender(string loggerName, IAppender appender) 
    { 
     ILog log = LogManager.GetLogger(loggerName); 
     Logger l = (Logger)log.Logger; 

     l.AddAppender(appender); 
    } 
    // Add an appender to a logger 
    public static void AddAppender2(ILog log, IAppender appender) 
    { 
     // ILog log = LogManager.GetLogger(loggerName); 
     Logger l = (Logger)log.Logger; 

     l.AddAppender(appender); 
    } 

    // Create a new file appender 
    public static IAppender CreateFileAppender(string name, string fileName) 
    { 
     FileAppender appender = new 
      FileAppender(); 
     appender.Name = name; 
     appender.File = fileName; 
     appender.AppendToFile = true; 

     PatternLayout layout = new PatternLayout(); 
     layout.ConversionPattern = "%d [%t] %-5p %c [%logger] - %m%n"; 
     layout.ActivateOptions(); 

     appender.Layout = layout; 
     appender.ActivateOptions(); 

     return appender; 
    } 

    private static readonly ILog log = LogManager.GetLogger(typeof(MyApp)); 
    static void Main(string[] args) 
    { 
     BasicConfigurator.Configure(); 
     SetLevel("Log4net.MainForm", "ALL"); 
     AddAppender2(log, CreateFileAppender("appenderName", "fileName.log")); 
     log.Info("Entering application."); 
     Console.WriteLine("starting........."); 
     log.Info("Entering application."); 
     Bar bar = new Bar(); 
     bar.DoIt(); 
     Console.WriteLine("starting........."); 
     log.Error("Exiting application."); 
     Console.WriteLine("starting........."); 
    } 
} 


namespace Com.Foo 
{ 
    public class Bar 
    { 
     private static readonly ILog log = LogManager.GetLogger(typeof(Bar)); 

     public void DoIt() 
     { 
      log.Debug("Did it again!"); 
     } 
    } 
} 
+0

यह ठीक काम कर रहा है, क्योंकि इस कम से कम log4jNet dll संस्करण 2.0 की आवश्यकता है। –

1

मैं आशा है कि इस मदद करता है, यह एक साधारण सांत्वना लकड़हारा कॉन्फ़िगर करता है।

static void Main(string[] args) 
{ 
    const string logLayoutPattern = 
     "[%date %timestamp][%level] %message %newline" + 
     "Domain: %appdomain, User: %username %identity %newline" + 
     "%stacktracedetail{10} %newline" + 
     "%exception %newline"; 

    var wrapperLogger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
    var logger = (Logger) wrapperLogger.Logger; 
    logger.Hierarchy.Root.Level = Level.All; 

    var consoleAppender = new ConsoleAppender 
    { 
     Name = "ConsoleAppender", 
     Layout = new PatternLayout(logLayoutPattern) 
    }; 

    logger.Hierarchy.Root.AddAppender(consoleAppender); 
    logger.Hierarchy.Configured = true; 

    wrapperLogger.Debug("Hello"); 
    Console.ReadKey(); 
} 
संबंधित मुद्दे