我需要支持数据库日志记录。 为此,我决定使用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;我的存储过程的值?
祝你好运
答案 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}";