c# - visual - ¿Está roto el registro de.NET Core 2.0?
asp.net core visual studio 2015 (4)
La forma en que se configura el registro ha cambiado un poco ... La forma recomendada (y está bastante bien documentada en este problema / anuncio de GitHub para hacerlo ahora es configurar los registradores en el método AddLogging
, como
services.AddLogging(builder =>
{
builder.AddConfiguration(Configuration.GetSection("Logging"))
.AddConsole()
.AddDebug();
});
Y tiene un appsettings.json
como
{
"ApplicationInsights": {
"InstrumentationKey": ""
},
"Logging": {
"IncludeScopes": false,
"Console": {
"LogLevel": {
"Default": "Warning",
"System": "Information",
"Microsoft": "Information"
}
}
}
}
Tenga en cuenta que la estructura de appsettings.json cambió con respecto a lo que solía ser en .NET Core 1.xy que la entrada de Logging
en appsettings.json
ahora tiene nombres de proveedores de registradores, lo que le permite configurar los niveles de registro por registro. proveedor.
Anteriormente, la entrada en appsettings.json
solo sería aplicable al registrador de la consola.
Alternativamente, el registro ahora se puede mover dentro de WebHostBuilder
en WebHostBuilder
lugar.
public static void Main()
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddJsonFile("hosting.json", optional: false)
.AddEnvironmentVariables();
})
.ConfigureLogging((webhostContext, builder) => {
builder.AddConfiguration(webhostContext.Configuration.GetSection("Logging"))
.AddConsole()
.AddDebug();
})
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run();
}
Actualizar
En caso de que uno no quiera usar appsettings.json
, también puede registrar los filtros en el código.
services.AddLogging(builder =>
{
builder.AddConfiguration(Configuration.GetSection("Logging"))
// filter for all providers
.AddFilter("System", LogLevel.Debug)
// Only for Debug logger, using the provider type or it''s alias
.AddFilter("Debug", "System", LogLevel.Information)
// Only for Console logger by provider type
.AddFilter<DebugLoggerProvider>("System", LogLevel.Error)
.AddConsole()
.AddDebug();
});
Parece que no puedo obtener información de registro de nivel de seguimiento después de actualizar a .NET Core 2.0 (+ ASP.NET Core 2.0).
De hecho, si hago un dotnet new web
proyecto dotnet new web
y agrego el siguiente código en Inicio para Configurar, no recibo ningún mensaje de seguimiento o registro de depuración, pero recibo los mensajes de Información y Error dos veces. Al comentar la llamada .AddConsole()
emitirán estos (Información y Error) solo una vez, lo que sugiere que se configure automáticamente con un proveedor de consola de forma predeterminada. Tenga en cuenta que esta es una experiencia de proyecto "Archivo -> Nuevo", no hay nada configurado en Program.cs
para el registro o la configuración para esto, excepto por lo que he agregado. ¿Alguien ha visto cosas? O debería registrar un problema de GitHub para ello.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Microsoft.Extensions.Logging.LogLevel.Trace);
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Run(async (context) =>
{
var logger = loggerFactory.CreateLogger("Blah");
logger.LogTrace("Hello world : Trace");
logger.LogDebug("Hello world : Debug");
logger.LogInformation("Hello world : Information");
logger.LogError("Hello world : Error");
await context.Response.WriteAsync("Hello World!");
});
}
La siguiente estructura de appsettings.json
parece funcionar bien:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"System": "Information",
"Microsoft": "Information"
},
"Console":
{
"IncludeScopes": true
}
}
}
Tomado de https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1
Además, vea cuáles son sus llamadas iniciales, encuentro los siguientes trabajos para mí:
public class Startup
{
public Startup(IHostingEnvironment env)
{
var logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Sink(jsonSink)
.Enrich.WithExceptionDetails()
.CreateLogger();
Log.Logger = logger;
}
}
Nada de lo anterior funciona para mí. La única solución fue escribir un método.
private void ConfigLogging( ILoggingBuilder builder ) {
builder.SetMinimumLevel( LogLevel.Trace );
//... additional configuration...
}
y cuando use el método de extensión AddLogging, escríbalo como
services.AddLogging( ConfigLogging );
Pasé casi veinte minutos para darme cuenta de que desde Configuration.GetSection("Logging")
en el archivo Startup.cs se lee la sección "Logging"
de la configuración en el archivo appsettings.json , que se configuró como "Error"
. Cambiarlo a "Information"
o algo más bajo, solucionó el problema.
Aquí está el aspecto del archivo appsettinsg.json ahora:
{
"Logging": {
"IncludeScopes": true,
"Debug": {
"LogLevel": {
"Default": "Information"
}
},
"Console": {
"LogLevel": {
"Default": "Information"
}
}
}
}
Para obtener más información sobre los niveles de registro (como en "Information"
), consulte this enlace, que también brinda información general sobre el registro de ASP.NET Core.
Solo publico aquí, en caso de que te encuentres con algún problema para que el registro funcione, asegúrate de haber revisado ese archivo JSON.