如何利用NLog给数据库发送日志

在NLog.Config里配置Target如下:

    < target name ="dbLogging " xsi:type ="Database " connectionStringName ="EtlLogGlobal ">
      < commandText>
        insert into Logging([LogTime], [Machine],[Logger],[LogLevel],[Message],[ProcessName],[AppVersion]) values (@LogTime, @Machine,@Logger,@LogLevel,@Message,@ProcessName, @AppVersion);
      </ commandText>
      <!-- parameter name="@DatabaseName" layout="${event-context:item=DatabaseName}" -->
      < parameter name ="@LogTime " layout ="${date} " />
      < parameter name ="@LogLevel " layout ="${level} " />
      < parameter name ="@Logger " layout ="${logger} " />
      < parameter name ="@Message " layout ="${message} ${exception} " />
      < parameter name ="@Machine " layout ="${machinename} " />
      < parameter name ="@AppVersion " layout ="${assembly-version} " />
      < parameter name ="@ProcessName " layout ="${processname} " />
    </ target>

注意点:
     1 connectionString:在target那里可以直接设置connectionString,也可以用connectionStringName设置一个值,该值指向App.config里ConnectionStrings节里设置的连接字符串。

     2 commandText等内容都可以在运行时修改,具体可参考《如何运行时修改NLog配置》

     3 parameter的设置,不仅仅可以用date等自带的变量,也可以在运行时传入想要的值,具体请参考《如何在运行时给NLog配置里传入参数》

     4 执行方式。打开sql server profiler就可以看到,系统实际上通过sp_executesql 来执行commandText的。
     
     5 运行时设置想插入的值的办法:采用动态传参,参见2
    
     6 运行时设置想插入的数据库或表的可能办法:
          1 得到NLog.LogManager.Configuration,调用FindTargetByName方法,然后把它转换成DatabaseTarget类型,然后运行LogManager.ReconfigExistingLoggers()。该办法能用,但是有一些讲究,否则不能正常工作,可参考《如何运行时修改NLog配置》

          2 用动态传参来修改所在数据库或表的值。在示例里无法使用,因为在sp_executesql不支持把参数当成数据库名或表名来使用。参考《SQL SERVER中常用函数、存储过程等》。但如果把CommandText等属性写在这里:
               < target name =" dbLogging " xsi:type =" Database " connectionStringName =" EtlLogGlobal " commandText =" ${event-context:item=commandText} ">
             就可以用动态传参的方式传入commandText了。
          
          3 connectionStringName被指定时,修改app.config的connectionString,改变其Initial Catelog为所需要的数据库。结论:不能用,好像是连接池搞的鬼,有待于进一步研究。
               
展开阅读全文

没有更多推荐了,返回首页