Log4Net: программно указать несколько регистраторов (с несколькими файловыми дополнениями) - PullRequest
33 голосов
/ 21 ноября 2008

Как (программно, без xml config) настроить несколько регистраторов с Log4Net? Мне нужно, чтобы они записывали в разные файлы.

Ответы [ 4 ]

43 голосов
/ 21 ноября 2008

В этой теме на панели инструментов log4net подробно описан подход .

Подводя итог, надеюсь, не отрывая слишком много кода:

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
3 голосов
/ 18 июня 2012
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!");
        }
    }
}
1 голос
/ 07 августа 2017

Надеюсь, это поможет, он настраивает простой консольный регистратор.

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();
}
0 голосов
/ 04 сентября 2018

Я смешал код из ответа Блэр Конрад и код от Филиппа М на этом посте:

stackoverflow.com / вопросы / 16336917 / может вы-Configure-log4net-в-кода-вместо-о-с помощью A-конфиг-файл

Я скомпилировал результат в dll, на которую я ссылаюсь в своих проектах и ​​называю так, обычно в первой строке основной программы:

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

Вот код в 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;
        }
    }

Можно, конечно, добавить необходимые параметры в конструктор или создать переопределения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...