.NET下使用 Seq结构化日志系统
前言
我们公司在日志管理方面一直没有统一,主要痛点有:
- 每个开发人员都是各用各的,存储日志的形式也是五花八门,如:本地文件,数据库,Redis,MongoDB
- 由于公司访问服务器要通过堡垒机,所以本机无法直连测试或生产环境。如果测试日志是写入本地文件,就需要开发人员只能登录服务器上查看日志,查看非常不方便。
综合以上所述有三种选择:
- 自己写一个日志系统
- 找一个现成的
- 不记录日志了
综合考虑,第三点肯定是不靠谱的,第一点成本太高,公司本来就比较忙,那就只能去找一个现成的了…
Seq简介
Seq是运行在一台机器上的日志服务器。您的应用程序通过像Serilog这样的框架发送结构化事件:
Log.Information("Hello, {Name}!", Environment.UserName);
结构化日志记录保留了自定义的属性值以及与每个事件关联的文本。
这些信息通过网络发送到Seq,Seq显示它们并使其可搜索:

目前支持三种语言:.NET与NET Core,Java,Node.js,以及Python。
Seq主要功能:
丰富的事件数据 -以结构化形式记录上文信息与应用程序事件,支持消息模板将文本数据与结构话数据无缝连接。下图中所有属性都是由使用者自定义的。
多种查询方式 -支持以SQL表达式查询,以及C#中的,==,!=,<,<=,内置StartsWith(),
EndsWith(),IndexOf()和Contains(),并支持文本全文检索。
仪表盘 - 搜索框添加查询语句也可以是SQL查询,匹配到相应的数据后,使用右侧的Add to dashboard创建对应的仪表盘
添加警报 -当检测到警报情况时,可以通过邮件将情况通知到相关人员。单击仪表板图表上ALERTS选项卡下的+按钮:
Seq缺点:
内存消耗较高,属于那种有多少就吃多少,如果吃撑了,就又吐出来一部分返回给系统,真的是有点不要脸。收费,非开源系统,所以免费版本功能会有阉割。
详细介绍可查看官网文档:https://docs.getseq.net/docs
.NET Core实践
1.下载并安装Seq服务器
2.打开安装程序启动安装向导,一路下一步,完成后浏览器输入http://localhost:5341/#/events,5341是Seq的默认端口。Seq是托管在Windows服务中,通过win+r输入services.msc命令运行查看。
环境搭建完成后,下面我们看下如何在项目中应用:
1.新建一个项目,ASP.NET Core 或 MVC都可以
2.添加Nuget程序包:
- Seq.Extensions.Logging
- Autofac
- Autofac.Extensions.DependencyInjection
3.在appsettings.json添加一个"Seq"属性:
{
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Seq": {
"ServerUrl": "http://localhost:5341/", //Seq本地环境地址.
"ApiKey": "fCT0LNqspu3kituQMb", //在Seq系统创建的项目名称KEY值。可通过此KEY值检索出项目下的所有日志信息
"MinimumLevel": "Trace",
"LevelOverride": {
"Microsoft": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
}
}
4. 在你的Startup类的ConfigureServices()方法,调用AddSeq()上loggingBuilder提供AddLogging()。
services.AddLogging(loggingBuilder =>
{
//loggingBuilder.AddSeq();
loggingBuilder.AddSeq(Configuration.GetSection("Seq"));
});
5.配置依赖注入
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddLogging(loggingBuilder =>
{
/*此方法默认使用本地地址: 5341端口*/
//loggingBuilder.AddSeq();
/*加载Seq配置*/
loggingBuilder.AddSeq(Configuration.GetSection("Seq"));
});
services.AddMvc(); /*这里使用Autofac作为依赖注入*/
var containerBuilder = new ContainerBuilder();
/*注入Seq记录日志对象*/
containerBuilder.RegisterGeneric(typeof(Logger<>)).As(typeof(ILogger<>)).InstancePerMatchingLifetimeScope();
/*因为更改了默认的依赖注入框架,所以需要将其原来的对象填充值新的依赖框架中*/
containerBuilder.Populate(services);
var container = containerBuilder.Build();
return new AutofacServiceProvider(container);
}
6.将ILogger实例注入到控制器中,并写入日志
private ILogger<ValuesController> _logger;
public ValuesController(ILogger<ValuesController> logger)
{
_logger = logger;
}
// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
_logger.LogInformation("{Projece}&{ModuleName} Get Test", "SeqExample", "Values");
return new string[] { "value1", "value2" };
}
7.运行结果

可以看到,我们通过消息模板,自定义了两个属性,Project和ModuleName。在实际使用中我们可以根据公司业务来建立统一的消息模板,对项目日志分类管理并查看。
总结
由于现在我使用的是免费版的,在很多方面有限制,如:不能将本地改为公网地址(可通过反向代理解决),不支持邮件预警。
类似这种限制还有,但都不影响使用,作为日志系统,免费版本的基础功能已经足够使用,并且查询性能并不弱。谁让.NET开源框架少了,比起自己写一个这样的系统,我已经很知足了!
Seq目前在国内用的公司很少,所以此文只是抛砖引玉,便于大家在选择日志框架方面可以多一个选择,仅此而已。
.NET下使用 Seq结构化日志系统的更多相关文章
- 结构化日志类库 ---- Serilog库
在过去的几年中,结构化日志已经大受欢迎.而Serilog是 .NET 中最著名的结构化日志类库 ,我们提供了这份的精简指南来帮助你快速了解并运用它. 0. 内容 设定目标 认识Serilog 事件和级 ...
- 如何利用NLog输出结构化日志,并在Kibana优雅分析日志?
上文我们演示了使用NLog向ElasticSearch写日志的基本过程(输出的是普通文本日志),今天我们来看下如何向ES输出结构化日志.并利用Kibana中分析日志. NLog输出结构化日志 Elas ...
- .NET Core开发日志——结构化日志
在.NET生态圈中,最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net.而其后来者,莫过于NLog.Nlog与log4net相比,有一项较显著的优势,它支持结构化日志. 结 ...
- 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志
前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...
- Asp.Net Core中利用Seq组件展示结构化日志功能
在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看 ...
- 【转】结构化日志类库 ---- Serilog库
源地址:https://www.cnblogs.com/mq0036/p/8479956.html 解决异常: Invalid cast from 'System.String' to 'Serilo ...
- k8s-搭建 EFK 日志系统
搭建 EFK 日志系统 大家介绍了 Kubernetes 集群中的几种日志收集方案,Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch.Fluentd 和 Kibana( ...
- Loki日志系统
一.概述 背景 Loki的第一个稳定版本于2019年11月19日发布,是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统. Grafana 对 Loki ...
- .NET Core集成Seq+Serilog实现日志中心
.NET Core集成Seq+Serilog实现日志中心 一,下载安装Seq https://datalust.co/download/all,版本很多,大家随便挑,开发版个人免费,商业版多账号需要收 ...
随机推荐
- sql server和oracle数据库
sql server和oracle数据库安装按照官方教程即可:以及他们相应的管理工具,sql server management studio自带的,oracle的管理工具PLSQL需要单独下载安装, ...
- flask 操作数据库(分类)
数据库 数据库是大多数动态web程序的基础设施,只要你想把数据存下来,就离不开数据库. 这里所说的数据库指的是有存储数据的单个或多个文件组成的集合,它是一种容器,可以类比文文件柜.而人们通常使用数据库 ...
- 委托、匿名函数到lambda表达式
在C#2.0之前就有委托了,在2.0之后又引入了匿名方法,C#3.0之后,又引入了Lambda表达式,他们三者之间的顺序是:委托->匿名表达式->Lambda表达式,微软的一步步升级,带给 ...
- Django框架----命名空间模式
命名空间模式 即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL. 举个例子: project中的urls.py from django.conf.urls im ...
- Maven项目启动报错:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
1.场景 1.1.先确认pom.xml文件已添加mysql依赖: <dependency> <groupId>mysql</groupId> < ...
- 一文看懂显示关键材料之彩色滤光片(Color Filter)
http://www.sohu.com/a/219398623_119960 液晶显示器的背光源发出的白光,而想要获得彩色显示,必须依靠显示关键材料-彩色滤光片. 图片来源:网络公开资料 什么是彩色滤 ...
- curl命令基本使用小总结
curl 下载文件 -o:将文件保存为命令行中指定的文件名的文件中 -O:使用URL中默认的文件名保存文件到本地 --limit-rate:限速 -C:对大文件使用断点续传功能 --silent:不显 ...
- 【题解】Luogu P2147 [SDOI2008]洞穴勘测
原题传送门 这题用Link-Cut-Tree解决,Link-Cut-Tree详解 我不太会踩爆Link-Cut-Tree的并查集做法qaq 我们用Link-Cut-Tree维护连通性(十分无脑) Co ...
- nlp homework 03
NLP Homework 03 --冯煜博 题目描述 (盒子和球模型)假设有3个盒子,每个盒子里装有红白两种颜色的球,盒子里的红白球有下表列出,初始状态分布. 解答 1. 给出HMM模型 \(\mu= ...
- Python-制作抖音图片
---------------------------------------------------------------------------------------------------- ...






