How do I programmatically add logging filters?

4k views Asked by At

I want to add the rule in my NLog. The rule is:

 <rules>
<logger name="*" writeTo="file">
    <filters>
        <when condition="length(message) > 100" action="Ignore" />
        <when condition="equals('${logger}','MyApps.SomeClass')" action="Ignore" />
        <when condition="(level >= LogLevel.Debug and contains(message,'PleaseDontLogThis')) or level==LogLevel.Warn" action="Ignore" />
        <when condition="not starts-with('${message}','PleaseLogThis')" action="Ignore" />
    </filters>
</logger>

Now I want to implement it in C# code. I haven't found the sample code online.

1

There are 1 answers

6
mclark1129 On BEST ANSWER

I would take a look a look at the Configuration API documentation for NLog. While it doesn't specifically reference filters, it seems like the way to accomplish this programmatically is by using LoggingRules to control how log messages are processed.

Edit

Like I said, the Configuration API is the way to achieve this. This example will replicate the following config programmatically:

Config

<targets>            
    <target name="console" type="Console" />
</targets>
<rules>
    <logger name="*" minlevel="Debug" writeTo="console">
        <filters>
            <when condition="not starts-with('${message})', 'PleaseLogThis')" action="Ignore" />
        </filters>
    </logger>
</rules>

Code

// Create the filter
var filter = new ConditionBasedFilter();            
filter.Condition = "not starts-with('${message}','PleaseLogThis')";
filter.Action = FilterResult.Ignore;

// Create the rule to apply the filter to
var consoleTarget = new ColoredConsoleTarget();
var rule = new LoggingRule("*", LogLevel.Debug, consoleTarget);
rule.Filters.Add(filter);

// Create the config to apply the rule to
var config = new LoggingConfiguration();
config.LoggingRules.Add(rule);

// Update the log manager with the programmatic config
LogManager.Configuration = config;

// Test Your Logging
var log = LogManager.GetCurrentClassLogger();

log.Debug("Test");
log.Debug("Filter");
log.Debug("PleaseLogThis");

Console.ReadLine();