我有一个依赖注入ILoggerFactory
,它ILogger
在 .NET Core 2.1 应用程序中生成 。
我想记录这样的内容:
\n\nlogger.LogInformation("Magic Char {MagicChar}", "\xce\xbb")\n
Run Code Online (Sandbox Code Playgroud)\n\n问题是实际记录的是:
\n\ninfo <myClass>\n Magic Char ?`\n
Run Code Online (Sandbox Code Playgroud)\n\n如何使用 .NET 的内置记录器记录 unicode 字符?
\n是的,接口完美地处理 unicode。
\n\nConsole.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)
遗憾的是Visual Studio 中有一个错误,因此输出窗口(写入调试消息的位置)无法处理 unicode。他们应该在 VS 2017 15.6 中修复它,但我在控制台程序中使用 VS 2017 15.7.5,错误仍然存在(但在另一台电脑上,在 VS 2017 15.7.5 上,unicode 显示正确。 .. 谁知道?)。
\n\n(这Thread.Sleep()
是因为从观察来看,Console
记录器是“懒惰的”,并且在写入之前等待了一会儿)
但你可以自己测试一下:
\n\npublic 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\nILoggerFactory 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。
归档时间: |
|
查看次数: |
2075 次 |
最近记录: |