当前位置: 首页 > news >正文

Serilog文档翻译系列(六) - 可用的接收器、增强器、格式化输出

01、提供的接收器

Serilog 使用接收器将日志事件以各种格式写入存储。许多接收器由更广泛的 Serilog 社区开发和支持;可以通过在 NuGet 上搜索 serilog 标签找到。
在这里插入图片描述

02、增强器

日志事件可以通过多种方式增强属性。通过 NuGet 提供了一些预构建的增强器:

Install-Package Serilog.Enrichers.Thread

增强配置是通过 Enrich 配置对象进行的:

var log = new LoggerConfiguration().Enrich.WithThreadId().WriteTo.Console().CreateLogger();

通过日志写入的所有事件将携带一个名为 ThreadId 的属性,表示写入它们的托管线程的 ID。(根据约定,Enrich 上的任何 .WithXyz() 方法都会创建名为 Xyz 的属性。)

1、日志上下文

Serilog.Context.LogContext 可以用来动态添加和移除来自环境“执行上下文”的属性;例如,在一个事务期间写入的所有消息可能会携带该事务的 ID,等等。

此功能必须在配置时通过 .FromLogContext() 添加到日志记录器中:

var log = new LoggerConfiguration().Enrich.FromLogContext()

然后,可以使用 LogContext.PushProperty() 向上下文添加和移除属性:

log.Information("No contextual properties");
using (LogContext.PushProperty("A", 1))
{log.Information("Carries property A = 1");using (LogContext.PushProperty("A", 2))using (LogContext.PushProperty("B", 1)){log.Information("Carries A = 2 and B = 1");}log.Information("Carries property A = 1, again");
}

将属性推送到上下文中会覆盖任何具有相同名称的现有属性,直到从 PushProperty() 返回的对象被释放,如示例中的属性 A 所示。

重要提示:必须按照添加的确切顺序从上下文中弹出属性。否则,行为是未定义的。

2、可用的增强器包

Serilog 项目提供:

  • Serilog.Enrichers.Environment - WithMachineName() 和
    WithEnvironmentUserName()
  • Serilog.Enrichers.Process - WithProcessId()
  • Serilog.Enrichers.Thread - WithThreadId()

其他有趣的增强器:

  • Serilog.Web.Classic - WithHttpRequestId() 和许多其他在经典 ASP.NET 应用程序中有用的增强器
  • Serilog.Exceptions - WithExceptionDetails() 添加来自异常的额外结构化属性
  • Serilog.Enrichers.Demystify - WithDemystifiedStackTraces()
  • Serilog.Enrichers.ClientInfo - WithClientIp()、WithCorrelationId() 和 WithRequestHeader(“header-name”) 将添加具有客户端 IP、关联 ID 和 HTTP 请求头值的属性
  • Serilog.Enrichers.ExcelDna - WithXllPath() 和许多其他在 Excel-DNA 插件中有用的增强器
  • Serilog.Enrichers.Sensitive - WithSensitiveDataMasking() 在日志事件中掩盖敏感数据
  • Serilog.Enrichers.GlobalLogContext - FromGlobalLogContext() 动态添加来自“全局上下文”的属性

03、格式化输出

Serilog 提供了多种输出格式机制。

1、格式化纯文本

写入纯文本输出的接收器,例如控制台和基于文件的接收器,通常接受输出模板以控制日志事件数据的格式。

这些接收器写入的事件格式可以使用 outputTemplate 配置参数进行修改。例如,要控制控制台接收器:

Log.Logger = new LoggerConfiguration().WriteTo.Console(outputTemplate:"[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}").CreateLogger();

输出模板中可以出现多个内置属性:

  • Exception - 完整的异常消息和堆栈跟踪,以多行格式显示。如果事件没有关联的异常,则为空。
  • Level - 日志事件级别,以完整级别名称格式化。要使用更紧凑的级别名称,可以使用格式如 {Level:u3} 或 {Level:w3} 来分别表示三个字符的大写或小写级别名称。
  • Message - 日志事件的消息,呈现为纯文本。:l 格式说明符可以关闭字符串的引用,:j 则使用 JSON 风格渲染任何嵌入的结构化数据。
  • NewLine - 属性值为 System.Environment.NewLine。
  • Properties - 所有在输出中未出现的事件属性值。使用 :j 格式可以进行 JSON 渲染。
  • Timestamp - 事件的时间戳,类型为 DateTimeOffset。
  • TraceId - 创建事件时活动的追踪 ID(如果有)。
  • SpanId - 创建事件时活动的跨度 ID(如果有)。

通过增强器附加的事件属性也可以出现在输出模板中。

2、格式化 JSON

许多接收器会将日志事件记录为 JSON,或者可以配置为这样做。要输出 JSON 而不是纯文本,可以指定格式化程序。以下示例使用来自 Serilog.Formatting.Compact 的格式化程序配置文件接收器。

Log.Logger = new LoggerConfiguration().WriteTo.File(new CompactJsonFormatter(), "log.txt").CreateLogger();

Serilog 项目提供了三种 JSON 格式化程序:

  • Serilog.Formatting.Json.JsonFormatter - 这是 Serilog 包中历史默认的格式化程序。它生成完整的日志事件渲染,并支持一些配置选项。
  • Serilog.Formatting.Compact.CompactJsonFormatter - 这是一个较新、更节省空间的 JSON 格式化程序,随 Serilog.Formatting.Compact 一起提供。
  • Serilog.Formatting.Compact.RenderedCompactJsonFormatter - 也是随 Serilog.Formatting.Compact 提供的,该格式化程序将消息模板预先渲染为文本。

3、灵活的的格式化与 ExpressionTemplate

Serilog.Expressions 包含了 ExpressionTemplate 类,用于更复杂的文本和 JSON 格式化。表达式模板可以包含条件块、重复部分、对事件属性的计算以及自定义格式化函数。

ExpressionTemplate 实现了 ITextFormatter 接口,因此它可以与任何基于文本的 Serilog 接收器一起使用,包括控制台(带 ANSI 颜色主题)、文件、调试和电子邮件。

4、义格式化程序

纯文本和 JSON 格式化都是通过 ITextFormatter 接口实现的。该接口的实现可以将日志事件格式化为任何基于文本的格式。

自定义 JSON 格式化程序可以围绕 Serilog 中包含的 JsonValueFormatter 类构建。

格式提供程序

有多种选项可用于格式化单个类型的输出,例如日期。一个例子是大多数接收器接受的格式提供程序。

下面是一个使用 Serilog.Sinks.Console 接收器的简单控制台示例。这使用了默认的日期渲染行为。

class User
{public int Id { get; set; }public string Name { get; set; }public DateTime Created { get; set; }
}public class Program
{public static void Main(string[] args){Log.Logger = new LoggerConfiguration().WriteTo.Console().CreateLogger();var exampleUser = new User { Id = 1, Name = "Adam", Created = DateTime.Now };Log.Information("Created {@User} on {Created}", exampleUser, DateTime.Now);Log.CloseAndFlush();}
}

这将以下内容写入控制台。

[18:46:45 INF] Created {"Id": 1, "Name": "Adam", "Created": "2018-05-17T18:46:45.9064879+10:00", "$type": "User"} on 05/17/2018 18:46:45

在某些情况下,可能希望重写或指定 DateTime 的格式。可以通过实现 IFormatProvider 来实现这一点。这种策略适用于您传递给 Serilog 的任何类型。

class User
{public int Id { get; set; }public string Name { get; set; }public DateTime Created { get; set; }
}class CustomDateFormatter : IFormatProvider
{readonly IFormatProvider basedOn;readonly string shortDatePattern;public CustomDateFormatter(string shortDatePattern, IFormatProvider basedOn){this.shortDatePattern = shortDatePattern;this.basedOn = basedOn;}public object GetFormat(Type formatType){if (formatType == typeof(DateTimeFormatInfo)){var basedOnFormatInfo = (DateTimeFormatInfo)basedOn.GetFormat(formatType);var dateFormatInfo = (DateTimeFormatInfo)basedOnFormatInfo.Clone();dateFormatInfo.ShortDatePattern = this.shortDatePattern;return dateFormatInfo;}return this.basedOn.GetFormat(formatType);}
}public class Program
{public static void Main(string[] args){var formatter = new CustomDateFormatter("dd-MMM-yyyy", new CultureInfo("en-AU"));Log.Logger = new LoggerConfiguration() .WriteTo.Console(formatProvider: new CultureInfo("en-AU")) // Console 1.WriteTo.Console(formatProvider: formatter)                // Console 2.CreateLogger();var exampleUser = new User { Id = 1, Name = "Adam", Created = DateTime.Now };Log.Information("Created {@User} on {Created}", exampleUser, DateTime.Now);Log.CloseAndFlush();}
}

以下是上述示例的输出,配置了两个控制台接收器。

[13:57:12 INF] Created {"Id": 1, "Name": "Adam", "Created": "2020-09-01T13:56:59.7803740-05:00", "$type": "User"} on 1/09/2020 1:57:12 PM
[13:57:12 INF] Created {"Id": 1, "Name": "Adam", "Created": "2020-09-01T13:56:59.7803740-05:00", "$type": "User"} on 01-Sep-2020 1:57:12 PM

:相关源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Planner

相关文章:

Serilog文档翻译系列(六) - 可用的接收器、增强器、格式化输出

01、提供的接收器 Serilog 使用接收器将日志事件以各种格式写入存储。许多接收器由更广泛的 Serilog 社区开发和支持;可以通过在 NuGet 上搜索 serilog 标签找到。 02、增强器 日志事件可以通过多种方式增强属性。通过 NuGet 提供了一些预构建的增强器&#xff…...

傅里叶级数在机器人中的应用(动力学参数辨识)

B站首发!草履虫都能看懂的【傅里叶变换】讲解,清华大学李永乐老师教你如何理解傅里叶变换,辨清美颜和变声原理,!!_哔哩哔哩_bilibiliB站首发!草履虫都能看懂的【傅里叶变换】讲解,清…...

前端框架Vue、React、Angular、Svelte对比

在对比 React、Vue.js、Angular 和 Svelte 时,除了在高层次的特性上有显著差异,它们在核心设计理念和底层实现机制上也有明显的不同。为了清晰地理解这些框架,我们可以从以下几个方面来分析它们的核心不同点和底层不同点。 1. 框架类型和设计…...

深度学习后门攻击分析与实现(二)

前言 在本系列的第一部分中,我们已经掌握了深度学习中的后门攻击的特点以及基础的攻击方式,现在我们在第二部分中首先来学习深度学习后门攻击在传统网络空间安全中的应用。然后再来分析与实现一些颇具特点的深度学习后门攻击方式。 深度学习与网络空间…...

boost 的lockfree 使用

boost 的lockfree 使用 // test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <mutex> #include <memory> #include <condition_variable> #include <…...

基于Hexo个人博客界面优化

基于Hexo个人博客界面优化 怎么搭建个人博客 选择主题 经过多个对比&#xff0c;选择简单一点的的yilia 1.将主题文件下载解压到 你的博客目录的 themes下 下载yilia主题文件 2.改写配置 打开你的_config.yml #theme: landscape 这是原来的&#xff0c;改成下面这个 theme: yil…...

vue3+ts不能将类型“Timeout”分配给类型“null”不能将类型“Timeout”分配给类型number

在设置有setTimeout() 函数时&#xff0c;一般是需要进行清除计时器操作的&#xff1b; 常用的做法是定义一个全局变量timer&#xff0c;在onMounted或者有需要的地方进行赋值&#xff0c;在onBeforeUnmount进行clear&#xff0c;一般在定义timer变量时&#xff0c;使用 numbe…...

如何给多台Linux机器设置时间同步

文章目录 1&#xff0c;使用chrony时间同步服务1.1 修改chrony配置文件 2&#xff0c;使用ntpdate服务 1&#xff0c;使用chrony时间同步服务 Centos7默认已安装&#xff0c;另外基于centos7的统信OS&#xff0c;中科OS也会默认安装这个。如果你机器上没有这个服务&#xff0c…...

忘写return有什么现象?

使用C语言&#xff0c;一直觉得没有return无所谓&#xff0c;直到被制裁。。 参考&#xff1a; 非void函数缺失返回值导致crash或结果异常的分析 - 知乎 (zhihu.com) 可以分析出&#xff1a; 没有写return 的话&#xff0c;eax的内容是在预期之外的。 例如更新参考内容的解…...

大数据新视界 --大数据大厂之 Druid 实时数据分析平台在大数据中的应用

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

MySQL --基本查询(下)

文章目录 3.Update3.1将孙悟空同学的数学成绩变更为 80 分3.2将曹孟德同学的数学成绩变更为 60 分&#xff0c;语文成绩变更为 70 分3.3将总成绩倒数前三的 3 位同学的数学成绩加上 30 分3.4将所有同学的语文成绩更新为原来的 2 倍 4.Delete4.1删除数据4.1.1删除孙悟空同学的考…...

vue3实现自定义主题色切换功能

目录 1.添加theme样式文件2.引入样式文件3.使用变量设置css样式4.设置主题样式5.切换方法 1.添加theme样式文件 文件内容如下&#xff1a; html[data-theme"light"]{--text-color: #000000;/* 写需要切换的样式 */ } html[data-theme"dark"]{--text-color…...

不懂性能测试,被面试官挂了...

性能测试旨在检查应用程序或软件在特定负载下工作时的响应性和稳定性&#xff0c;从而检测应用程序/软件在响应速度、可扩展性和稳定性方面是否达到预期的要求。 简而言之&#xff0c;性能测试目标就是为了识别并消除应用程序中的性能瓶颈。 本文将为大家详细介绍性能测试主要…...

JS逆向基础-谷歌浏览器调试技巧(详细)

概述 浏览器的调试工具在 JavaScript 逆向工程中&#xff0c;帮助开发者分析和理解代码执行流程、变量值及其变化&#xff0c;从而揭示隐藏逻辑和加密机制&#xff0c;为破解、修改或复现代码提供重要支持。 调试面板详解 谷歌浏览器的调试面板概览&#xff1a; 顶部操作栏 …...

那年我双手插兜,使用IPv6+DDNS动态域名解析访问NAS

估计有很多科技宅和我一样&#xff0c;会买一个NAS存储或者自己折腾刷一下黑群晖玩玩&#xff0c;由于运营商不给分配固定的公网IP&#xff0c;就导致我在外出的时候无法访问家里的NAS&#xff0c;于是远程访问常常受到IP地址频繁变动的困扰。为了解决这一问题&#xff0c;结合…...

CSS的弹性盒子模型(Flex box)

弹性盒子模型是CSS3的一种新的布局模式&#xff0c;弹性盒是一种当页面需要适应不同的屏幕大小以及设备类型时确保拥有合适的布局方式&#xff0c;引入弹性盒子模型的目的时提供更加有效的方式来对一个容器中的子元素进行排列&#xff0c;对齐和分配空白空间。 弹性盒子由弹性容…...

django drf 分页器

自定义分页器代码&#xff1a; from django.core.paginator import InvalidPage from django.core.paginator import Paginator as DjangoPaginator from django.utils.functional import cached_property from rest_framework.exceptions import NotFound from rest_framewor…...

SpringBoot整合JPA实现CRUD详解

SpringBoot版本是2.0以上(2.6.13) JDK是1.8 一、依赖 <dependencies><!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><!--…...

干部画像——精准辅助干部选拔的核心利器

干部画像&#xff0c;作为现代干部管理体系中的一项重要创新&#xff0c;已逐步成为精准辅助干部选拔的核心利器。通过综合运用多维度信息收集、系统化整理与科学化分析的方法&#xff0c;全面、客观、真实地勾勒出每位干部的综合素质与能力画像&#xff0c;为干部选拔工作提供…...

linux网络编程9

24.9.26学习目录 一.Web编程1.Javascript3.CGI 一.Web编程 1.Javascript 是一种基于对象并具有安全性能的脚本语言&#xff0c;是由浏览器内解释器翻译成可执行格式后执行&#xff1b; 即是网页与用户完成各种交互动作&#xff1b; 特点&#xff1a;基于对象的语言、简单性、…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...