Net Core 2.1 日志記錄框架NLog+Mysql配置


NLog是什么?

這里還是簡單介紹一下吧,為了讓小白也知道。NLog是一個靈活的免費日志記錄平台,適用於各種.NET平台,包括.NET Core。NLog可以通過簡單地配置就可以可以很方便的寫入多個日志倉庫中(數據庫,文件,控制台)。

NLog在Net Core中怎么用啊?

  1. 用之前你得新建一個asp.net core項目吧。這里以net core api為例吧。如下圖所示是博主剛剛創建的net core api項目。

 

  1. 建好項目之后干什么呢、當然得添加引用了。你可以隨心所欲的使用Nuget或者命令進行安裝

    Install-Package NLog -Version 4.6.5
    Install-Package NLog.Web.AspNetCore -Version 4.8.4
    Install-Package MySql.Data -Version 8.0.16

     

  2. 上面說了,NLog只需要簡單地修改配置就可以使用,那接下來就是新建一個NLog配置文件了。你可以通過Nuget或者程序包控制台進行安裝,也可以自己新建一個NLog.config文件。這里還是通過程序包控制台進行安裝吧

    安裝后看到項目目錄多了一個NLog.config文件。這里需要注意,右鍵設置一下這個NLog.config的屬性為“始終復制”

    1532873688872

  3. 打開nlog.config文件,看看里面的結構,發現有兩個重要節點,一個是聲明目標 一個是聲明規則。如下圖所示,我配置了一個寫入文件,一個寫入mysql的target.並定義了不同的寫入規則,大家可以根據實際需要參照着自定義規則以及target.

    <?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="nlog.txt">
      <targets async="true"><!--async設置同步異步 true:異步 false:同步-->
        <target name="file" xsi:type="File"
                layout="${longdate} ${logger} ${message}${exception:format=ToString}"
                fileName="${basedir}/logs/nlog.txt"
                keepFileOpen="true"
                encoding="utf-8" />
        <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=數據庫名;user id=root;password=111111;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,
      `Title` varchar(512) DEFAULT NULL,
      PRIMARY KEY (`Id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
    -->
          <commandText>
            insert into logs (
            Application, Logged, Level, Message,
            Logger, CallSite, Exception,Title
            ) values (
            @Application, @Logged, @Level, @Message,
            @Logger, @Callsite, @Exception,@title
            );
          </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}" />
          <parameter name="@title" layout="${event-context:item=title}" /><!--自定義字段-->
        </target>
    
      </targets>
    
      <rules>
        <logger name="*" minlevel="Debug" writeTo="file" />
        <!--Skip Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
        <logger name="*" minlevel="Debug" 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. 下面就可以在代碼中愉快的玩耍了,

    [Route("api/[controller]")]
        [ApiController]
        public class ValuesController : ControllerBase
        {
            private readonly Logger nlog = LogManager.GetCurrentClassLogger(); //獲得日志實;
            // GET api/values
            [HttpGet]
            public ActionResult<IEnumerable<string>> Get()
            {
    
                //1、沒有加自定義字段測試
                //nlog.Log(LogLevel.Debug, $"測試Debug日志");
                //nlog.Log(LogLevel.Info, $"測試Info日志");
                //try
                //{
                //    throw new Exception($"故意拋出的異常");
                //}
                //catch (Exception ex)
                //{
    
                //    nlog.Log(LogLevel.Error, ex, $"異常的額外信息");
                //}
    
                //2、添加自定義字段測試
                //LogEventInfo log = new LogEventInfo();
                //log.Properties["title"] = "測試吧";
                //log.Level = LogLevel.Debug;
                //log.Message = "測試Debug";
                //nlog.Log(log);

                 //3、測試異步同步
                 //設置<targets async="true"> true:異步 false:同步
                 //Stopwatch sw = new Stopwatch();
                 //sw.Restart();
                 //for (int i = 0; i < 5000; i++)
                 //{
                 // Manager.LogManager.Debug(new NLogInfo { message=$"異步測試---{i}" });//記錄到數據庫
                 //}
                 //sw.Stop();
                 //var s = sw.ElapsedMilliseconds;  耗時:600ms

                return new string[] { "value1", "value2" };
            }
            
        }

     

     
  7. 下面運行起來項目,然到數據庫里面就可以看到記錄的日志信息如下所示:

     

    這里大家可能會問,為什么沒有Debug信息輸出呢,這是因為我們上面NLog配置設置的記錄日志的最低級別為Info.所以比Info級別小的Debug信息不會記錄。如果想記錄的話就把這個級別設置成Debug或者比Debug小的Trace就可以記錄了。如下圖所示:

     

原帖:https://blog.csdn.net/qq_42564846/article/details/81407097


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM