Wie (programmgesteuert, ohne XML-Konfiguration) mehrere Logger mit Log4Net konfigurieren? Ich brauche sie in verschiedene Dateien zu schreiben.Log4Net: Programmgesteuert mehrere Logger angeben (mit mehreren Dateiapplikatoren)
31
A
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
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
- 1. Log4Net Mehrere Logger
- 2. Log4Net: Mehrere Logger
- 3. Log4net mehrere Logger - File Logger funktioniert nicht
- 4. Log4net: Logger Instanziierung
- 5. log4net-Strategie für named Logger?
- 6. log4net - Konfiguration mit mehreren Konfigurationsdateien
- 7. Logger programmgesteuert mit Log4J 2 konfigurieren?
- 8. Log4net auf IIS7,5 oder anderen Logger?
- 9. Was ist der Root-Logger in log4net
- 10. Ändern log4net Logging-Ebene programmgesteuert
- 11. Wie häufig Anwendungsdatenordner für log4net angeben?
- 12. Verwenden von log4net in einer Lösung mit mehreren Projekten
- 13. log4net mehrere adonetappender
- 14. Python protokolliert mehrere Dateien mit demselben Logger
- 15. Können Sie auf Logger-Ebene in log4net filtern
- 16. .Net Logger (Schreiben Sie Ihre eigenen vs log4net/Enterprise Logger/Nlog usw.)
- 17. log4net: Logger dynamisch erstellen, sollte ich mich um irgendetwas kümmern?
- 18. log4net: Wie wird der Logger-Dateiname dynamisch gesetzt?
- 19. Wie umleiten npgsql Log-Ausgabe zu einem log4net Logger?
- 20. Unterschied zwischen Logger und Root-Ebene in log4Net?
- 21. Verwenden von log4net zum Schreiben in verschiedene Logger
- 22. C# Statisch Readonly log4net Logger, wie kann man den Logger im Unit Test ändern?
- 23. Schreiben in einen log4net FileAppender mit mehreren Thread-Leistungsproblemen
- 24. Protokollierung von InnerException mit Log4Net
- 25. PHP Regex mehrere Pfade angeben mit glob()
- 26. Log4net ForwardingAppender Schwelle
- 27. PostgreSQL: mehrere LINKE JOIN mit mehreren Bedingungen
- 28. Logback: Zwei Appender, mehrere Logger, verschiedene Ebenen
- 29. Log4Net dynamisch rekonfigurieren
- 30. Logback mehrere Logger nicht eben zu Ehren
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
@Dave: Ich hatte das gleiche Problem und löste es, indem ich 'l.Repository.Configured = true;' an 'AddAppender' anfügte. – Stephan
@Stephan danke, ich glaube, genau das musste ich tun, damit es auch funktioniert. :) – Dave