在 .NET Core 中使用 ILogger 如何记录 unicode 字符

Kei*_*ith 1 logging .net-core

我有一个依赖注入ILoggerFactory,它ILogger在 .NET Core 2.1 应用程序中生成 。

\n\n

我想记录这样的内容:

\n\n
logger.LogInformation("Magic Char {MagicChar}", "\xce\xbb")\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是实际记录的是:

\n\n
info <myClass>\n     Magic Char ?`\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何使用 .NET 的内置记录器记录 unicode 字符?

\n

xan*_*tos 5

是的,接口完美地处理 unicode。

\n\n
Console.OutputEncoding = Encoding.UTF8;\n\nILoggerFactory loggerFactory = new LoggerFactory()\n    .AddDebug()\n    .AddConsole();\n\nILogger logger = loggerFactory.CreateLogger<Program>();\nlogger.LogInformation("Magic Char {MagicChar}", "\xce\xbb");\n\nDebug.WriteLine(string.Format("Magic Char (b) {0}", "\xce\xbb"));\n\nThread.Sleep(1000);\n
Run Code Online (Sandbox Code Playgroud)\n\n

(注意使用Console.OutputEncoding设置Console为 UTF-8)

\n\n

遗憾的是Visual Studio 中有一个错误,因此输出窗口(写入调试消息的位置)无法处理 unicode。他们应该在 VS 2017 15.6 中修复它,但我在控制台程序中使用 VS 2017 15.7.5,错误仍然存​​在(但在另一台电脑上,在 VS 2017 15.7.5 上,unicode 显示正确。 .. 谁知道?)。

\n\n

(这Thread.Sleep()是因为从观察来看,Console记录器是“懒惰的”,并且在写入之前等待了一会儿)

\n\n

但你可以自己测试一下:

\n\n
public class MyLoggerProvider : ILoggerProvider\n{\n    public ILogger CreateLogger(string categoryName)\n    {\n        return new MyLogger();\n    }\n\n    public void Dispose()\n    {\n    }\n}\n\npublic class MyLogger : ILogger\n{\n    public IDisposable BeginScope<TState>(TState state)\n    {\n        return null;\n    }\n\n    public bool IsEnabled(LogLevel logLevel)\n    {\n        return true;\n    }\n\n    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)\n    {\n        string formatted = formatter(state, exception);\n        File.AppendAllText("output.txt", formatted, Encoding.UTF8);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

进而:

\n\n
ILoggerFactory loggerFactory = new LoggerFactory();\nloggerFactory.AddProvider(new MyLoggerProvider());\nILogger logger = loggerFactory.CreateLogger<Program>();\nlogger.LogInformation("Magic Char {MagicChar}", "\xce\xbb");\n
Run Code Online (Sandbox Code Playgroud)\n\n

看看这个ouput.txt文件,应该是带有 BOM 的 UTF-8。

\n