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

时间:2018-04-24 09:38:09

标签: database arguments config nlog

我需要支持数据库日志记录。 为此,我决定使用nlog,因为它带来了数据库支持。 但首先我需要以编程方式设置配置。 据我所知,我必须为目标设置布局。 但是课程" 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 Method支持泛型参数。它看起来像这样:

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

如何分配传递的&#34; logEntry.Fault&#34;我的存储过程的值?

祝你好运

1 个答案:

答案 0 :(得分:1)

您当前的日志语句将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}";