Cysharp / ZLogger

Zero Allocation Text/Structured Logger for .NET with StringInterpolation and Source Generator, built on top of a Microsoft.Extensions.Logging.
MIT License
1.16k stars 81 forks source link

InvalidOperationException when DOTNET_ENVIRONMENT is "Development" #7

Closed brian-imaginelearning closed 4 years ago

brian-imaginelearning commented 4 years ago

When DOTNET_ENVIRONMENT is set to "Development", an exception is thrown during configuration:

System.InvalidOperationException: Cannot resolve scoped service 'Microsoft.Extensions.Options.IOptionsSnapshot`1[ZLogger.ZLoggerOptions]' from root provider.

Simple app to reproduce: (using netcoreapp3.1 and ZLogger v1.1.11)

    class Program : ConsoleAppBase
    {
        readonly ILogger<Program> _log;

        public Program(ILogger<Program> logger)
        {
            _log = logger;
        }

        public static Task Main(string[] args)
        {
            // THIS DOESN'T WORK
            Environment.SetEnvironmentVariable("DOTNET_ENVIRONMENT", "Development");

            // THIS WORKS
            //Environment.SetEnvironmentVariable("DOTNET_ENVIRONMENT", "Test");  

            return Host.CreateDefaultBuilder(args)
                .ConfigureLogging((context, logging) =>
                {
                    logging.ClearProviders();
                    logging.AddZLoggerConsole();
                })
                .RunConsoleAppFrameworkAsync<Program>(args);
        }

        public void Run()
        {
            _log.LogInformation("started");
        }
    }
neuecc commented 4 years ago

Thanks, this is related to using IOptionsSnapshot<T> in ZLoggerProvider's constructor. In development mode, defaultbuilder validate scope but currently ZLogger does not use scope. https://github.com/dotnet/runtime/blob/d09c058e4b7a23f00f033f35ae60bc06f71f2bcf/src/libraries/Microsoft.Extensions.Hosting/src/Host.cs#L121-L123

I've changed to use IOptionsMonitor<T>, it works fine, so now released 1.2.0, please try it.

brian-imaginelearning commented 4 years ago

Works great. Thanks!