升级到.NET Core 2.0(+ ASP.NET Core 2.0)后,似乎无法获得跟踪级别日志信息。
实际上,如果我执行dotnet new web
项目并在Startup for Configure中添加以下代码,我不会收到任何跟踪或调试日志消息,但我收到两次信息和错误消息。注释掉.AddConsole()
调用将仅输出这些(信息和错误)一次 - 建议默认情况下使用控制台提供程序自动配置它。请注意,这是一个"文件 - >新"项目经验,Program.cs
中没有任何设置可用于记录或配置 - 除了我已经添加的内容。有谁见过的东西?或者我应该为它注册一个GitHub问题。
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!");
});
}
答案 0 :(得分:32)
配置日志记录的方式发生了一些变化...推荐的方法(现在this GitHub issue/announcement中已经很好地记录了这一点)是在AddLogging
方法上配置记录器,例如
services.AddLogging(builder =>
{
builder.AddConfiguration(Configuration.GetSection("Logging"))
.AddConsole()
.AddDebug();
});
并拥有appsettings.json
之类的
似乎有些人感到困惑,因为该示例仅演示了Console
提供程序的配置,而不是所有记录器的配置。
LogLevel
部分配置所有命名空间(Default
键)或特定命名空间(System
的日志记录级别,覆盖其命名空间以{{1开头的所有类日志记录的默认值}}
这适用于System.*
中T
中使用的类。这允许为此命名空间中的记录器设置高于或低于默认日志记录级别。
ILogger<T>
请注意,appsettings.json的结构与以前在.NET Core 1.x中的结构有所不同,而{
"ApplicationInsights": {
"InstrumentationKey": ""
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Information",
"System": "Warning",
"Microsoft": "Information"
},
"Console": {
"LogLevel": {
"Default": "Warning",
"System": "Information",
"Microsoft": "Information"
}
}
}
}
中的Logging
条目现在具有记录器提供程序名称,它允许您配置每个日志记录提供程序的日志记录级
以前,appsettings.json
中的条目仅适用于控制台记录器。
或者,现在可以在appsettings.json
内移动日志记录。
WebHostBuilder
如果一个人不想使用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();
}
,也可以在代码中注册过滤器。
appsettings.json
答案 1 :(得分:8)
我花了差不多二十分钟才意识到, Startup.cs 文件中的Configuration.GetSection("Logging")
从 appsettings.json <中的配置中读取"Logging"
部分/ em>文件,配置为"Error"
。将其更改为"Information"
或更低,修复了问题。
以下是 appsettinsg.json 文件的内容:
{
"Logging": {
"IncludeScopes": true,
"Debug": {
"LogLevel": {
"Default": "Information"
}
},
"Console": {
"LogLevel": {
"Default": "Information"
}
}
}
}
要了解有关日志记录级别的更多信息(例如在"Information"
中),请查看this链接,该链接还提供有关ASP.NET Core日志记录的一般信息。
我刚刚在这里发帖,以防您在使用日志记录工作时遇到任何问题,请确保您已经通过该JSON文件。
答案 2 :(得分:5)
以上任何内容对我都无效 唯一的解决方法是编写方法
private void ConfigLogging( ILoggingBuilder builder ) {
builder.SetMinimumLevel( LogLevel.Trace );
//... additional configuration...
}
使用AddLogging扩展方法时将其写为
services.AddLogging( ConfigLogging );
答案 3 :(得分:0)
appsettings.json
的以下结构似乎可以正常工作:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"System": "Information",
"Microsoft": "Information"
},
"Console":
{
"IncludeScopes": true
}
}
}
另外,看看您的启动电话是什么,我发现以下对我有用的东西
public class Startup
{
public Startup(IHostingEnvironment env)
{
var logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Sink(jsonSink)
.Enrich.WithExceptionDetails()
.CreateLogger();
Log.Logger = logger;
}
}