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集成的搜索、过滤、图标分析等功能, 来快速诊断应用程序当中的警告、错误信息等,简单配置,轻量级的组件,是一个不错的选项。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?