当我尝试使用ILogger.LogInformation()
使用货币格式说明符输出数值时,会得到与使用Console.Log(string.Format())
时不同的意外符号。后者将预期的美元符号显示为符号,而前者则显示无法打印的内容。
示例代码
var services = new ServiceCollection();
services.AddLogging(x =>
{
x.AddDebug();
x.AddConsole();
});
var svcProvider = services.BuildServiceProvider();
var logger = svcProvider.GetRequiredService<ILoggerFactory().CreateLogger<Program>();
logger.LogInformation("Amount {0:C}", 100.0);
System.Diagnostics.Debug.WriteLine(string.Format("Amount {0:C}", 100.0));
调试输出
xyz.Program:信息:金额¤100.00
金额$ 100.00
我看到了为ILogger配置CultureInfo的已知方法,并且我不想每次编写时都指定它。另外,我认为这无关紧要,但是代码是在async
方法中执行的。
那么这是一个错误,是我的期望不切实际,还是我做错了什么?
答案 0 :(得分:0)
显然,此行为的原因是日志不应特定于任何语言环境。我在Microsoft.Extensions.Logging.Abstractions回购中搜索了一种解决方法或设置,但是似乎没有办法避免这种行为。
(几乎) ILogger 的所有日志记录方法都来自静态扩展类, LoggerExtensions ( ILogger 定义了一个{{1 }}方法(直接使用会很痛苦)。该类中的所有方法最终都调用相同的Log
方法,该方法将消息格式及其参数转换为 FormattedLogValues 对象。
FormattedLogValues 对象具有一个静态高速缓存,该高速缓存由具有 LogValuesFormatter 值的格式字符串键入。这些格式化程序负责将消息和args转换为字符串,并在调用Log
时将区域性明确设置为 CultureInfo.InvariantCulture 。这就是为什么使用货币格式说明符时会显示“ scarab”符号(¤)的原因。
由于我知道我所有的金额都将以美元为单位,所以最简单,最正确的解决方案是避免使用客户数字格式字符串的货币说明符。
string.Format
感谢@Amy和@PanagiotisKanavos的所有帮助。