设置来自ILogger的红隼输出颜色

时间:2018-01-29 18:51:57

标签: c# asp.net-core console kestrel

我注意到在ASP.NET Core中设置不同的日志记录级别时,有时会通过对Entity Framework的不同调用生成日志输出,控制台ForeColor会更改为黄色,红色,蓝色等......

我认为能够为这个窗口做自定义颜色会很好(只是为了让我在日志输出中输入的东西比从我的代码发送到ILogger的消息更好一点)

我尝试以这种方式设置颜色(只是为了看它是否有用)......

//set the console color (expecting the Kestrel console window to change to this)
var oldColor = Console.ForeColor;
Console.ForeColor = ConsoleColor.Yellow

//send the log message (expecting it to be yellow when output in the kestrel console window)
_logger.LogTrace(@"Hello World!");

//be a good citizen and set the color back now that the log message has been displayed
Console.ForeColor = Console.ForeColor;

不幸的是,这不是那么简单,我必须在工厂或者ILogger中还有其他东西让我这样做 - 我想在我开始挖掘之前我会问这里实体框架核心代码,以了解它们(Microsoft)是如何做到的。

我尝试在SO和MSDN上搜索关于此主题的一些信息 - 我没有提出任何问题,所以如果问题已经得到解答,我会提前道歉,我只是在寻找错误的地方。

提前致谢!

2 个答案:

答案 0 :(得分:0)

ILogger实现中的颜色是根据记录的LogLevel决定的。如果您想自己指定颜色,则需要自己实施ILogger。这是一个非常简单的界面,但作为参考,这篇文章给你一个例子。

http://asp.net-hacker.rocks/2017/05/05/add-custom-logging-in-aspnetcore.html

此外,如果你想要全力以赴,那么有一个很好的库可以包装控制台,这样你就可以更容易地切换颜色,而不必在这里设置ForegroundColour http://colorfulconsole.com/

答案 1 :(得分:0)

最简单的方法是,ILogger可以支持您想要的内容,但是您将无法使用某些ILogger扩展方法,因为这些方法对您可以执行的操作有更多限制,但是您可以添加自己的扩展方法来为您提供帮助。这是ILogger的签名。

template<typename T>
struct is_complex : std::false_type {};

template<typename T> 
struct is_complex<std::complex<T>> : std::true_type {};

template<typename T, typename RT = typename is_complex<T>::value ? T : std::complex<T>>
std::vector<RT> myFunc(std::vector<T> inVec){
    ...
    std::vector<RT> outVec;
    return outVec

因此,您将必须创建自定义ILogger实现,并使用EventId根据该颜色决定颜色...

此外,如果您想全神贯注并为字符串的某些部分加上颜色,则可以使用error: expected '>' before '?' token template<typename T, typename RT = typename is_complex<T>::value ? T : std::complex<T>> void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter); 的组合来使用“标准” ILogger,但可以在其中提取其他信息。您的自定义ILogger并按照您喜欢的方式格式化消息。正如@poke所指出的那样,编写最先进的控制台记录器可能很困难……但是您可以从“标准”控制台记录器实现here中获得启发。