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日志配置的主要内容,如果未能解决你的问题,请参考以下文章