本文是Util应用框架日志记录的第三篇,介绍安装和写入 Seq 日志系统的配置方法.

安装 Seq

Seq是一个日志管理系统,对结构化日志数据拥有强大的模糊搜索能力.

Util应用框架目前主要使用 SeqExceptionless 管理日志.

你可以从中选择一个合适的.

本节介绍使用 Docker 简单安装 Seq,用于开发测试,部署到生产环境请参考官方文档.

安装 Seq

创建 seq-data 卷, 运行命令.

docker volume create seq-data

创建 Seq 容器, 运行命令.

docker run --name seq -d --restart=always -e ACCEPT_EULA=Y -v seq-data:/data -p 5380:80 datalust/seq:2023.3

容器名称: seq

连接端口: 5380

未设置用户密码

安装成功后,Docker容器列表出现 seq 容器.

运行 Seq

打开 http://localhost:5380 ,可以看到 Seq 管理界面.

写入 Seq

日志配置

  • 引用Nuget包

    Nuget包名: Util.Logging.Serilog

  • AddSerilog

    使用 AddSerilog 扩展方法启用 Serilog 日志操作.

    • 默认配置不带参数.

      var builder = WebApplication.CreateBuilder( args );
      builder.AsBuild().AddSerilog();
    • 如果要清除默认设置的日志提供程序,传入 true.

      Asp.Net Core 默认日志提供程序会把消息输出到控制台,你可以清除它们.

      builder.AsBuild().AddSerilog( true );
    • 设置应用程序名称.

      对于微服务应用,记录产生日志的应用名称,能方便排查问题.

      builder.AsBuild().AddSerilog( "权限服务" );
    • 你也可以使用委托设置参数.

      • 清除默认设置的日志提供程序
      builder.AsBuild().AddSerilog( t => t.IsClearProviders = true );
  • 添加 appsettings 配置节

    appsettings.json 配置文件添加 Serilog 配置节.

    {
    "Logging": {
    "LogLevel": {
    "Default": "Trace"
    }
    },
    "Serilog": {
    "WriteTo": [
    {
    "Name": "Seq",
    "Args": {
    "serverUrl": "http://localhost:5380"
    }
    }
    ]
    }
    }

    WriteTo 指定日志接收器为 Seq.

    最简化配置仅需设置 Seq 的服务地址.

    本教程 Seq 安装示例使用 5380 端口.

    其它参数请参考 Serilog 和 Seq 文档.

查看 Seq

配置完成后,可以启动你的项目,查看 Seq 日志界面.

可以看到由 Asp.Net Core 写入的系统日志.

结构化日志支持

下面的示例比较结构化日志与普通日志的差别.

范例使用 ILog 接口写入日志,你也可以使用 ILogger 替代.

先记录普通日志消息,方便后续比较.

_log.Message( "用户admin已删除" ).LogInformation();

结构化日志语法

  • {}

    • {} 用来定义日志属性.

    • 范例:

      _log.Message( "用户{User}已删除", "admin" ).LogInformation();

      {User} 定义了名为 User 的字符串属性.

      查看 Seq 操作界面, 可以看到已经添加了 User 属性.

      识别出了 User 属性,就可以使用它进行搜索.

      点击 User 属性左侧的勾,弹出菜单选择 Find 进行查找.

      搜索框设置 User = 'admin' 表达式,表示搜索 User 属性为 admin 的日志.

      Seq 不仅能使用 = 进行精确匹配,还支持类似Sql like 的模糊匹配方式.

      范例:

      User like '%dm%'

      注意: 不要将结构化日志 {} 与 .Net 字符串语法 $"{}" 混淆.

      var user = "admin";
      _log.Message( $"用户{user}已删除" ).LogInformation();

      $"" 中的 {user} 将被 user 变量值 'admin' 替换, 等效于.

      _log.Message( "用户admin已删除" ).LogInformation();

      它仅是普通日志消息,不是结构化日志.

    • {@} 用来定义日志属性,并强制序列化对象.

      前面的示例使用简单的字符串参数,如果传入对象参数是什么结果?

    • 范例:

      定义 User 对象.

      namespace Demo;
      
      public class User {
      public int Id { get; set; }
      public string Name { get; set; }
      }

      现在传入 User 对象.

      var user = new User { Id = 1, Name = "a" };
      _log.Message( "用户{User}已删除", user ).LogInformation();

      {User} 被替换为字符串 "Demo.User" ,这是通过调用 User 对象的 ToString() 方法得到的.

      这与我们的预期不符合,我们希望序列化 User 对象,从而获取对象的结构进行搜索.

      Serilog 对 {} 参数的处理有一套内置规则,如果传入对象,有些结构能序列化,比如字典 Dictionary<string,int> ,有些则不能.

      不应该依赖 Serilog 自动序列化的能力,而是应明确指定是否序列化.

      {@} 强制序列化对象,从而保留对象结构,以方便日志系统展示和搜索.

      var user = new User { Id = 1, Name = "a" };
      _log.Message( "用户{@User}已删除", user ).LogInformation();

      可以进一步展开对象结构,点击 {Id: 1, Name: 'a'} 左侧的小灯泡,选择 Expand all 展开.

      现在可以通过对象属性进行搜索了.

    • {$} 用来定义日志属性,并强制字符串化.

      {$} 让 Serilog 以明确的方式显示对象的字符串表示.

      var user = new User { Id = 1, Name = "a" };
      _log.Message( "用户{$User}已删除", user ).LogInformation();

      {$User} 调用user对象的 ToString() 方法显示为字符串.

Util应用框架基础(六) - 日志记录(三) - 写入 Seq的更多相关文章

  1. 从零开始编写自己的C#框架(20)——框架异常处理及日志记录

    最近很忙,杂事也多,所以开发本框架也是断断续续的,终于在前两天将前面设定的功能都基本完成了,剩下一些小功能遗漏的以后发现再补上.接下来的章节主要都是讲解在本框架的基础上进行开发的小巧. 本框架主要有四 ...

  2. [编程基础] Python日志记录库logging总结

    Python日志记录教程展示了如何使用日志记录模块在Python中进行日志记录. 文章目录 1 介绍 1.1 背景 1.2 Python日志记录模块 1.3 根记录器 2 Python logging ...

  3. Gin 框架 - 使用 logrus 进行日志记录

    目录 概述 日志格式 Logrus 使用 推荐阅读 概述 上篇文章分享了 Gin 框架的路由配置,这篇文章分享日志记录. 查了很多资料,Go 的日志记录用的最多的还是 github.com/sirup ...

  4. 在android中配置 slf4j + log4j 日志记录框架

    需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...

  5. 第17章 使用日志记录监视和排除错误(ASP.NET Core in Action, 2nd Edition)

    第3部分 扩展应用程序 我们在第1部分和第2部分中介绍了大量内容:我们查看了您将用于构建传统服务器渲染的 Razor Pages 应用程序以及 Web API 的所有主要功能组件.在第3部分中,我们将 ...

  6. PHP框架中的日志系统

    现在在一家公司做PHP后台开发程序猿(我们组没有前端,做活动时会做前端的东西),刚开始到公司的时候花2个周赶出了一个前端加后台的活动(记得当时做不出来周末加了两天班...),到现在过去4个多月了,可以 ...

  7. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  8. 如何定制.NET6.0的日志记录

    在本章中,也就是整个系列的第一部分将介绍如何定制日志记录.默认日志记录仅写入控制台或调试窗口,这在大多数情况下都很好,但有时需要写入到文件或数据库,或者,您可能希望扩展日志记录的其他信息.在这些情况下 ...

  9. 从壹开始前后端分离 [.netCore 不定期更新 ] 三十五║ 完美实现全局异常日志记录

    缘起 哈喽我是不定期更新的日常,昨天群里小伙伴问到了记录日志,当然,以前我也挖过这个坑,后来一直没有来得及填上,也想着 swagger 一直又有错误信息展示的功能,就迟迟没有添加这个功能,不过昨天夜里 ...

  10. 清晰梳理最全日志框架关系与日志配置-SpringBoot 2.7.2 实战基础

    优雅哥 SpringBoot 2.7.2 实战基础 - 07 - 日志配置 Java 中日志相关的 jar 包非常多,log4j.log4j2.commons-logging.logback.slf4 ...

随机推荐

  1. Bug_ku source (WEB) wp

    在源代码中注释中发现了flag,提交发现是假的. 我们打开kali用dirserch扫描一下网站后台目录吧 发现.git ,这题应该是一个git泄露的题,用wget吧文件下载到本地,-r 选项的作用是 ...

  2. 无linux基础也能熟练掌握git的基本操作

    git是一个用来管理项目的工具,它的远程仓库有github.gitee.gitlab代码托管中心,既可以用于个人共享代码,又可以用于团队进行项目的协作与发布,那么我们一起来了解一下git该如何使用~ ...

  3. 【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小

    问题描述 在前两篇文章中,创建了Disk + PV + PVC + POD 方案后,并且进入POD中增加文件. [Azure K8S | AKS]在AKS集群中创建 PVC(PersistentVol ...

  4. Sealos 国内集群正式上线,可一键运行 LLama2 中文版大模型!

    2023 年 7 月 19 日,MetaAI 宣布开源旗下的 LLama2 大模型,Meta 首席科学家.图灵奖得主 Yann LeCun 在推特上表示 Meta 此举可能将改变大模型行业的竞争格局. ...

  5. .NET Evolve 数据库版本管理工具

    .NET Evolve数据库版本管理工具 1.简介 提到数据库版本管理,Java领域开发首先会想到大名鼎鼎的flyway.但是它不适用.NET领域,那么.NET领域也需要做数据库版本管理,该用什么工具 ...

  6. P1551 亲戚 && #569. 【例4-7】亲戚(并查集)

    P1551 亲戚 题目链接:落谷 题目链接:TFLS OJ 落谷题解(具体分析见慎入潜出P239) #include<bits/stdc++.h> using namespace std; ...

  7. 纯干货!一文get昇腾Ascend C编程入门全部知识点

    本文分享自华为云社区<昇腾Ascend C编程入门教程>,作者:昇腾CANN . 2023年5月6日,在昇腾AI开发者峰会上,华为正式发布了面向算子开发场景的昇腾Ascend C编程语言. ...

  8. Nomad 系列-安装

    系列文章 Nomad 系列文章 Nomad 简介 开新坑!近期算是把自己的家庭实验室环境初步搞好了,终于可以开始进入正题研究了. 首先开始的是 HashiCorp Nomad 系列,欢迎阅读. 关于 ...

  9. TIKZ全局样式设置

    tikz绘图引擎 TIKZ绘图引擎是基于tex实现,代码极其复杂,每次编写都要单独设置样式,甚是繁琐,如何能够全局设置呢? \begin{tikzpicture}[ auto, % 决策结点 deci ...

  10. DP模拟题

    Smiling & Weeping ----寒灯纸上,梨花雨凉,我等风雪又一年 # [NOIP2007 普及组] 守望者的逃离 ## 题目背景 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深 ...