gpt4 book ai didi

.net - 最有用的 NLog 配置

转载 作者:行者123 更新时间:2023-12-03 03:58:18 25 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

7年前关闭。



Improve this question




使用 NLog 进行日志记录的最佳或最有用的配置是什么? (这些可以是简单的也可以是复杂的,只要它们有用。)

我正在考虑一些示例,例如自动滚动特定大小的日志文件、更改布局(日志消息)是否有异常、一旦发生错误就升级日志级别等。

以下是一些链接:

  • NLog Demo
  • Examples in the source
  • 最佳答案

    其中一些属于一般 NLog(或日志记录)提示的类别,而不是严格的配置建议。

    以下是 SO 上的一些通用日志记录链接(您可能已经看过其中的一些或全部):

    log4net vs. Nlog

    Logging best practices

    What's the point of a logging facade?

    Why do loggers recommend using a logger per class?

    使用基于类 Logger logger = LogManager.GetCurrentClassLogger() 命名记录器的常见模式.这为您的记录器提供了高度的粒度,并为您的记录器配置提供了极大的灵活性(全局控制、命名空间控制、特定记录器名称等)。

    在适当的地方使用非基于类名的记录器。也许您有一个真正想要单独控制日志记录的功能。也许您有一些横切日志问题(性能日志)。

    如果您不使用基于类名的日志记录,请考虑以某种层次结构(可能按功能区域)命名您的记录器,以便您可以在配置中保持更大的灵活性。例如,您可能有一个“数据库”功能区、一个“分析”FA 和一个“ui”FA。其中每一个都可能有子区域。因此,您可能会请求这样的记录器:

    Logger logger = LogManager.GetLogger("Database.Connect");
    Logger logger = LogManager.GetLogger("Database.Query");
    Logger logger = LogManager.GetLogger("Database.SQL");
    Logger logger = LogManager.GetLogger("Analysis.Financial");
    Logger logger = LogManager.GetLogger("Analysis.Personnel");
    Logger logger = LogManager.GetLogger("Analysis.Inventory");

    等等。使用分层记录器,您可以全局(“*”或根记录器)、FA(数据库、分析、UI)或子区域(Database.Connect 等)配置日志记录。

    记录器有许多配置选项:
    <logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" /> 
    <logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" />
    <logger name="Name.Space.*" writeTo="f3,f4" />
    <logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" />

    NLog help有关每个选项的确切含义的更多信息。这里最值得注意的项目可能是通配符记录器规则的能力,多个记录器规则可以为单个记录语句“执行”的概念,并且记录器规则可以标记为“最终”,因此后续规则不会执行给定的日志记录语句。

    使用 GlobalDiagnosticContext、MappedDiagnosticContext 和 NestedDiagnosticContext 向输出添加额外的上下文。

    在配置文件中使用“变量”来简化。例如,您可以为布局定义变量,然后在目标配置中引用该变量,而不是直接指定布局。
      <variable name="brief" value="${longdate} | ${level} | ${logger} | ${message}"/>
    <variable name="verbose" value="${longdate} | ${machinename} | ${processid} | ${processname} | ${level} | ${logger} | ${message}"/>
    <targets>
    <target name="file" xsi:type="File" layout="${verbose}" fileName="${basedir}/${shortdate}.log" />
    <target name="console" xsi:type="ColoredConsole" layout="${brief}" />
    </targets>

    或者,您可以创建一组“自定义”属性以添加到布局中。
      <variable name="mycontext" value="${gdc:item=appname} , ${mdc:item=threadprop}"/>
    <variable name="fmt1withcontext" value="${longdate} | ${level} | ${logger} | [${mycontext}] |${message}"/>
    <variable name="fmt2withcontext" value="${shortdate} | ${level} | ${logger} | [${mycontext}] |${message}"/>

    或者,您可以严格通过配置来执行诸如创建“日”或“月”布局渲染器之类的操作:
      <variable name="day" value="${date:format=dddd}"/>
    <variable name="month" value="${date:format=MMMM}"/>
    <variable name="fmt" value="${longdate} | ${level} | ${logger} | ${day} | ${month} | ${message}"/>
    <targets>
    <target name="console" xsi:type="ColoredConsole" layout="${fmt}" />
    </targets>

    您还可以使用布局渲染来定义您的文件名:
      <variable name="day" value="${date:format=dddd}"/>
    <targets>
    <target name="file" xsi:type="File" layout="${verbose}" fileName="${basedir}/${day}.log" />
    </targets>

    如果您每天滚动文件,则每个文件都可以命名为“Monday.log”、“Tuesday.log”等。

    不要害怕编写自己的布局渲染器。它很简单,允许您通过配置将自己的上下文信息添加到日志文件中。例如,这里是一个布局渲染器(基于 NLog 1.x,而不是 2.0),可以将 Trace.CorrelationManager.ActivityId 添加到日志中:
      [LayoutRenderer("ActivityId")]
    class ActivityIdLayoutRenderer : LayoutRenderer
    {
    int estimatedSize = Guid.Empty.ToString().Length;

    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
    builder.Append(Trace.CorrelationManager.ActivityId);
    }

    protected override int GetEstimatedBufferSize(LogEventInfo logEvent)
    {
    return estimatedSize;
    }
    }

    像这样告诉 NLog 你的 NLog 扩展在哪里(什么程序集):
      <extensions>
    <add assembly="MyNLogExtensions"/>
    </extensions>

    像这样使用自定义布局渲染器:
      <variable name="fmt" value="${longdate} | ${ActivityId} | ${message}"/>

    使用异步目标:
    <nlog>
    <targets async="true">
    <!-- all targets in this section will automatically be asynchronous -->
    </targets>
    </nlog>

    和默认目标包装器:
    <nlog>  
    <targets>
    <default-wrapper xsi:type="BufferingWrapper" bufferSize="100"/>
    <target name="f1" xsi:type="File" fileName="f1.txt"/>
    <target name="f2" xsi:type="File" fileName="f2.txt"/>
    </targets>
    <targets>
    <default-wrapper xsi:type="AsyncWrapper">
    <wrapper xsi:type="RetryingWrapper"/>
    </default-wrapper>
    <target name="n1" xsi:type="Network" address="tcp://localhost:4001"/>
    <target name="n2" xsi:type="Network" address="tcp://localhost:4002"/>
    <target name="n3" xsi:type="Network" address="tcp://localhost:4003"/>
    </targets>
    </nlog>

    在适当情况下。有关这些的更多信息,请参阅 NLog 文档。

    告诉 NLog 监视并在配置发生变化时自动重新加载配置:
    <nlog autoReload="true" /> 

    有几个配置选项可帮助排除 NLog 故障
    <nlog throwExceptions="true" />
    <nlog internalLogFile="file.txt" />
    <nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" />
    <nlog internalLogToConsole="false|true" />
    <nlog internalLogToConsoleError="false|true" />

    有关更多信息,请参阅 NLog 帮助。

    NLog 2.0 添加了 LayoutRenderer 包装器,允许对布局渲染器的输出执行额外的处理(例如修剪空格、大写、小写等)。

    如果您想将代码与 NLog 的硬依赖隔离,请不要害怕包装记录器,但要正确包装。在 NLog 的 github 存储库中有如何包装的示例。包装的另一个原因可能是您希望自动向每个记录的消息添加特定的上下文信息(通过将其放入 LogEventInfo.Context)。

    包装(或抽象)NLog(或任何其他与此相关的日志记录框架)有利有弊。只需稍加努力,您就可以在此处找到大量关于 SO 呈现双方的信息。

    如果您正在考虑包装,请考虑使用 Common.Logging .它运行良好,如果您愿意,可以轻松切换到另一个日志记录框架。此外,如果您正在考虑包装,请考虑如何处理上下文对象(GDC、MDC、NDC)。 Common.Logging 目前不支持对它们的抽象,但据说它在添加功能队列中。

    关于.net - 最有用的 NLog 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4091606/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com