c# - studio - Habilite el registro de archivos para log4net desde el código en lugar de desde la configuración
log4net threshold (3)
¿Por qué en el mundo falla la siguiente prueba? (está en xunit) Lo he probado con diferentes agregadores y nunca escribe nada, aunque el registro parece estar listo para escribir. Eventualmente creé mi propio appender solo para probarlo.
public class TestAppender : AppenderSkeleton {
public event Action<LoggingEvent> AppendCalled = delegate { };
protected override void Append(LoggingEvent loggingEvent) {
AppendCalled(loggingEvent);
}
}
public class Class1 {
private TestAppender _appender = new TestAppender();
public Class1() {
log4net.Util.LogLog.InternalDebugging = true;
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
Logger rootLogger = hierarchy.Root;
rootLogger.Level = Level.All;
Logger coreLogger = hierarchy.GetLogger("abc") as Logger;
coreLogger.Level = Level.All;
coreLogger.Parent = rootLogger;
PatternLayout patternLayout = new PatternLayout();
patternLayout.ConversionPattern = "%logger - %message %newline";
patternLayout.ActivateOptions();
_appender.Layout = patternLayout;
_appender.ActivateOptions();
coreLogger.AddAppender(_appender);
}
[Fact]
public void Test() {
bool called = false;
_appender.AppendCalled += e => called = true;
var log = LogManager.GetLogger("abc");
log.Debug("This is a debugging message");
Thread.Sleep(TimeSpan.FromSeconds(2));
log.Info("This is an info message");
Thread.Sleep(TimeSpan.FromSeconds(2));
log.Warn("This is a warning message");
Thread.Sleep(TimeSpan.FromSeconds(2));
log.Error("This is an error message");
Assert.True(called);
}
}
Aún no puedo decir por qué el código anterior no funciona, pero tengo log4net para configurarlo correctamente y usar mi appender reemplazando todo el código de configuración con:
log4net.Config.BasicConfigurator.Configure(_appender);
Desde here
Sólo tirando una conjetura por ahí ...
¿Tiene la configuración Xml definida en su ensamblaje?
¿Lo olvidaste en tu proyecto de prueba?
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
Eso usualmente me quema de vez en cuando.
Siempre uso el siguiente código para configurar log4net desde el código. ¡Funciona genial!
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders(); /*Remove any other appenders*/
FileAppender fileAppender = new FileAppender();
fileAppender.AppendToFile = true;
fileAppender.LockingModel = new FileAppender.MinimalLock();
fileAppender.File = Server.MapPath("/") + "log.txt";
PatternLayout pl = new PatternLayout();
pl.ConversionPattern = "%d [%2%t] %-5p [%-10c] %m%n%n";
pl.ActivateOptions();
fileAppender.Layout = pl;
fileAppender.ActivateOptions();
log4net.Config.BasicConfigurator.Configure(fileAppender);
//Test logger
ILog log =LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log.Debug("Testing!");