如何从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"); .... }
输出:
要在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,但也许这是因为它不是控制器。 更多信息欢迎!
参考文献:
- 持久保存到Azure表存储时使用POCO
- 尝试激活’AuthController’时无法解析类型’Microsoft.AspNetCore.Identity.UserManager`的服务
- 如何强制Visual Studio使用特定版本的DNX
- Aspnet核心十进制绑定不适用于非英语文化
- .NET Core IServiceScopeFactory.CreateScope()vs IServiceProvider.CreateScope()扩展
- Asp.Net 5缺少Linq到Sql类
- 处理ASP.NET Core 1.0上的大型文件上传
- ASP.Net核心MVC中的本地化无法正常工作 – 无法找到资源文件
- Quartz.Netdependency injection.Net核心