2008-11-21 11 views

Antwort

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

Ich habe diesen Ansatz für eine meiner Assemblys verwendet, anstatt den XML-Konfigurationsansatz zu verwenden. Während die Datei generiert wird, schreiben die ILog-Protokollierungsmethoden aus irgendwelchen Gründen nichts in die Dateien. Gibt es eine Methode, um den neuen Appender wirksam werden zu lassen? Ich habe so etwas noch nicht gefunden ... – Dave

+7

@Dave: Ich hatte das gleiche Problem und löste es, indem ich 'l.Repository.Configured = true;' an 'AddAppender' anfügte. – Stephan

+0

@Stephan danke, ich glaube, genau das musste ich tun, damit es auch funktioniert. :) – 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

dieser funktioniert gut, für diese atleast log4jNet dll version2.0 ist erforderlich. –

1

Ich hoffe, das hilft, es konfiguriert eine einfache Konsolenlogger:

Um ein wenig, hoffentlich ohne zu viel Code Abreißen zusammenfassen.

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(); 
} 
Verwandte Themen