Kibana 异常C#中的消息模板

mrfwxfqh  于 2023-05-12  发布在  Kibana
关注(0)|答案(1)|浏览(233)

我想创建一个例外,我可以通过一个结构化的消息模板。这可能吗?(也可以像使用Serilog那样立即记录它)
关于我如何使用它的例子:

throw new NotFoundException("The book {BookId} was not found", book.Id);

最终目标是使用elasticsearch + kibana来过滤错误消息。例如“给予我所有包含'The book {BookId} was not found'的日志,其中bookid的范围在100到1000之间”

de90aj5v

de90aj5v1#

我的尝试沿着都是正确的。要使用消息模板记录错误,可以传递异常、模板和参数。
例外情况:

public class NotFoundException : Exception
{
   public object?[] Args { get; set; }

   public NotFoundException(string message) : base(message)
   {
       Args = Array.Empty<object?>();
   }

   public NotFoundException(string message, params object?[] args) : base(message)
   {
       Args = args;
   }
}

中间件/ExceptionHandler:

try {
        //Whatever
    }
    catch (NotFoundException e)
    {
        _logger.LogError(e, e.Message, e.Args);
    }

仅供参考,使用这种方法的另一个优点(除了过滤日志之外)是,当异常消息中有动态数据时,您还可以更容易地过滤异常。

try
{
    //Do some stuff
}
catch (NotFoundException e) when (e.Message == "The book {BookId} was not found"){
    //Do some more stuff
}
catch (NotFoundException e) when (Resources.BookNotFoundTemplate.Equals(e.Message)){
    //Do some more stuff
}
catch (NotFoundException e) when (e.Args[0] is 1234){
    //Do some more stuff
}

同样,对于单元测试,当测试异常消息时...

await testedMethod.Should().ThrowAsync<NotFoundException>().Where(e => e.Message == "The book {BookId} was not found");
await testedMethod.Should().ThrowAsync<NotFoundException>().Where(e => e.Args[0] is 1234);

相关问题