NLog auto truncate messages
I don't know of a built in way to do it. Instead, I would write a LayoutRenderer (actually, a WrapperLayoutRenderer). It's not hard.
Something like this (untested) ought to do it:
[LayoutRenderer("truncate")]
[ThreadAgnostic]
public sealed class TruncateLayoutRendererWrapper : WrapperLayoutRendererBase
{
public TruncateLayoutRendererWrapper()
{
this.Truncate = true;
this.Ellipsis = true;
this.Limit = 1000;
}
[DefaultValue(true)]
public bool Truncate { get; set; }
[DefaultValue(true)]
public bool Ellipsis { get; set; }
[DefaultValue(1000)]
public bool Limit { get; set; }
/// <summary>
/// Post-processes the rendered message.
/// </summary>
/// <param name="text">The text to be post-processed.</param>
/// <returns>Trimmed string.</returns>
protected override string Transform(string text)
{
if (!Truncate || Limit <= 0) return text;
var truncated = text.Substring(0, Ellipsis ? Limit - 3 : Limit);
if (Ellipsis) truncated += "...";
return truncated;
}
}
NLog 4.6.3 supports this:
${message:truncate=1000}
Older versions of NLog can do this:
${trim-whitespace:inner=${message:padding=-1000:fixedLength=true}}
One way to do this is by using regular expression replacement of the message, which you can define right in the nlog.config. I used the following to truncate to 500 characters:
<variable name="truncated_message" value="${replace:replaceWith=...TRUNCATED:regex=true:inner=${message}:searchFor=(?<\=.\{500\}).+}"/>
<target name="filelog" xsi:type="File" fileName="${basedir}/../logs/jobs/${shortdate}.log" layout="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level:uppercase=true}|${truncated_message}"/>