Skip to content

Instantly share code, notes, and snippets.

@relyky
Last active February 14, 2025 14:29
Show Gist options
  • Select an option

  • Save relyky/0b109d14f9a2c483d76f901519d14995 to your computer and use it in GitHub Desktop.

Select an option

Save relyky/0b109d14f9a2c483d76f901519d14995 to your computer and use it in GitHub Desktop.
NLog, Programmatic Configuration write to database
/// <summary>
/// NLog Programmatic Configuration
/// ref → https://github.com/nlog/NLog/wiki/Configuration-API
/// ref → http://nlog-project.org/documentation/v2.0.1/html/T_NLog_Targets_DatabaseTarget.htm
/// ref → https://github.com/nlog/NLog/wiki/Database-target
/// ref → https://github.com/nlog/nlog/wiki/Layout-Renderers
/// </summary>
private static void DoConfigNLogWriteToDatabase()
{
//<target name="db" xsi:type="Database">
// <dbProvider>System.Data.SqlClient</dbProvider>
// <connectionString>your_database_connectionstring</connectionString>
// <commandText>
// INSERT INTO dbo.NLog (
// LogDate, MachineName,
// Level, Message,
// Username,
// Logger, CallSite, Exception
// ) values (
// @LogDate, @MachineName,
// @Level, @Message,
// @Username,
// @Logger, @Callsite, @Exception
// );
// </commandText>
// <parameter name="@LogDate" layout="${date}" />
// <parameter name="@MachineName" layout="${machinename}" />
// <parameter name="@Level" layout="${level}" />
// <parameter name="@Message" layout="${message}" />
// <parameter name="@Username" layout="${identity:name=True:authType=False:isAuthenticated=False}" />
// <parameter name="@Logger" layout="${logger}" />
// <parameter name="@Callsite" layout="${callsite}" />
// <parameter name="@Exception" layout="${exception:tostring}" />
//</target>
//<logger name="*" minlevel="Trace" writeTo="db" />
//# prepare target
DatabaseTarget dbTarget = new DatabaseTarget();
dbTarget.Name = "db";
dbTarget.DBProvider = "System.Data.SqlClient";
dbTarget.ConnectionString = your_database_connectionstring;
dbTarget.CommandText =
@"INSERT INTO dbo.NLog (
LogDate, MachineName,
Level, Message,
Username,
Logger, CallSite, Exception
) values (
@LogDate, @MachineName,
@Level, @Message,
@Username,
@Logger, @Callsite, @Exception
);";
dbTarget.Parameters.Add(new DatabaseParameterInfo("@LogDate", "${date}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@MachineName", "${machinename}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Level", "${level}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Message", "${message}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Username", "${identity:name=True:authType=False:isAuthenticated=False}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Logger", "${logger}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Callsite", "${callsite}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@Exception", "${exception:tostring}"));
//# add to currnet NLog configuration
NLog.LogManager.Configuration.AddRuleForAllLevels(dbTarget);
//# re-active NLog
NLog.LogManager.ReconfigExistingLoggers(); // refresh
}
<?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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<targets async="true">
<!-- for log -->
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${logger} ${message} ${exception:format=message}" />
<!-- to preview DB fields as log -->
<target xsi:type="File" name="dbf" fileName="${basedir}/logs/${shortdate}.DB.log"
layout="${longdate} ${machinename} ${windows-identity} ${identity:name=True:authType=False:isAuthenticated=False} ${uppercase:${level}} ${logger} ${message} ${exception:format=message}" />
<!-- for DB -->
<target name="db" xsi:type="Database">
<dbProvider>System.Data.SqlClient</dbProvider>
<connectionString>your_database_connectionstring</connectionString>
<commandText>
INSERT INTO dbo.NLog (
LogDate, MachineName,
Level, Message,
Username,
Logger, CallSite, Exception
) values (
@LogDate, @MachineName,
@Level, @Message,
@Username,
@Logger, @Callsite, @Exception
);
</commandText>
<parameter name="@LogDate" layout="${date}" />
<parameter name="@MachineName" layout="${machinename}" />
<parameter name="@Level" layout="${level}" />
<parameter name="@Message" layout="${message}" />
<parameter name="@Username" layout="${identity:name=True:authType=False:isAuthenticated=False}" />
<parameter name="@Logger" layout="${logger}" />
<parameter name="@Callsite" layout="${callsite}" />
<parameter name="@Exception" layout="${exception:tostring}" />
</target>
</targets>
<rules>
<!-- NLog 把訊息分成六個等級:1.Trace, 2.Debug, 3.Info, 4.Warn, 5.Error, 6.Fatal -->
<!-- for DB -->
<logger name="*" minlevel="Trace" writeTo="db" />
<!-- for log -->
<logger name="*" minlevel="Info" writeTo="f" />
</rules>
</nlog>
/****** Object: Table [dbo].[NLog] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[NLog](
[LogDate] [datetime] NOT NULL,
[MachineName] [nvarchar](50) NOT NULL,
[Level] [nvarchar](50) NOT NULL,
[Message] [nvarchar](max) NOT NULL,
[UserName] [nvarchar](250) NULL,
[Logger] [nvarchar](250) NULL,
[Callsite] [nvarchar](max) NULL,
[Exception] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment