Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NLog.Extensions.Logging(1.6.1)打印多行消息_C#_Nlog - Fatal编程技术网

C# 使用NLog.Extensions.Logging(1.6.1)打印多行消息

C# 使用NLog.Extensions.Logging(1.6.1)打印多行消息,c#,nlog,C#,Nlog,我正在使用NLog.Extensions.Logging v1.6.1开发一个.NET Core 3.1控制台应用程序,并希望打印一条包含多行的消息。我遵循了前面使用包装器布局渲染器提供的StackOverflow示例,如下所示。我看到了新的线路是如何被替换的;但是,多行消息的开头(即第一行)没有前缀 示例的输出如下所示: line 1> Hello world line 2> 19:30:45.2313 Hello World , again 先前提供的示例代码: NLog.C

我正在使用NLog.Extensions.Logging v1.6.1开发一个.NET Core 3.1控制台应用程序,并希望打印一条包含多行的消息。我遵循了前面使用包装器布局渲染器提供的StackOverflow示例,如下所示。我看到了新的线路是如何被替换的;但是,多行消息的开头(即第一行)没有前缀

示例的输出如下所示:

line 1> Hello world 
line 2> 19:30:45.2313 Hello World , again
先前提供的示例代码: NLog.Config

<?xml version="1.0" encoding="utf-8" ?>
<!-- XSD manual extracted from package NLog.Schema: https://www.nuget.org/packages/NLog.Schema-->
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogFile="c:\temp\console-example-internal.log"
      internalLogLevel="Info" >

  <!-- the targets to write to -->
  <targets>
    <!-- write logs to file -->
    <target xsi:type="File" name="target1" fileName="c:\temp\console-example.log"
        layout="${replace-newlines-withlayout:replacement=${newline}${time}:${message}}" />
    <target xsi:type="ColoredConsole" name="target2"
        layout="${replace-newlines-withlayout:replacement=${newline}${time}:${message}}" />
    />
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <logger name="*" minlevel="Trace" writeTo="target1,target2" />
  </rules>
</nlog>
例如:

class Program
{
    private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();

    static void Main(string[] args)
    {
        try
        {
            var ReplaceNewLinesFormatLayoutRendererWrapper = new ReplaceNewLinesFormatLayoutRendererWrapper();
            ReplaceNewLinesFormatLayoutRendererWrapper.Register<NLogTest.ReplaceNewLinesFormatLayoutRendererWrapper>("replace-newlines-withlayout");

            Logger.Info($"Hello world {Environment.NewLine} Hello World , again");
            System.Console.ReadKey();
        }
        catch (Exception ex)
        {
            Logger.Error(ex, "yeah, here again");
        }
    }
}
这里的问题是,在Append之前调用Transform,而您的转换依赖于Append

幸运的是,现在有一个更好的转换要覆盖,这个转换还将包含LogEventInfo作为参数。NLog 4.5+

因此,您可以删除当前的附加和转换覆盖,并替换为:

protected override string Transform(LogEventInfo logEvent, string text)
{
    // Render...
    var replacementString = Replacement.Render(logEvent);

    // Now just put in the rendered replacement string.
    return text.Replace(Environment.NewLine, replacementString);
}
清洗后的完整代码:

using System;
using NLog;
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
    {
        public Layout Replacement { get; set; } = " ";

        protected override string Transform(LogEventInfo logEvent, string text)
        {
            // Render...
            var replacementString = Replacement.Render(logEvent);

            // Now just put in the rendered replacement string.
            return text.Replace(Environment.NewLine, replacementString);
        }
    }
}

我遵循了之前在StackOverflow上提供的一个示例。。。如果你把一个链接放在你所指的答案上,这会很有帮助。当然,请包括相关的配置以及那些有用和不有用的例子-谢谢!这里是我引用的链接:编辑了原始帖子并添加了Nlog.config、示例和示例输出。谢谢示例的输出是当前行为,而不是期望的行为,不是吗?你不想要那一行吗?谢谢。然而,在进行了上述更改之后,我仍然得到了与原始代码相同的结果。我的示例程序正在调用TransformLogEventInfo logEvent,字符串文本。事实上,在本例中,它被调用了两次。单独但相关的是,我需要重写WrapperLayoutRenderBase中定义的“protected override string Transformstring text”,以满足抽象要求;也许再多检查一下就能解决这个问题?还是我不明白?你说的变换覆盖是对的。我会解决的,谢谢。通过添加返回的replacementString+text.ReplaceEnvironment.NewLine、replacementString;第一行加了前缀,但由于替换字符串本身的原因,它前面还有一个额外的空行。我在高层不理解的是,转换被调用两次,使用相同的字符串,$Hello world{Environment.NewLine}Hello world的插值,再次调用。再次感谢。
using System;
using NLog;
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
    {
        public Layout Replacement { get; set; } = " ";

        protected override string Transform(LogEventInfo logEvent, string text)
        {
            // Render...
            var replacementString = Replacement.Render(logEvent);

            // Now just put in the rendered replacement string.
            return text.Replace(Environment.NewLine, replacementString);
        }
    }
}