[英]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.