.NET 日志系统-3 结构化日志和集中日志服务

系列文章

结构化日志

结构化日志比普通文本更利于日志的分析,结构化日志的格式为json格式。

Serilog

使用步骤

  1. NLog也可以配置结构化日志,不过配置麻烦,推荐用Serilog。

  2. NuGet安装:Serilog.AspNetCore

  3. Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug() //最低级别设置为Debug
    .Enrich.FromLogContext()
    .WriteTo.Console(new JsonFormatter())
    .CreateLogger();
    builder.AddSerilog();
  4. 要记录的结构化数据通过占位符来输出:

    logger.LogWarning("新增用户{@person}",new {Id=3,Name="zack"});
  5. 同样可以输出到文件、数据库、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多服务器,如果每个服务器都把日志记录到本地文件,不便于查询、分析。需要把日志保存到集中化的日志服务器中。

  1. 使用NLog、Serilog等可以把日志记录到数据库、MongoDB等地方,就可以实现“结构化、集中日志服务”,不过需要自己编写日志分析程序。
  2. 公有云厂商一般都提供了日志云服务,都带有分析功能,都有对应Serilog插件,即使没有提供,开发一个插件也不麻烦。
  3. 如果没有用云平台或者想自己控制日志服务们可以使用Exceptionless或者ELK等。

Exceptionless

在线版有些功能需要收费,可以去官网用docker将Exceptionless部署到自己的服务器中。

官网:https://exceptionless.com/

找到Docs页面,列表最小面的Self Hosting中就有Docker部署的方法。

试用步骤:

Exceptionless https://be.exceptionless.io/

  1. 到Exceptionless官网注册、登录后,新建一个项目,安装向导输入公司名、项目名后,网站会给出一个apikey。
  2. 项目Nuget安装Serilog的Exceptionless插件:Serilog.Sinks.Exceptionless。
  3. 在程序最开始加上一句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+集中式日志服务,需要记录结构化日志,再进行结构化输出

参考链接

每日一道面试题

  1. 在.Net中所有可序列化的类都被标记为_____?

    答:[serializable]

  2. 在.Net托管代码中我们不用担心内存漏洞,这是因为有了______?

    答:GC。

.NET 日志系统-3 结构化日志和集中日志服务的更多相关文章

  1. 重新整理 .net core 实践篇—————日志系统之结构化[十八]

    前言 什么是结构化呢? 结构化,就是将原本没有规律的东西进行有规律话. 就比如我们学习数据结构,需要学习排序然后又要学习查询,说白了这就是一套,没有排序,谈如何查询是没有意义的,因为查询算法就是根据某 ...

  2. 结构化日志类库 ---- Serilog库

    在过去的几年中,结构化日志已经大受欢迎.而Serilog是 .NET 中最著名的结构化日志类库 ,我们提供了这份的精简指南来帮助你快速了解并运用它. 0. 内容 设定目标 认识Serilog 事件和级 ...

  3. Java日志系统框架的设计与实现

    推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程 ...

  4. Android源码——Logger日志系统

    Android的Logger日志系统是基于内核中的Logger日志驱动程序实现的. 日志保存在内核空间中 缓冲区保存日志   分类方法:日志的类型  +   日志的输出量   日志类型:   main ...

  5. PHP框架中的日志系统

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

  6. SLF4J日志系统在项目导入时频现的问题

    一.概述 近期在导入一个已有的项目时,日志系统出现了一个问题.错误信息如下: SLF4J问题 SLF4J: Failed to load class "org.slf4j.impl.Stat ...

  7. C++ 高性能无锁日志系统

    服务器编程中,日志系统需要满足几个条件 .高效,日志系统不应占用太多资源 .简洁,为了一个简单的日志功能引入大量第三方代码未必值得 .线程安全,服务器中各个线程都能同时写出日志 .轮替,服务器不出故障 ...

  8. java日志框架与日志系统

    日志框架:提供日志调用的接口,实际的日志输出委托给日志系统实现. JCL(Jakarta Commons Logging):比较流行的日志框架,很多框架都依赖JCL,例如Spring等. SLF4j: ...

  9. 配置Tomcat的日志系统

    成功配置tomcat的log4j日志系统,格式:HTML+每天以yyyy-mm-dd.log命名的日志文件 一.引言: 实习单位让用log4j配置webapp的日志系统,要求产生的日志文件是html格 ...

  10. iOS-创建自己的日志系统

    今天说说怎么创建自己的日志系统 先看下Xcode自己的日志(这里说的NSLog) 系统自带的NSLog打印的信息只有简单的 时间 / 项目名称 / 打印内容 内容比较简单, 很难做分类管理和写入文件 ...

随机推荐

  1. NopCommerce 多数据库方案

    本文转自:http://www.cnblogs.com/YUTOUYUWEI/p/5538200.html 有时候一个项目需要连接多个数据库,以实现不同数据库的数据在同个项目的共享. 如果已经安装了n ...

  2. c++图像处理程序编译成.so动态链接库供Java调用(包含jni文件与引用第三方动态链接库opencv)

    一.linux编译so文件需要准备的环境 1.安装JDK(注意:不能安装openjdk,因为openjdk没有include目录,编译时需要用到include目录的头文件) 2.安装gcc和g++   ...

  3. js实现打字机效果(完整实例)

    在上篇css高斯模糊的效果基础上用js实现一个打字机效果: 上图: 代码: <!DOCTYPE HTML> <html lang="en-US"> < ...

  4. ABAP 7.58 中支持任意精度算术的新类

    1. 引言 通常,有两种对编程语言的改进.第一种是让困难的事情变得简单,第二种是让不可能的事情变为可能.本文介绍的是任意精度算术,它属于第二类:使在ABAP中原本不可能的事情成为可能. 过去已经可以在 ...

  5. 八、Doris外部表及数据导入

    DorisDB提供了多种导入方式,用户可以根据数据量大小.导入频率等要求选择最适合自己业务需求的导入方式. 数据导入:  1.离线数据导入:如果数据源是Hive/HDFS,推荐采用 Broker Lo ...

  6. C#的基于.net framework的Winform编程 - 编程手把手系列文章

    对于C#,笔者最早接触的是ASP.NET里的开发,后面对Winform程序也有一定的开发,但是真正理解和重新编码是这些年的事,在我的C#标签里有一些例子,记录了winform程序开发的一些功能.此文只 ...

  7. gitignore文件不生效的问题解决

    如何添加 git的忽略文件 .gitignore 在使用git过程中,我们可能有些文件不需要上传上去,比如一些缓存文件,生成的图片,运行环境的一些配置等等,这时就需要用到.gitignore忽略掉这些 ...

  8. LVS负载均衡(3)-- DR模型搭建实例

    目录 1. LVS DR模型搭建 1.1 DR模型网络规划 1.2 RS设备的VIP冲突解决方式 1.3 DR模型访问流程 1.4 DR模型配置 1.4.1 ROUTER设备配置 1.4.2 后端ng ...

  9. 关于SQL数据库Varchar字符串类型长度设计问题(转载)

    为什么要合理的设计数据库字段数据类型的长度?个人观点:一个是降低物理上的存储空间,一个是提高数据库的处理速度,还有一个附带功能是能校验数据是否合法.   现代数据库一般都支持CHAR与VARCHAR字 ...

  10. 使用interface化解一场因操作系统不同导致的编译问题

    场景描述 起因: 因项目需求,需要编写一个agent, 需支持Linux和Windows操作系统. Agent里面有一个功能需要获取到服务器上所有已经被占用的端口. 实现方式:针对不同的操作系统,实现 ...