天天看点

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

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" };
        }