asp - log4net c# ejemplo
Cómo usar log4net en el núcleo 2.0 de Asp.net (5)
Configuro log4net
en mi aplicación asp.net core 2.0 como se menciona en este artículo LINK
program.cs
public static void Main(string[] args)
{
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
BuildWebHost(args).Run();
}
HomeController
public class HomeController : Controller
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(HomeController));
public IActionResult Error()
{
log.Info("Hello logging world!");
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
log4net.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="RollingFile" />
</root>
<appender name="RollingFile" type="log4net.Appender.FileAppender">
<file value="C:/Temp/app.log" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p %d{hh:mm:ss} %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
¡Mala suerte! No vi ningún archivo generado en el directorio C C:/Temp/app.log
. ¿Cuál sería el error? ¿Cómo configurar log4net
para asp.net core 2.0?
¡Perdón por el retraso!
En mi escenario, se trata de .config
esquema .config
. por encima de uno fue creado con .config
extendido simplemente por lo que me preocupa. Si hubiera creado el archivo de configuración a través del esquema, el código funciona perfectamente.
Con éxito puedo registrar un archivo usando el siguiente código
public static void Main(string[] args)
{
XmlDocument log4netConfig = new XmlDocument();
log4netConfig.Load(File.OpenRead("log4net.config"));
var repo = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(),
typeof(log4net.Repository.Hierarchy.Hierarchy));
log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);
BuildWebHost(args).Run();
}
log4net.config en la raíz del sitio web
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="C:/Temp/" />
<datePattern value="yyyy-MM-dd.''txt''"/>
<staticLogFileName value="false"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<maxSizeRollBackups value="100"/>
<maximumFileSize value="15MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level App %newline %message %newline %newline"/>
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
Necesita instalar el paquete de Microsoft.Extensions.Logging.Log4Net.AspNetCore NuGet y agregar un archivo log4net.config a su aplicación. Entonces esto debería funcionar:
public class Program
{
private readonly ILogger<Program> logger;
public Program()
{
var services = new ServiceCollection()
.AddLogging(logBuilder => logBuilder.SetMinimumLevel(LogLevel.Debug))
.BuildServiceProvider();
logger = services.GetService<ILoggerFactory>()
.AddLog4Net()
.CreateLogger<Program>();
}
static void Main(string[] args)
{
Program program = new Program();
program.Run();
Console.WriteLine("/n/nPress any key to continue...");
Console.ReadKey();
}
private void Run()
{
logger.LogInformation("Logging is working");
}
}
Siguiendo la respuesta de Irfan, tengo la siguiente configuración XML en OSX con .NET Core 2.1.300 que registra y agrega correctamente a una carpeta ./log
y también a la consola. Tenga en cuenta que log4net.config
debe existir en la raíz de la solución (mientras que en mi caso, la raíz de mi aplicación es una subcarpeta).
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="logs/" />
<datePattern value="yyyy-MM-dd.''txt''"/>
<staticLogFileName value="false"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<maxSizeRollBackups value="100"/>
<maximumFileSize value="15MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level App %newline %message %newline %newline"/>
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="RollingLogFileAppender"/>
<appender-ref ref="ConsoleAppender"/>
</root>
</log4net>
Otra nota, la forma tradicional de configurar el XML dentro de app.config
no funcionó:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net> ...
Por alguna razón, no se encontró el nodo log4net al acceder al documento XML a través de log4netConfig["log4net"]
.
Tenga en cuenta que ya existe un adaptador log4net para la interfaz de registro Core de ASP.NET.
Lo único que debe hacer es pasar el ILoggerFactory
a su clase de Startup
, luego llamar
loggerFactory.AddLog4Net();
y tener una configuración en su lugar. Así que no tienes que escribir ningún código de enchapado de la caldera.
https://github.com/huorswords/Microsoft.Extensions.Logging.Log4Net.AspNetCore