nlog 的包装函数 - 分配日志级别

Wrapper function for nlog - assigning log level

我想要一个自定义日志 class,然后将其属性注入 nlog Logger。 class 应该初始化 nlog target 和 config ,然后其他人可以使用它而无需知道这些细节。

public interface ILogger
{
  void Log(LogEntry entry);
}

public enum LoggingEventType { Debug, Information, Warning, Error, Fatal};

public class LogEntry 
{

   public readonly LoggingEventType Level;
   public readonly string Message;
   public readonly Exception Ex;

   public LogEntry(LoggingEventType level, string message, Exception exception = null)
    {
      this.Level = severity;
      this.Message = message;
      this.Ex = exception;
    }
}


public static Main(){

   //Should happen in Class MyLogger that implements ILogger 

   var config = new NLog.Config.LoggingConfiguration();
   var logfile = new NLog.Targets.FileTarget("logfile") { FileName 
   "file.txt" };
   var logconsole = new NLog.Targets.ConsoleTarget("logconsole");

   config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile);

   NLog.LogManager.Configuration = config;


  LogEntery log = new LogEntry( Error , "Bad stuff" , IOException);
  Logger nlog  = logger.Error( log.Ex , log.Message);
  //How can I inject log level to Nlog class Logger?
  }

如何将日志级别注入 Nlog class 记录器?

也许是这样的:

class NLogLogger : ILogger
{
    private readonly NLog.Logger _logger;

    public NLogLogger(string name)
    {
        _logger = NLog.LogManager.GetLogger(name);
    }

    public void Log(LogEntry entry)
    {
        var nlogLevel = GetNLogLevel(entry.Level);
        if (_logger.IsEnabled(nlogLevel))
        {
           var nlogEvent = NLog.LogEventInfo.Create(nlogLevel, _logger.Name, entry.Message, entry.Ex);
           _logger.Log(typeof(NLogLogger), nlogEvent);
        }
    }

    NLog.LogLevel GetNLogLevel(LoggingEventType level)
    {
        switch (level)
        {
           case LoggingEventType.Debug: return NLog.LogLevel.Debug;
           case LoggingEventType.Information: return NLog.LogLevel.Info;
           case LoggingEventType.Warning: return NLog.LogLevel.Warn;
           case LoggingEventType.Error: return NLog.LogLevel.Error;
           case LoggingEventType.Fatal: return NLog.LogLevel.Fatal;
           default: return NLog.LogLevel.Trace;
        }
    }
}

对于任何语法错误,我们深表歉意。

另请参阅:https://github.com/NLog/NLog/wiki/Custom-extension-of-Logger-interface