Util应用框架基础(六) - 日志记录(三) - 写入 Seq
本文是Util应用框架日志记录的第三篇,介绍安装和写入 Seq 日志系统的配置方法.
安装 Seq
Seq是一个日志管理系统,对结构化日志数据拥有强大的模糊搜索能力.
Util应用框架目前主要使用 Seq 和 Exceptionless 管理日志.
你可以从中选择一个合适的.
本节介绍使用 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的更多相关文章
- 从零开始编写自己的C#框架(20)——框架异常处理及日志记录
最近很忙,杂事也多,所以开发本框架也是断断续续的,终于在前两天将前面设定的功能都基本完成了,剩下一些小功能遗漏的以后发现再补上.接下来的章节主要都是讲解在本框架的基础上进行开发的小巧. 本框架主要有四 ...
- [编程基础] Python日志记录库logging总结
Python日志记录教程展示了如何使用日志记录模块在Python中进行日志记录. 文章目录 1 介绍 1.1 背景 1.2 Python日志记录模块 1.3 根记录器 2 Python logging ...
- Gin 框架 - 使用 logrus 进行日志记录
目录 概述 日志格式 Logrus 使用 推荐阅读 概述 上篇文章分享了 Gin 框架的路由配置,这篇文章分享日志记录. 查了很多资料,Go 的日志记录用的最多的还是 github.com/sirup ...
- 在android中配置 slf4j + log4j 日志记录框架
需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...
- 第17章 使用日志记录监视和排除错误(ASP.NET Core in Action, 2nd Edition)
第3部分 扩展应用程序 我们在第1部分和第2部分中介绍了大量内容:我们查看了您将用于构建传统服务器渲染的 Razor Pages 应用程序以及 Web API 的所有主要功能组件.在第3部分中,我们将 ...
- PHP框架中的日志系统
现在在一家公司做PHP后台开发程序猿(我们组没有前端,做活动时会做前端的东西),刚开始到公司的时候花2个周赶出了一个前端加后台的活动(记得当时做不出来周末加了两天班...),到现在过去4个多月了,可以 ...
- Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例
本文目录 1. Net下日志记录 2. NLog的使用 2.1 添加nuget引用NLog.Web.AspNetCore 2.2 配置文件设置 2.3 依赖配置及调用 ...
- 如何定制.NET6.0的日志记录
在本章中,也就是整个系列的第一部分将介绍如何定制日志记录.默认日志记录仅写入控制台或调试窗口,这在大多数情况下都很好,但有时需要写入到文件或数据库,或者,您可能希望扩展日志记录的其他信息.在这些情况下 ...
- 从壹开始前后端分离 [.netCore 不定期更新 ] 三十五║ 完美实现全局异常日志记录
缘起 哈喽我是不定期更新的日常,昨天群里小伙伴问到了记录日志,当然,以前我也挖过这个坑,后来一直没有来得及填上,也想着 swagger 一直又有错误信息展示的功能,就迟迟没有添加这个功能,不过昨天夜里 ...
- 清晰梳理最全日志框架关系与日志配置-SpringBoot 2.7.2 实战基础
优雅哥 SpringBoot 2.7.2 实战基础 - 07 - 日志配置 Java 中日志相关的 jar 包非常多,log4j.log4j2.commons-logging.logback.slf4 ...
随机推荐
- Elementary OS old version download 旧版本下载
Elementary OS 号称是最漂亮的Linux发行版,没有之一.确实,他的整体风格看起来就是特别舒服,说不出哪里特别好,但也挑不出什么毛病.相比之下,其他Linux的界面总感觉不太和谐.比如特别 ...
- Linux 日志收集器:syslog,syslog-ng,rsyslog
一 参考:https://www.cnblogs.com/zhaoyong631/p/14441090.html 基本上,它们都是相同,它们都允许在中央存储库中记录来自不同类型系统的数据. 但是它们是 ...
- 语音合成技术汇总1:Glow-TTS:通过单调对齐实现文本到语音的生成流
今天开始开一期语音合成经典论文的翻译 Glow-TTS:通过单调对齐实现文本到语音的生成流 摘要: 最近,文本到语音(Text-to-Speech,TTS)模型,如FastSpeech和ParaNet ...
- go项目实现在配置文件实现配置项统一管理
转载请注明出处: go项目中实现配置项统一管理,实现逻辑:将 配置项整理为一个json的数据结构,并保存到go.conf文件中,然后在go项目启动main方法中加载 go.conf 文件,读取go.c ...
- bzip2: (stdin) is not a bzip2 file.
用tar -zxvf dir.tar.gz命令解压即可.
- Go 语言入门指南: 环境搭建、基础语法和常用特性解析 | 青训营
Go 语言入门指南: 环境搭建.基础语法和常用特性解析 | 青训营 从零开始 Go 语言简介 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert ...
- 三维模型OSGB格式轻量化压缩必要性分析
三维模型OSGB格式轻量化压缩必要性分析 三维模型是计算机图形学和视觉效果等领域的重要应用之一.然而,由于三维模型通常包含大量的几何信息.纹理信息和其他元素,导致其占用的存储空间和计算资源非常巨大.为 ...
- C#/.NET/.NET Core优秀项目和框架8月简报
前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(公众号每周至少推荐两个优秀的项目和框架当然节假日除外),公众号推文有项目和框架的介绍.功能特点以及部分截图等(打不开或 ...
- 推荐一个react上拉加载更多插件:react-infinite-scroller
在开发网页和移动应用时,经常需要处理大量数据的展示和加载.如果数据量非常大,一次性全部加载可能会导致页面卡顿或崩溃.为了解决这个问题,我们可以使用无限滚动(Infinite Scroll)的技术.Re ...
- Salesforce LWC学习(四十五) lwc支持Console App控制Tab了
本篇参考:https://help.salesforce.com/s/articleView?id=release-notes.rn_lwc_workspaceAPI.htm&release= ...