如何覆盖 Serilog 在 Guid(或其他内置基元)上使用 ToString?
How can I override Serilog's use of ToString on Guid (or other built-in primitives)?
我正在使用 Serilog 来记录多人游戏,并将 Guid 作为玩家的标识符。
日志记录比我喜欢的更嘈杂,所以我正在寻找 trim 一些接收器。通常,人类(即我)只需要 Guid 的前 8 位数字来调试问题。我已经为 Guid 编写了一个名为 ShortForm()
的扩展方法,我希望 Serilog 控制台、文件和 Slack 接收器使用它,而不是完整的 Guid。
public static string ShortForm(this Guid guid)
{
if (guid == Guid.Empty)
return "????????";
return guid.ToString().Substring(0, 8);
}
我尝试在构造函数中使用 Destructure.ByTransforming()
,但它似乎没有用:
string _outputTemplate = "[{@t:HH:mm:ss} {@l:u3}] {@m}\n{@x}";
ExpressionTemplate _consoleExpression = new ExpressionTemplate(_outputTemplate, theme: TemplateTheme.Literate);
Log.Logger = new LoggerConfiguration().
... etc snipped ...
Destructure.ByTransforming<Guid>(g => g.ShortForm()).
WriteTo.Console(formatter: _consoleExpression).
CreateLogger();
在我的代码库中:
//code
Log.Information("{@Guid} disconnected from {IP}", removedGuid, serverEvent.EndPoint);
//console output
[12:30:54 INF] 00000000-0000-0000-0000-000000000000 disconnected from 127.0.0.1:59548
//or, if authenticated:
[12:34:01 INF] 3babffd8-68cb-41c2-87b6-d2beffbd431b disconnected from 127.0.0.1:51933
有办法吗?
我查找了一个 Serilog 的存储库,发现 Guid 作为 Scalar 类型处理,无法使用 .Destructure.ByTransforming 对其进行转换。你可以看看https://github.com/serilog/serilog/blob/697a23189e3068bfe0da1460a2676913239d2757/src/Serilog/Capturing/PropertyValueConverter.cs#L45.
但是您可以使用自定义格式化程序将您的 Guid 格式化为字符串 (https://github.com/serilog/serilog/wiki/Formatting-Output#format-providers)。
我做了个小测试 - https://gist.github.com/sergey-miryanov/544b8413da70a0be455ac3903c1a781c
我正在使用 Serilog 来记录多人游戏,并将 Guid 作为玩家的标识符。
日志记录比我喜欢的更嘈杂,所以我正在寻找 trim 一些接收器。通常,人类(即我)只需要 Guid 的前 8 位数字来调试问题。我已经为 Guid 编写了一个名为 ShortForm()
的扩展方法,我希望 Serilog 控制台、文件和 Slack 接收器使用它,而不是完整的 Guid。
public static string ShortForm(this Guid guid)
{
if (guid == Guid.Empty)
return "????????";
return guid.ToString().Substring(0, 8);
}
我尝试在构造函数中使用 Destructure.ByTransforming()
,但它似乎没有用:
string _outputTemplate = "[{@t:HH:mm:ss} {@l:u3}] {@m}\n{@x}";
ExpressionTemplate _consoleExpression = new ExpressionTemplate(_outputTemplate, theme: TemplateTheme.Literate);
Log.Logger = new LoggerConfiguration().
... etc snipped ...
Destructure.ByTransforming<Guid>(g => g.ShortForm()).
WriteTo.Console(formatter: _consoleExpression).
CreateLogger();
在我的代码库中:
//code
Log.Information("{@Guid} disconnected from {IP}", removedGuid, serverEvent.EndPoint);
//console output
[12:30:54 INF] 00000000-0000-0000-0000-000000000000 disconnected from 127.0.0.1:59548
//or, if authenticated:
[12:34:01 INF] 3babffd8-68cb-41c2-87b6-d2beffbd431b disconnected from 127.0.0.1:51933
有办法吗?
我查找了一个 Serilog 的存储库,发现 Guid 作为 Scalar 类型处理,无法使用 .Destructure.ByTransforming 对其进行转换。你可以看看https://github.com/serilog/serilog/blob/697a23189e3068bfe0da1460a2676913239d2757/src/Serilog/Capturing/PropertyValueConverter.cs#L45.
但是您可以使用自定义格式化程序将您的 Guid 格式化为字符串 (https://github.com/serilog/serilog/wiki/Formatting-Output#format-providers)。
我做了个小测试 - https://gist.github.com/sergey-miryanov/544b8413da70a0be455ac3903c1a781c