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

一、前言

  在上两个章节,我们介绍使用文本文件记录日志、并且学习了OpenTelemetry在日志、监控、链路上的可观测性、标准化高效组件。所以本章基于上述内容来学习,构建可视化的日志,日志管理的无非包括日志来源、日志采集、日志过滤、日志存储、日志可视化、日志的搜索功能。通过各种组件的组合满足上述功能,服务于分布式或者微服务系统构建高效的日志管理体系,从而满足业务或者开发人员开发、调试、运维系统需求。

二、SEQ

  在基于OpenTelemetry+SEQ+ASP.NET Core的Microsoft.Extensions.Logging前先来熟悉SEQ。1、SEQ是一个平台,Seq是一个用于结构化应用程序日志和跟踪的实时搜索和分析服务器。其精心设计的用户界面、JSON事件存储和熟悉的查询语言使其成为检测和诊断复杂应用程序和微服务中问题的高效平台。2、Seq是自托管的,在Windows或Docker/Linux下运行。您可以将Seq部署到自己的基础设施中,也可以轻松地在任何公共云中启动实例。3、应用程序遥测可以从各种日志库和协议中获取。警报和通知可以发送到各种各样的输出。而且,输入和输出插件都可以用任何语言或使用编写。NET应用程序SDK。

  通过上述架构图,SEQ是处于一个核心位置,围绕SEQ来收集从Applicationn传输来的结构化日志(Log data);Seq使用JSON事件存储的方式进行存储并且在获取数据;开发或者运维使用通过提供的可视化界面,使用SQL语句便捷的查询相关日志数据;提供多种方式进行通知提醒功能。

三、实践

  第一步、安装SEQ,在下载地址https://datalust.co/Download,基于测试环境选择Windows的安装包;或者使用docker的方式安装。在安装过程中会输入两个重要的信息,一个是Storage(存储)的路径,一个是控制面板的访问地址。同时在windows环境注册成Windows服务,减少服务开启操作。

 

  第二步、安装完成,通过配置的地址访问控制面板,如果访问成功则表示服务开启(注意初始化的账号密码信息)

   上述内容是界面管理包括历史日志数据、下面的是SEQ日志存储的位置,及其存储文件信息。

  第四步、在ASP.NET Core中集成OpenTelemetry,通过OpenTelemetry构建结构化日志,并且将logs传输到SEQ中存储查询。创建一个ASP.NET Core的应用,引入相关的包OpenTelemetry.Exporter.OpenTelemetryProtocol、OpenTelemetry.Extensions.Hosting。在program中注入OpenTelemetry的日志服务。

复制代码
using OpenTelemetry.Exporter;
using OpenTelemetry.Logs;
using OpenTelemetry.Resources;

namespace apiDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            builder.Logging.AddOpenTelemetry(options =>
            {
                options.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(builder.Environment.ApplicationName));
                options.IncludeScopes = true;
                options.AddOtlpExporter(otlpOptions =>
                {
                    otlpOptions.Protocol = OtlpExportProtocol.HttpProtobuf;
                    otlpOptions.Endpoint = new Uri("http://localhost:5341/ingest/otlp/v1/logs");
                });
            });
            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}
复制代码

  通过使用otlpOptions.Endpoint参数,使用HTTP的方式将日志传输至SEQ中,http://localhost:5341/ingest/otlp/v1/logs代表了SEQ接收日志。

  第五步、在应用程序中写入相关等级的日志信息。

复制代码
using Microsoft.AspNetCore.Mvc;

namespace apiDemo.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(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            _logger.LogInformation("这个是接口日志");
            _logger.LogWarning(DateTime.Now.ToString());
            _logger.LogInformation(DateTime.Now.ToString());
            try
            {
                throw new NotImplementedException("抛出一个异常信息");
            }
            catch (Exception ex) {
                _logger.LogError(ex,"异常");
            }
            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();
        }
    }
}
复制代码

   所以集成到ASP.NET Core中相对侵入式比较少,然后借助OpenTelemetry完成了日志的结构化、采集的功能,SEQ完成日志存储、查询的功能,从而构建一个相对完整的可视化日志功能。

四、总结

  通过成熟的组件,进行简单的搭配,并且很少代码侵入式 ,完成一个可视化日志,代表着日志随着系统的发展而不断发展,对应开发人员和运维人员工作无疑提供极大帮助,减少传统使用日志的困境。

posted @   tuqunfu  阅读(316)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
点击右上角即可分享
微信分享提示