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


             

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

            一、对项目添加NLog

    通过Nuget安装NLog NLog.Extensions.LoggingNLog.Web.AspNetCore
     
     
    image

           二、对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} log-all.log"
                 layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}"
    />


        <target xsi:type="File" name="ownFile-web" fileName="${var:configDir} log-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中

       image
     
     
    image

           四、执行

      
    复制代码

    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。直接上代码
    image
     
    Append会返回一个数据给当前调用者。然后我们再修改一下配置文件NLog.config。
    image
    并且我们还需要加载此程序集
    image
    这样就会将对应的值插入到我们的数据库中了。
    1. <targets/>定义日志的目标/输出
      1. type - 目标的类型 - 比如“File”,“Database”,“Mail”。如果你使用了名字空间,这个属性会被命名为 xsi:type.
    2. <rules /> - 定义日志的路由规则
    3. <extensions /> - 从*.dll加载NLog扩展
    4. <include /> - 导入外部配置文件
    5. <variable /> - 为配置变量赋值
     交流群:743523033
  • 相关阅读:
    struts2ModelDriven模型驱动
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    struts2Token Interceptor(处理表单重复提交)
    strutsOGNL标签
    嵌入式关系型SQLite数据库
    SQLite数据库的增删改查
    Pull解析器解析XML文件和生成XML文件
    proguard.cfg 系统找不到指定的文件
    struts2ONGL原理和表达式
    写代码的三重境界 Hanson
  • 原文地址:https://www.cnblogs.com/yyfh/p/9070833.html
Copyright © 2020-2023  润新知