配置 NLog 以用英文编写异常消息
Configure NLog to write exception messages in English
是否可以将 NLog 配置为用英语而不是当前线程文化编写异常消息?
可能可以通过切换当前线程文化来解决此问题,如此处所建议的那样Exception messages in English?,但如果有其他解决方案,我不想这样做。
我的记录器公开为 Ninject ILogger,因此我也可以实现每个方法并更改线程文化,但如果有其他解决方案,我希望避免这种情况。
我在一些帮助下找到了解决方案。见 github.com/NLog/NLog/issues/172 感谢 Julian
可以编写自定义 WrapperLayoutRenderer,在记录异常之前切换区域性。
namespace NLog.LayoutRenderers.Wrappers
{
[LayoutRenderer("InvariantCulture")]
[ThreadAgnostic]
public sealed class InvariantCultureLayoutRendererWrapper : WrapperLayoutRendererBase
{
protected override string Transform(string text)
{
return text;
}
protected override string RenderInner(LogEventInfo logEvent)
{
var currentCulture = Thread.CurrentThread.CurrentUICulture;
try
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
return base.RenderInner(logEvent);
}
finally
{
Thread.CurrentThread.CurrentUICulture = currentCulture;
}
}
}
}
必须在创建任何记录器之前注册
ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("InvariantCulture", typeof(InvariantCultureLayoutRendererWrapper));
并且可以像在配置中那样使用
layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${InvariantCulture:${exception:format=tostring}}"
是否可以将 NLog 配置为用英语而不是当前线程文化编写异常消息?
可能可以通过切换当前线程文化来解决此问题,如此处所建议的那样Exception messages in English?,但如果有其他解决方案,我不想这样做。
我的记录器公开为 Ninject ILogger,因此我也可以实现每个方法并更改线程文化,但如果有其他解决方案,我希望避免这种情况。
我在一些帮助下找到了解决方案。见 github.com/NLog/NLog/issues/172 感谢 Julian
可以编写自定义 WrapperLayoutRenderer,在记录异常之前切换区域性。
namespace NLog.LayoutRenderers.Wrappers
{
[LayoutRenderer("InvariantCulture")]
[ThreadAgnostic]
public sealed class InvariantCultureLayoutRendererWrapper : WrapperLayoutRendererBase
{
protected override string Transform(string text)
{
return text;
}
protected override string RenderInner(LogEventInfo logEvent)
{
var currentCulture = Thread.CurrentThread.CurrentUICulture;
try
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
return base.RenderInner(logEvent);
}
finally
{
Thread.CurrentThread.CurrentUICulture = currentCulture;
}
}
}
}
必须在创建任何记录器之前注册
ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("InvariantCulture", typeof(InvariantCultureLayoutRendererWrapper));
并且可以像在配置中那样使用
layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${InvariantCulture:${exception:format=tostring}}"