C# Nlog和自定义级别

C# Nlog和自定义级别,c#,nlog,logging,C#,Nlog,Logging,我知道NLog中内置了一些日志级别,如跟踪、信息、致命等 我想定义一些新的日志,比如“DBLog”,并且只能将所有使用DBLog的日志配置为针对特定目标 有没有办法做到这一点?或者我必须定义一个自定义日志?据我所知,这是不可能的。of nlog甚至没有公共构造函数,只有预定义的静态日志级别对象(即通常的信息、跟踪等) 但是,仅仅一个目标还不够吗?@SemVanmeenen是正确的,NLog不允许添加自定义级别(即扩展LogLevel类中的可能值)。另外,考虑到级别的工作方式,至少在NLog中,每

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

我想定义一些新的日志,比如“DBLog”,并且只能将所有使用DBLog的日志配置为针对特定目标


有没有办法做到这一点?或者我必须定义一个自定义日志?据我所知,这是不可能的。of nlog甚至没有公共构造函数,只有预定义的静态日志级别对象(即通常的信息、跟踪等)


但是,仅仅一个目标还不够吗?

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

您真的需要一个特殊级别(或多个级别)来记录“DBLog”之类的内容吗?为什么不在配置文件中定义另一个名为“DBLog”的记录器呢?通过这种方式,您可以使用筛选和目标将这些日志发送到特定目标,或者打开或关闭该日志记录器

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目标写入调试和错误级别消息(即,将跳过跟踪、信息、警告和致命消息)

第3行将导致命名空间Name.Space中所有类的记录器写入目标f3和f4,而不考虑级别

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

第5行将导致namespace Name.Space中所有类的记录器拒绝级别介于Debug和Error之间的任何消息。他们被拒绝,因为没有书面条款。由于
final=true

这些示例显示了如何在记录器级别进行过滤。您可以使用FilteringTargetRapper在目标级别进行进一步筛选。我没有使用它,但这里有一个配置FilteringTargetRapper的示例:


我从NLog 1.0刷新安装附带的帮助文件中获得了这些示例。我还没有安装nlog 2,因为我在一个项目的中间,更喜欢等到Nlog 2在测试之前,我移到它。如果您正在使用Nlog 2,并且帮助文件没有Nlog网站上更好的示例,那么您可以考虑至少安装Nlog 1帮助。您可以在此处获得NLog 1.0帮助:

问题是我与服务器有连接,我为每个“连接对象”创建了一个记录器。现在让我们假设我执行logger.trace和log.warn,如果我想过滤跟踪(仅)而不显示警告,该怎么办?在配置文件中配置记录器时,您可以配置minLevel、maxLevel、,或为每一个设置离散的级别。因此,对于记录器“A”,您可以将其配置为仅记录跟踪消息,对于记录器“B”,您可以将其配置为仅记录警告消息(或警告和更低级别)。我将在我的答案中添加几个示例。我寻找的是通知级别,如syslog中的通知级别: