Changing .NET Minimum Log Level programmatically

Using Microsoft.Extensions.Logging, let be the log initialization (F#):

let myLogger = 
    LoggerFactory
        .Create(fun builder -> 
            builder
                .AddSimpleConsole()
                .SetMinimumLevel(myLevel) 
                |> ignore)
        .CreateLogger()

How do we change that minimum level later, on demand?

I am looking to something as simple as:

myLogger.ChangeMinimumLevelTo(newLevel)

Solution 1:

A little dirty, but it works (Mono.Reflection used for GetBackingField)

let changeMinimumLevel (logger: ILogger) (level: LogLevel) = 
    let logger = logger :?> Microsoft.Extensions.Logging.Logger<obj>
    let _logger = 
        logger
            .GetType()
            .GetField("_logger", BindingFlags.NonPublic ||| BindingFlags.Instance)
            .GetValue(logger)
    let loggersArray = 
        _logger
            .GetType()
            .GetProperty("MessageLoggers")
            .GetValue(_logger) :?> Array

    let loggers = seq { 
        let enu = loggersArray.GetEnumerator()
        while enu.MoveNext() do enu.Current 
    }

    loggers |> Seq.iteri (fun i info ->            
        let piMinLevel = info.GetType().GetProperty("MinLevel")
        let fiMinLevel = piMinLevel.GetBackingField()
        fiMinLevel.SetValue(info, Nullable(level))
        loggersArray.SetValue(info, i)
    )