在Linux机器上使用kestrel运行asp.net core应用程序。如果一行包含西里尔语符号,SSH控制台的输出看起来很奇怪。有什么方法可以配置nlog,将西里尔语符号替换为西里尔语符号?译文糟糕的输出示例
06.05.2020 09:57:11.650||TRACE||<<Session:831259AB-493A-4215-89BB-81FF8802C714||Node:[[7_11 ▒вод индек▒а ▒ег▒л▒▒ной до▒▒авки]]||Phone: >>
Nlog目标。
<target name="Console" xsi:type="ColoredConsole" useDefaultRowHighlightingRules="false" layout="============================================================================================${newline} ${date:format=dd.MM.yyyy HH\:mm\:ss.fff}||${pad:padding=5:inner=${level:uppercase=true}}||<<Session:${pad:padding=36:inner=${event-properties:item=sessionId:uppercase=true}}||Node:[[${event-properties:item=nodename}]]||Phone:${pad:padding=13:inner=${event-properties:item=number:uppercase=true}}>>${newline} ${message}" >
如果有办法在不改变Linux配置的情况下正确显示西里尔符号,那将是可以接受的。
这不是开箱即用的,因为.NET中也不支持翻译。
但幸运的是,你可以不费吹灰之力地添加这个功能。
我使用的是NuGet包 NickBuhro.Translit
安装包NickBuhro.Translit。
并添加这个布局渲染器包装器
using System;
using NLog.Config;
using NLog.LayoutRenderers;
using NLog.LayoutRenderers.Wrappers;
using NickBuhro.Translit;
namespace MyExample
{
/// <summary>
/// Translit to latin. Usage: ${translit:${message}} or ${message:translit=true}
/// </summary>
[LayoutRenderer("translit")]
[AmbientProperty("translit")]
[ThreadAgnostic]
[ThreadSafe]
public class TranslitLayoutRendererWrapper : WrapperLayoutRendererBase
{
protected override string Transform(string text)
{
var latin = Transliteration.CyrillicToLatin(text, Language.Russian);
return latin;
}
}
}
并尽快注册,例如在NLog启动前在main()中注册(注意静态字段)。
NLog.LogManager.Setup().SetupExtensions(s =>
s.RegisterLayoutRenderer<TranslitLayoutRendererWrapper>("translit")
);
现在你可以用 ${translit:${message}}
或 ${message:translit=true}