예제 #1
0
        /// <summary>
        /// Checks whether log event should be logged or not. In case the LogEvent has just been repeated.
        /// </summary>
        /// <param name="logEvent">Log event.</param>
        /// <returns>
        /// <see cref="FilterResult.Ignore"/> - if the log event should be ignored<br/>
        /// <see cref="FilterResult.Neutral"/> - if the filter doesn't want to decide<br/>
        /// <see cref="FilterResult.Log"/> - if the log event should be logged<br/>
        /// .</returns>
        protected override FilterResult Check(LogEventInfo logEvent)
        {
            lock (_repeatFilter)
            {
                using (var targetBuilder = OptimizeBufferReuse ? ReusableLayoutBuilder.Allocate() : ReusableLayoutBuilder.None)
                {
                    if (OptimizeBufferReuse && targetBuilder.Result.Capacity != OptimizeBufferDefaultLength)
                    {
                        // StringBuilder.Equals only works when StringBuilder.Capacity is the same
                        if (OptimizeBufferDefaultLength < MaxInitialRenderBufferLength)
                        {
                            OptimizeBufferDefaultLength = MaxLength;
                            while (OptimizeBufferDefaultLength < targetBuilder.Result.Capacity && OptimizeBufferDefaultLength < MaxInitialRenderBufferLength)
                            {
                                OptimizeBufferDefaultLength *= 2;
                            }
                        }
                        targetBuilder.Result.Capacity = OptimizeBufferDefaultLength;
                    }

                    FilterInfoKey filterInfoKey = RenderFilterInfoKey(logEvent, OptimizeBufferReuse ? targetBuilder.Result : null);

                    FilterInfo filterInfo;
                    if (_repeatFilter.TryGetValue(filterInfoKey, out filterInfo))
                    {
                        return(RefreshFilterInfo(logEvent, filterInfo));
                    }

                    filterInfo = CreateFilterInfo(logEvent);
                    if (OptimizeBufferReuse && filterInfo.StringBuffer != null)
                    {
                        filterInfo.StringBuffer.ClearBuilder();
                        int length = Math.Min(targetBuilder.Result.Length, MaxLength);
                        for (int i = 0; i < length; ++i)
                        {
                            filterInfo.StringBuffer.Append(targetBuilder.Result[i]);
                        }
                    }
                    filterInfo.Refresh(logEvent.Level, logEvent.TimeStamp, 0);
                    _repeatFilter.Add(new FilterInfoKey(filterInfo.StringBuffer, filterInfoKey.StringValue, filterInfoKey.StringHashCode), filterInfo);
                }
            }

            return(FilterResult.Neutral);
        }
예제 #2
0
        /// <summary>
        /// Checks whether log event should be logged or not. In case the LogEvent has just been repeated.
        /// </summary>
        /// <param name="logEvent">Log event.</param>
        /// <returns>
        /// <see cref="FilterResult.Ignore"/> - if the log event should be ignored<br/>
        /// <see cref="FilterResult.Neutral"/> - if the filter doesn't want to decide<br/>
        /// <see cref="FilterResult.Log"/> - if the log event should be logged<br/>
        /// .</returns>
        protected override FilterResult Check(LogEventInfo logEvent)
        {
            FilterResult filterResult   = FilterResult.Neutral;
            bool         obsoleteFilter = false;

            lock (_repeatFilter)
            {
                using (var targetBuilder = OptimizeBufferReuse ? ReusableLayoutBuilder.Allocate() : ReusableLayoutBuilder.None)
                {
                    if (OptimizeBufferReuse && targetBuilder.Result.Capacity != OptimizeBufferDefaultLength)
                    {
                        // StringBuilder.Equals only works when StringBuilder.Capacity is the same
                        if (OptimizeBufferDefaultLength < MaxInitialRenderBufferLength)
                        {
                            OptimizeBufferDefaultLength = MaxLength;
                            while (OptimizeBufferDefaultLength < targetBuilder.Result.Capacity && OptimizeBufferDefaultLength < MaxInitialRenderBufferLength)
                            {
                                OptimizeBufferDefaultLength *= 2;
                            }
                        }
                        targetBuilder.Result.Capacity = OptimizeBufferDefaultLength;
                    }

                    FilterInfoKey filterInfoKey = RenderFilterInfoKey(logEvent, OptimizeBufferReuse ? targetBuilder.Result : null);

                    FilterInfo filterInfo;
                    if (!_repeatFilter.TryGetValue(filterInfoKey, out filterInfo))
                    {
                        filterInfo = CreateFilterInfo(logEvent);
                        if (OptimizeBufferReuse && filterInfo.StringBuffer != null)
                        {
                            filterInfo.StringBuffer.ClearBuilder();
                            int length = Math.Min(targetBuilder.Result.Length, MaxLength);
                            for (int i = 0; i < length; ++i)
                            {
                                filterInfo.StringBuffer.Append(targetBuilder.Result[i]);
                            }
                        }
                        filterInfo.Refresh(logEvent.Level, logEvent.TimeStamp, 0);
                        _repeatFilter.Add(new FilterInfoKey(filterInfo.StringBuffer, filterInfoKey.StringValue, filterInfoKey.StringHashCode), filterInfo);
                        obsoleteFilter = true;
                    }
                    else
                    {
                        if (IncludeFirst)
                        {
                            obsoleteFilter = filterInfo.IsObsolete(logEvent.TimeStamp, TimeoutSeconds);
                        }

                        filterResult = RefreshFilterInfo(logEvent, filterInfo);
                    }
                }
            }

            // Ignore the first log-event, and wait until next timeout expiry
            if (IncludeFirst && obsoleteFilter)
            {
                filterResult = Action;
            }

            return(filterResult);
        }