如何将 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"
在我想要的日志中:
...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"