您的位置:首页 > 数据库 > Mongodb

【NLog】.net core 使用NLog将日志存入MongoDB

2019-03-14 18:13 113 查看

1、安装Nuget包:
NLog;
NLog.Web.AspNetCore;
NLog.Mongo;
NLog.WindowsIdentity;

NLog.WindowsIdentity不一定需要,如果运行时报异常(如果配置文件中throwException设置为false,不会报异常):找不到“windows-identity”就需要安装这个包。

2、配置文件:

<?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"
throwExceptions="true"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">

<!-- enable  mongodb layout renderers -->
<extensions>
<add assembly="NLog.WindowsIdentity"/>
<add assembly="NLog.Mongo"/>
</extensions>

<targets>
<!-- write log to mongodb-->
<target xsi:type="Mongo"
name="mongo" databaseName="TestLog"
collectionName="Logs"
connectionString="mongodb://tang:tang@192.168.43.234:27017/TestLog"
IncludeDefaults="false"
>
<Field name="Date" layout="${date:format=yyyy-MM-dd HH\:mm\:ss}"  />
<Field name="Level" layout="${level}" />
<Field name="Logger" layout="${logger}"/>
<Field name="Message" layout="${message}" />
<Field name="Exception" layout="${exception:format=tostring}" />
<Field name="CallSite" layout="${callsite:filename=true}"/>
<Field name="StackTrace" layout="${stacktrace}"/>
</target>

</targets>

<rules>
<!-- add your logging rules here -->
<logger name="*" minlevel="Trace" writeTo="mongo"/>
</rules>
</nlog>

这里有几个需要注意的地方:
(1)NLog中默认没有MongoDB的 layout renderers,需要单独引入,即上面的

<extensions>...</extensions>

(2)配置MongoDB时,若不加“IncludeDefaults=false”,不写Field,就会在MongoDB中应用默认集合,包含“ID”,“Date”,“Logger”,“Exception”等。
设置IncludeDefaults=false,然后通过自定义Field,自定义MongoDB集合中显示的内容。更具体的可以查看GitHub上的NLog.Mongo的源码,dalao的代码写得非常清晰:
https://github.com/loresoft/NLog.Mongo

(3)Field Date中,date默认为string类型,可以加
bsonType=DateTime
将其设置为DateTime类型。但是这里的DateTime为国际标准时间,与北京时间相差8小时,而且format格式有问题,比如我设置了年月日 时分秒格式,最后输出的时间还是带毫秒的,只不过毫秒位置都是0。如果用默认的string格式,输出的是系统时间,且格式化有效,但是反序列化时,只能反序列化为string类型,反序列为DateTime类型会报错。
(4)其它配置内容可以参考官方配置文档:
https://nlog-project.org/config/

3、调用:
Program.cs

using NLog.Web;

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseNLog();

Startup.cs

using NLog.Extensions.Logging;
using NLog.Web;

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

//使用NLog作为日志记录工具
loggerFactory.AddNLog();
//引入Nlog配置文件,这里配置文件在项目根目录下
env.ConfigureNLog("NLog.config");

app.UseMvc();
}

在其它类中记录日志:

private readonly Logger nlog = LogManager.GetCurrentClassLogger();
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
nlog.Log(LogLevel.Debug, "Debug");
nlog.Log(LogLevel.Info, "Info");
try
{
throw new Exception("异常");
}
catch (Exception ex)
{

nlog.Log(LogLevel.Error, ex, "异常的附加信息");
}
return new string[] { "value1", "value2" };
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: