从字符串创建强类型 log4net 级别
我注意到 log4net 有一个强类型的 级别类。有谁知道是否有办法通过解析日志级别字符串来创建 Level 对象?
例如:
我想将错误级别字符串“ERROR”解析为等效的 log4net.Core.Level.Error 对象,对于其他日志记录级别也是如此。
我编写了自己的(天真的)方法来执行此操作(见下文),但我希望 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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
看起来这就是 LevelMap 类的目的。
https://logging.apache.org /log4net/log4net-1.2.11/release/sdk/log4net.Core.LevelMap.html
编辑:您可以从 LevelMap。 apache.org/log4net/log4net-1.2.11/release/sdk/log4net.Repository.ILoggerRepository.LevelMap.html" rel="noreferrer">
ILoggerRepository
的 LevelMap 属性,如果您有权访问其中之一。It looks like that is the purpose of the
LevelMap
class.https://logging.apache.org/log4net/log4net-1.2.11/release/sdk/log4net.Core.LevelMap.html
EDIT: You can get a
LevelMap
from the LevelMap property of anILoggerRepository
, if you have access to one.您可以使用反射来获取日志级别列表,并使用该列表来填充 LevelMap。
You can use reflection to get the list of log levels and use this list to fill the LevelMap.
好吧,只要每个级别在 Level 类中定义为:
我没有看到一个很好的方法来处理它(您可以使用反射来枚举属性,但我认为它不值得)。我看到的对代码的唯一改进是使用 Level.Name 中的值,而不是硬编码字符串值。
Well, as long as each level is defined in Level class as:
I don't see a nice way to handle it (you could use reflection to enumerate properties, but i don't think it's worth). The only improvement to your code i see, instead of hard coded string values, use values from Level.Name instead.