Reputation: 95
I am setting up a test app using Nlog and I want the configuration to be editable through code. I have set up the configuration correctly, however I am unable to actually see anything logging. I am not sure if this is because I have coded it incorrectly or if I have it implemented incorrectly. I am not seeing a file being created nor am I getting a colored console. Any help is appreciated as there is not too much documentation on programmatic configuration.
using System;
using NLog;
using NLog.Targets;
using NLog.Targets.Wrappers;
using NLog.Config;
namespace NLogArchitecture
{
class ApplicationFramework
{
public static Logger log = LogManager.GetCurrentClassLogger();
public static int sum = 0;
public static void Main()
{
SetupLoggingConfiguration();
F1();
F2();
F3();
F4();
}
public static void F1()
{
int[] array1 = new int[5] { 1, 2, 3, 4, 5 };
for (int i = 0; i > array1.Length; i++)
{
sum += array1[i];
}
log.Trace("The sum of array1 is: " + sum);
}
public static void F2()
{
int sumException = 0;
try
{
sumException = sum / 0;
}
catch(Exception ex)
{
log.Error("Invalid operation: " + ex);
}
}
public static void F3()
{
sum = sum + 3;
log.Debug("Consider a different syntax");
}
public static void F4()
{
if (sum > 12) log.Info("The sum has been calculated well");
if (sum <= 10) log.Info("The sum has been calculated incorrectly");
}
public static void SetupLoggingConfiguration()
{
// Intialize Config Object
LoggingConfiguration config = new LoggingConfiguration();
// Initialize Console Target
var consoleTarget = new ColoredConsoleTarget("Console Target")
{
Layout = @"${time} ${longdate} ${uppercase: ${level}} ${logger} ${message} ${exception: format=ToString}"
};
// Initialize the AsyncWrapper for the ConsoleTarget
AsyncTargetWrapper consoleWrapper = new AsyncTargetWrapper();
consoleWrapper.WrappedTarget = consoleTarget;
consoleWrapper.OverflowAction = AsyncTargetWrapperOverflowAction.Block;
consoleWrapper.QueueLimit = 5000;
// Initialize the AsyncFlushTargetWrapper for the ConsoleWrapper
AutoFlushTargetWrapper consoleFlushWrapper = new AutoFlushTargetWrapper();
consoleFlushWrapper.WrappedTarget = consoleWrapper;
// This condition controls when the log is flushed. Set the LogLevel to be equivalent to the maximum level specified in the targetRule
consoleFlushWrapper.Condition = "level >= LogLevel.Trace";
// Adding the target to the config
config.AddTarget("console", consoleFlushWrapper);
// Initialize File Target
var fileTarget = new FileTarget("File Target")
{
FileName = "@C:/logs/log.txt",
KeepFileOpen = false,
Layout = @"${time} ${longdate} ${uppercase: ${level}} ${logger} ${message} ${exception: format=ToString}"
};
// Initialize the AsyncWrapper for the fileTarget
AsyncTargetWrapper fileWrapper = new AsyncTargetWrapper();
fileWrapper.WrappedTarget = fileTarget;
fileWrapper.QueueLimit = 5000;
fileWrapper.OverflowAction = AsyncTargetWrapperOverflowAction.Block;
// Initialize the AsyncFlushTargetWrapper for the FileWrapper
AutoFlushTargetWrapper fileFlushWrapper = new AutoFlushTargetWrapper();
fileFlushWrapper.WrappedTarget = fileWrapper;
// This condition controls when the log is flushed. Set the LogLevel to be equivalent to the maximum level specified in the targetRule
fileFlushWrapper.Condition = "level >= LogLevel.Trace";
// Adding the target to the config
config.AddTarget("file", fileFlushWrapper);
// Creating the Log Level rules for each target and adding them to the config
// Edit these to change what methods are logged
var fileRule = new LoggingRule("FileRule", fileTarget);
fileRule.EnableLoggingForLevels(LogLevel.Trace, LogLevel.Info);
fileRule.EnableLoggingForLevel(LogLevel.Error);
config.LoggingRules.Add(fileRule);
var consoleRule = new LoggingRule("ConsoleRule", consoleTarget);
consoleRule.EnableLoggingForLevels(LogLevel.Trace, LogLevel.Info);
consoleRule.EnableLoggingForLevel(LogLevel.Error);
config.LoggingRules.Add(consoleRule);
// Assigning the configuration to the logger
LogManager.Configuration = config;
}
}
}
Upvotes: 0
Views: 1025
Reputation: 1070
Your issue is in your LoggingRule Pattern. NLog does not know what 'ConsoleRule' or 'FileRule' is. There are no matching patterns in your logger name like that since you are using default.
var consoleRule = new LoggingRule("ConsoleRule", consoleTarget);
var fileRule = new LoggingRule("FileRule", fileTarget);
Change it to '*' to match all or give your logger a name to match on for the rule.
var consoleRule = new LoggingRule("*", consoleTarget);
var fileRule = new LoggingRule("*", fileTarget);
Upvotes: 2