查看原文
其他

.NET Core平台日志记录框架:NLog+Mysql

DotNet 2019-08-03

(点击上方蓝字,可快速关注我们)


来源:依乐祝

cnblogs.com/yilezhu/p/9416439.html


《.NET Core集成Exceptionless分布式日志功能以及全局异常过滤》有人说比较重量,生产环境部署也比较麻烦。因此就有了今天的这篇文章。


如果你的项目(网站或者中小型项目)不是很大,日志量也不多的话可以考虑NLog+Mysql的组合。因为NLog具有高性能,易于使用,易于扩展和灵活配置的特点能够让你快速集成日志记录功能。


NLog是什么?


这里还是简单介绍一下吧,为了让小白也知道。NLog是一个灵活的免费日志记录平台,适用于各种.NET平台,包括.NET Core。NLog可以通过简单地配置就可以可以很方便的写入多个日志仓库中(数据库,文件,控制台)。


NLog在Net Core中怎么用啊?


1、用之前你得新建一个ASP.NET Core 项目吧。这里以.NET Core API为例吧。如下图所示是博主刚刚创建的.NET Core API项目。



建好项目之后干什么呢、当然得添加引用了。你可以随心所欲的使用Nuget或者命令进行安装


Install-Package NLog -Version 4.5.7

Install-Package NLog.Web.AspNetCore -Version 4.5.4


2、上面说了,NLog只需要简单地修改配置就可以使用,那接下来就是新建一个NLog配置文件了。你可以通过Nuget或者程序包控制台进行安装,也可以自己新建一个NLog.config文件。这里还是通过程序包控制台进行安装吧


Install-Package NLog -Version 4.5.7


安装后看到项目目录多了一个NLog.config文件。这里需要注意,右键设置一下这个NLog.config的属性为“始终复制”



3、打开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"

       autoReload="true"

      throwExceptions="true"

      internalLogLevel="Off">

  <targets>

    <target xsi:type="Null" name="blackhole" />

    <target name="database" xsi:type="Database"

              dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"

              connectionString="server=127.0.0.1;Database=nlog;user id=root;password=123456;SslMode=none"

             >

      <!--

CREATE TABLE `log` (

  `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `Application` varchar(50) DEFAULT NULL,

  `Logged` datetime DEFAULT NULL,

  `Level` varchar(50) DEFAULT NULL,

  `Message` varchar(512) DEFAULT NULL,

  `Logger` varchar(250) DEFAULT NULL,

  `Callsite` varchar(512) DEFAULT NULL,

  `Exception` varchar(512) DEFAULT NULL,

  PRIMARY KEY (`Id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;


-->

      <commandText>

        insert into nlog.log (

        Application, Logged, Level, Message,

        Logger, CallSite, Exception

        ) values (

        @Application, @Logged, @Level, @Message,

        @Logger, @Callsite, @Exception

        );

      </commandText>

      <parameter name="@application" layout="NLogTestDemo" />

      <parameter name="@logged" layout="${date}" />

      <parameter name="@level" layout="${level}" />

      <parameter name="@message" layout="${message}" />

      <parameter name="@logger" layout="${logger}" />

      <parameter name="@callSite" layout="${callsite:filename=true}" />

      <parameter name="@exception" layout="${exception:tostring}" />

    </target>


  </targets>


  <rules>

    <!--Skip Microsoft logs and so log only own logs-->

    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />

    <logger name="NLogTestDemo.*" minlevel="Info" writeTo="database" />

  </rules>

</nlog>


4、上面的代码中我是以写入mysql为例进行的NLog配置。下面就可以进行简单地使用了。首先需要在。首先在Startup中的Configure中来加入中间件:


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

{

    if (env.IsDevelopment())

    {

        app.UseDeveloperExceptionPage();

    }


    //使用NLog作为日志记录工具

    loggerFactory.AddNLog();

    //引入Nlog配置文件

    env.ConfigureNLog("Nlog.config");

    //app.AddNLogWeb();

    app.UseMvc();

}


5、在Program中进行如下配置:


public class Program

{

    public static void Main(string[] args)

    {

        CreateWebHostBuilder(args).Build().Run();

    }


    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>

        WebHost.CreateDefaultBuilder(args)

        .UseNLog()

            .UseStartup<Startup>();

}


6、下面就可以在代码中愉快的玩耍了,


private readonly Logger nlog = LogManager.GetCurrentClassLogger(); //获得日志实;


// GET api/values

[HttpGet]

public ActionResult<string> Get()

{

    nlog.Log(NLog.LogLevel.Debug, $"yilezhu测试Debug日志");

    nlog.Log(NLog.LogLevel.Info, $"yilezhu测试Info日志");

    try

    {

        throw new Exception($"yilezhu故意抛出的异常");

    }

    catch (Exception ex)

    {


        nlog.Log(NLog.LogLevel.Error, ex, $"yilezhu异常的额外信息");

    }

    return "yilezhu的返回信息";

}


下面运行起来项目,然到数据库里面就可以看到记录的日志信息如下所示:



这里大家可能会问,为什么没有Debug信息输出呢,这是因为我们上面NLog配置设置的记录日志的最低级别为Info.所以比Info级别小的Debug信息不会记录。如果想记录的话就把这个级别设置成Debug或者比Debug小的Trace就可以记录了。如下图所示:



总结


本文开头讲述了分布式日志记录框架Exceptionless部署困难说起,然后引出轻量级简单易用的NLog日志框架,并通过一个简单地api项目讲述了NLog如何在Net Core中使用。


并且给出了NLog日志记录在mysql中的使用配置。以及mysql的建表语句。希望能对大家有所参考!


看完本文有收获?请转发分享给更多人

关注「DotNet」,提升.Net技能 

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存