【问题标题】:Using C# params with serilog将 C# 参数与 serilog 一起使用
【发布时间】:2017-09-11 20:35:16
【问题描述】:

刚开始使用 Serilog + ElasticSearch,想知道是否有一种优雅的方法可以在一个日志条目中记录 params 对象数组。到目前为止,我能够管理它的唯一方法是循环遍历每个 params,它为每个创建一个单独的日志条目。有什么方法可以将它们组合成一个日志条目?

谢谢!

示例:

public static void MethodEntry<T>(string methodName, params object[] parameters)
{
    if (parameters.Length > 0)
        foreach (var param in parameters) // Will create parameters.Length number of log entries
            Log.ForContext(typeof(T)).Debug("Entering {MethodName} with {@Param}", methodName, param);
    else
        Log.ForContext(typeof(T)).Debug("Entering {MethodName}", methodName);
}

编辑:

使用的水槽:

  • Serilog
  • Serilog.Sinks.Elasticsearch(包括文件、PeriodicBatching 和 RollingFile 接收器)
  • Environment 和 ThreadId 等耦合丰富器

【问题讨论】:

  • 您是否尝试过将参数传递到日志?类似于以下内容:Log.ForContext(typeof(T)).Debug("Entering {MethodName} with {@Parameters}", methodName, parameters); ?
  • @SamvelPetrosov 我确实尝试过,但它导致内存使用量激增,直到崩溃并且没有写入日志条目。
  • 你传递了多少个参数?
  • @SamvelPetrosov 在崩溃的情况下是 2(这是一个事件,所以 object senderEventArgs e
  • 您使用哪些水槽?请添加 Serilog 的初始配置

标签: c# elasticsearch parameters optional-parameters serilog


【解决方案1】:

如果您知道您的 Sender 对象的具体类型,您可以使用 Serilog 的以下功能来避免记录不需要的信息:

Log.Logger = new LoggerConfiguration()
    .Destructure.ByTransforming<YOUR_SENDER_TYPE>(
        r => new { firstValue = r.firstValue, secondValue = r.secondValue })
    .WriteTo .... 

有关记录结构化数据的更多信息,请参阅官方文档Serilog Structured Data

【讨论】:

  • 有趣!我唯一担心的是 .NET 中的事件中的 sender 不总是一个通用的 object 吗?然后覆盖将适用于所有objects,而不仅仅是sender...
  • 是的,这就是为什么我从“如果您知道特定类型”开始回答。例如,当您作为发件人单击按钮时,会出现盒装的“按钮”对象,因此检查 is Button 将返回 true。
  • 知道了,Destructure 很高兴知道,非常感谢!如果事件sender 没有具体答案,那么我会在一天内接受这个。
【解决方案2】:
public static void MethodEntry<T>(string methodName, params object[] parameters)
{
    Log.ForContext<T>()
        .ForContext("Parameters", parameters)
        .Debug("Entering {MethodName}", methodName);
}

这应该做你所追求的。

【讨论】:

  • 我用以下对象尝试了这种方式:Dim testStr = "test" & Dim testObj = New With {Key .Name = "Test", .Price = 1.29}。日志条目根本没有写入,没有崩溃或异常似乎只是跳过了调用。调用:_logger.MethodEntry(NameOf(TestMethod), testStr, testObj) 方法:log.ForContext("Parameters", parameters).Debug("Entering {MethodName}", methodName); 其中parametersparams object[] parameters。有什么想法吗?
  • 我仍然有这个问题,有什么想法吗?
  • 您是否开启了Debug 级别的日志记录?一件事要检查。
  • 是的,我确实检查过以确保我没有发疯哈哈
猜你喜欢
  • 1970-01-01
  • 2022-06-25
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2021-08-05
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多