在使用ILogger的.NET Core中,如何记录Unicode字符

时间:2018-07-23 16:40:56

标签: logging .net-core

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

我想记录以下内容:

logger.LogInformation("Magic Char {MagicChar}", "λ")

问题是实际记录的是:

info <myClass>
     Magic Char ?`

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

1 个答案:

答案 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。