Nlog 以编程方式设置数据库目标并访问自定义日志消息属性

Nlog set Database target programatically and access custom log message properties

我需要支持数据库日志记录。 为此,我决定使用 nlog,因为它带来了数据库支持。 但首先我需要以编程方式设置配置。 据我了解,我必须为目标设置布局。 但是 class "DatabaseTarget" 没有任何与布局相关的 属性 :/.

                        var dbTarget = new DatabaseTarget();
                    dbTarget.ConnectionString = LogConnectionString;
                    dbTarget.CommandType = System.Data.CommandType.StoredProcedure;
                    dbTarget.CommandText = "exec dbo.InsertLog @level=${level}, @callSite=${callsite}, @message=${message}, @stackTrace=${stacktrace}, @machinename=${machinename}, @processname=${processname}";

DatabaseTarget 是否真的需要布局定义。如果是这样,我该如何以编程方式设置它?

另外我想传递一些信息。但我不确定如何为程序分配这些信息。 据我了解,我可以分配这些变量: https://github.com/nlog/nlog/wiki/Layout-Renderers

但 NLog 支持其 Log 方法的通用参数。它看起来像这样:

_nLog.Log<AJourFaultLevel>(ConvertLogLevel(logEntry.Level), logEntry.Message, logEntry.Fault);

如何为我的存储过程分配传递的 "logEntry.Fault" 值?

此致

您当前的日志语句将 logEntry.Fault 作为参数注入 string.Format(logEntry.Message, logEntry.Fault):

_nLog.Log<AJourFaultLevel>(ConvertLogLevel(logEntry.Level), logEntry.Message, logEntry.Fault);

如果您使用的是 NLog 4.5,那么您可以使用 structured-logging,您可以在其中命名参数,如下所示:

_nLog.Log<AJourFaultLevel>(ConvertLogLevel(logEntry.Level), "Fault occurred: {AJourFaultLevel}", logEntry.Fault);

然后您可以使用 ${event-properties:item=}:

访问命名参数
dbTarget.CommandText = "exec dbo.InsertLog @level=${level}, @callSite=${callsite}, @message=${message}, @stackTrace=${stacktrace}, @machinename=${machinename}, @processname=${processname}, @faultLevel=${event-properties:item=AJourFaultLevel}";