NLog是否可以发出多行消息,以便根据当前布局格式化每一行? E.g。
NSError *error=nil;
或者,NLog是否可以在多线程环境中将多个消息作为单个非中断块发出?
答案 0 :(得分:5)
您可以从配置中完成所有这些操作。
Console.WriteLine(result);
不完全确定您的64是什么或您获得每分钟数据的位置。可能是一个变量或者你插入的东西。如果你要登录的是一个文件而不是控制台,这个也应该有效。
至于你的第二个问题,如果你想要来自多个线程的单个日志消息,我认为你必须在代码端做到这一点。您必须收集线程,获取所需的日志数据并将其发送一次到nLog。我可能会误解
答案 1 :(得分:1)
目前似乎还没有功能上存在(从NLog 4.2.3开始)。一个潜在的解决方案是创建自己的包装器布局渲染器,以改进 replace-newlines 渲染器的功能。
所以 replace-newlines 和 replace 包装器不会在替换字符串中使用布局渲染器。查看其他包装器,渲染器和目标的NLog源,可以使用Layout
类型属性接受带(或不带)布局渲染器的字符串。提供布局渲染器时,内置替换包装器失败,因为它们的Replacement
属性类型为string
。 xml解析器只查找纯文本,但提供的布局渲染器的}过早地结束 replace-newline 包装。
以下自定义包装器会将替换类型从string
更改为Layout
。然后需要通过使用某个上下文(Render
)调用其LogEventInfo
方法来呈现替换布局。这可以在覆盖Append
方法中完成,其中LogEventInfo
可用。可以保存渲染的输出,以便以后在Transform
方法中使用。
using System;
using System.Text;
using NLog.Config;
using NLog.LayoutRenderers;
using NLog.LayoutRenderers.Wrappers;
using NLog.Layouts;
namespace My.Namespace
{
[LayoutRenderer("replace-newlines-withlayout")]
[ThreadAgnostic]
public class ReplaceNewLinesFormatLayoutRendererWrapper : WrapperLayoutRendererBase
{
private string m_replacementString = " ";
public ReplaceNewLinesFormatLayoutRendererWrapper()
{
// Changed from
// Replacement = " ";
Replacement = Layout.FromString(" ");
}
// Changed from
// public string Replacement { get; set; }
public Layout Replacement { get; set; }
// Override Append in order to render the replacement.
protected override void Append(StringBuilder builder, NLog.LogEventInfo logEvent)
{
// Render...
m_replacementString = Replacement.Render(logEvent);
// The base functionality of append is fine.
base.Append(builder, logEvent);
}
// Called from base.Append()
protected override string Transform(string text)
{
// Changed from
// return text.Replace(Environment.NewLine, Replacement);
// Now just put in the rendered replacement string.
return text.Replace(Environment.NewLine, m_replacementString);
}
}
}
然后,例如,将其用作
<target
...
layout=${replace-newlines-withlayout:replacement=${newline}${time}:${message}}
...
/>
在这个简化的情况下,假设$ {message}有换行符,每个新行都将以时间戳为前缀。只需用所需的前缀布局替换$ {time}。