简体   繁体   English

以编程方式更改 .NET 最小日志级别

[英]Changing .NET Minimum Log Level programmatically

Using Microsoft.Extensions.Logging, let be the log initialization (F#):使用 Microsoft.Extensions.Logging,让日志初始化 (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)

A little dirty, but it works ( Mono.Reflection used for GetBackingField)有点脏,但它可以工作( Mono.Reflection用于 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)
    )

For anyone else needing this solution, but in C# , this is @Franco Tiveron's solution translated:对于其他需要此解决方案的人,但在C#中,这是@Franco Tiveron 的解决方案翻译:

void changeMinimumLevel(ILogger logger, LogLevel level)
        {
            var _logger = logger
                    .GetType()
                    .GetField("_logger", BindingFlags.NonPublic | BindingFlags.Instance)
                    .GetValue(logger);
            var loggersArray =
                (Array)_logger
                    .GetType()
                    .GetProperty("MessageLoggers")
                    .GetValue(_logger);


            var enu = loggersArray.GetEnumerator();
            var i = 0;
            while (enu.MoveNext())
            {
                var x = enu.Current;
                var piMinLevel = x.GetType().GetProperty("MinLevel");
                var fiMinLevel = piMinLevel.GetBackingField();
                fiMinLevel.SetValue(x, level);
                loggersArray.SetValue(x, i);
                i++;
            }
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM