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:[email protected]: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" };
}