Azure Functions : NLog and Database

This post has been republished via RSS; it originally appeared at: Azure App Service articles.

First published on MSDN on Mar 16, 2017

Here are steps to write NLog to Database in Azure Functions

1. via Config (NLog.config)

<?xml version="1.0" encoding="utf-8" ?>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<targets>

<!--<target name="logfile" xsi:type="File" fileName="file.txt" />-->

<target name="logfile" xsi:type="Database" connectionstring="Server=dbservername.database.windows.net,1433;Initial Catalog=dbname;Persist Security Info=False;User ID=dbuser;Password=password; MultipleActiveResultSets=False; Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;">

<commandText>

insert into LogTable(time_stamp,level,logger,message) values(@time_stamp, @level, @logger, @message);

</commandText>

<parameter name="@time_stamp" layout="${date}" />

<parameter name="@level" layout="${level}" />

<parameter name="@logger" layout="${logger}" />

<parameter name="@message" layout="${message}" />

</target>

</targets>

<rules>

<logger name="*" minlevel="Trace" writeTo="logfile" />

</rules>

</nlog>

2. via Code

static void Main(string[] args)

{

LogManager.ThrowExceptions = true;

LogManager.ThrowConfigExceptions = true;

//InternalLogger.LogToConsole = true;

InternalLogger.LogFile = "log.txt";

InternalLogger.LogLevel = LogLevel.Trace;

#if DEBUG1 //FILE_TARGET

NLog.Targets.FileTarget target = new NLog.Targets.FileTarget("file_target");

target.FileName = "logfile.txt";

NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Trace);

Logger logger = LogManager.GetLogger("file_target");

#elif DEBUG2

NLog.Targets.DatabaseTarget target = new NLog.Targets.DatabaseTarget("db_target");

NLog.Targets.DatabaseParameterInfo param;

//target.DBProvider = "System.Data.SqlClient";

target.DBHost = "dbservername.database.windows.net";

target.DBUserName = "dbuser";

target.DBPassword = "password";

target.DBDatabase = "dbname";

target.CommandText = "insert into LogTable(time_stamp,level,logger,message) values(@time_stamp, @level, @logger, @message);";

param = new NLog.Targets.DatabaseParameterInfo();

param.Name = "@time_stamp";

param.Layout = "${date}";

target.Parameters.Add(param);

param = new NLog.Targets.DatabaseParameterInfo();

param.Name = "@level";

param.Layout = "${level}";

target.Parameters.Add(param);

param = new NLog.Targets.DatabaseParameterInfo();

param.Name = "@logger";

param.Layout = "${logger}";

target.Parameters.Add(param);

param = new NLog.Targets.DatabaseParameterInfo();

param.Name = "@message";

param.Layout = "${message}";

target.Parameters.Add(param);

NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Trace);

Logger logger = LogManager.GetLogger("db_target");

#else

Logger logger = LogManager.GetCurrentClassLogger();

#endif

logger.Trace("Sample trace message");

logger.Debug("Sample debug message");

logger.Info("Sample informational message");

logger.Warn("Sample warning message");

logger.Error("Sample error message");

logger.Fatal("Sample fatal error message");

LogManager.Flush();

}

3. In Azure Functions, we need to set the location of NLog.config file using XmlLoggingConfiguration() class as shown below:

using System;

using NLog;

using NLog.Common;

using NLog.Config;

private static Logger logger = null;

public static void Run(TimerInfo myTimer, TraceWriter log)

{

log.Info($"C# Timer trigger function executed at: {DateTime.Now}");

if (logger == null)

{

LogManager.ThrowExceptions = true;

LogManager.ThrowConfigExceptions = true;

//InternalLogger.LogToConsole = true;

InternalLogger.LogFile = "log.txt";

InternalLogger.LogLevel = LogLevel.Trace;

LogManager.Configuration = new XmlLoggingConfiguration("D:\\home\\site\\wwwroot\\<your function name>\\NLog.config");

logger = LogManager.GetCurrentClassLogger();

}

4. Also note, we need to add NuGet package details in the Project.json as shown below

REMEMBER: these articles are REPUBLISHED. Your best bet to get a reply is to follow the link at the top of the post to the ORIGINAL post! BUT you're more than welcome to start discussions here:

This site uses Akismet to reduce spam. Learn how your comment data is processed.