使用NLog打印多行消息

时间:2015-12-17 11:45:00

标签: nlog

NLog是否可以发出多行消息,以便根据当前布局格式化每一行? E.g。

NSError *error=nil;

或者,NLog是否可以在多线程环境中将多个消息作为单个非中断块发出?

2 个答案:

答案 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}。