class 的自定义格式
Custom Formatting for a class
我目前正在使用 Serilog,我希望能够将 class 传递给记录器,并让它在输出到文本文件之前以自定义格式记录。有点类似于IFormatProvider。我也找到了 ITextFormatter
但我不确定这是否是正确的实施方式。我想要定制水槽吗?
对于基本类型,Serilog supports IFormatProvider
直接。
然而,大多数用户定义的引用类型不会被 Serilog 直接传递到接收器。这是因为接收器通常是异步操作的,Serilog 不能假设任意用户定义的类型都是线程安全的。
为了使用 IFormatProvider
,您可以通过捕获类型为 "scalars":
的值来规避此问题
.Destructure.AsScalar<SomeClass>()
或者,您可以 "destructure" 将 class 转换为您在记录时想要的任何辅助表示形式:
.Destructure.ByTransforming<SomeClass>(sc => Display(sc))
要使此 (ByTransforming()
) 正常工作,您需要在记录对象时使用 @
选择加入:
Log.Information("Hello {@Something}", new SomeClass());
最简单的是,您也可以在 class 本身中覆盖 ToString()
。
我目前正在使用 Serilog,我希望能够将 class 传递给记录器,并让它在输出到文本文件之前以自定义格式记录。有点类似于IFormatProvider。我也找到了 ITextFormatter
但我不确定这是否是正确的实施方式。我想要定制水槽吗?
对于基本类型,Serilog supports IFormatProvider
直接。
然而,大多数用户定义的引用类型不会被 Serilog 直接传递到接收器。这是因为接收器通常是异步操作的,Serilog 不能假设任意用户定义的类型都是线程安全的。
为了使用 IFormatProvider
,您可以通过捕获类型为 "scalars":
.Destructure.AsScalar<SomeClass>()
或者,您可以 "destructure" 将 class 转换为您在记录时想要的任何辅助表示形式:
.Destructure.ByTransforming<SomeClass>(sc => Display(sc))
要使此 (ByTransforming()
) 正常工作,您需要在记录对象时使用 @
选择加入:
Log.Information("Hello {@Something}", new SomeClass());
最简单的是,您也可以在 class 本身中覆盖 ToString()
。