在微服務或分布式系統中,如果將日志作為文件輸出,查看系統日志將非常不便;如果將日志保存到數據庫中,又不能進行全文搜索。在這里我們將日志輸出到ElasticSearch中,借助Kibana再查找日志。
添加Nuget引用
需要添加兩個Nuget引用:NLog.Web.AspNetCore和NLog.Targets.ElasticSearch
配置
新增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" internalLogToConsole="true"> <extensions> <add assembly="NLog.Targets.ElasticSearch"/> </extensions> <targets> <!--ElasticSearch保存日志信息--> <target name="ElasticSearch" xsi:type="ElasticSearch" ConnectionStringName="ElasticSearchServerAddress" index="userapi-${date:format=yyyy.MM.dd}" documentType="doc" includeAllProperties="true" layout="[${date:format=yyyy-MM-dd HH\:mm\:ss}][${level}] ${logger} ${message} ${exception:format=toString}"> <field name="MachineName" layout="${machinename}" /> <field name="Time" layout="${longdate}" /> <field name="level" layout="${level:uppercase=true}" /> <field name="logger" layout=" ${logger}" /> <field name="message" layout=" ${message}" /> <field name="exception" layout=" ${exception:format=toString}" /> <field name="processid" layout=" ${processid}" /> <field name="threadname" layout=" ${threadname}" /> <field name="stacktrace" layout=" ${stacktrace}" /> <field name="Properties" layout="${machinename} ${longdate} ${level:uppercase=true} ${logger} ${message} ${exception}|${processid}|${stacktrace}|${threadname}" /> </target> </targets> <rules> <logger name="*" minlevel="INFO" writeTo="ElasticSearch" /> </rules> </nlog>
修改appsettings.json,增加如下節點,注意,經調試源碼才發現,這里必須將連接增加到ConnectionStrings節點下,ElasticSearchServerAddress節點名稱對應nlog.config中ConnectionStringName的名稱。
"ConnectionStrings": { "ElasticSearchServerAddress": "http://192.168.2.97:9200,http://192.168.2.101:9200,http://192.168.2.102:9200" }
修改代碼
修改Program.cs文件:
public static void Main(string[] args) { NLogBuilder.ConfigureNLog("nlog.config"); BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseNLog() .UseStartup<Startup>() .Build();
修改Startup.cs文件:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddNLog(); }
測試
public class ValuesController : Controller { private ILogger _logger; public ValuesController(ILogger<ValuesController> logger) { _logger = logger; } [HttpGet] public IEnumerable<string> Get() { _logger.LogInformation("測試一下,不要緊張!"); return new string[] { "value1", "value2" }; } }
kibana里查詢截圖: