我无法在应用程序中获得basiceLogTrace(...)
输出。这是一个责备:
使用Visual Studio 2017创建新的ASP.NET核心应用程序。
(可选)注释掉.UseApplicationInsights()
以便重新编程更清晰
将ValuesController.cs
中的代码替换为:
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace WebApplication1.Controllers
{
[Route("api/[controller]")]
public class ValuesController : Controller
{
private readonly ILogger<ValuesController> logger;
public ValuesController(ILogger<ValuesController> logger)
{
this.logger = logger;
}
[HttpGet]
public IEnumerable<string> Get()
{
logger.LogError("ERROR!");
logger.LogWarning("WARN!");
logger.LogInformation("INFO!");
logger.LogTrace("TRACE!");
return new string[] { "value1", "value2" };
}
}
}
将
appsettings.Development.json
改为:{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Trace",
"System": "Information",
"Microsoft": "Information"
}
}
}
运行并查看调试输出
这将导致:
实际产量:
预期的输出将是“trace!”信息也是
我也试过调整
appsettings.json
文件中的值,但也没有效果。奇怪的是,将两个文件中的值更改为
"Error"
也没有任何作用。底线/问题
我需要做什么才能使注入的
ILogger<ValuesController>
尊重日志设置,包括Trace
级别?脚注
以下是一些相关代码,这些代码将通过上述重新编程自动生成:
Startup.cs
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseMvc();
}
}
Program.cs
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run();
}
}
appsettings.json
默认值:{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
}
}
最佳答案
从2.0开始中断更改
正如曾在下面评论的,这个答案将从2.0开始过时,您可以在这里找到更多关于这个注释的信息:https://github.com/aspnet/Announcements/issues/238
问题出在哪里…
根据你的方法,我发现了一个问题:
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug(); // ⇦ you're not passing the LogLevel!
app.UseMvc();
}
这就是为什么对
Configure()
文件中的配置集所做的任何更改都不起作用的原因。未传递任何参数的
appsettings.json
的默认行为是添加为loglevel.information或更高版本启用的调试记录器。
如果要显式地将其设置为使用特定的最低日志级别,则可以直接将其传递给
.AddDebug()
方法。loggerFactory.AddDebug(LogLevel.Trace);
更多信息可以找到here。
将其绑定到配置。
方法1:从配置中获取值。
LogLevel foo = this.Configuration.GetSection("Logging:LogLevel")
.GetValue<LogLevel>("Default");
loggerFactory.AddDebug(foo);
方法2:使用loglevel的内置对象
(故意遗漏。很明显,这两种方法之间的关系是很亲密的。)
方法3:使用手册(使用配置活页夹)
幻想
AddDebug(ILoggerFactory, LogLevel)
var obj = new MyObject();
ConfigurationBinder.Bind(_configuration.GetSection("Logging:LogLevel"), obj);
它将映射到
public class MyObject
{
public LogLevel Default { get; set; }
public LogLevel System { get; set; }
public LogLevel Microsoft { get; set; }
}
所以你可以通过:
loggerFactory.AddDebug(obj.Default);
关于nodes和appsettings.json的特别说明
请注意,配置的分隔符使用
ConfigurationBinder
。示例:
:
将转到:"Logging": {
"IncludeScopes": false,
"LogLevel": { ⇦⇦⇦⇦⇦ Here
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
日志级枚举
仅供参考,以下是有效的
"Logging:LogLevel"
值:public enum LogLevel
{
Trace = 0,
Debug = 1,
Information = 2,
Warning = 3,
Error = 4,
Critical = 5,
None = 6,
}
资料来源:
https://docs.microsoft.com/en-us/aspnet/core/api/microsoft.extensions.logging.loglevel#Microsoft_Extensions_Logging_LogLevel