Custom Logging with Personal Fields in Nlog
Setting the database string via
var databaseTarget = (DatabaseTarget)LogManager.Configuration.FindTargetByName("database");
databaseTarget.ConnectionString = connectionString;
LogManager.ReconfigExistingLoggers();
The above didn't work but I used the example below where I set it via the program's start.var defaultConnection = Configuration.GetConnectionString("DefaultConnection");
NLog.GlobalDiagnosticsContext.Set("defaultConnection", defaultConnection);
var logger = LogManager.LoadConfiguration("nlog.config").GetCurrentClassLogger();
Then you can use ${gdc:item=defaultConnection} in your nlog.config:
<target xsi:type="Database" connectionString="${gdc:item=defaultConnection}" />
Rather than using GDC, which is for global static data and fails on concurrent logging, it is better to use EventProperties-Layout-Renderer which allows to pass of custom properties specific to the event
The easiest way of overriding connection string is through the use of GDC:
<target name="db" type="Database" connectionString="${gdc:myConnectionstring}" ... />
Now in your code you can simply do:
GDC.Set("myConnectionString", "Server=.;database=.....");
For Custom Logging with the following...
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
https://github.com/nlog/NLog/wiki/Database-target<nlog throwExceptions="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="default" xsi:type="File" fileName="logs/app-log.txt" archiveFileName="logs/archives/app-log.{#}.txt" archiveEvery="Day" archiveNumbering="Rolling" maxArchiveFiles="7" />
<target name="database" xsi:type="Database" dbProvider="System.Data.SqlClient"
commandText="INSERT INTO [dbo].[AppLog]
([database_name],[app_name], [version], [message_type], [message], [routine], [src_file], [src_line], [username], [computer_name]) VALUES ('300', @app_name, @version, @message_type, @message, @routine , @src_file, @src_line, @username, @computer_name)">
<parameter name="@app_name" layout="${processname}" />
<parameter name="@version" layout="${assembly-version}" />
<parameter name="@message_type" layout="${level}" />
<parameter name="@message" layout="${message}" />
<parameter name="@routine" layout="${callsite:className=true:includeSourcePath=true:methodName=true}" />
<parameter name="@src_file" layout="${currentdir}" />
<parameter name="@src_line" layout="${callsite-linenumber}" />
<parameter name="@username" layout="${environment-user}" />
<parameter name="@computer_name" layout="${machinename}" />
</target>
</targets>
<rules>
<logger name="*" writeTo="database" />
</rules>
</nlog>
Doing the rest...- <target name="eventlog" xsi:type="EventLog" layout="${message}" log="Application" source=" My Custom Api Services" />
- <target name="database" type="Database" connectionString="Data Source=your sql source;initial catalog=YourDbNameDb;user id=u1;password=p1;MultipleActiveResultSets=True;">
- <rules>
- <!-- I am adding my 3 logging rules here -->
- <logger name="*" minlevel="Debug" writeTo="database" />
- <logger name="*" minlevel="Trace" writeTo="logfile" />
- <logger name="*" minlevel="Trace" writeTo="eventlog" />
- </rules>