public void AddRule(
            TEvent eventId,
            TagRuleCheckType ruleCheckType,
            IRtTag tagExpression,
            double?tolerance    = null,
            double?discardValue = null,
            Func <ITagRuleDefinition <TEvent>, bool> action = null)
        {
            var rule = new TagRuleDefinition <TEvent>(eventId, ruleCheckType, tagExpression,
                                                      tolerance ?? defaultTolerance, discardValue ?? defaultDiscardValue, action ?? defaultAction, logger);

            tagRules.Add(rule);

            logger?.LogInformation("Add Rule [{0}] {1} TagName:[{2}] TagExpression:[{3}] Status:{4} Updated:{5} ",
                                   rule.EventId, rule.RuleCheckType, rule.TagExpression.TagName, rule.TagExpression,
                                   rule.TagExpression.Status, rule.TagExpression.Updated);
        }
 internal TagRuleDefinition(
     TEvent eventId,
     TagRuleCheckType ruleCheckType,
     IRtTag tagExpression,
     double tolerance    = 0.01,
     double discardValue = 0,
     Func <ITagRuleDefinition <TEvent>, bool> action = null,
     ILogger logger = null)
 {
     this.logger       = logger ?? Configuration.Configuration.DefaultLogger;
     EventId           = eventId;
     TagExpression     = tagExpression;
     RuleCheckType     = ruleCheckType;
     this.tolerance    = tolerance;
     this.DiscardValue = discardValue;
     this.action       = action;
 }