.Net Core使用serilog的小记

2023-05-16

与许多其他 .NET 库一样,Serilog 为文件、控制台等提供基本的诊断日志记录。它易于设置,具有干净的API,并且可以在最近的.NET平台之间移植。今天花了点时间好好研究了下,记录下心得。

核心日志记录包是 Serilog。支持的平台是.NET/.NET Core,.NET Framework 4.5 +,Windows(8 / WinRT / Universal +)和Windows Phone 8 +。

github位置:serilog/serilog: Simple .NET logging with fully-structured events (github.com)

消息输出模板:Message Templates

创建记录器:

Log.Logger = new LoggerConfiguration().CreateLogger();
Log.Information("No one listens to me!");

// Finally, once just before the application exits...
Log.CloseAndFlush();

上面的示例将创建一个不记录任何位置的事件的记录器。若要查看日志事件,必须配置接收器。

添加接收器:

$ dotnet add package Serilog.Sinks.Console
$ dotnet add package Serilog.Sinks.File

using var log = new LoggerConfiguration()
    .WriteTo.Console()
    .WriteTo.File("log-.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();
   

Log.Information("Ah, there you are!");

上面的示例,添加了控制台和文件的接收器,这样日志就可以显示在控制台和文件中了。

日志级别:

配置最低记录级别:

serilog默认处理的日志最低级别为information,如果需要可以自行配置,

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Console()
    .CreateLogger();

上面的示例修改日志最低级别为Debug模式,否则使用Log.Debug("xxx"),不会有任何显示,因为默认处理的最低级别为information。

日志记录级别检测:

readonly bool _isDebug = Log.IsEnabled(LogEventLevel.Debug);
if (_isDebug) Log.Debug("Someone is stuck debugging...");

日志记录级别动态切换:

var levelSwitch = new LoggingLevelSwitch();

levelSwitch.MinimumLevel = LogEventLevel.Warning;

var log = new LoggerConfiguration()
  .MinimumLevel.ControlledBy(levelSwitch)
  .WriteTo.ColoredConsole()
  .CreateLogger();

现在,写入记录器的事件将根据交换机的属性进行筛选。MinimumLevel

若要在运行时调高或调低级别(可能是为了响应通过网络发送的命令),请更改以下属性:

levelSwitch.MinimumLevel = LogEventLevel.Verbose;
log.Verbose("This will now be logged");

使用Serilogs.Enrichers.Thread记录当前执行线程的ID和Name

Install-Package Serilog.Enrichers.Thread

Log.Logger = new LoggerConfiguration()
    .Enrich.WithThreadId()
    .Enrich.WithThreadName()
    .WriteTo.Console()
    .WriteTo.File("logs\log.txt")
    .CreateLogger();

许多接收器包含所有属性,无需进一步操作,因此将自动记录线程 ID。但是,某些接收器(如文件和控制台接收器)使用输出模板,所以一些新的属性可能不会自动输出到接收器中。在这种情况下,为了让我们需要的线程ID和Name显示在日志记录中,我们需要创建或修改输出模板。可以验证上面的例子,看是否有ID和Name显示。

配置输出模板:

            Thread.CurrentThread.Name = "MyWorker";
              
            var logger = Log.Logger = new LoggerConfiguration()
                 .MinimumLevel.Debug()
                 .WriteTo.Console(restrictedToMinimumLevel:Serilog.Events.LogEventLevel.Information)
                 .WriteTo.Async(w=>w.File("..\\..\\..\\..\\logs\\SerilogLogFile.json", rollingInterval: RollingInterval.Day, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj} <{ThreadId}><{ThreadName}>{NewLine}{Exception}"))
                 .Enrich.WithThreadId()
                 .CreateLogger();

上面我们使用Serilogs.Sinks.Async异步输出日志到文件中了,大概输出如下:

2018-04-06 13:12:45.684 +02:00 [ERR] The file file_name.svg does not exist <4><MyWorker>

<4> 线程ID,<MyWorker>线程名称

注意:如果线程名称为null,则会自动忽略name属性。如果想一直显示,则可以如下配置:

using Serilog.Enrichers;

Log.Logger = new LoggerConfiguration()
    .Enrich.WithThreadName() //这里顺序很重要,如果属性写在前,则一直输出MyDefault
    .Enrich.WithProperty(ThreadNameEnricher.ThreadNamePropertyName, "MyDefault")
    .CreateLogger();

使用Serilogs.Sinks.Debug显示日志信息到Visual Studio的调试输出窗口。

Install-Package Serilog.Sinks.Debug
Log.Logger = new LoggerConfiguration()
    .WriteTo.Debug()
    .CreateLogger();
    
Log.Information("Hello, world!");

使用Serilog.Settings.AppSettings读取.config文件配置信息

Install-Package Serilog.Settings.AppSettings

var log = new LoggerConfiguration()
    .ReadFrom.AppSettings()
    .CreateLogger();

节点配置App.config, Web.config配置console输出

<configuration>
  <appSettings>
    <add key="serilog:using:Debug" value="Serilog.Sinks.Debug" />
    <add key="serilog:write-to:Debug" />

若要将控制台接收器与 Microsoft.Extensions.Configuration(例如,ASP.NET Core 或 .NET Core)配合使用,请使用 Serilog.Settings.Configuration 程序包。如果尚未安装该软件包,请先安装该软件包

Install-Package Serilog.Settings.Configuration
var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();

在文件中的节点下,:appsettings.json   Serilog

{
  "Serilog": {
    "WriteTo": ["Debug"]
  }
}

使用Serilog.Sinks.File写文件的一些配置问题:

Serilog.Sinks.RllingFile已经弃用,合入到了Serilog.Sinks.File中。

默认情况下,单个文件最大为1GB.

取消限制:    .WriteTo.File("log.txt", fileSizeLimitBytes: null)

 同样,默认仅保留31个文件

取消限制:    .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: null)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net Core使用serilog的小记 的相关文章

  • win32 API 和 .NET 框架之间的选择

    我必须开发一个适用于 Windows 的应用程序 该应用程序将能够通过网络摄像头识别手势来控制鼠标 我将使用 vc 2008 进行开发 但我很困惑是使用 NET 框架还是核心 win32 API 性能对于我的应用程序非常重要 根据 Ivor
  • Windows:列出并启动与扩展关联的应用程序

    如何确定与特定扩展名 例如 JPG 关联的应用程序 然后确定该应用程序的可执行文件所在的位置 以便可以通过调用 System Diagnostics Process Start 来启动它 我已经知道如何读取和写入注册表 注册表的布局使得以标
  • 如何将 Metro 应用部署到桌面?

    我正在尝试将我的 C 应用程序部署到我的 Windows 8 Metro 桌面 我可以在 bin 文件夹中看到部署的文件 但是当我尝试打开它们时 出现以下错误 该应用程序只能在 AppContainer 的上下文中运行 我检查了属性上下文菜
  • SQL 查询在多用户环境中返回错误值

    一段时间以来 我们在我们的一个客户站点上发现了奇怪的数据完整性问题 经过大量调查后 我们现在已将其隔离为数据库调用 如果两个用户同时调用同一个存储过程 有时一个用户会得到另一个用户的结果 我们设置了一个测试来验证这一点 并且我们有一个循环
  • 字符串与 StringBuilder

    我理解之间的区别String and StringBuilder StringBuilder是可变的 但是两者之间有很大的性能差异吗 我正在开发的程序有很多大小写驱动的字符串附加 500 正在使用StringBuilder更好的选择 是的
  • 自定义 WCF DataContractSerializer

    是否可以用我自己的序列化程序替换 Windows Communication Foundation 中的 dataContractSerializer 如果可能的话 我怎样才能实现这一目标 是的 您可以提供自己的序列化器实现 默认情况下 W
  • 为什么 Roslyn 中有这么多对象池的实现?

    The 对象池 http source roslyn codeplex com Microsoft CodeAnalysis ObjectPool 25601 cs 20b9a041fb2d5b00是 Roslyn C 编译器中使用的一种类
  • 实体框架 - 循环更新属性

    我正在尝试找到一种方法来循环 EF 对象的属性并更新这些属性的值 更具体地说 我有 50 个字段 其中最多填充 50 个下拉列表 所有 50 个可能都需要填充 也可能不需要填充 为了解决这个问题 我有一个中继器 最多可以创建 50 个 DD
  • .NET 图形重影

    我正在为我们正在开发的新应用程序制作一个示例 GUI 我已经决定了语言 但我可以使用任何第 3 方 DLL 或插件或任何我需要的东西 以使 GUI 尽可能无缝地工作 他们希望它非常像 mac ubuntu vista Windows 7 所
  • 从 VS.NET 2008 转换到 2010 时 Windows 服务安装项目出现问题

    我正在尝试将解决方案从 VS NET 2008 转换为 2010 该解决方案包括一个 Windows 服务项目和一个安装 Windows 服务的安装项目 我在编译安装项目时遇到问题 我已经尝试按照教程从头开始几次here http msdn
  • 如何将 ConcurrentDictionary 转换为字典?

    我有一个 ConcurrentDictionary 对象 我想将其设置为 Dictionary 对象 不允许在它们之间进行转换 那么我该怎么做呢 The ConcurrentDictionary
  • 学习实体框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何创建一个没有边框且只能通过手柄调整大小的 WPF 窗口?

    如果你设置ResizeMode CanResizeWithGrip 在 WPF 上Window然后右下角会出现一个调整大小的夹点 如下 如果你设置WindowStyle None 标题栏也会消失 但灰色斜边仍然保留 直到您设置ResizeM
  • 从基础创建 Uri,不带尾部斜杠和相关部分

    我的 Uri 构造函数有问题 基本路径是否以斜杠结尾的结果会有所不同 var baseWithSlash new Uri c Temp var baseNoSlash new Uri c Temp var relative MyApp va
  • 可能有相同的合同,相同的绑定,相同的地址,但不同的端口?

    我有需要通过 basicHTTPBinding 进行通信的手持设备 我有合同 一切都按照广告进行 我需要扩展它以轻松支持测试环境 培训 当然还有生产的更改 我选择了端口路线 认为我可以公开具有端口差异的不同端点 并根据端口决定我想要来自哪个
  • Powershell XMLDocument保存为无BOM的UTF-8

    我构建了一个 System Xml XmlDocument 类型的 XML 对象 scheme gettype IsPublic IsSerial Name BaseType True False XmlDocument System Xm
  • 从嵌入 C# 的浏览器控件获取 HTML 源代码

    我有一个嵌入在 C Windows 应用程序中的浏览器控件 我想获取渲染的 HTML 可能已被 javascript 修改 而不是原始 HTML 有什么建议么 您可以获取 HTML 并确实设置它 使用WebBrowser DocumentT
  • FullCalendar Asp.Net WebForms

    我正在尝试实施全日历 https i stack imgur com wmhGx png在我的 ASP NET 上WebForms项目 我见过一些实现此目的的示例 但没有任何运气 因为它们是针对我不习惯的 MVC 的 My Events数据
  • WPF 中的屏幕分辨率问题?

    我将在 WPF 中使用以下代码检测分辨率 double height System Windows SystemParameters PrimaryScreenHeight double width System Windows Syste
  • 使用 ContractNamespace 属性设置 WCF DataContract 命名空间

    在设计我的服务时 我决定要自定义出现在生成的 WSDL 中的名称空间 对于数据合同 我遇到了合约命名空间 http msdn microsoft com en us library system runtime serialization

随机推荐

  • 怎么看电脑CPU是几核?

    对硬件的东西知之甚少 xff0c 保存在此 xff0c 以便以后查阅 方法一 鼠标右键桌面最下方的任务栏 任务管理器 性能 查看cpu使用记录 xff0c 有几个窗口就是几核心cpu xff1b 方法二 右键 我的电脑 属性 硬件 设备管理
  • linux批量远程控制

    前提 xff1a 勉ssh秘钥登陆 使用pdssh 1 配置主机列表 web list root 64 192 168 1 2 22 root 64 192 168 1 3 182 22 root 64 192 168 1 4 181 22
  • DataBinding详解

    一 开启DataBinding 在build gradle文件添加 android dataBinding enabled true 二 生成DataBinding布局 1 光标在布局文件的根布局 gt 点击Alt 43 Enter gt
  • python批量删除txt文件中指定行

    应用场景 xff1a 在深度学习项目中 xff0c 常常会处理各种数据集 比如已经标注好的数据标签有三类 xff1a 人形 汽车 猫 xff0c 有一个新项目 xff0c 只需要识别人形 xff0c 那就需要把这个数据集进行处理 xff0c
  • Python.循环

    一 循环结构 xff1a 是程序控制流程的三大结构之一 xff08 三大手段 方法之一 xff09 通过指定的条件将循环体进行有限次或无限次 xff08 死循环 xff09 地重复运行 在Python中主要用到while和for函数实现 二
  • bind详细学习

    DNS DNS xff1a Domain Name Service 应用层协议 xff08 C S 53 udp 53 tcp xff09 域名 分类 xff1a 最多可以有127级域名 根域一级域名 xff1a Top Level Dom
  • C++ 指针常量、常量指针和常指针常量

    1 指针常量 如果在定义指针变量时候 xff0c 指针变量前用const修饰 xff0c 被定义的指针变量就变成了一个指针类型的常变量 xff0c 指针类型的常变量简称为指针常量 格式如下 数据类型 const 指针变量 61 变量名 xf
  • Jetpack初尝试 NavController,LiveData,DataBing,ViewModel,Paging

    文章目录 插件配置NavController 使用1 创建xml2 创建Activity3 res 创建navigation nav garden和说明流程 ViewModel 负责页面的数据LiveData onChangedObserv
  • 移动固态硬盘删除分区(包括EFI分区)

    新换电脑原始的固态硬盘大小是500G xff0c 担心不够用 xff0c 但电脑只有一个放置固态硬盘的位置 xff0c 所以打算将原装的500G固态换成1T固态 xff0c 原始500G固态改成移动固态硬盘 原始500G固态一共有4个分区
  • Linux-OneNote的安装和使用

    P3X OneNote是Linux的非官方应用程序 xff0c 允许用户直接从Linux平台创建和共享笔记 安装 第一种方法 xff1a Snap安装 此部分转载自链接 在Linux操作系统上使用非官方版OneNote最快捷 最简单的方法是
  • Visual Studio运行控制台程序一闪而退的解决方法!

    初学者在使用Visual Studio各个版本时 xff0c 在进行调试运行时 xff0c 会发现控制台总是一闪即退 xff0c 输出结果的窗口无法保持打开状态 xff01 其实问题是你执行时按的是F5还是Ctrl 43 F5 xff0c
  • C# Microsoft.ClearScript.V8脚本使用

    1 ClearScript支持的功能和适用场景 微软的 net是非常强大和灵活的 xff0c 除了C 体系脚本扩展 xff0c 也支持其他流行的脚本扩展 xff0c Microsoft ClearScript V8就是一个 NET绑定到Go
  • WSL2中使用systemctl报错Failed to connect to bus: Host is down

    问题截图 xff1a System has not been booted with systemd as init system PID 1 Can t operate Failed to connect to bus Host is d
  • dom4j的Element

    1 Element其中的一个Element为dom4j 创建Element xff0c 通过DocumentHelper createElement xff08 name xff09 如 xff1a Element result 61 Do
  • 【重磅推荐: 强化学习课程】清华大学李升波老师《强化学习与控制》

    深度强化学习实验室 官网 xff1a http www neurondance com 论坛 xff1a http deeprl neurondance com 编辑 xff1a DeepRL 强化学习与控制 是一门由清华大学智能驾驶课题组
  • Java正则实现EL表达式

    br public static void main String args br br Map map 61 new HashMap 2 br map put 34 name 34 34 Jame Gosling 34 br map pu
  • 【vivado】ILA调试报错 The debug hub core was not detected 以及 Data read from hw_ila [hw_ila_1] is corrupted

    报错一 xff1a WARNING Labtools 27 3361 The debug hub core was not detected Resolution 1 Make sure the clock connected to the
  • TSLint 配置规则

    TSLint core rules 原文 xff1a https palantir github io tslint rules Lint rules encode logic for syntactic amp semantic chec
  • android一些不常见属性

    1 xff1a coreApp 61 true 表示拥有该属性的app是核心app xff0c 并不表示其拥有系统权限 xff1b 核心app是最小的android framework 系统 xff0c 其作用是 xff1a andriod
  • .Net Core使用serilog的小记

    与许多其他 NET 库一样 xff0c Serilog 为文件 控制台等提供基本的诊断日志记录 它易于设置 xff0c 具有干净的API xff0c 并且可以在最近的 NET平台之间移植 今天花了点时间好好研究了下 xff0c 记录下心得