从字符串创建强类型log4net级别

本文关键字:log4net 级别 强类型 创建 字符串 | 更新日期: 2023-09-27 17:53:30

我注意到log4net有一个强类型的Level类。有没有人知道,如果有一种方法来创建一个级别对象解析日志级别字符串?

例如:

我想将错误级别字符串" error "解析为等效的log4net.Core.Level。错误对象,其他日志级别也是如此。

我写了我自己的(幼稚的)方法来做这件事(见下文),但我希望有一些内部的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");
        }
    }

编辑:根据Dr. Wily's Apprentice的建议,以下是我最后使用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;
    }

从字符串创建强类型log4net级别

看起来这就是LevelMap类的目的。

https://logging.apache.org/log4net/log4net-1.2.11/release/sdk/log4net.Core.LevelMap.html

编辑:您可以从ILoggerRepository的LevelMap属性中获得LevelMap,如果您可以访问一个。

您可以使用反射来获取日志级别列表,并使用此列表来填充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]; 
            }
        }
    }
}

只要每个关卡在level类中定义为:

 public static readonly Level Warn;

我没有看到一个好的方法来处理它(你可以使用反射来枚举属性,但我不认为这是值得的)。唯一的改进你的代码我看到,而不是硬编码的字符串值,使用值从水平。名字。