0

I have 2 NLog database targets. The first one has been working. The second one that I just added does not seem to save when I check the table in the database.. However, I get no exception to look at for debugging.. Is there something I can turn on? Or somewhere I need to look?

Maybe if there are any NLog experts, they can see a simple mistake I may have made? Here is my code for creating the NLog configuration:

 // nlog config (ExceptionTracking)
            LogManager.ThrowExceptions = true;
            // Using NLog.Common
            InternalLogger.LogLevel = LogLevel.Warn;
            InternalLogger.LogFile = @"c:\log.txt";

            var config = new LoggingConfiguration();
            var dbTarget = new DatabaseTarget()
            {
                Name = "ExceptionTracking",
                ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["NLogConnection"].ConnectionString,
                CommandText = "INSERT INTO Common.ExceptionTracking ( ApplicationID,  Url,  IP,  Referrer,  UserName,  ExceptionDescription,  Action,  Controller,  InsertedBy,  InsertedDate) " +
                                                            "VALUES (@ApplicationID, @Url, @IP, @Referrer, @UserName, @ExceptionDescription, @Action, @Controller, @InsertedBy, @InsertedDate);"
            };

            dbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@ApplicationID", Layout = "${appsetting:name=AppID:default=null}" });
            dbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@Url", Layout = "${aspnet-Request-Url}" });
            dbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@IP", Layout = "${aspnet-Request-IP}" });
            dbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@Referrer", Layout = "${aspnet-Request-Referrer}" });
            dbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@UserName", Layout = "${identity:authType=false:isAuthenticated=false}" });
            dbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@ExceptionDescription", Layout = "${exception:tostring}" });
            dbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@Action", Layout = "${aspnet-MVC-Action}" });
            dbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@Controller", Layout = "${aspnet-MVC-Controller}" });
            dbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@InsertedBy", Layout = "${gdc:BEMSID}" });
            dbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@InsertedDate", Layout = "${date}" });

            config.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, dbTarget));


            // Add another NLog Target (ChangeTracking)
            var changeTrackingDbTarget = new DatabaseTarget()
            {
                Name = "ChangeTracking",
                ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["NLogConnection"].ConnectionString,
                CommandText = "INSERT INTO Common.ChangeTracking ( ApplicationID,  UserName,  Name,  EntityName,  PropertyName,  PrimaryKeyValue,  OldValue,  NewValue, DateChanged) " +
                                                            "VALUES (@ApplicationID, @UserName, @Name, @EntityName, @PropertyName, @PrimaryKeyValue, @OldValue, @NewValue, @DateChanged);"
            };

            changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@ApplicationID", Layout = "${appsetting:name=AppID:default=null}" });
            changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@UserName", Layout = "${identity:authType=false:isAuthenticated=false}" });
            changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@Name", Layout = "${event-properties:item=name}" });
            changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@EntityName", Layout = "${event-properties:item=entityname}" });
            changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@PropertyName", Layout = "${event-properties:item=propname}" });
            changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@PrimaryKeyValue", Layout = "${event-properties:item=primarykey}" });
            changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@OldValue", Layout = "${event-properties:item=oldvalue}" });
            changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@NewValue", Layout = "${event-properties:item=newvalue}" });
            changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@DateChanged", Layout = "${date}" });

            config.LoggingRules.Add(new LoggingRule("*", LogLevel.Off, changeTrackingDbTarget));

            LogManager.Configuration = config;
            LogManager.Configuration.AddTarget("ExceptionTracking", dbTarget);
            LogManager.Configuration.AddTarget("ChangeTracking", changeTrackingDbTarget);
        }

Here is the code that trys to actually create a log:

private static Logger _logger = LogManager.GetLogger("ChangeTracking");
                        LogEventInfo changeEvent = new LogEventInfo(LogLevel.Info, "ChangeTracking", "A change event has been fired");
                        changeEvent.Properties["Name"] = "Jake";
                        changeEvent.Properties["EntityName"] = "test";
                        changeEvent.Properties["PropertyName"] = "test property name";
                        changeEvent.Properties["PrimaryKeyValue"] = "test";
                        changeEvent.Properties["OldValue"] = "test";
                        changeEvent.Properties["NewValue"] = "test";
                        _logger.Log(changeEvent);
  • 1
    Side note: I would recommend to create the config first with all the targets and rules, and then assign it to `LogManager.Configuration`. The setter of `LogManager.Configuration` will do some stuff for setting up Nlog – Julian Feb 11 '20 at 22:40
  • Do I need the following line? config.LoggingRules.Add(new LoggingRule("*", LogLevel.Off, changeTrackingDbTarget)); – JakeFromStateFarm Feb 11 '20 at 23:35
  • I just want a new Target, I don't care about the Log Level – JakeFromStateFarm Feb 11 '20 at 23:36
  • Every target needs a (shared) rule. Otherwise logs won't end to the target. See https://github.com/NLog/NLog/wiki/Tutorial#Configure-NLog-Targets-for-output and https://github.com/NLog/NLog/wiki/Configure-from-code – Julian Feb 12 '20 at 00:06
  • How can I create the Targets first before setting LogManager.Configuration = config? I get an error that LogManager.Configuration is null... I have to set the LogManager.Configuration before I addTarget() right?? – JakeFromStateFarm Feb 12 '20 at 00:17
  • I have updated my code... But I am done for the day. Thank you for your help. – JakeFromStateFarm Feb 12 '20 at 00:25

2 Answers2

2

Is there something I can turn on?

throwExceptions

You could enable that NLog will throw exceptions. Config:

<nlog throwExceptions="true" >

Or in code:

LogManager.ThrowExceptions = true

Internal log

You could enable the internal log. This will show the log internally by NLog. In this case warning (and upper) should be enough.

Config:

<nlog internalLogFile="c:\log.txt" internalLogLevel="Warn">

in code:

// Using NLog.Common
InternalLogger.LogLevel = LogLevel.Warn;
InternalLogger.LogFile = @"c:\log.txt";

See more about the internal log here

Read more

There is also a troubleshooting guide for NLog

Julian
  • 33,915
  • 22
  • 119
  • 174
  • I tried adding: LogManager.ThrowExceptions = true; LogManager.ThrowConfigExceptions = true; InternalLogger.LogLevel = LogLevel.Warn; InternalLogger.LogFile = @"C:\log.txt"; But I do not see any text file created, or console exceptions.. Any idea what I am doing wrong? I put it right under this line: LogManager.Configuration.AddTarget("ChangeTracking", changeTrackingDbTarget); – JakeFromStateFarm Feb 11 '20 at 23:05
  • Enable `LogManager.ThrowExceptions = true`/internal logging as soon as possible. Before any config, log rewrite etc. So first line in `main` for example. – Julian Feb 11 '20 at 23:06
0

The problem is not you mixing up the target-names, but this line:

config.LoggingRules.Add(new LoggingRule("*", LogLevel.Off, changeTrackingDbTarget));

Notice how you have chosen LogLevel.Off. Maybe consider using this instead:

config.AddRule(LogLevel.Trace, LogLevel.Fatal, changeTrackingDbTarget);

See also: https://github.com/nlog/nlog/wiki/Tutorial#configure-nlog-targets-for-output

But I guess it could be nice to have an AddRule-method that takes minlevel and target.

Rolf Kristensen
  • 17,785
  • 1
  • 51
  • 70