Net7引入Serilog日志输出到Seq日志服务

TerraMours框架踩坑记录

官方地址:https://hub.docker.com/r/datalust/seq

Logstash 和 Seq优劣

GPT回答优缺点:

Logstash 和 Seq 都是常见的日志收集和分析工具,它们各有优劣点。

Logstash 是 Elastic Stack 中的一个组件(另外两个组件是 Elasticsearch 和 Kibana),它支持通过日志收集器实时收集、过滤和转换日志数据,并将数据发送到 Elasticsearch 中进行存储和查询。Logstash 的强大之处在于它的插件生态系统非常丰富,支持各种各样的数据输入源、过滤器和输出目的地。此外,Logstash 还支持多线程处理和零延迟数据传输,可快速处理大量数据。

Seq 是一个专门的日志管理工具,它提供了强大的搜索和过滤功能,能够极大地提高日志分析的效率;它还支持通过 API 将数据发送到其他系统中。Seq 支持通用日志格式(如 JSON 和 XML),可以自动解释和索引日志事件的属性,还提供了强大的查询语言,可用于过滤、聚合和计算日志数据的统计信息。
相对而言,Seq 的优越点在于它平滑地支持 .NET 日志库,比如 Serilog,这使得你可以轻松地在 .NET 应用程序中实现结构化日志记录。此外,Seq 支持通过 UI 和 API 更好的查询、分析和可视化日志数据,同时,Seq 还提供了丰富的告警和通知机制,可以让你在出现问题时第一时间得到告知。

总的来说,Logstash 更适合处理海量的结构化和非结构化数据,而 Seq 显然更加专注于 .NET 环境下的日志收集、过滤和分析。如果你的系统是 .NET 环境,同时希望实现结构化日志记录、快速查询和告警机制等功能,Seq 可能更加适合你。

主要是更方便的支持Net,并且有使用过,所以没考虑Logstash

Seq并不是完全免费的,但是我们使用个人版即可,完全够用,价格如下

image-20230515003627712

docker安装Seq

使用容器本地存储和端口上的所有服务运行最初不安全的 Seq 实例5341

docker run --name seq -d --restart unless-stopped -e ACCEPT_EULA=Y -p 5341:80 datalust/seq:latest

使用初始密码运行 Seq 实例admin,访问localhost:5341即可:

如图:
image-20230515004209402

这种方式不需要登陆,仅供学习和本地开发测试使用。

详细信息参考官方文档:

官方docker安装文档:https://hub.docker.com/r/datalust/seq

Program添加以下代码即可

需要引入以下nuget包:版本以你自己的为准

<PackageReference Include="Serilog.AspNetCore" Version="7.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Serilog.Sinks.Seq" Version="5.2.2" />
//注入日志
// 配置 Serilog 日志记录器

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
    .Enrich.FromLogContext()
    .WriteTo.Console()
    //.WriteTo.File()
    .WriteTo.Seq("http://localhost:5341/")
    .CreateLogger();
builder.Host.UseSerilog(Log.Logger);



//日志
app.UseSerilogRequestLogging();

---------------------------------------------------------分界线--------------------------------------------------------------

说明:(下面方式有些问题)

下面方式如果对应的MinimalService构造没有注入Ilog会报错,后续会看看原因。改为以下方式

//minimal Service 构造函数没有Ilog 会报错 
builder.Services.AddLogging(builder =>
{
    Log.Logger = new LoggerConfiguration()
     // .MinimumLevel.Information().Enrich.FromLogContext()
     .MinimumLevel.Debug()
     .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
     .Enrich.FromLogContext()
     .WriteTo.Console()
     //.WriteTo.File(initOptions.LogFilePath)
     .WriteTo.Seq("http://localhost:5341/")
     .CreateLogger();
    builder.AddSerilog();
});

如何使用

主要核心代码:
private readonly Serilog.ILogger _log;

  public LoginMiniApiService(Serilog.ILogger log) : base()
        {
            _log = log;
        }
        
//测试seq
_log.Information("登录成功,测试Seq");
代码图片

image-20230515004912465

测试登陆接口之后,查看Seq日志:

image-20230515005203748

使用Seq日志搜索功能

image-20230515005319096

日志看起来很多是因为设置的information级别,自己项目按自己的需求设置

Serilog包说明:
  • Serilog.Sinks.File:用于将日志写入文件。
  • Serilog.Sinks.MSSqlServer:用于将日志写入 SQL Server 数据库。
  • Serilog.Sinks.PostgreSQL:用于将日志写入 PostgreSQL 数据库。
  • Serilog.Sinks.MongoDB:用于将日志写入 MongoDB 数据库。
  • Serilog.Sinks.Seq:用于将日志写入 Seq。

个人博客:https://www.firstsaofan.top/

TerraMours源码地址:https://github.com/firstsaofan/TerraMours