.NET 日志系统-3 结构化日志和集中日志服务
.NET 日志系统-3 结构化日志和集中日志服务
系列文章
结构化日志
结构化日志比普通文本更利于日志的分析,结构化日志的格式为json格式。
Serilog
使用步骤
NLog也可以配置结构化日志,不过配置麻烦,推荐用Serilog。
NuGet安装:Serilog.AspNetCore
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug() //最低级别设置为Debug
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.CreateLogger();
builder.AddSerilog();
要记录的结构化数据通过占位符来输出:
logger.LogWarning("新增用户{@person}",new {Id=3,Name="zack"});
同样可以输出到文件、数据库、MongoDB等。
代码实现
接文章日志系统文章-1和-2(前2篇文章),代码一样,只需要在注入的时候添加第三步即可。
services.AddLogging(logBuilder =>
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug() //最低级别设置为Debug
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.CreateLogger();
logBuilder.AddSerilog();
});
效果展示
模拟用户
通过第4步占位符实现结构化数据
首先在Test2中创建一个User类
class User
{
public string Name { get; set; }
public string Email { get; set; }
}
然后模拟一下注册用户
public void Test()
{
User user = new User { Name = "admin", Email = "123@qq.com" };
_logger.LogDebug("注册一个用户{@person}",user);
}
效果展示
集中化日志
集群化部署环境中,有N多服务器,如果每个服务器都把日志记录到本地文件,不便于查询、分析。需要把日志保存到集中化的日志服务器中。
- 使用NLog、Serilog等可以把日志记录到数据库、MongoDB等地方,就可以实现“结构化、集中日志服务”,不过需要自己编写日志分析程序。
- 公有云厂商一般都提供了日志云服务,都带有分析功能,都有对应Serilog插件,即使没有提供,开发一个插件也不麻烦。
- 如果没有用云平台或者想自己控制日志服务们可以使用Exceptionless或者ELK等。
Exceptionless
在线版有些功能需要收费,可以去官网用docker将Exceptionless部署到自己的服务器中。
找到Docs页面,列表最小面的Self Hosting中就有Docker部署的方法。
试用步骤:
Exceptionless https://be.exceptionless.io/
- 到Exceptionless官网注册、登录后,新建一个项目,安装向导输入公司名、项目名后,网站会给出一个apikey。
- 项目Nuget安装Serilog的Exceptionless插件:Serilog.Sinks.Exceptionless。
- 在程序最开始加上一句ExceptionlessClient.Default.Startup("拿到的apikey"),然后Serilog的配置加上一句:.WriteTo.Exceptionless()
创建项目
选择项目
马赛克部分为apikey,然后根据提示安装Nuget
Install-Package Exceptionless.AspNetCore
代码实现
其实上面的官网网站讲得很清楚了,在程序的开头加上
ExceptionlessClient.Default.Startup("apikey");
然后接上第二步安装Serilog.Sinks.Exceptionless
,继续第三步注入的时候添加
services.AddLogging(logBuilder =>
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug() //最低级别设置为Debug
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.WriteTo.Exceptionless() //添加这行
.CreateLogger();
logBuilder.AddSerilog();
});
效果展示
总结
普通项目用NLog输出到文本文件即可,根据需要设定过滤、分类规则
集群部署的项目用Serilog+集中式日志服务,需要记录结构化日志,再进行结构化输出
参考链接
- 【.NET 6教程,.Net Core 2022视频教程,杨中科主讲】 https://www.bilibili.com/video/BV1pK41137He/?p=49&share_source=copy_web&vd_source=fce337a51d11a67781404c67ec0b5084
每日一道面试题
在.Net中所有可序列化的类都被标记为_____?
答:[serializable]
在.Net托管代码中我们不用担心内存漏洞,这是因为有了______?
答:GC。
.NET 日志系统-3 结构化日志和集中日志服务的更多相关文章
- 重新整理 .net core 实践篇—————日志系统之结构化[十八]
前言 什么是结构化呢? 结构化,就是将原本没有规律的东西进行有规律话. 就比如我们学习数据结构,需要学习排序然后又要学习查询,说白了这就是一套,没有排序,谈如何查询是没有意义的,因为查询算法就是根据某 ...
- 结构化日志类库 ---- Serilog库
在过去的几年中,结构化日志已经大受欢迎.而Serilog是 .NET 中最著名的结构化日志类库 ,我们提供了这份的精简指南来帮助你快速了解并运用它. 0. 内容 设定目标 认识Serilog 事件和级 ...
- Java日志系统框架的设计与实现
推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程 ...
- Android源码——Logger日志系统
Android的Logger日志系统是基于内核中的Logger日志驱动程序实现的. 日志保存在内核空间中 缓冲区保存日志 分类方法:日志的类型 + 日志的输出量 日志类型: main ...
- PHP框架中的日志系统
现在在一家公司做PHP后台开发程序猿(我们组没有前端,做活动时会做前端的东西),刚开始到公司的时候花2个周赶出了一个前端加后台的活动(记得当时做不出来周末加了两天班...),到现在过去4个多月了,可以 ...
- SLF4J日志系统在项目导入时频现的问题
一.概述 近期在导入一个已有的项目时,日志系统出现了一个问题.错误信息如下: SLF4J问题 SLF4J: Failed to load class "org.slf4j.impl.Stat ...
- C++ 高性能无锁日志系统
服务器编程中,日志系统需要满足几个条件 .高效,日志系统不应占用太多资源 .简洁,为了一个简单的日志功能引入大量第三方代码未必值得 .线程安全,服务器中各个线程都能同时写出日志 .轮替,服务器不出故障 ...
- java日志框架与日志系统
日志框架:提供日志调用的接口,实际的日志输出委托给日志系统实现. JCL(Jakarta Commons Logging):比较流行的日志框架,很多框架都依赖JCL,例如Spring等. SLF4j: ...
- 配置Tomcat的日志系统
成功配置tomcat的log4j日志系统,格式:HTML+每天以yyyy-mm-dd.log命名的日志文件 一.引言: 实习单位让用log4j配置webapp的日志系统,要求产生的日志文件是html格 ...
- iOS-创建自己的日志系统
今天说说怎么创建自己的日志系统 先看下Xcode自己的日志(这里说的NSLog) 系统自带的NSLog打印的信息只有简单的 时间 / 项目名称 / 打印内容 内容比较简单, 很难做分类管理和写入文件 ...
随机推荐
- C++多态与虚拟:C++编译器对函数名的改编(Name Mangling)
如果函数名称都相同(也就是被overloaded),编译器在面对你的函数唤起动作时,究竟是如何确定调用哪个函数实体呢?事实上,编译器把所有同名的overloaded functions视为不同的函数, ...
- .NET开源、功能强大、跨平台的图表库 - LiveCharts2
前言 今天大姚给大家分享一个.NET开源(MIT License).功能强大.简单.灵活.跨平台的图表.地图和仪表库:LiveCharts2. 项目介绍 LiveCharts2是一个.NET开源. ...
- golang cron定时任务简单实现
目录 星号(*) 斜线(/) 逗号(,) 连字符 (-) 问好 (?) 常用cron举例 使用说明 golang 实现定时服务很简单,只需要简单几步代码便可以完成,不需要配置繁琐的服务器,直接在代码中 ...
- 传入一个List集合,返回分页好的数据
传入一个List集合,返回分页好的数据. 定义分页信息类: package com.cn.common; import java.util.List; public class CommonPage& ...
- Flutter 多线程实现
异步Isolate实现多线程 最近在看Flutter开发相关知识点,对照着Android原生,探究了下多线程实现方式.在Flutter中有 Isolate,隔离,它的实现原理并不是内存共享的,它更 ...
- Intel HDSLB 高性能四层负载均衡器 — 快速入门和应用场景
目录 目录 目录 前言与背景 传统 LB 技术的局限性 HDSLB 的特点和优势 HDSLB 的性能参数 基准性能数据 对标竞品 HDSLB 的应用场景 HDSLB 的发展前景 参考文档 前言与背景 ...
- pageoffice 5.x升级到pageoffice 6.x的关键步骤
Vue+Springboot前后端分离项目 将后端Springboot项目中pom.xml文件中对于pageoffice的jar引用升级成6.0版本,以maven中央仓库(https://mvnrep ...
- CCL 2024 Task7 双任务冠军
近期参加NLP领域CCL2024评测,现将赛题背景和实现方法分享,推理文本纠错领域的发展. 1.背景信息 随着教育的发展和网络的普及,作文评价的规模越来越大,人工评改作文的成本和效率成为一大难题.为了 ...
- .NET周刊【5月第3期 2024-05-19】
国内文章 WPF使用Shape实现复杂线条动画 https://www.cnblogs.com/czwy/p/18192720 文章介绍了利用WPF的Shape和动画功能,模仿CSS/SVG实现复杂的 ...
- uniapp 配置 基座调试指定页面
在用hbuildx时,用自定义基座,调试程序时,有的页面因为基座缺少组件而进不去,这个时候就可以用指定页面的方式,我们只需要把进入页面的入参传进去,这个时候打开页面就是指定要调试的页面了. 就在pag ...