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

         

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

        一、对项目添加NLog

通过Nuget安装NLog NLog.Extensions.LoggingNLog.Web.AspNetCore
 
 
Asp.Net Core NLog 将日志输出到数据库以及添加LayoutRenderer的支持_第1张图片

       二、对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">
 
   <targets>
   
     <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>
   
     <logger name="*" minlevel="Trace" writeTo="allfile" />

   
    <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中

   Asp.Net Core NLog 将日志输出到数据库以及添加LayoutRenderer的支持_第2张图片
 
 
Asp.Net Core NLog 将日志输出到数据库以及添加LayoutRenderer的支持_第3张图片

       四、执行

  
复制代码

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。
image
    这个我们可以看出他是一个泛型方法,所以往里面插入对象是可行的。下面我说一下怎么重写LayoutRenderer。直接上代码
Asp.Net Core NLog 将日志输出到数据库以及添加LayoutRenderer的支持_第4张图片
 
Append会返回一个数据给当前调用者。然后我们再修改一下配置文件NLog.config。
image
并且我们还需要加载此程序集
image
这样就会将对应的值插入到我们的数据库中了。
  1. 定义日志的目标/输出
    1. type - 目标的类型 - 比如“File”,“Database”,“Mail”。如果你使用了名字空间,这个属性会被命名为 xsi:type.
  2. - 定义日志的路由规则
  3. - 从*.dll加载NLog扩展
  4. - 导入外部配置文件
  5. - 为配置变量赋值
 交流群:743523033

你可能感兴趣的:(Asp.Net Core NLog 将日志输出到数据库以及添加LayoutRenderer的支持)