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