[英]Create a strongly typed log4net level from a string
我注意到log4net有一个强类型的Level class 。 有谁知道是否有办法通过解析日志级别字符串来创建级别 object?
例如:
我想将错误级别字符串“ERROR”解析为等效的 log4net.Core.Level.Error object,对于其他日志记录级别也是如此。
我编写了自己的(天真的)方法来做到这一点(见下文),但我希望 log4net 内部有一些东西可以为我做这件事。
谢谢!
public static Level ParseLevel(string level)
{
switch (level.ToUpperInvariant())
{
case "ALERT":
return log4net.Core.Level.Alert;
case "ALL":
return log4net.Core.Level.All;
case "CRITICAL":
return log4net.Core.Level.Critical;
case "DEBUG":
return log4net.Core.Level.Debug;
case "EMERGENCY":
return log4net.Core.Level.Emergency;
case "ERROR":
return log4net.Core.Level.Error;
case "FATAL":
return log4net.Core.Level.Fatal;
case "FINE":
return log4net.Core.Level.Fine;
case "FINER":
return log4net.Core.Level.Finer;
case "FINEST":
return log4net.Core.Level.Finest;
case "INFO":
return log4net.Core.Level.Info;
case "NOTICE":
return log4net.Core.Level.Notice;
case "OFF":
return log4net.Core.Level.Off;
case "SEVERE":
return log4net.Core.Level.Severe;
case "TRACE":
return log4net.Core.Level.Trace;
case "VERBOSE":
return log4net.Core.Level.Verbose;
case "WARN":
return log4net.Core.Level.Warn;
default:
throw new Exception("Invalid logging level specified");
}
}
编辑:根据 Wily 博士的学徒建议,这是我最终使用LevelMap 得出的结论:
using System;
using System.Linq;
public static Level ParseLevel(string level)
{
var loggerRepository = LoggerManager.GetAllRepositories().FirstOrDefault();
if (loggerRepository == null)
{
throw new Exception("No logging repositories defined");
}
var stronglyTypedLevel = loggerRepository.LevelMap[level];
if (stronglyTypedLevel == null)
{
throw new Exception("Invalid logging level specified");
}
return stronglyTypedLevel;
}
看起来这就是LevelMap
class 的目的。
编辑:您可以从LevelMap
的 LevelMap 属性中ILoggerRepository
,如果您有权访问的话。
您可以使用反射来获取日志级别列表,并使用此列表来填充 LevelMap。
using System.Reflection;
using log4net.Core;
namespace MyUtils
{
/// <summary>
/// for getting the log level that belongs to a string
/// </summary>
public static class LogLevelMap
{
static LevelMap levelMap = new LevelMap();
static LogLevelMap()
{
foreach (FieldInfo fieldInfo in typeof(Level).GetFields(BindingFlags.Public | BindingFlags.Static))
{
if (fieldInfo.FieldType == typeof(Level))
{
levelMap.Add((Level)fieldInfo.GetValue(null));
}
}
}
public static Level GetLogLevel(string logLevel)
{
if (string.IsNullOrWhiteSpace(logLevel))
{
return null;
}
else
{
return levelMap[logLevel];
}
}
}
}
好吧,只要每个级别在级别 class 中定义为:
public static readonly Level Warn;
我没有看到处理它的好方法(您可以使用反射来枚举属性,但我认为这不值得)。 我看到的对代码的唯一改进,而不是硬编码的字符串值,而是使用 Level.Name 中的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.