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 ...
随机推荐
- OO第二次大作业
前言 前言的前言 第二篇blog跟上一篇只隔了将近一个月,但是感觉心境上好像发生了很多的变化,认识到了自己存在的很多不足(可能是菜单折磨的),感觉对很多东西都一知半解,希望在写完这篇总结性blog之后 ...
- 智能制造之路—从0开始打造一套轻量级MOM平台之基础平台搭建(Linux部署)
一.前言 前面我们选定了Admin.net来搭建我们的MOM快速开发平台,本章主要描述.NET6平台的Linux部署,以及记录搭建过程中坑. 本次搭建我们选择某云的轻量应用服务器,系统选择CentOS ...
- pycharm:插件translation 更新TTK失败
解决方案 1.修改C:\Windows\System32\drivers\etc 下hosts文件, 添加 203.208.40.66 translate.google.com 203.208.40. ...
- 好用的css3特性-过渡和2D变换
css3中有很多非常好用的特性,今天来总结一下与动画相关,包括过渡.2D变换. 首先来介绍一下过渡,过渡是在进行变化的时候进行的一个缓冲,如果没有过渡,当变更了元素的位置.大小的数据时,会一瞬间完成变 ...
- 性能监控平台搭建(grafana+telegraf+influxdb) 及 配置 jmeter后端监听
搞性能测试,可以搭建Grafana+Telegraf+InfluxDB 监控平台,监控服务器资源使用率.jmeter性能测试结果等. telegraf: 是一个用 Go 编写的代理程序,可收集系统和服 ...
- 文心一言 VS 讯飞星火 VS chatgpt (75)-- 算法导论7.2 4题
四.如果用go语言,银行一般会按照交易时间来记录某一账户的交易情况.但是,很多人却喜欢收到的银行对账单是按照支票号码的顺序来排列的.这是因为,人们通常都是按照支票号码的顺序来开出支票的,而商人也通常都 ...
- 《高级程序员 面试攻略 》RocketMQ 如何保证顺序性
RocketMQ 提供了一种称为顺序消息的机制来确保消息的顺序性.下面是一些关键的方法和概念: 1. 顺序消息:顺序消息是指在发送和消费过程中,消息按照特定的顺序进行处理.RocketMQ 通过将消息 ...
- .NET Core基础到实战案例零碎学习笔记
前言:前段时间根据 [老张的哲学] 大佬讲解的视频做的笔记,讲的很不错.此文主要记录JWT/DI依赖注入/AOP面向切面编程/DTO/解决跨域等相关知识,还包含一些.NET Core项目实战的一些案例 ...
- 十年磨一剑的华为云GES,高明在哪
本文分享自华为云社区<华为云GES:十年磨一剑,打造业界一流的云原生分布式图数据库>,作者:GES图引擎服务小图 . 1.浅谈云原生图数据库 图数据库(graph database)是一个 ...
- 小白整理了VUEX
在小白开发的项目中前端使用的是Vue,虽然在日常工作中可以使用Vue进行开发工作.但是没有系统的学习过Vue,对Vue的一些特性和方法使用时常常需要查询资料解决问题,查询资料常常会占用大量时间,尤其对 ...