【问题标题】:Selecting a custom log level in NLog在 NLog 中选择自定义日志级别
【发布时间】:2021-05-17 11:35:10
【问题描述】:

我正在为应用程序编写 NLog 文件。所需的要求之一是用户应该能够选择文件大小和日志级别。可以从下拉菜单中选择日志级别。我在想我可以有一个文件大小和日志级别的占位符。我该怎么做呢?目前,我已经这样做了:

<target name="logfile" xsi:type="File" FileName=".\logs\${shortdate}.log" 
        archiveFileName=".\logs\archive\${shortdate}.log"
        maxArchiveFiles="60" archiveEvery="Day" archiveAboveSize="###MaxSize###"
        layout="${longdate}|${level:uppercase=true}|${callsite}|${message}|${exception:format=toString}"/>
    <rules>
<logger name="*" minlevel="Trace" writeTo="logfile" />

对此我有两个问题:

  1. 我怎样才能使日志级别可以在一个选项中选择?
  2. 是否需要为每个日志级别设置不同的target

【问题讨论】:

  • 这是应用程序内还是将在应用程序进程之外运行并“简单地”更改日志配置文件的“日志配置器”?用户选择是“临时的”(例如,直到应用重新启动)还是持久的?
  • @Fildor 下拉菜单和能够选择文件大小的功能将被添加到应用程序中。在这里,我将有占位符,然后将替换为选择的任何大小或日志级别。所以这整个将是应用内的。用户的选择是永久的。
  • 好的,如果它在应用程序内,我将从以编程方式更改 NLog 配置开始。 (受到stackoverflow.com/questions/10302561/… 的启发)和github.com/NLog/NLog/wiki/…
  • ^^ 如后者所示,我可能会将用户选择保存在应用设置中,并在每次重新加载配置时重新应用。

标签: c# wpf nlog


【解决方案1】:

半动态路由规则

NLog 4.6.7 使动态更改 LogLevel 变得容易:

<nlog>
   <variable name="myLevel" value="Trace" />
    <rules>
      <logger name="*" minlevel="${var:myLevel}" writeTo="logfile" />
    </rules>
</nlog>

然后像这样从运行时更改它:

LogManager.Configuration.Variables["myLevel"] = "Debug";
LogManager.ReconfigExistingLoggers();

https://github.com/NLog/NLog/wiki/Filtering-log-messages#semi-dynamic-routing-rules

重写并重新加载 NLog.config

但听起来您应该只在NLog.config-文件中执行搜索和替换,然后执行显式重新加载:

<nlog>
    <variable name="myLevel" value="Trace" />
    <variable name="mySize" value="42" />
    <targets>
        <target name="logfile" xsi:type="File"
              fileName=".\logs\${shortdate}.log" 
              archiveAboveSize="${mySize}" />
    </targets>
    <rules>
      <logger name="*" minlevel="${var:myLevel}" writeTo="logfile" />
    </rules>
</nlog>

在文件重写/更新(更改两个变量)之后,显式重新加载是这样完成的:

NLog.LogManager.Configuration = NLog.LogManager.Configuration?.Reload();

显式重新加载的替代方法是使用&lt;nlog autoReload="true"&gt;(然后NLog 将检测到NLog.config-file 的更改并自动重新加载)。

重写并重新加载 NLog.user.config

如果您感到兴奋并喜欢高级的东西,那么您也可以使用包含文件,并拥有一个包含NLog.user.config 的默认NLog.config

<nlog autoreload="true">
    <variable name="myLevel" value="Trace" />
    <variable name="mySize" value="42" />
    <include file="NLog.user.config" ignoreErrors="true" />  <!-- Can override variables -->
    <targets>
        <target name="logfile" xsi:type="File"
              fileName=".\logs\${shortdate}.log" 
              archiveAboveSize="${mySize}" />
    </targets>
    <rules>
      <logger name="*" minlevel="${var:myLevel}" writeTo="logfile" />
    </rules>
</nlog>

另见:https://github.com/NLog/NLog/wiki/XML-config-include-Example

【讨论】:

    【解决方案2】:

    基于Combine nlog.config and config from code

    请注意,结合配置文件 (nlog.config) 并在代码中更改它,重新加载 nlog.config 可能会撤消您的更改。如果您将两者结合起来,则在重新加载事件上重新应用更改。例如

    // On start of your program
    UpdateConfig();
    
    LogManager.ConfigurationReloaded += (sender, e) =>
    {
        //Re apply if config reloaded
        UpdateConfig();
    };
    

    UpdateConfig 在哪里

    public void UpdateConfig()
    {
        var configuration = LogManager.Configuration;
        var fileTarget = configuration.FindTargetByName<FileTarget>("myTargetName");
        fileTarget.FileName = "${basedir}/file.log";
        LogManager.Configuration = configuration; //apply
    }
    

    然后,我会将其调整为

    public void UpdateConfig()
    {
        var configuration = LogManager.Configuration;
    
        // Get User-Defined LogLevel and FileSize from App Settings
        // Set NLog LogLevel and FileSize
    
        LogManager.Configuration = configuration; //apply
    }
    

    在 Log-Config-Dialog 的处理程序中,我会将 Level 和 FileSize 写入 App Settings,然后调用 UpdateConfig

    确保为这些应用设置提供默认设置或处理尚未设置的设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-13
      • 2012-08-18
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多