web-dev-qa-db-fra.com

Log4Net: spécifier par programme plusieurs enregistreurs (avec plusieurs appender de fichiers) 

Comment (par programmation, sans configuration xml) configurer plusieurs enregistreurs avec Log4Net? J'en ai besoin pour écrire dans différents fichiers.

33
Jox

Ce fil sur le tableau de bord log4net détaille une approche .

Pour résumer un peu, j'espère sans extraire trop de code:

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
43
Blair Conrad
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!");
        }
    }
}
3
Narottam Goyal

J'espère que cela aide, il configure un simple enregistreur de console.

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();
}
1
G.Y

J'ai mélangé le code de la réponse de Blair Conrad et le code de Philipp M sur ce post:

stackoverflow.com/questions/16336917/can-you-configure-log4net-in-code-instead-of-using-a-config-file

J'ai compilé le résultat dans une dll que je référence dans mes projets et que j'appelle comme ceci, généralement sur la première ligne du programme principal:

public static Log = new Log4NetWrapper.LogWrapper().Setup(@"c:\myLog.log", "TestLog");

Voici le code dans la DLL:

public class LogWrapper
    {
        public ILog Setup(string logFilePath, string logName, string maxFileSize = "10MB")
        {
            var patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
            patternLayout.ActivateOptions();

            var roller = new RollingFileAppender();
            roller.AppendToFile = true;
            roller.File = logFilePath;
            roller.Layout = patternLayout;
            roller.MaxSizeRollBackups = 5;
            roller.MaximumFileSize = maxFileSize;
            roller.RollingStyle = RollingFileAppender.RollingMode.Size;
            roller.StaticLogFileName = true;
            roller.ActivateOptions();
            //hierarchy.Root.AddAppender(roller);

            var memory = new MemoryAppender();
            memory.ActivateOptions();

            ILog log = LogManager.GetLogger(logName);
            var l = (Logger)log.Logger;
            l.AddAppender(roller);
            l.AddAppender(memory);

            l.Level = l.Hierarchy.LevelMap["Debug"];
            l.Repository.Configured = true;
            return log;
        }
    }

On pourrait bien sûr ajouter des paramètres au constructeur ou en créer de nouveaux.

0
pasx