ASP.NET Core之NLog、SEQ、ILogger构建可视化日志

一、前言

  上述章节,通过使用OpenTelemetry+SEQ实现了日志可视化的功能,其中OpenTelemetry提供结构化日志,并且传输到SEQ的功能。在前一章节中使用了一样实现结构化日志的日志库NLog和Serilog,那么能否使用Serilog或者NLog+SEQ完成日志的可视化?所以通过本章的实践来得出结论。

  注意:SEQ是具备收费性质的软件,在个人版本是免费,在团队、标准、数据中心版本是收费使用的。参考https://datalust.co/pricing

二、实践

  第一步、完成SEQ的安装,在上一个章节中已经完成安装,主要注意如下一个安装设置项,日志存储的物理位置,日志接入、面板地址、默认管理账号密码信息。

  第二步、在创建的ASP.NET Core的中引入安装包NLog(NLog基本的类包),NLog.Web.AspNetCore(适配ASP.NET Core,Web应用的包),NLog.Targets.Seq(将日志传入目标为Seq的包),NLog.Extensions.Logging(扩展包)结合ASP.NET Core框架自带的ILogger类。全部使用最新版本,适应.NET 8.0框架。

 

  第三步、上一章节中实践NLog日志库,是一个灵活性,代码入侵少的库,所以通过在NLog中进行相关的配置,就可以对接到目标为SEQ的日志可视化中,配置如下所示。

复制代码
<?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"
      internalLogLevel="info"
      throwConfigExceptions="true">

  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
    <add assembly="NLog.Targets.Seq"/>
  </extensions>

  <variable name="OwnWebLayout"
              value="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"/>

  <targets async="true">
    <target name="seq" xsi:type="BufferingWrapper" bufferSize="1000" flushTimeout="2000">
      <target xsi:type="Seq" serverUrl="http://localhost:5341" apiKey="" >
        <property name="MachineName" value="${machinename}" />
        <property name="LogType" value="${event-properties:item=LogType}" />
      </target>/>
    </target>
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="seq" />
  </rules>
</nlog>
复制代码

  如上配置,在<extensions>标签中引入刚才的包NLog.Targets.Seq的包,并且<targets>标签定义日志写入的目标是Seq,设置服务的地址、属性之,路由规则。所以,通过配置就完成整个接入,体现灵活性和高可扩展。

复制代码
using NLog;
using NLog.Web;

namespace tqf.nlogSeq.Demo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
            logger.Debug("init main");
            try
            {
                var builder = WebApplication.CreateBuilder(args);
                // Add services to the container.
                builder.Services.AddControllers();

                // 启用NLog
                /*
                builder.Services.AddLogging(loggingBuilder =>
                {
                    loggingBuilder.ClearProviders();
                    loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
                    loggingBuilder.AddNLogWeb();
                });
                */
                // NLog: Setup NLog for Dependency injection
                builder.Logging.ClearProviders();
                builder.Logging.AddNLogWeb("n.config");// 加载日志配置项文件,默认根目录下NLog.config
                builder.Host.UseNLog();// 使用NLog为Microsoft.Extensions.Logging的日志记录
                var app = builder.Build();
                // Configure the HTTP request pipeline.
                app.UseAuthorization();
                app.MapControllers();
                app.Run();
            }
            catch (Exception ex)
            {
                logger.Error(ex, "Stopped program because of exception");
                throw;
            }
            finally
            {
                NLog.LogManager.Shutdown();
            }
        }
    }
}
复制代码
复制代码
using Microsoft.AspNetCore.Mvc;

namespace tqf.nlogSeq.Demo.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            _logger.LogInformation("开始输出日志信息");
            _logger.LogDebug("开始输出调试信息!");
            _logger.LogError("开始输出错误信息!");
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}
复制代码

  第四步、登录SEQ服务的面板,查看相关日志数据。

三、总结

  通过上述操作,如果想实现一个结构化日志,并且实现日志的收集、日志查询,使用NLog+SEQ可以很好满足这些要求,使用Seq集成的搜索、过滤、图标分析等功能, 来快速诊断应用程序当中的警告、错误信息等,简单配置,轻量级的组件,是一个不错的选项。

posted @   tuqunfu  阅读(261)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示