在微服务或分布式系统中, 如果将日志作为文件输出, 查看系统日志将非常不便; 如果将日志保存到数据库中, 又不能进行全文搜索. 在这里我们将日志输出到 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 里查询截图:
来源: http://www.bubuko.com/infodetail-3110621.html