Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I log a custom field in NLog to database?

Tags:

c#

nlog

I currently use NLog on a lot of projects. On some, I log to a database.

Here is what I would like to do:

CREATE TABLE [dbo].[NLogEntries](   [Id] [bigint] IDENTITY(1,1) NOT NULL,   [Origin] [nvarchar](100) NOT NULL,   [LogLevel] [nvarchar](20) NOT NULL,   [Message] [nvarchar](3600) NOT NULL,   [CreatedOn] [datetime] NOT NULL,   [OrderId] [int] NULL --Custom field! ) 

And NLog.config with this target:

<target type="Database" name="database" connectionstring="Server=localhost;Database=NLog;Trusted_Connection=True;">   <commandText>     INSERT INTO NLogEntries ([Origin], [Message], [LogLevel],[CreatedOn],[OrderId]) VALUES (@Origin,@Message,@LogLevel,@Date, @OrderId);   </commandText>   <parameter name="@Date" layout="${date}"/>   <parameter name="@Origin" layout="${callsite}"/>   <parameter name="@LogLevel" layout="${level}"/>   <parameter name="@message" layout="${message}"/>   <parameter name="@OrderId" layout="${orderId}"/> <!-- custom field! --> </target> 

And then log something like this:

var logger = LogManager.GetCurrentClassLogger(); var orderId = 123; logger.Debug("What is going on here", orderId); 

Is there a good way to do this and keep using NLog? Or do I have to roll my own logger and skip NLog when these are the requirements?

like image 786
Kjensen Avatar asked Sep 14 '12 12:09

Kjensen


People also ask

Which of the following logging levels does NLog support?

NLog supports the following levels: Trace - Very detailed log messages, potentially of a high frequency and volume. Debug -Less detailed and/or less frequent debugging messages. Info - Informational messages.

What can be configured with this NLog config file?

The following types can be configured: Targets - the destinations of a logevent, e.g. file, database, console. Layout - the layout e.g. json, csv, plain-text (default) Layout renderers - the template markers, e.g. ${message}, ${exception}, ${date}


1 Answers

UPDATE 11 Feb 2022: newer versions of NLOG have other solutions- see Julian’s answer.

Rather than using GDC, which is for global static data and fails on concurrent logging, it is better to use EventProperties-Layout-Renderer that allows to pass custom  properties specific for the event

LogEventInfo theEvent = new LogEventInfo(logLevel, "", message); theEvent.Properties["OrderId"] =orderId;`  log.Log(theEvent);  ... and in your NLog.config file:  ${event-context:item=OrderId}  -- obsolete ${event-properties:item=OrderId} -- renders OrderId 
like image 145
Michael Freidgeim Avatar answered Oct 17 '22 20:10

Michael Freidgeim