代码之家  ›  专栏  ›  技术社区  ›  user3580768

如何使用配置c中的规则发送NLog中的特定函数#

  •  2
  • user3580768  · 技术社区  · 6 年前

    我有一个类似这样的Logger类:

    public class Logger : ILogging
    {
        private ILogger _logger;
    
        public Logger()
        {
            _logger = LoggerFactory<ILogging>.Resolve();
        }
    
        public void log(string priority, string message)
        {
      //to do the code here
        }
    

    }

    这是我的配置文件:

     <rules >
    <logger name="Priority1" minlevel="Error" writeTo="logfile" />
    <logger name="Priority2" minlevel="Warn" writeTo="logfile" />
    <logger name="Priority3" minlevel="Debug" writeTo="logfile" />
    <logger name="Priority4" minlevel="Trace" writeTo="logfile" />
    

    我想通过“名称”规则写入nlog中的特定函数 例如:如果用户调用

     logger.log("Priority1","errorMessage");
    

    该函数用于logger。错误(“错误”)

    我试图在谷歌上看到,但我没有看到任何好的解决方案

    更新

          public void log( Priority priority, string message)
        {
            string currentLogLevel;
            _logger = NLog.LogManager.GetLogger(priority.ToString());
            LogEventInfo logEvent = new LogEventInfo(currentLogLevel , _logger.Name, message);
            _logger.Log(logEvent);
        }
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Fildor    6 年前

    以下是对OP的评论:

    而不是

    public void log( Priority priority, string message)
    {
        string currentLogLevel; // <= This can't work
        _logger = NLog.LogManager.GetLogger(priority.ToString());
        LogEventInfo logEvent = new LogEventInfo(currentLogLevel , _logger.Name, message);
        _logger.Log(logEvent);
    }
    

    public void log( Priority priority, string message)
    {
        LogLevel logLevel;
    
        switch(priority)
        {
            case Priority.Priority1 : loglevel = LogLevel.Error; break;
            case Priority.Priority2 : loglevel = LogLevel.Warn; break;
            case Priority.Priority3 : loglevel = LogLevel.Debug; break;
            case Priority.Priority4 : loglevel = LogLevel.Trace; break;
            default: loglevel = LogLevel.None; break;
        }
    
        _logger = NLog.LogManager.GetLogger(priority.ToString());
        LogEventInfo logEvent = new LogEventInfo(logLevel , _logger.Name, message);
        _logger.Log(logEvent);
    }
    

    首先。

    但我也建议只使用一个记录器,并将其作为包装器的静态字段。

    我个人通常使用无包装的NLog。这使我可以自由地获取基于类的记录器和专用记录器,我可以在配置文件中路由和过滤这些记录器。但是如果您需要或想要使用包装器,如果您没有在消息本身中这样做,我会考虑在消息中传递一些上下文。

        2
  •  0
  •   user1012506    6 年前

    您可以管理包装器类(工厂),

    请参见中的示例:

    How to retain callsite information when wrapping NLog