0
votes

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;

        }
    }
}
1
Try LogManager.ReconfigExistingLoggers() at the end of your configuration code.user47589
Hey Amy that didn't seem to work. Could it be that I have something wrong with my implementation in the methods?Peter Doro

1 Answers

2
votes

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);