c# - Nlog 和自定义级别

标签 c# nlog logging

我知道 NLog 中内置了一些日志级别,例如跟踪、信息、致命等

我想定义一些新的,例如“DBLog”,并且只能将所有带有 DBlog 的日志配置为针对某个目标。

有办法吗?或者我必须定义自定义日志?

最佳答案

@SemVanmeenen 是对的,NLog 不允许添加自定义级别(即扩展 LogLevel 类中的可能值)。另外,鉴于级别的工作方式,至少在 NLog 中,每个级别通常表示消息的优先级。因此,如果您将一些(或所有)记录器配置为仅记录错误和更高级别的消息,则不会记录任何跟踪、调试、信息和警告消息。 DBLog 级别适合哪里?这似乎更像是一个“类别”(可以有点类似于记录器名称)而不是一个级别。

您真的需要一个特殊级别(或多个级别)来记录诸如“DBLog”之类的内容吗?为什么不在您的配置文件中定义另一个名为“DBLog”的记录器?这样您就可以使用过滤和 Targets 将这些日志发送到特定的 Target 或打开或关闭该记录器。 See this link for some examples of stuff you can do with NLog configuration.

NLog 和 log4net 中最常见的模式之一是每个类都有一个记录器,如下所示:

class MyClass
{
  private static readonly Logger logger = LogManager.GetCurrentClassLogger();

  public void DoSomething(int x, int y);
  {
    logger.Info("Doing something.  x = {0}, y = {1}", x, y);

    //Or

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y);
  }
}

您还可以使用任意记录器名称:

class MyDbClass
{
  private static readonly Logger logger = LogManager.GetLogger("DbStuff");

  public void DoSomething(int x, int y);
  {
    logger.Info("Doing something.  x = {0}, y = {1}", x, y);

    //Or

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y);
  }
}

class MyOtherDbClass
{
  private static readonly Logger logger = LogManager.GetLogger("DbStuff");

  public void DoSomething(int x, int y);
  {
    logger.Info("Doing something.  x = {0}, y = {1}", x, y);

    //Or

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y);
  }
}

在第二个示例中,两个类都使用相同的记录器(“DbStuff”),并且都可以根据该记录器名称进行控制(记录级别、目标等)。

您还可以在同一个类中使用不同的记录器(也许默认情况下您使用“每类”记录器样式,但您也可以定义一些“横切”记录器,以便更容易地记录和控制跨类的类似信息类)。您可能有一个名为“SQL”或“PERFORMANCE”的记录器,您偶尔会使用它来记录您希望在类级别以外的级别控制的特定信息。

使用不同的记录器名称,您当然可以将日志消息路由到不同的目标,而无需定义新的日志级别。

如果这没有帮助,也许您可​​以在您的问题中详细说明您到底想做什么。您希望自己可以编写什么样的日志记录代码,但您觉得自己现在无法编写?

[更新]

<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="Warn" writeTo="f3,f4" /> 
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" />

假设 f1、f2、f3 和 f4 是文件目标。

第 1 行将使 Class1 的记录器写入 f1 目标以获取调试和更高级别的消息(即,将跳过跟踪)。

第 2 行将使 Class1 的记录器仅将调试和错误级别的消息写入 f1 目标(即,将跳过 Trace、Info、Warn 和 Fatal)

第 3 行将导致命名空间 Name.Space 中所有类的记录器写入目标 f3 和 f4,无论级别如何。

第 4 行将导致命名空间 Name.Space 中所有类的记录器仅在日志级别为 Warn 或更高时写入目标 f3 和 f4(即,将跳过 Trace、Debug 和 Info)

第 5 行将导致命名空间 Name.Space 中所有类的记录器拒绝级别介于 Debug 和 Error 之间的任何消息。它们被拒绝,因为没有 writeTo 子句。由于 final=true

,没有为记录器处理进一步的规则

这些示例展示了如何在记录器级别进行过滤。您可以使用 FilteringTargetWrapper 在目标级别进行进一步过滤。我没有使用过它,但是这里有一个配置 FilteringTargetWrapper 的例子:
Most useful NLog configurations

我从 NLog 1.0 刷新安装附带的帮助文件中获取了这些示例。我还没有安装 NLog 2.0,因为我正处于一个项目的中间,我更愿意等到 NLog 2.0 结束测试版后再转向它。如果您使用的是 NLog 2.0,并且帮助文件没有比 NLog 网站上更好的示例,您可以考虑至少安装 NLog 1.0 帮助。您可以在此处获得 NLog 1.0 帮助:http://nlog.codeplex.com/releases/view/32601

关于c# - Nlog 和自定义级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5057061/

相关文章:

Django 模型 __unicode__ 在记录时引发异常

ios - Xcode Version 7.1 beta 3 启用调试器后无法附加到进程

c# - OpenCover 用于 .Net Core 中的 xUnit 测试

c# - 如何确定数学表达式的求值顺序?

C# 替换字符串中的不同字符

logging - 配置log4net根据日志级别写入不同的文件

c# - 查询反序列化对象

nlog - 将 NLog 与多个服务器一起使用。想要写入特定服务器上的 1 个文件

c# - NLog DatabaseTarget 安装不工作

Python Gevent共享队列(监听进程)