如何限制NLog中行的长度?

时间:2016-04-22 08:28:41

标签: c# nlog

我们的默认NLog配置中有2个目标:FileConsole。为了使控制台保持可读性,我们希望在包装到下一行之前定义控制台中显示的行的最大长度。

现在我已经看了很多不同的layouts for NLog,但只能找到pad wrapper fixed-length选项。但这会截断行而不是包裹它。

我能想到的唯一方法是通过正则表达式和${newline}布局的引入。

还有其他想法吗?

1 个答案:

答案 0 :(得分:3)

您可以按照以下方式编写自己的包装器:

[LayoutRenderer("wrap-line")]
[AmbientProperty("WrapLine")]
[ThreadAgnostic]
public sealed class WrapLineRendererWrapper : WrapperLayoutRendererBase
{
    public WrapLineRendererWrapper ()
    {
        Position = 80;
    }

    [DefaultValue(80)]
    public int Position { get; set; }

    protected override string Transform(string text)
    {
        return string.Join(Environment.NewLine, MakeChunks(text, Position));
    }

    private static IEnumerable<string> MakeChunks(string str, int chunkLength)
    {
        if (String.IsNullOrEmpty(str)) throw new ArgumentException();
        if (chunkLength < 1) throw new ArgumentException();

        for (int i = 0; i < str.Length; i += chunkLength)
        {
            if (chunkLength + i > str.Length)
                chunkLength = str.Length - i;

            yield return str.Substring(i, chunkLength);
        }
    }
}

如何使用它:https://github.com/NLog/NLog/wiki/Extending%20NLog#how-to-write-a-custom-layout-renderer

基于此:https://github.com/NLog/NLog/blob/master/src/NLog/LayoutRenderers/Wrappers/ReplaceNewLinesLayoutRendererWrapper.cs

这个回答:https://stackoverflow.com/a/8944374/971