【问题标题】:Replace cyrilic symbols in Nlog output替换 Nlog 输出中的西里尔符号
【发布时间】:2020-05-06 07:34:12
【问题描述】:

在 Linux 机器上使用 kestrel 运行 asp.net 核心应用程序。如果一行包含西里尔符号,则 SSH 控制台输出看起来很奇怪。有没有办法配置 nlog 用translit 替换西里尔符号? 错误输出示例

 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}}||&lt;&lt;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 配置的情况下正确显示西里尔符号,那将是可以接受的。

【问题讨论】:

  • 不知道您使用的是什么目标,但 Console-Target 和 File-Target 都有编码选项。尝试将其更改为 UTF8
  • 这是我的目标:
  • 用更多的细节更新您的问题,而不是用 cmets 编写(StackOverflow 上的一般规则)。当你使用Encoding="UTF-8" 时会发生什么?

标签: asp.net-core logging nlog transliteration kestrel


【解决方案1】:

这是不支持开箱即用的,因为 .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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-19
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多