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?
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.
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}
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 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With