Serilog:如何进一步增强 appsettings.json 中的过滤器表达式?

2023-12-06

我有两个带有 Serilog 的记录器,它们保存到不同的文件。我想通过 appsettings.json 而不是代码创建记录器。

当我通过创建记录器时Startup.cs配置后,我会得到更具体的日志,我更喜欢这样,因为它更清晰,并且允许其他人检查日志并了解正在发生的情况,而无需太多的技术知识。但是,我想将其应用于应用程序设置,以便我可以将代码迁移到我可能使用的任何其他项目。仅供参考:我不想覆盖日志级别。

例如,我使用代码创建记录器,如下所示:

Log.Logger = new LoggerConfiguration()
    .WriteTo.ColoredConsole()
    .WriteTo.Logger(lc => lc
    .Filter.ByExcluding(Matching.FromSource("Microsoft"))
    .WriteTo.File("Serilogs/Program_log_.txt", rollingInterval: RollingInterval.Day)
    .MinimumLevel.Information()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Information))

    .WriteTo.Logger(lc => lc
    .Filter.ByIncludingOnly(Matching.FromSource("Microsoft"))
    .WriteTo.File("Serilogs/ServerTrace_log_.txt", rollingInterval: RollingInterval.Day)
    .MinimumLevel.Information()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Information))

    .CreateLogger();

这会生成两个独立的输出,我喜欢它们的格式:File 1:可读的自定义日志:

2019-01-18 11:18:09.873 +00:00 [INF] //Some custom log information
2019-01-18 11:18:09.875 +00:00 [INF] //Some more custom log information

File 2:堆栈跟踪,服务器信息:

2019-01-18 11:17:56.378 +00:00 [INF] User profile is available. Using '//A path' as key repository and Windows DPAPI to encrypt keys at rest.
2019-01-18 11:17:57.840 +00:00 [INF] Request starting HTTP/1.1 GET https://localhost:5001/swagger/index.html  
2019-01-18 11:17:58.074 +00:00 [INF] Request finished in 235.5796ms 200 text/html
2019-01-18 11:17:58.326 +00:00 [INF] Request starting HTTP/1.1 GET https://localhost:5001/swagger/v1/swagger.json  
2019-01-18 11:17:58.452 +00:00 [INF] Request finished in 126.2127ms 200 application/json;charset=utf-8 

当我使用 JSON appsettings 执行此操作时,它看起来像这样:

 "Serilog": {
    "Using": [
      "Serilog.Sinks.File",
      "Serilog.Filters.Expressions",
      "Serilog.Settings.Configuration"
    ],
    "WriteTo": [
      {
        "Name": "Logger",
        "Args": {
          "configureLogger": {
            "Filter": [
              {
                "Name": "ByIncluding",
                "Args": {
                  "expression": "SourceContext = 'Microsoft'"
                }
              }
            ],
            "WriteTo": [
              {
                "Name": "File",
                "Args": {
                  "path": "./Serilogs/server_logs_.log",
                  "rollingInterval": "Day"
                }
              }
            ]
          }
        }
      },
      {
        "Name": "Logger",
        "Args": {
          "configureLogger": {
            "Filter": [
              {
                "Name": "ByExcluding",
                "Args": {
                  "expression": "SourceContext = 'Microsoft.AspNetCore.Hosting.Internal.WebHost'"
                }
              }
            ],
            "WriteTo": [
              {
                "Name": "File",
                "Args": {
                  "path": "./Serilogs/program_logs_.log",
                  "rollingInterval": "Day"
                }
              }
            ]
          }
        }
      }
    ]
  }

这会生成两个文件。File 1:可读的自定义日志:

2019-01-18 11:22:52.903 +00:00 [INF] User profile is available. Using '// A path' as key repository and Windows DPAPI to encrypt keys at rest.
2019-01-18 11:22:59.229 +00:00 [INF] Route matched with {action = "PollForStatusUpdate", controller = "StatusMessage"}. Executing action {apiname}.{controller}.{method}.PollForStatusUpdate ({apiname})
2019-01-18 11:22:59.505 +00:00 [INF] Executing action method {apiname}.{controller}.{method}.PollForStatusUpdate ({apiname}) with arguments (["{apiname}.{controller}.{method}.MessageResult"]) - Validation state: "Valid"
2019-01-18 11:22:59.632 +00:00 [INF] //Some custom log information
2019-01-18 11:22:59.639 +00:00 [INF] //Some more custom log information
{apiname}.{controller}.{method}.PollForStatusUpdate ({apiname}), returned result Microsoft.AspNetCore.Mvc.OkObjectResult in 516.8129ms.
2019-01-18 11:23:00.040 +00:00 [INF] Executing ObjectResult, writing value of type '{apiname}.{controller}.{method}.MessageResult'.
2019-01-18 11:23:00.048 +00:00 [INF] Executed action {apiname}.{controller}.{method}.PollForStatusUpdate ({apiname}) in 813.08940000000007ms

File 2:堆栈跟踪,服务器信息:

2019-01-18 11:22:52.903 +00:00 [INF] User profile is available. Using 'C:\Users\msharp\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
2019-01-18 11:22:54.263 +00:00 [INF] Request starting HTTP/1.1 GET https://localhost:5001/swagger/index.html  
2019-01-18 11:22:54.473 +00:00 [INF] Request finished in 211.831ms 200 text/html
2019-01-18 11:22:54.737 +00:00 [INF] Request starting HTTP/1.1 GET https://localhost:5001/swagger/v1/swagger.json  
2019-01-18 11:22:54.838 +00:00 [INF] Request finished in 100.8892ms 200 application/json;charset=utf-8
2019-01-18 11:22:59.205 +00:00 [INF] Request starting HTTP/1.1 POST https://localhost:5001/api/StatusMessage/PollForStatusUpdate application/json-patch+json 180
2019-01-18 11:22:59.229 +00:00 [INF] Route matched with {action = "PollForStatusUpdate", controller = "StatusMessage"}. Executing action PureValuationsApi.Controllers.StatusMessageController.PollForStatusUpdate (PureValuationsApi)
2019-01-18 11:22:59.505 +00:00 [INF] Executing action method {apiname}.{controller}.{method}.PollForStatusUpdate ({apiname}) with arguments (["{apiname}.{controller}.{method}.MessageResult"]) - Validation state: "Valid"
2019-01-18 11:22:59.632 +00:00 [INF] //Some custom lof information
2019-01-18 11:22:59.639 +00:00 [INF] //Some more custom log information
{apiname}.{controller}.{method}.PollForStatusUpdate ({apiname}), returned result Microsoft.AspNetCore.Mvc.OkObjectResult in 516.8129ms.
2019-01-18 11:23:00.040 +00:00 [INF] Executing ObjectResult, writing value of type '{apiname}.{controller}.{method}.MessageResult'.
2019-01-18 11:23:00.048 +00:00 [INF] Executed action {apiname}.{controller}.{method}.PollForStatusUpdate ({apiname}) in 813.08940000000007ms
2019-01-18 11:23:00.052 +00:00 [INF] Request finished in 847.5964ms 200 application/json; charset=utf-8

因此,通过应用感觉相同的技术,结果的结果是不同的:File 1现在包含更多操作信息和File 2包含堆栈plus自定义日志信息,尽管我希望它们完全分开。


我认为你的过滤器不太正确。

过滤器表达式应该是:

"expression": "SourceContext = 'Microsoft' or StartsWith(SourceContext, 'Microsoft.')"

(我想你可以这样做StartsWith(SourceContext, 'Microsoft')没有最后一个点,但是对于像这样的命名空间可能无法正常运行MicrosoftOrIsItReally.MyNamespace)

(内部Matching.ForSource does a SourceContext.StartsWith(..)一种过滤,如图所示在源中)

要确认这一点,您可能需要编辑outputTemplate您的文件接收器的显示SourceContext属性并查看日志事件的来源。 (默认是"{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}")。你可以将其更改为"{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}]<{SourceContext}> {Message:lj}{NewLine}{Exception}"包括SourceContext财产。


顺便说一下,你还有一个额外的、不需要的"Using"指示。这"Serilog.Settings.Configuration"没有必要

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

Serilog:如何进一步增强 appsettings.json 中的过滤器表达式? 的相关文章

  • 从 C# 调用非托管 dll。拿2

    我编写了一个 C 程序 它调用一个 C DLL 将命令行参数回显到文件中 当使用 rundll32 命令调用 c 时 它显示命令行参数没有问题 但是当从 c 内部调用它时 它不会显示 我问了这个问题 https stackoverflow
  • 有没有办法分析 WCF 应用程序的性能?

    我们正在尝试测量我们的系统的性能 该系统是一个使用 WCF 调用的 NET 3 5 应用程序 问题是到目前为止 我们无法分析这些调用中的方法 编写了一个 winforms 客户端应用程序来测试我们的系统 我们尝试使用ANTS 4 Profi
  • 将数组从 C# 编组到 C++ 并返回:PInvokeStackImbalance

    我有一个 C 函数 我想从 C 访问它 问题是我不断收到 PInvokeStackImbalance 异常 但我不知道为什么 当检查异常被关闭时 一切都运行良好并且符合预期 我的 C 函数的签名是 extern C double solve
  • 无法使用 Unity 函数在 Visual Studio Code 中获得完整的 Intellisense

    好吧 我知道这个问题已经被问过并回答过很多次了 但我花了大约 3 天的时间试图解决这个问题 但到目前为止我所做的一切都没有奏效 我基本上在 Visual Studio Code 中有部分智能感知 也就是说 它似乎只识别 Unity 类和变量
  • 无法使用 ASP.NET Core 从 JWT 令牌获取声明

    我正在尝试使用 ASP NET Core 实现 JWT 持有者身份验证的非常简单的实现 我从控制器返回的响应有点像这样 var identity new ClaimsIdentity identity AddClaim new Claim
  • 在 C++ 中,严格别名规则中的“访问”是什么意思?

    3 10 10 说 如果一个程序试图access通过除以下类型之一之外的泛左值存储对象的值 行为未定义 然而 术语 访问 并没有在任何地方定义 在这种情况下这意味着read or 读取或修改 在 C 标准中 它被明确定义为读取或修改 然而在
  • 用 C++ 解密文件,该文件使用 openssl -aes-128-cbc 加密

    我正在尝试用 C 解密文件 该文件使用以下命令加密 openssl enc nosalt aes 128 cbc pass pass test in test txt out test enc txt p 控制台显示key 098F6BCD
  • 发生错误。", ExceptionMessage: "提供的 'HttpContent' 实例无效

    尝试将文件添加到 http 休息调用时出现此错误 responseJson 消息 发生错误 ExceptionMessage 提供了无效的 HttpContent 实例 它确实 正在使用 多部分 参数名称 内容 异常类型 System Ar
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 如何使用 Caliburn.Micro MVVM 将焦点设置到控件

    我有一个表单 我想在发生某些用户操作时将焦点设置到文本框 我知道 MVVM 的处理方式是绑定到 VM 属性 但是 TextBox 没有允许这种情况发生的属性 从虚拟机设置焦点的最佳方法是什么 我创建了一个 IResult 实现 可以很好地实
  • 在 C# 中加密并在 Flex 中解密

    我需要解密 Flex 中的一些数据 这些数据是用 C 加密并写入文件的 为了简单起见 我选择使用 as3crypto As3 库和 Bruce Schneier C 库 AS3 as3加密链接 http code google com p
  • 为什么 MISRA:2012 需要函数原型?

    我想知道为什么 MISRA 2012 需要函数原型 在下面的示例中 这两个原型并不是真正必要的 include
  • 我可以在C中直接比较int和size_t吗?

    我可以比较一个int and a size t像这样的变量 int i 1 size t y 2 if i y Do something 或者我必须输入其中之一 只要满足以下条件 它就是安全的int为零或正数 如果它是负数 并且size t
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 在同一条线上铸造两次

    我在项目中看到了这段代码 b的类型是void void b int a int unsigned long b 这条线毫无意义吗 我的意思是 这与a int b在所有情况下 这可能会避免 64 位 Unix 系统上的编译器警告unsigne
  • 如何从标准输入读取一行,阻塞直到找到换行符?

    我试图从命令行的标准输入一次读取任意长度的一行 我不确定是否能够包含 GNU readline 并且更喜欢使用库函数 我读过的文档表明getline应该可以工作 但在我的实验中它不会阻塞 我的示例程序 include
  • jquery ajax“发布”调用

    我是 jQuery 和 Ajax 的新手 并且在 发布 方面遇到问题 我正在使用 jQuery Ajax post 调用将数据保存到数据库 当我尝试保存数据时 它将 null 传递给我的 C 方法 jQuery 看起来像这样 functio
  • 为什么C#不支持多重继承? [复制]

    这个问题在这里已经有答案了 可能的重复 C 应该包含多重继承吗 https stackoverflow com questions 191691 should c include multiple inheritance 为什么C 不支持多
  • 为了清楚起见,是否应该在返回类型上使用无用的类型限定符?

    当我们的头文件中有原型时 我们的静态分析工具会抱怨 返回类型上有无用的类型限定符 例如 const int foo 我们这样定义它是因为该函数返回一个永远不会改变的常量 认为 API 看起来更清晰const到位 为了清楚起见 我觉得这类似于
  • 在 WPF 树视图中获取 FullPath?

    如果我以编程方式创建 WPF TreeView 例如 TreeView treeView lt added in the designer TreeViewItem rootNode new TreeViewItem rootNode He

随机推荐

  • 世博会开发者菜单未显示

    我正在使用 expo 工具并进行原生反应 没有任何问题 但在我的模拟器上升级 Expo Go 应用程序后 出现了问题 开发者菜单不会像以前那样显示 并且菜单中的项目不会显示 我的expo go版本 2 25 1 我正在使用 Genymoti
  • 张量流成本函数是张量,而不是标量 - 为什么?优化失败

    以下代码可以运行 但不起作用 变量cost总是一个充满 1 0 的张量 但为什么呢 我估计了一个标量 因为 1x5 矩阵乘以 5x1 矩阵就是一个标量 优化时偏差和权重也不会改变 我究竟做错了什么 KI Model x tf placeho
  • luasocket的问题

    我试图从 lua 套接字读取一些 二进制 数据 但上面的代码不会终止重复循环 我如何知道流已到达末尾 client require socket client socket connect www google com 80 client
  • 将(自定义)解码器添加到 WebMVC 端点

    我有一个 WebMVC 端点 RequestMapping path execution id method RequestMethod POST public ResponseEntity lt gt execute PathVariab
  • Android socket.io 在不丢失连接的情况下切换活动

    我开发了一个游戏 它将使用socket io连接 我的服务器是用node js编写的 我的android客户端使用socket io 现在 我的问题是 我如何在不失去与服务器连接的情况下切换活动 我至少有 4 个活动 聊天 游戏视图 在线玩
  • Cordova ios 上的 Ajax 调用 SecurityError: DOM Exception 18

    您好 我正在通过 Cordova 5 1 1 Phonegap 构建 iOS 应用程序 但有一个无法解决的问题 A basic Ajax调用抛出一个SecurityError DOM Exception 18我尝试了有关白名单的所有技巧 但
  • MySQL:如何对 ORDER BY 子句使用 CASE

    我有一个存储过程 必须在根据输入过滤行后返回一个表 其中两个输入是sort column and sort dir 查询必须 ORDER BYsort column in the sort dir方向 ASC 或 DESC 我尝试过以下查询
  • 在 Mac 上的 SwiftUI 中处理“打开方式”中的多个 URL

    在 SwiftUI 中 我们被赋予了onOpenURL 执行 功能 但是 在 macOS 中 我们可以在 Finder 中选择多个文件 然后单击 打开方式 如果我使用带有以下代码的应用程序打开这些文件 main struct testURL
  • 康威的生命游戏更新(下一代)

    我正在研究 Conway 的生命游戏 java 代码 并且我正在与我的更新方法 也称为下一代创建者 作斗争 我将发布我迄今为止编写的代码 请让我知道我可以做什么来修复更新方法 如果在 T 时刻没有细胞 就会诞生一个细胞 1 并且它的三个邻居
  • EnableRaisingEvents 是否可以在应用程序启动时已在运行的进程上使用?

    目前我有一个程序启动另一个应用程序并监视该应用程序以使用以下代码保持其运行 System Diagnostics Process startProgram System Diagnostics Process Start program e
  • C++:在构造函数中初始化变量的位置[重复]

    这个问题在这里已经有答案了 可能的重复 C 初始化列表 选项 1 与选项 2 初始化变量的优缺点是什么 class MyClass public MyClass float f char a private float mFloat cha
  • SQL Server:合并性能

    我有一个包含 500 万行的数据库表 聚集索引是自增标识列 还有PK是生成256字节的代码VARCHAR这是 URL 的 SHA256 哈希值 这是表上的非聚集索引 表格如下 CREATE TABLE dbo store image ima
  • 方法始终从 Firestore DB 查询返回 false

    我有一种方法可以检查列表是否包含用户 由于某种原因它总是返回 false 即使用户位于列表中 该函数确实有效 我知道它确实找到了用户 只是不确定为什么它不返回任何其他内容 但false 我知道它有效 因为我有另一种方法使用此代码片段来检查用
  • 展开一项时折叠所有其他 Recyclerview 项目

    我有一个设置良好的可扩展回收器视图 单击任何项 目时 它会展开以显示更多详细信息 但我想在这里改变一下 单击一项展开时 所有其他项都应折叠 这是我的适配器代码 public class DataAdapter extends Recycle
  • 403 - 授权错误 - OAuth2.0 - 访问令牌 - Azure Api For Fhir

    我已使用此链接部署并配置了适用于 FHIR 的 Azure API https learn microsoft com en gb azure healthcare apis tutorial web app fhir server 使用邮
  • 方程有不同数量的参数

    我创建了这些数据类型来代表吉他标签 我正在尝试编写show功能将它们打印为真正的吉他谱 data这不是我的专长 我在匹配类型时遇到了困难 错误是 show 的方程有不同数量的参数 在 GHC Show Show Tabs Chord 的实例
  • MySQL解释行数限制

    下面是我的查询 用于获取类型 ID 为 1 的 20 行 EXPLAIN SELECT FROM content WHERE genre id 1 AND category 1 LIMIT 20 我在内容表中总共有 654 行 类型 id
  • WooCommerce 根据产品类别替换购物车/结帐中的“延期交货可用”

    我编写了一些代码 用于在基于产品类别的产品详细信息页面上显示自定义缺货消息 function custom backorder message text product if product gt managing stock produc
  • 如何不在 FacetGrid 中共享轴

    我正在尝试在数据框中绘制 KDE 的每一列df 最后一列是一个布尔值 我通过使用它在每个图表上绘制两种色调 sns pairplot df hue last palette True FF0000 False 0000FF diag kin
  • Serilog:如何进一步增强 appsettings.json 中的过滤器表达式?

    我有两个带有 Serilog 的记录器 它们保存到不同的文件 我想通过 appsettings json 而不是代码创建记录器 当我通过创建记录器时Startup cs配置后 我会得到更具体的日志 我更喜欢这样 因为它更清晰 并且允许其他人