public TraceFilter(string typeFilter, MessageTypes msgTypeFilter, Level levelFilter, TraceFilter next)
        {
            if (string.IsNullOrEmpty(typeFilter))
            {
                throw new ArgumentException("typeFilter was null or empty");
            }

            this.myFilter        = typeFilter;
            this.Next            = next;
            this.myMsgTypeFilter = msgTypeFilter;
            this.myLevelFilter   = levelFilter;

            var parts = typeFilter.Trim().ToLower().Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);

            this.myFilterHashes = new int[parts.Length];
            Debug.Assert(parts.Length > 0, "Type filter parts should be > 0");
            for (var i = 0; i < parts.Length; i++)
            {
                if (parts[i] == "*")
                {
                    this.myFilterHashes[i] = MATCHANY;
                }
                else
                {
                    this.myFilterHashes[i] = parts[i].GetHashCode();
                }
            }
        }
Ejemplo n.º 2
0
        internal TracerConfig(string cfg)
        {
            if (string.IsNullOrEmpty(cfg))
            {
                return;
            }

            var source = new TraceSource(TraceEnvVarName, SourceLevels.All);

            this.myListeners = source.Listeners;

            var parser      = new TraceCfgParser(cfg);
            var newListener = parser.OutDevice;

            this.myFilters    = parser.Filters;
            this.myNotFilters = parser.NotFilters;

            if (newListener != null)
            {
                // when the App.config _Trace source should be used we do not replace
                // anything
                if (!parser.UseAppConfigListeners)
                {
                    this.myListeners.Clear();
                    this.myListeners.Add(newListener);
                }
            }
            else
            {
                this.myListeners = null;
            }
        }
        /// <summary>
        ///     Format string is of the form
        ///     outDevice; type flag1+flag2+...;type flags; ...
        ///     where flags are a combination of trace markers
        /// </summary>
        /// <param name="config"></param>
        public TraceCfgParser(string config)
        {
            if (string.IsNullOrEmpty(config))
            {
                return;
            }

            var parts = config.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Select(str => str.Trim()).ToArray();

            foreach (var filter in this.GetFilters(parts, 1).Reverse())
            {
                var typeName     = filter.Key.TrimStart('!');
                var bIsNotFilter = filter.Key.IndexOf('!') == 0;

                var levelAndMsgFilter = this.ParseMsgTypeFilter(filter.Value);

                var curFilterInstance = new TraceFilter(typeName, levelAndMsgFilter.Value, levelAndMsgFilter.Key, bIsNotFilter ? this.NotFilters : this.Filters);

                if (bIsNotFilter)
                {
                    this.NotFilters = curFilterInstance;
                }
                else
                {
                    this.Filters = curFilterInstance;
                }
            }

            if (parts.Length > 0)
            {
                this.OpenOutputDevice(parts[0].ToLower());
            }

            // when only output device was configured or wrong mask was entere we enable full tracing
            // by default
            if (this.Filters == null)
            {
                this.Filters = new TraceFilterMatchAll();
            }

            if (this.bHasError)
            {
                InternalError.PrintHelp();
            }
        }