NLog写入Mongo日志配置

Posted gavin-num1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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"
    }

 

以上是关于NLog写入Mongo日志配置的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Nlog 将日志写入 Azure

从 msi 安装程序安装时,NLog 不写入日志

.Net -- NLog日志框架配置与使用

Nlog不会写入Windows服务中的日志文件

在 NLog 使用 AsyncWrapper 后大部分日志丢失

Net Core 2.1 日志记录框架NLog+Mysql配置