How do I write logs from within Startup.cs?

前端 未结 10 1384
伪装坚强ぢ
伪装坚强ぢ 2020-12-01 04:16

In order to debug a .NET Core app which is failing on startup, I would like to write logs from within the startup.cs file. I have logging setup within the file that can be u

10条回答
  •  爱一瞬间的悲伤
    2020-12-01 04:28

    I use a solution avoiding 3rd party loggers implementing a "logger buffer" with ILogger interface.

    public class LoggerBuffered : ILogger
    {
        class Entry
        {
            public LogLevel _logLevel;
            public EventId  _eventId;
            public string   _message;
        }
        LogLevel            _minLogLevel;
        List         _buffer;
        public LoggerBuffered(LogLevel minLogLevel)
        {
            _minLogLevel = minLogLevel;
            _buffer = new List();
        }
        public IDisposable BeginScope(TState state)
        {
            return null;
        }
    
        public bool IsEnabled(LogLevel logLevel)
        {
            return logLevel >= _minLogLevel;
        }
    
        public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter)
        {
            if (IsEnabled(logLevel)) {
                var str = formatter(state, exception);
                _buffer.Add(new Entry { _logLevel = logLevel, _eventId = eventId, _message = str });
            }
        }
        public void CopyToLogger (ILogger logger)
        {
            foreach (var entry in _buffer)
            {
                logger.Log(entry._logLevel, entry._eventId, entry._message);
            }
            _buffer.Clear();
        }
    }
    

    Usage in startup.cs is easy, of course you get log output after call of Configure. But better than nothing. :

    public class Startup
    {
    ILogger         _logger;
    
    public Startup(IConfiguration configuration, IWebHostEnvironment env)
    {
        _logger = new LoggerBuffered(LogLevel.Debug);
        _logger.LogInformation($"Create Startup {env.ApplicationName} - {env.EnvironmentName}");
    
    }
    
    public void ConfigureServices(IServiceCollection services)
    {
        _logger.LogInformation("ConfigureServices");
        services.AddControllersWithViews();
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger logger)
    {
        (_logger as LoggerBuffered).CopyToLogger(logger);
        _logger = logger;   // Replace buffered by "real" logger
        _logger.LogInformation("Configure");
    
        if (env.IsDevelopment())
    

提交回复
热议问题