如何将 nlog 布局中的 ${level} 截断为单个字符?

How can I truncate ${level} in nlog layout to a single character?

在我想要的日志中:

...D...

而不是

...Debug...

Info、Warn 等当然也一样。我尝试了 ${level[0]} 和其他布局变体,但没有成功。

更新

从 NLog 4.4.6 开始,您也可以 ${level:format=FirstCharacter}。参见 docs

原回答

你可以用 ${when} 来完成,但有点麻烦:

例如

${when:when=level=LogLevel.Trace:inner=T:else=${when:when=level=LogLevel.Debug:inner=D:else=TODO}}

或者您可以使用一些代码添加 "wrapper":

/// <summary>
/// Take the left characters
/// </summary>
/// <example>
/// ${left:${level}:Length=2} //[DefaultParameter]
/// ${left:Inner=${level}:Length=2} 
/// ${level:Length=2} //[ambient] 
/// </example>
[LayoutRenderer("left")]
[AmbientProperty("Left")]
[ThreadAgnostic]
public sealed class LeftLayoutRendererWrapper : WrapperLayoutRendererBase
{
    /// <summary>
    /// Gets or sets the length in characters. 
    /// </summary>
    /// <value>Index</value>
    /// <docgen category='Transformation Options' order='10' />
    [DefaultValue(1)]
    public int Length { get; set; }

    /// <summary>
    /// Post-processes the rendered message. 
    /// </summary>
    /// <param name="text">The text to be post-processed.</param>
    /// <returns>Substringed</returns>
    protected override string Transform(string text)
    {
        if (text == null)
        {
            return null;
        }

        if (Length <= 0)
        {
            return String.Empty;
        }

        return text.Substring(0, Length);
    }
}

注册(尽快,例如 main()app_start()

ConfigurationItemFactory.Default.LayoutRenderers
                        .RegisterDefinition("left", typeof(MyNamespace.LeftLayoutRendererWrapper ));

用法:

${left:${level}:Length=2} //or
${level:Length=2} //"ambient way"