Nlog和自定义级别

时间:2011-02-20 12:34:45

标签: c# nlog logging

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

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

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

2 个答案:

答案 0 :(得分:21)

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

你真的需要一个特殊级别(或多个)来记录像“DBLog”这样的东西吗?为什么不在配置文件中定义另一个名为“DBLog”的记录器?这样,您可以使用过滤和目标将这些日志发送到特定目标或打开或关闭该记录器。 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”的记录器,您偶尔会使用该记录器记录您希望在类级别以外的级别控制的特定信息。

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

如果这没有帮助,也许你可以详细说明你想要做什么的问题。你希望你能写出什么样的日志代码,你觉得你现在不能写?

[UPDATE]

<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(即将跳过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

答案 1 :(得分:0)

据我所知,不可能。 The log level class的nlog甚至没有公共构造函数,只有预定义的静态loglevel对象(即通常的Info,Trace等)。

但是,为什么仅靠目标还不够?