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文档翻译系列(六) - 可用的接收器、增强器、格式化输出的更多相关文章
- React文档翻译系列(三)JSX简介
# React文档翻译系列(三)JSX简介 先来看一下下面的变量声明: ``` const element = Hello world! ``` 这种有趣的标签语法既不是字符串也不是HTML. 这种形 ...
- Orchard core 中文文档翻译系列
本系列翻译顺序完全参照 官方顺序 原文地址:https://orchardcore.readthedocs.io/en/latest/ Orchard Core 中文文档翻译(一)关于Orchard ...
- CSS 魔法系列:纯 CSS 绘制各种图形《系列六》
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...
- WCF编程系列(六)以编程方式配置终结点
WCF编程系列(六)以编程方式配置终结点 示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...
- SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性
原文:SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 ...
- R语言数据分析系列六
R语言数据分析系列六 -- by comaple.zhang 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候怎样下手分析,数据分析的第一步.探索性数据分析. 统计量,即统计学里面关注的数据集 ...
- React文档翻译系列(二)Hello World
这是React文档翻译系列的第二篇,前一篇介绍了如何安装react,本篇主要介绍react的知识体系,掌握了基本的知识体系,才能更好的学习React. Hello World 开始React最简单的方 ...
- java基础解析系列(六)---深入注解原理及使用
java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer ja ...
- information_schema系列六(索引,表空间,权限,约束相关表)
information_schema系列六(索引,表空间,权限,约束相关表) 1: STATISTICS 这个表提供的是关于表的索引信息: INFORMATION_SCHEMA Name SHOW ...
- java基础解析系列(六)---注解原理及使用
java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及 ...
随机推荐
- Known框架实战演练——进销存基础数据
本文介绍如何实现进销存管理系统的基础数据模块,基础数据模块包括商品信息.供应商管理和客户管理3个菜单页面.供应商和客户字段相同,因此可共用一个页面组件类. 项目代码:JxcLite 开源地址: htt ...
- CSP-S提高组数据结构算法模板大合集
CSP-S 算法总结 2.2.1 基础知识与编程环境 无 2.2.2 C++ 程序设计 2 set/nultiset map/multimap deque/priority_queue STL 2.2 ...
- Java基础学习知识点框架(详细)
//学习网站 Java研发技术学习路线_飞月程序人生-CSDN博客_java开发学习路线 Java后端技术栈梳理 - 知乎 harrywfl/JavaGuide: [Java学习+面试指南] 一份涵盖 ...
- 对比python学julia(第一章)--(第二节)似曾相识燕归来
Julia和python一样,都是跨平台开源语言,而且都是动态语言,所以毫无疑问,需要运行时支撑.很简单,到官网去下载julia(https://julialang.org/downloads/).和 ...
- 【CI/CD】Jenkins 部署前后端项目Demo
前置环境准备: 参考尚硅谷最新发布的Jenkins教程 同样准备了三台服务器: 192.168.124.34 Centos7 8G内存 用于安装GitLab 192.168.124.35 Centos ...
- 【MySQL】01 概念与介绍
视频节选自 :P1 - P7 https://www.bilibili.com/video/BV1xW411u7ax 用户浏览的页面 - 服务器 - 数据库 所有访问的本质的东西,就是访问数据,数据 ...
- 什么是智慧城市(Smart City)?
Smart City是一个常见的概念,但是这个东西,这个名词到底指代的是什么却一直搞不太清,于是就查了查资料,有了这篇blog. 参考: https://baijiahao.baidu.com/s?i ...
- baselines算法库common/vec_env/dummy_vec_env.py模块分析
baselines算法库设计可以和多个并行环境进行交互,也就是并行采样,实现多进程并行采样的模块为subproc_vec_env.py,与此相对的只实现单个进程下多环境交互的模块即为本文所要讲的dum ...
- 实验室服务彻底死机记录——硬件故障——主板pcie槽坏掉或显卡坏掉
2022年11月8日 后记(最新更新) 服务器送售后,售后给厂家技术打电话,厂家技术说可能是显卡的电源线松了,于是我们打开机箱把显卡的电源线紧了紧,然后神奇的事情发生了,故障解除了...... 一 ...
- vue 文件流下载
/** * 文件转为文件流 * @param {file} file //文件 */ export function getFileBlob(file) { var dataUrl va ...