Serilog :选择在运行时记录哪个接收器

2023-11-22

我将在 .net 标准 2.0 库中实现 Serilog。 我正在寻找一种方法来选择每个日志行应使用哪个接收器。

假设我们在配置中定义了 2 个接收器(控制台和文件):

    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Debug()
        .WriteTo.Console()
        .WriteTo.File("c:\\temp\\SerilogTets.txt")
        .CreateLogger();

之后,我们将编写一条日志规则:

Log.Information("Hello, world!");  //<- how can we define which sink we want to use

我正在寻找一种方法来定义应记录哪些接收器的这些行:

  • 控制台和文件
  • 仅控制台
  • 仅文件

不依赖于它是什么日志级别。

先感谢您!

亲切的问候, 库尔特


在 Serilog 中,您可以通过以下方式进行分离子记录器 using filters or via Serilog.Sinks.Map, using 上下文属性决定哪个记录器将包含或排除某些消息。

下面的示例定义默认情况下所有日志事件都将写入控制台和文件,但是如果日志事件具有名为FileOnly在日志上下文中,它不会被写入控制台,同样,如果日志事件具有名为的属性ConsoleOnly,它不会被写入文件。

using Serilog;
using Serilog.Context;
using Serilog.Filters;
// ...

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .Enrich.FromLogContext()
    .WriteTo.Logger(c =>
        c.Filter.ByExcluding(Matching.WithProperty("FileOnly"))
            .WriteTo.Console())
    .WriteTo.Logger(c =>
        c.Filter.ByExcluding(Matching.WithProperty("ConsoleOnly"))
            .WriteTo.File("C:\\Temp\\SerilogTests.txt"))
    .CreateLogger();

// Writes to both Console & File
Log.Information("Hello, world! (Console and File)");

using (LogContext.PushProperty("ConsoleOnly", value: true))
{
    // Writes only to the Console
    Log.Information("Hello, world! (Console)");
}

using (LogContext.PushProperty("FileOnly", value: true))
{
    // Writes only to the File
    Log.Information("Hello, world! (File Only)");
}

Log.CloseAndFlush();

注意:理想情况下,您会想出更好、更通用的属性名称,这样当您在应用程序中写入日志时,就不必知道有关“控制台”或“文件”的任何信息。例如你可以拥有一个名为Secret or Classified并根据此属性是否存在来决定将日志写入何处。

向日志事件添加属性有多种方法,包括在您添加属性时直接在消息模板中添加属性。Log.Information等,通过LogContext.PushProperty如上例所示,并且 viLog.ForContext.

您可以在此处查看过滤、子记录器和 Serilog.Sinks.Map 的其他示例:

  • Serilog:如何不记录某些请求(或以不同级别记录)
  • Serilog - 单独的信息文件,使用 appsetting.json 的例外
  • Serilog 破坏多个日志?
  • 按方法名称过滤 Serilog
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Serilog :选择在运行时记录哪个接收器 的相关文章

随机推荐

  • 编写一个有 2 个线程交替打印的程序

    我最近在接受采访时被问到这个问题 编写一个具有两个线程 A 和 B 的程序 其中 A 打印 1 B 打印 2 依此类推 直到达到 50 我们该如何去做呢 分配的本质是演示一个线程如何向另一个线程发出信号 最常见的方法是使用阻塞队列 但这里信
  • 在Python 2.7中模拟按键事件

    我想要做的是在 Windows 上按 Python 脚本级别的任意键盘键 我尝试过 SendKeys 但它仅适用于 python 2 6 我尝试过的其他方法包括 import win32com client win32com client
  • 来自 ADFS 服务器的 URL 重定向

    我在 ASP net Web 应用程序中使用 ADFS 进行身份验证 STS服务器将浏览器重定向到https test contoso com 首先将客户端重定向到 STS 时 STS 不允许任何返回 URL 参数 是否可以将浏览器重定向到
  • 整数除法的行为是什么?

    例如 int result result 125 100 or result 43 100 结果总是分区的底线吗 定义的行为是什么 结果总是分区的底线吗 定义的行为是什么 不完全的 它向 0 舍入 而不是向下舍入 6 5 5 乘法运算符 6
  • Java 的“Parallel.For”?

    我想知道是否有并行 For相当于 Java 的 net 版本吗 如果有人可以提供一个例子吗 谢谢 我想最接近的事情是 ExecutorService exec Executors newFixedThreadPool SOME NUM OF
  • jquery 中的按钮文本切换

    当我单击 pushme 按钮时 它会将其文本变为 不要推我 当再次单击按钮时 我想再次将文本变为 推我 我怎样才能做到这一点
  • 避免应用程序激活并在单击其上的按钮时集中注意力 - Windows API 或 Qt

    情况 无边框 QDialog 成功地保持在其他应用程序之上 问题是当单击此始终位于顶部的应用程序窗口时 会发生以下情况 单击的始终位于顶部的应用程序被激活 单击的始终位于顶部的应用程序窗口会窃取先前活动 聚焦的应用程序的焦点 是否有可能当单
  • YouTube API loadVideoById startSeconds 不起作用

    我为我嵌入的一些 YouTube 视频创建了一个章节选择器 此方法曾经有效 但最近已停止 我不明白发生了什么事 我使用他们推荐的格式 但使用 loadVideoById 来显示每一章 div class wrapper div div di
  • 具有 MVVM 模式的数字文本框

    我见过数字的实现TextBox后面的代码WPF 我们如何做到这一点MVVM图案 在 WPF 中 如果将 TextBox 绑定到 Decimal 或 Int 属性 它将仅接受该 int 或decimal 否则它将显示红色边框 表明它在绑定中没
  • 什么是真与假?它与 True 和 False 有何不同?

    我刚刚了解到有truthy and falsypython 中的值与正常值不同True and False 有人可以深入解释一下什么吗truthy and falsy价值观是 我应该在哪里使用它们 有什么区别truthy and True价
  • 为什么 ${basedir} NLog 配置不起作用?

    为什么我无法在生产服务器中使用 basedir nlog config 如果我使用fileName basedir logs shortdate log nlog 不记录消息信息 但是如果我更改为类似的内容fileName C logs s
  • dockerfile中的EXPOSE和服务YAML中的TARGETPORT与Pod中实际运行的端口有什么关系?

    dockerfile中的EXPOSE和服务YAML中的TARGETPORT与Pod中实际运行的端口有什么关系 在我的 dockerfile 中 expose 8080 在我的部署中 ports containerPort 8080 在我的服
  • fork() 后 libCurl SSL 错误

    我正在开发一个 FUSE 驱动程序 当我将其作为守护进程运行时 没有 f 或 d 标志 通过 libcurl 发出的所有 https 请求都会失败 我能够通过发出 https 请求 分叉并返回父进程 然后从新进程发出第二个请求来重现该错误
  • 查找关联记录存在的位置

    如何仅选择那些具有关联标签记录的员工 换句话说 仅选择具有一个或多个与其关联的标签记录的员工记录 class Employee lt ActiveRecord Base has and belongs to many tags end cl
  • 在 ASP.NET 中正确执行锁定

    我有一个 ASP NET 站点 其搜索功能相当慢 我想通过使用查询作为缓存键将结果添加到缓存一小时来提高性能 using System using System Web using System Web Caching public cla
  • Spring Boot应用程序立即退出

    当我运行我的spring bootapplication 它立即退出 与exit code 0 有了这个 Spring Boot v2 1 0 RELEASE 2018 11 27 14 08 31 219 INFO 94920 resta
  • iOS 检测蓝牙连接/断开

    即使我的应用程序处于后台 当蓝牙设备与 iOS 连接或断开连接时 是否可以收到通知 在 Android 上 我使用ACTION ACL CONNECTED and ACTION ACL DISCONNECTED事件 但我找不到 iOS 的等
  • Chrome 特定的 CSS 问题将表格单元格设置为显示:块

    I found 这个问题那似乎有我想要的 我正在使用 chrome 32 0 1700 102 甚至fiddle第一个答案对我来说效果很好 但是 当我将以下 html 放入新文件并在 chrome 中打开它时 tds 的 计算样式 选项卡仍
  • Flutter 中是否有任何回调告诉我“构建”功能何时完成?

    我的屏幕上有一个 listView 我已经给它附加了一个控制器 我能够调用我的端点 接收响应 解析它并插入行中 ListView 应该自动滚动 确实如此 但不是以完美的方式 我总是落后一个项目 这是我的代码 override Widget
  • Serilog :选择在运行时记录哪个接收器

    我将在 net 标准 2 0 库中实现 Serilog 我正在寻找一种方法来选择每个日志行应使用哪个接收器 假设我们在配置中定义了 2 个接收器 控制台和文件 Log Logger new LoggerConfiguration Minim