A programmatic initial setup example is given on the NLog tutorial page here which I've included below. (There's a slightly more extensive version here.)
public static void Startup()
{
var config = new NLog.Config.LoggingConfiguration();
// Targets where to log to: File and Console
var logfile = new NLog.Targets.FileTarget("logfile") { FileName = "file.txt" };
var logconsole = new NLog.Targets.ConsoleTarget("logconsole");
// Rules for mapping loggers to targets
config.AddRule(LogLevel.Info, LogLevel.Fatal, logconsole);
config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile);
// Apply config
NLog.LogManager.Configuration = config;
LogManager.ReconfigExistingLoggers();
}
Then, to change the log level, where logconsole is the target you want to change:
public static void SetConsoleLogLevel(LogLevel level)
{
foreach (var rule in LogManager.Configuration.LoggingRules)
{
foreach (var ruleTarget in rule.Targets)
{
if (ruleTarget != logconsole) continue;
DisableLoggingForLevels(rule, LogLevel.Trace, level);
rule.EnableLoggingForLevels(level, LogLevel.Fatal);
LogManager.GetCurrentClassLogger().Log(level, "Changed logger level to {0}", level);
}
}
LogManager.ReconfigExistingLoggers();
}
where DisableLoggingForLevels is a private method exactly like NLog.Config.LoggingRule.EnableLoggingForLevels except that it disables:
private static void DisableLoggingForLevels(LoggingRule rule, LogLevel minLevel, LogLevel maxLevel)
{
for (var ordinal = minLevel.Ordinal; ordinal <= maxLevel.Ordinal; ++ordinal)
rule.DisableLoggingForLevel(LogLevel.FromOrdinal(ordinal));
}