如何设置 dotnet 日志记录的文化?

How can I set the culture for dotnet logging?

我正在使用 dotnetcore 3.1 中的日志记录。当我在记录器中使用日期的复合格式时,我得到的格式与我在应用程序代码中将日期转换为字符串时得到的格式不同。

此代码:

ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
_logger = loggerFactory.CreateLogger<Program>();
_logger.LogInformation("TEST date via format string {}", DateTime.Today);
_logger.LogInformation("TEST date with concatentation:" + DateTime.Today);

产生这个输出(注意天和月顺序的变化):

TEST date via format string 08/26/2020 00:00:00
TEST date with concatentation:26/08/2020 00:00:00

我很惊讶记录器没有从应用程序继承文化。我是否遗漏了什么,如果没有,我该如何控制记录器的文化?

这让我很感兴趣,我决定深入研究一下。

根据Logging repository中的dotnet LogValuesFormatter判断,当使用大括号{}时,对Format方法的调用使用不变区域性。

其中,根据Microsoft docs设置为MM/dd/yyyy。

但是,串联似乎确实使用了当前区域性。

我建议,如果您想使用大括号格式,您只需调用 ToString 并添加区域性,以便在格式化程序获取它之前将日期转换为当前区域性中的字符串。您还可以使用字符串插值,它使用与大括号类似的语法,但似乎也使用当前区域性:

_logger.LogInformation("Current culture is "+  CultureInfo.CurrentCulture.Name);
_logger.LogInformation("TEST date via format string {}", DateTime.Today);
_logger.LogInformation("TEST date via cultured format string {}", DateTime.Today.ToString(CultureInfo.CurrentCulture));
_logger.LogInformation("TEST date with concatentation:" + DateTime.Today);
_logger.LogInformation($"TEST date with string interpolation: {DateTime.Today}");

这段代码给出了这个输出:

Current culture is en-GB
TEST date via format string 09/12/2020 00:00:00
TEST date via cultured format string 12/09/2020 00:00:00
TEST date with concatentation:12/09/2020 00:00:00
TEST date with string interpolation: 12/09/2020 00:00:00