• NLog写入Mongo日志配置


    Web网站中引入了NLog日志,日志记录在Mongo数据库中,经过两天的简单学习,现简要记录说明下:

    首先贴出NLog的学习地址: https://github.com/NLog/NLog/wiki/Tutorial ,使用的NLog版本为:4.5+

    以及此次项目中的NLog配置文档 :(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"
          xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
          autoReload="true"
          throwExceptions="false"
          internalLogLevel="Off" internalLogFile="c:	emp
    log-internal.log">
      
      <extensions>
        <add assembly="NLog.Mongo"/>
        <add assembly="NLog.Web"/>
      </extensions>
      <targets>   
        <target xsi:type="Mongo"
            name="mongoDefault"
            connectionString="mongodb://192.168.106.56/MongoDB"
            collectionName="SysErrorLog"
            cappedCollectionSize="26214400">
          <field name="Date" layout="${longdate}"/>
          <property name="RequestIP" layout="${aspnet-request-ip}" />
          <property name="UserName" layout="$UserName" />
          <property name="BaseDir" layout="${aspnet-appbasepath}"/>
          <property name="QueryUrl" layout="${aspnet-request-url}"/>
          <property name="Method" layout="${aspnet-request-method}"/>
          <property name="Controller" layout="${aspnet-mvc-controller}"/>
          <property name="Action" layout="${aspnet-mvc-action}" />
          <property name="FormContent" layout="${aspnet-request-form}"/>
          <property name="QueryContent" layout="${aspnet-request-querystring}"/>
        </target>
      </targets>
      <rules>
        <logger name="*" minlevel="Info" maxlevel="Fatal" writeTo="mongoDefault"/>
      </rules>
    </nlog>

    相关节点的说明:

    <target> 日志输出目标。目前NLog支持八十余种输出,如控制台,邮件,窗体,数据库等。具体支持的目标,可参考 这里 。一个<targets>中可以配置多个<target>输出。

        1、target属性中标记了当前 target 的名称以及要输出到相关MongoDB的配置。

        2、<field>指定 document中的根字段,name 对应的根节点名称,layout 对应输出值

        3、<property> 指定 document中的properties节点中的子节点,name 对应的根节点名称,layout 对应输出值

        4、不同的应用中,NLog能获取的系统参数可以看 这里 。

    <rules> 指定 loger 的输出目标,即指定 logger 使用哪个 target 进行输出日志。本节配置指定最小级别为Info,最高级别为Fatal,并使用名称为 "mongoDefault" 的 target。

    <extensions> NLog使用的扩展库。

    由上边两个图知道,我们使用的MongoDB配置引用了 NLog.Mongo 动态库。layout中使用获取的 Web 参数使用了 NLog.Web动态库。不仅要在Nuget上获取这两个动态库,还应该在配置中引入。

    关于日志中加入用户参数的使用说明:

           

    public static void Error(Exception ex)
    {

                 Logger logger = LogManager.GetCurrentClassLogger();

            var UserName = Config.Identity?.Name ?? "";
            var Target = ex.TargetSite.Name ?? "";
            var parms = ex.Data?.ToDictionary().Select(k => k.Key + "=" + k.Value).Join() ?? "";

           LogEventInfo theEvent = new LogEventInfo();
                theEvent.Exception = ex;
                theEvent.Message = ex.Message;
                theEvent.Properties["Target"] = Target;
                theEvent.Properties["Parameters"] = parms;
                theEvent.Properties["UserName"] = UserName;
                logger.Error(theEvent);
    }

    使用LogEventInfo写入自定义参数。本节中,将用户自定义的参数都放入到document的Properties节点中。

    注:如果对应的节点值为空,则NLog不会写入该节点。

    程序调用代码:

                try
                {
                    throw new DivideByZeroException("Opps");
                }
                catch (Exception e)
                {
                    e.Data.Add(nameof(a),a);
                    e.Data.Add(nameof(b), b);
                    Error(e);
                }

    输入日志格式如下:

        "_id" : ObjectId("5c8867288d14af392479e58f"),
        "Date" : "2019-03-13 10:12:56.5343",
        "Level" : "Error",
        "Logger" : "Test.Web.Window.LogHelper",
        "Message" : "Opps",
        "Exception" : {
            "Message" : "Opps",
            "BaseMessage" : "Opps",
            "Text" : "System.DivideByZeroException: Opps
       在 Test.Web.Window.Controllers.TestController.Divid(Double a, Double b) 位置 D:\Projects\Common\Test.Web\Test.Web\Test.Web.Window\Controllers\TestController.cs:行号 35",
            "Type" : "System.DivideByZeroException",
            "HResult" : -2147352558,
            "Source" : "Test.Web.Window",
            "MethodName" : "Divid",
            "ModuleName" : "Test.Web.Window",
            "ModuleVersion" : "1.0.0.0"
        },
        "Properties" : {
            "RequestIP" : "::1",
            "UserName" : "admin",
            "BaseDir" : "D:\Projects\Common\Test.Web\Test.Web\Test.Web.Window\",
            "QueryUrl" : "http://localhost/test/index",
            "Method" : "GET",
            "Controller" : "test",
            "Action" : "index",
            "Target" : "Divid",
            "Parameters" : "a=5,b=0"
        }
  • 相关阅读:
    MySQL缓存分类
    Babel 是干什么的
    npm是干什么的?
    在改变某一项目的svn的地址,relocate
    在搭建服务器的时候,svn最好与项目所部署的服务器分开
    简述负载均衡和CDN技术
    nginx介绍
    NideShop项目的安装部署教程
    Navicat破解
    当返回的不是单独的一种数据格式
  • 原文地址:https://www.cnblogs.com/gavin-num1/p/10524677.html
Copyright © 2020-2023  润新知