.Net Core 3.1
Infelizmente, para ASP.NET Core 3.0, a situação é um pouco diferente. Os modelos padrão usam o HostBuilder
(em vez do WebHostBuilder
), que configura um novo host genérico que pode hospedar vários aplicativos diferentes, não se limitando a aplicativos da web. Parte desse novo host também é a remoção do segundo contêiner de injeção de dependência que existia anteriormente para o host da web. Em última análise, isso significa que você não poderá injetar quaisquer dependências além do IConfiguration
na Startup
classe. Portanto, você não poderá registrar durante o ConfigureServices
método. Você pode, no entanto, injetar o logger no Configure
método e registrar lá:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILogger<Startup> logger)
{
logger.LogInformation("Configure called");
// …
}
Se você realmente precisa fazer login ConfigureServices
, pode continuar a usar o WebHostBuilder
que criará o legado WebHost
que pode injetar o logger na Startup
classe. Observe que é provável que o host da web seja removido em algum momento no futuro. Portanto, você deve tentar encontrar uma solução que funcione para você, sem ter que fazer login ConfigureServices
.
.NET Core 2.x
Isso mudou significativamente com o lançamento do ASP.NET Core 2.0. No ASP.NET Core 2.x, o log é criado no construtor de host. Isso significa que o registro está disponível por meio de DI por padrão e pode ser injetado na Startup
classe:
public class Startup
{
private readonly ILogger<Startup> _logger;
public IConfiguration Configuration { get; }
public Startup(ILogger<Startup> 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");
// …
}
}
ConfigureServices
o logger é executado, o logger ainda não existe. Portanto, você não poderá registrar nesse ponto simplesmente porque ainda não há um registrador. No lado positivo, isso ainda dá a você a capacidade de configurar o logger dentro do,ConfigureServices
já que é o mesmo contêiner de DI (o que é realmente uma coisa boa). - Se você absolutamente precisa registrar coisas, pode, por exemplo, coletar as informações separadamente (por exemplo, em uma lista) e, em seguida, desconectar assim que o registrador estiver disponível..NET 3.1
momento, você PODE registrar-se noConfigureServices
método sem recorrer aoWebHostBuilder
. Use a resposta abaixo: stackoverflow.com/a/61488490/2877982Startup.cs
(então recebo erros do compilador ao esquecer uma dependência) em vez de apenas registrar dependências personalizadas. Portanto, preciso resolver esses loggers. Mas isso pode ser um pouco hackeado, sim.Opção 1: usar diretamente o log (por exemplo, Serilog) na inicialização-
Resultado:
Para configurar o Serilog no aplicativo asp.net-core, verifique o pacote Serilog.AspNetCore no GitHub .
Opção 2: configurar o login em program.cs como este-
LoggerFactory do usuário na inicialização assim-
Detalhes completos disponíveis neste link
fonte
Eu uso uma solução para evitar que loggers de terceiros implementem um "logger buffer" com interface ILogger .
O uso no startup.cs é fácil, é claro que você obtém a saída do log após chamar Configure. Mas melhor do que nada. :
fonte
Para .NET Core 3.0, a documentação oficial diz o seguinte: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.0#create-logs-in-startup
Mas, como dizem nos documentos, você pode configurar um serviço que depende do ILogger, então se você escreveu uma classe StartupLogger:
Em seguida, em Startup.ConfigureServices adicione o serviço, então você precisa construir o provedor de serviços para obter acesso ao contêiner DI:
Editar: isso produz um aviso do compilador, para depurar sua classe StartUp, isso deve estar OK, mas não para produção:
fonte
De acordo com o .net core 3.1 , você pode criar um logger diretamente usando LogFactory.
fonte
A solução oficial atualmente é configurar uma LoggerFactory local como esta:
Veja também: https://github.com/dotnet/aspnetcore/issues/9337#issuecomment-539859667
fonte
Código principal:
CreateDefaultBuilder configura um registrador de console padrão.
Código de inicialização:
Não consegui fazer a injeção de um ILogger funcionar, mas talvez seja porque não é um controlador. Mais informações bem-vindos!
Refs:
fonte
Nenhuma das respostas acima funcionou para mim. Estou usando o NLog e até mesmo construindo um novo ServiceCollection, chamando .CreateBuilder () em qualquer coleção de serviço, criando um serviço de registro ... nada disso gravaria em um arquivo de registro durante ConfigureServices.
O problema é que o log não é realmente uma coisa até depois que o ServiceCollection é construído, e não é construído durante ConfigureServices.
Basicamente, eu só quero (preciso) registrar o que está acontecendo durante a inicialização em um método de extensão de configuração, porque a única camada na qual estou tendo problemas é o PROD, onde não consigo anexar um depurador.
A solução que funcionou para mim foi usar o antigo método .NET Framework NLog:
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
adicionado esse direito à classe do método de extensão e consegui gravar em um log ("o" log) durante ConfigureServices e depois.Não tenho ideia se essa é uma boa ideia realmente lançar no código de produção (não sei se o ILogger controlado por .NET e este NLog.ILogger entrarão em conflito em algum ponto), mas eu só precisava disso para ver o que estava acontecendo em.
fonte
Consegui fazer isso criando estaticamente um logger com Nlog no arquivo e, em seguida, usá-lo nos métodos de inicialização.
fonte
System.IO.File.Write()
métodos.Basta usar a linha abaixo para fazer login no Startup.cs
fonte