Nlog和自定义级别

Sta*_*ker 8 c# logging nlog

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

我想定义一些新的,例如"DBLog",并且只能将所有带有DBlog的日志配置为针对某个Target.

有办法做到这一点吗?或者我必须定义自定义日志?

wag*_*ghe 22

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

你真的需要一个特殊级别(或多个)来记录像"DBLog"这样的东西吗?为什么不在配置文件中定义另一个名为"DBLog"的记录器?这样,您可以使用过滤和目标将这些日志发送到特定目标或打开或关闭该记录器. 有关NLog配置可以执行的操作的一些示例,请参阅此链接.

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

在第二个示例中,两个类都使用相同的记录器("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" />
Run Code Online (Sandbox Code Playgroud)

假设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的例子:
最有用的NLog配置

我从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