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

特定loggername的Nlog规则不起作用

  •  0
  • PsCraft  · 技术社区  · 6 年前

    我的应用程序为几个客户做了一些事情。我想为每个客户提供单独的日志文件。所有配置必须按程序进行。

    private static Logger InitialiseLog(Target target, string customerName)
    {
        var loggerName = customerName == null? "globalLog" : customerName;
        var config = LogManager.Configuration ?? new LoggingConfiguration();
        config.AddTarget("eventlog", target);
        var rule = new LoggingRule("*", LogLevel.Debug, target);
        config.LoggingRules.Add(rule);
        LogManager.Configuration = config;
        Logger _logger;
        _logger = LogManager.GetLogger(loggerName);
    
        return _logger;
    }
    

    其名称为:

    var target =
        new FileTarget
        {
            FileName = customerName + ".log",
            Layout = "${longdate}|${level:uppercase=true}|${logger}|${message}${exception}"
        };
    
        return InitialiseLog(target, customerName);
    

    我想将单个信息写入特定文件,因此我将规则更改为:

    var rule = new LoggingRule(loggerName, ...
    

    但它不起作用,什么都没有写。 我的目标是实现这样的目标: LogManager.GetLogger(“Customer1”)-&燃气轮机;它只写入Customer1.log文件 LogManager.GetLogger(“globallo”)-&燃气轮机;它只写入globallo.log文件

    我做错了什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Rolf Kristensen Raúl Diego    6 年前

    也许你可以这样做:

    private static Logger InitialiseLog(Target target, string customerName)
    {
        var loggerName = string.IsNullOrEmpty(customerName) ? "globalLog" : customerName;
    
        var config = LogManager.Configuration ?? new LoggingConfiguration();
        if (config.FindTargetByName("eventlog")==null)
        {
            config.AddTarget("eventlog", target);
            var rule = new LoggingRule("*", LogLevel.Debug, target);
            config.LoggingRules.Add(rule);
            LogManager.Configuration = config;
        }
    
        return LogManager.GetLogger(loggerName);
    }
    

    我不知道您是如何配置(或分配)NLog目标的,但由于您隐藏了该信息,因此我猜NLog目标只取决于 ${logger} -名称,您可以对所有记录器使用相同的NLog目标。

    为每个记录器注册新目标的替代解决方案:

    private static Logger InitialiseLog(Target target, string customerName)
    {
        var loggerName = string.IsNullOrEmpty(customerName) ? "globalLog" : customerName;
        var targetAlias = "eventlog_" + loggerName;
    
        var config = LogManager.Configuration ?? new LoggingConfiguration();
        if (config.FindTargetByName(targetAlias)==null)
        {
            config.AddTarget(targetAlias, target);
            config.AddRule(LogLevel.Debug, LogLevel.Fatal, target, loggerName, true):
            if (LogManager.Configuration != null)
               LogManager.ReconfigExistingLoggers();
            else
               LogManager.Configuration = config;
        }
    
        return LogManager.GetLogger(loggerName);
    }