我有一个依赖项注入的ILoggerFactory
在.NET Core 2.1应用程序中生成一个ILogger
。
我想记录以下内容:
logger.LogInformation("Magic Char {MagicChar}", "λ")
问题是实际记录的是:
info <myClass>
Magic Char ?`
如何使用.NET内置的记录器记录Unicode字符?
答案 0 :(得分:3)
是的,接口可以完美地处理unicode。
Console.OutputEncoding = Encoding.UTF8;
ILoggerFactory loggerFactory = new LoggerFactory()
.AddDebug()
.AddConsole();
ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("Magic Char {MagicChar}", "λ");
Debug.WriteLine(string.Format("Magic Char (b) {0}", "λ"));
Thread.Sleep(1000);
(请注意使用Console.OutputEncoding
来将Console
设置为UTF-8)
很遗憾,这里有一个bug in Visual Studio,因此“输出”窗口(写入调试消息的窗口)不能处理unicode。他们应该已经在VS 2017 15.6中对其进行了修复,但是我在控制台程序中使用了VS 2017 15.7.5,并且该错误仍然存在(但是在另一台PC上,在VS 2017 15.7.5上正确显示了unicode。谁知道?)。
(Thread.Sleep()
是因为观察到Console
记录器是“懒惰的”,并且在写入之前等待了一段时间)
但是您可以测试自己:
public class MyLoggerProvider : ILoggerProvider
{
public ILogger CreateLogger(string categoryName)
{
return new MyLogger();
}
public void Dispose()
{
}
}
public class MyLogger : ILogger
{
public IDisposable BeginScope<TState>(TState state)
{
return null;
}
public bool IsEnabled(LogLevel logLevel)
{
return true;
}
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
string formatted = formatter(state, exception);
File.AppendAllText("output.txt", formatted, Encoding.UTF8);
}
}
然后:
ILoggerFactory loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new MyLoggerProvider());
ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("Magic Char {MagicChar}", "λ");
看看ouput.txt
文件,该文件应该是带有BOM的UTF-8。