如何从Startup.cs中编写日志

为了调试在启动时失败的.net核心应用程序,我想从startup.cs文件中编写日志。 我在文件中有日志设置,可以在startup.cs文件之外的应用程序的其余部分中使用,但不知道如何从startup.cs文件本身写入日志。

随着ASP.NET Core 2.0的发布,这已经发生了重大变化。 在ASP.NET Core 2.0中,将在主机构建器中创建日志记录。 这意味着默认情况下可以通过DI获取日志记录,并且可以将其注入Startup类:

 public class Startup { private readonly ILogger _logger; public IConfiguration Configuration { get; } public Startup(ILogger logger, IConfiguration configuration) { _logger = logger; Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { _logger.LogInformation("ConfigureServices called"); // … } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { _logger.LogInformation("Configure called"); // … } } 

选项1:在启动时直接使用日志(例如Serilog) –

 public class Startup { public Startup(IHostingEnvironment env) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.RollingFile(Path.Combine(env.ContentRootPath, "Serilog-{Date}.txt")) .CreateLogger(); Log.Information("Inside Startup ctor"); .... } public void ConfigureServices(IServiceCollection services) { Log.Information("ConfigureServices"); .... } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { Log.Information("Configure"); .... } 

输出:

serilog

要在asp.net-core应用程序中设置Serilog,请查看GitHub上的Serilog.AspNetCore包 。


选项2:在program.cs中配置日志记录,如下所示:

 var host = new WebHostBuilder() .UseKestrel() .ConfigureServices(s => { s.AddSingleton(); }) .ConfigureLogging(f => f.AddConsole(LogLevel.Debug)) .UseStartup() .Build(); host.Run(); 

用户loggerFactory在启动时像这样 –

 public class Startup { ILogger _logger; IFormatter _formatter; public Startup(ILoggerFactory loggerFactory, IFormatter formatter) { _logger = loggerFactory.CreateLogger(); _formatter = formatter; } public void ConfigureServices(IServiceCollection services) { _logger.LogDebug($"Total Services Initially: {services.Count}"); // register services //services.AddSingleton(); } public void Configure(IApplicationBuilder app, IFormatter formatter) { // note: can request IFormatter here as well as via constructor _logger.LogDebug("Configure() started..."); app.Run(async (context) => await context.Response.WriteAsync(_formatter.Format("Hi!"))); _logger.LogDebug("Configure() complete."); } } 

此链接提供完整的详细信息

我已经设法通过在文件中静态创建带有Nlog的记录器来完成此操作,然后在启动方法中使用它。

 private readonly NLog.Logger _logger = new NLog.LogFactory().GetCurrentClassLogger(); 

主要代码:

 public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup() .Build(); } 

CreateDefaultBuilder设置默认控制台记录器。

…配置ILoggerFactory以登录控制台并调试输出

启动代码:

 using Microsoft.Extensions.Logging; ... public class Startup { private readonly ILogger _logger; public Startup(IConfiguration configuration, ILoggerFactory logFactory) { _logger = logFactory.CreateLogger(); Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { _logger.LogInformation("hello stackoverflow"); } 

我无法注入ILogger,但也许这是因为它不是控制器。 更多信息欢迎!

参考文献: