Reputation: 794
I need to add NLog to a legacy asp.net 4.6.2 web forms app. In the global class, I am configuring the logger with a database target for a SQL Server database in the
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
void Application_Start(object sender, EventArgs e)
{
var dbTarget = new DatabaseTarget("DbTarget")
{
DBProvider = "mssql",
CommandText = "INSERT INTO dbo.ApplicationLog (ApplicationId, Login, HostName, VisitedPage, PageURL, ReferrerURL, LogDate) values (@ApplicationId, @Login, @HostName, @VisitedPage, @PageURL, @ReferrerURL, @LogDate);",
ConnectionString = "Server=DBSERVER;Database=ApplicationLogging_Test;Trusted_Connection=True;"
};
dbTarget.Parameters.Add(new DatabaseParameterInfo("@ApplicationId", "${applicationId}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Login", "${login}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@HostName", "${hostName}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@VisitedPage", "${visitedPage}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@PageURL", "${pageURL}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@ReferrerURL", "${referrerURL}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@LogDate", "${event-properties:LogDate}"));
NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(dbTarget, LogLevel.Info);
}
void Session_Start(object sender, EventArgs e)
{
// Bunch of stuff omitted for brevity, all vars in object below are populating.
Logger.Info(message, new { ApplicationId = 1049, Login, HostName, VisitedPage, PageURL, ReferrerURL });
}
Upvotes: 0
Views: 136
Reputation: 794
The problem is that I was arbitrarily adding layout renderers because I misunderstood them to be variables that would be mapped onto my SQL Query. It is possible to have custom variables but they need to be added as event properties. Layout renderers are controlled and a list of them is available here:
https://nlog-project.org/config/?tab=layout-renderers
The fixed code is:
dbTarget.Parameters.Add(new DatabaseParameterInfo("@ApplicationId", "${event-properties:applicationId}"));
And I have to add the applicationId this way:
LogEventInfo theEvent = new LogEventInfo(LogLevel.Info, null, "Session_Start");
theEvent.Properties["applicationId"] = 1049;
Logger.Log(theEvent);
Upvotes: 1