Skip to content

Commit

Permalink
WhenMethodFilter - Support dynamic filtering using lambda
Browse files Browse the repository at this point in the history
  • Loading branch information
snakefoot committed Aug 23, 2019
1 parent 110b151 commit 6223072
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 3 deletions.
61 changes: 61 additions & 0 deletions src/NLog/Filters/WhenMethodFilter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//
// Copyright (c) 2004-2019 Jaroslaw Kowalski <jaak@jkowalski.net>, Kim Christensen, Julian Verdurmen
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * Neither the name of Jaroslaw Kowalski nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
// THE POSSIBILITY OF SUCH DAMAGE.
//

namespace NLog.Filters
{
using System;

/// <summary>
/// Matches the provided filter-method
/// </summary>
public class WhenMethodFilter : Filter
{
private readonly Func<LogEventInfo, FilterResult> _filterMethod;

/// <summary>
/// Initializes a new instance of the <see cref="WhenMethodFilter" /> class.
/// </summary>
public WhenMethodFilter(Func<LogEventInfo, FilterResult> filterMethod)
{
if (filterMethod == null)
throw new ArgumentNullException(nameof(filterMethod));
_filterMethod = filterMethod;
}

/// <inheritdoc/>
protected override FilterResult Check(LogEventInfo logEvent)
{
return _filterMethod(logEvent);
}
}
}
2 changes: 1 addition & 1 deletion src/NLog/Filters/WhenRepeatedFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ public class WhenRepeatedFilter : LayoutBasedFilter
private readonly Stack<KeyValuePair<FilterInfoKey, FilterInfo>> _objectPool = new Stack<KeyValuePair<FilterInfoKey, FilterInfo>>(1000);

/// <summary>
/// Constructor
/// Initializes a new instance of the <see cref="WhenRepeatedFilter" /> class.
/// </summary>
public WhenRepeatedFilter()
{
Expand Down
26 changes: 24 additions & 2 deletions tests/NLog.UnitTests/Filters/APITests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@
// THE POSSIBILITY OF SUCH DAMAGE.
//

using NLog.Config;

namespace NLog.UnitTests.Filters
{
using System.Linq;
using NLog.Config;
using NLog.Layouts;
using NLog.Filters;
using Xunit;
Expand Down Expand Up @@ -65,5 +65,27 @@ public void APITest()
Assert.Equal("zzz", wcf.Substring);
Assert.Equal(FilterResult.Ignore, wcf.Action);
}

[Fact]
public void WhenMethodFilterApiTest()
{
// Stage
var logFactory = new LogFactory();
var logger1 = logFactory.GetLogger("Hello");
var logger2 = logFactory.GetLogger("Goodbye");
var config = new LoggingConfiguration(logFactory);
var target = new NLog.Targets.DebugTarget() { Layout = "${message}" };
config.AddRuleForAllLevels(target);
config.LoggingRules.Last().Filters.Add(new WhenMethodFilter((l) => l.LoggerName == logger1.Name ? FilterResult.Ignore : FilterResult.Neutral));
logFactory.Configuration = config;

// Act 1
logger1.Info("Hello World");
Assert.Empty(target.LastMessage);

// Act 2
logger2.Info("Goodbye World");
Assert.Equal("Goodbye World", target.LastMessage);
}
}
}

0 comments on commit 6223072

Please sign in to comment.