专栏首页HueiFeng技术专栏Asp.Net Core NLog 将日志输出到数据库以及添加LayoutRenderer的支持
原创

Asp.Net Core NLog 将日志输出到数据库以及添加LayoutRenderer的支持

在这之前打算用Apache的Log4Net,但是发现其AdoNetAppender方法已经不存在了,无法使用配置文件直接输出到数据库了,因此我便改用了NLog框架。

一、对项目添加NLog

通过Nuget安装NLog NLog.Extensions.Logging、NLog.Web.AspNetCore

       二、对NLog.config进行配置

     项目中添加NLog.config配置文件

<?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" autoReload="true" internalLogLevel="Trace" internalLogFile="internal-nlog.txt"> <!-- define various log targets --> <targets> <!-- write logs to file --> <target xsi:type="File" name="allfile" fileName="${var:configDir}\nlog-all.log"              layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}"/>

<target xsi:type="File" name="ownFile-web" fileName="${var:configDir}\nlog-own.log"              layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|  ${message} ${exception} " />

<target xsi:type="Null" name="blackhole" />

<target name="database" xsi:type="Database"> <connectionString>${var:connectionString}</connectionString> <commandText>          INSERT INTO [dbo].[System_SqlLog]          ([SqlLogId]          ,[CreateUserId]          ,[CreateUserCode]          ,[CreateUserName]          ,[CreateTime]          ,[OperateSql]          ,[EndDateTime]          ,[ElapsedTime]          ,[Parameter])          VALUES          (@SqlLogId          ,@CreateUserId          ,@CreateUserCode          ,@CreateUserName          ,@CreateTime          ,@OperateSql          ,@EndDateTime          ,@ElapsedTime          ,@Parameter); </commandText> <parameter name="@SqlLogId" layout="${event-context:item=SqlLogId}"/> <parameter name="@CreateUserId" layout="${event-context:item=CreateUserId}" /> <parameter name="@CreateUserCode" layout="${event-context:item=CreateUserCode}"/> <parameter name="@CreateUserName" layout="${event-context:item=CreateUserName}"/> <parameter name="@CreateTime" layout="${event-context:item=CreateTime}"/> <parameter name="@OperateSql" layout="${event-context:item=OperateSql}" /> <parameter name="@EndDateTime" layout="${event-context:item=EndDateTime}" /> <parameter name="@ElapsedTime" layout="${event-context:item=ElapsedTime}" /> <parameter name="@Parameter" layout="${event-context:item=Parameter}" /> </target> </targets>    <rules> <!--All logs, including from Microsoft--> <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--Skip Microsoft logs and so log only own logs--> <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /> <logger name="SqlLogToDatabase" minlevel="Debug" writeTo="database" /> <logger name="*" minlevel="Trace" writeTo="ownFile-web" /> </rules> </nlog>

  • Nlog节点如果设置 InternalLogLevel,internalLogFile 可以查看NLog输出日志时的内部信息,并且可以再里面检查配置文件错误等。
  • database target内可以指定connectionString,Sql语句,Sql参数等

         三、添加NLog到 .Net Core中

       四、执行

public virtual void WriteLog() {             Logger iLog = LogManager.GetCurrentClassLogger();             if (iLog.IsInfoEnabled) {                 LogEventInfo ei = new LogEventInfo(NLog.LogLevel.Info, "", "");                 ei.Properties["SqlLogId"] = CombUtil.NewComb();                 iLog.Info(ei);             }         }

     这样便可以将定义的值添加到数据库中。

      五、LayoutRenderer的应用

     根据上面的操作并满足不了我当前框架的应用,我所需要的是直接传对象,但是直接iLog.Info(T);并不会获取到值,他会获取到空值。

在这里操作的话就得需要自定义LayoutRenderer。

    这个我们可以看出他是一个泛型方法,所以往里面插入对象是可行的。下面我说一下怎么重写LayoutRenderer。直接上代码

Append会返回一个数据给当前调用者。然后我们再修改一下配置文件NLog.config。

并且我们还需要加载此程序集

这样就会将对应的值插入到我们的数据库中了。

  1. <targets/>定义日志的目标/输出
    1. type - 目标的类型 - 比如“File”,“Database”,“Mail”。如果你使用了名字空间,这个属性会被命名为 xsi:type.
  2. <rules /> - 定义日志的路由规则
  3. <extensions /> - 从*.dll加载NLog扩展
  4. <include /> - 导入外部配置文件
  5. <variable /> - 为配置变量赋值

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ASP.NET Core ResponseCache进行缓存操作

    本章将介绍客户端缓存将介绍浏览器缓存和服务端缓存,使用浏览器缓存将减少对web服务器的请求次数,同时可以提升性能,避免重复的运算浪费。

    HueiFeng
  • TypeScript类型断言

    通过如上代码,当我们获取length的时候会报错因为我们赋值为20所以不存在属性length,那么我们就可以采用类型断言去做处理

    HueiFeng
  • ASP.NET Core AutoWrapper 自定义响应输出

    AutoWrapper是一个简单可自定义全局异常处理程序和ASP.NET Core API响应的包装。他使用ASP.NET Core middleware拦截传...

    HueiFeng
  • spring 之 import标签、alias标签、beans标签 解析

    java404
  • C#多播委托(Multicast Delegate)

    委托可以包含多个方法,这种委托称为多播委托。如果调用多播委托,就可以按顺序连续调用多个方法。为此,委托的签名必须返回void,否则就只能得到委托调用的最后一个方...

    卡尔曼和玻尔兹曼谁曼
  • 图论加法

    在读到这个标题的时候,小伙伴是不是会觉得很疑惑,为什么图论能有加法?难道两个图可以加在一起?两个点可以加在一起? 在原来的数学范围是做不到的,但是如果是定义了一...

    林德熙
  • springmvc整合axis2 过程

    项目需要使用springmvc发布一个对外的服务,原来使用spring+cxf的结合,使用axis2的客户端调用,没有任何问题,但是使用pb9的客户端调用,一直...

    用户5640963
  • 《吊打面试官》系列-重复消费、顺序消费、分布式事务

    消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。

    Java3y
  • 通过shell定制dbms_advisor.quick_tune(r4笔记第15天)

    在平时的调优工作中,在11g中的新特性sql monitor可以极大的简化性能监控的工作,对于执行时间超过5秒的sql语句都会记入v$sql_monitor中...

    jeanron100
  • 谈谈分布式事务之二:基于DTC的分布式事务管理模型[下篇]

    [续上篇]当基于LTM或者KTM的事务提升到基于DTC的分布式事务后,DTC成为了本机所有事务型资源管理器的管理者;此外,当一个事务型操作超出了本机的范围,出现...

    蒋金楠

扫码关注云+社区

领取腾讯云代金券