我正在将邮件记录到最大为1000个字符的数据库字段中。目前,如果我尝试记录一条消息(通常包含带有堆栈跟踪,HTTP请求内容等的异常信息),大于1000个字符,插入失败,NLog(应该)默默地忽略它并继续运行。
我可以在NLog.config中放一些东西来声明消息长度应该总是被截断,所以它不超过1000个字符吗?
如果您可以通过使用“[... Truncated]”之类的内容替换1000个字符限制之前的最后几个字符来告诉我如何优雅地标记截断的邮件,那么
奖励积分。
无法相信我不能通过谷歌搜索找到这个。希望我不必编写自己的渲染器?
答案 0 :(得分:5)
我不知道有一种内置的方式来做到这一点。相反,我会写一个LayoutRenderer(实际上是一个WrapperLayoutRenderer)。这并不难。
这样的事情(未经测试)应该这样做:
[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;
}
}
答案 1 :(得分:5)
执行此操作的一种方法是使用正则表达式替换消息,您可以在nlog.config中定义该消息。我使用以下内容截断为500个字符:
<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}"/>
答案 2 :(得分:4)
在log4net中,我在insert语句中指定left(@msg,1000)以确保消息适合数据库列。您可以在nlog中执行类似的操作。
在sql server中,您可以使用此片段构造一个插入... select from-statement:
case when len(@msg) > 1000 then left(@msg, 988)+' [truncated]' else @msg end
答案 3 :(得分:2)
NLog 4.6.3支持此功能:
union Row {
TypeA,
TypeB,
TypeC,
Etc,
...
}
较旧版本的NLog可以执行以下操作:
${message:truncate=1000}