2011-02-20 87 views
7

我知道在NLOG内建像跟踪,信息的一些日志级别,致命等NLOG和自定义级别

我要定义一些新的如“DBLOG”,并只能与DBLOG配置所有日志针对某个目标。

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

回答

20

@SemVanmeenen是正确的,NLog不允许添加自定义级别(即扩展LogLevel类中的可能值)。另外,考虑到级别的工作方式,至少在NLog中,每个级别通常表示消息的优先级。因此,如果您将一些(或全部)记录器配置为只记录错误和更高级别的消息,则任何跟踪,调试,信息和警告消息都不会被记录。 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目标(即Trace将被跳过)。

线路2将引起记录器用于Class1的写入F1目标ONLY调试和错误级别的消息(即跟踪,信息,警告,以及致命将被跳过)

3号线将导致对于所有的记录器命名空间Name.Space中的类可以写入目标f3和f4,而不管级别如何。

4号线将导致所有类的记录器在命名空间Name.Space写入到目标F3和F4只有当日志级别为警告或更高(即跟踪,调试和信息将被跳过)

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

这些示例显示了如何在记录器级别进行过滤,因此没有为记录器处理更多规则。您可以使用FilteringTargetWrapper在目标级别执行进一步的筛选。我还没有使用它,但有此配置FilteringTargetWrapper的例子:我有这些例子指出,随着NLOG 1.0刷新安装附带的帮助文件的
Most useful NLog configurations

。我还没有安装NLog 2.0,因为我正处于一个项目的中间,宁愿等到NLog 2.0超出测试阶段才能进入它。如果您使用NLog 2.0并且帮助文件没有比NLog网站更好的示例,那么您可以考虑至少安装NLog 1.0帮助。你可以在这里得到NLog 1.0的帮助:http://nlog.codeplex.com/releases/view/32601

+0

问题是我有一个服务器的连接我为每个“连接对象”做了一个记录器现在让我说logger.trace和log.warn如果我想过滤跟踪(唯一)没有显示警告? – Stacker

+1

在配置文件中配置记录器时,可以为每个配置一个minLevel,maxLevel或离散级别。因此,对于记录器“A”,您可以将其配置为仅记录跟踪消息,对于记录器“B”,您可以将其配置为仅记录警告消息(或警告或更低)。我会在我的答案中添加几个示例。 – wageoghe

+0

用于“横切”记录器的+1 –

0

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

但是有没有一个单独的目标不足的原因?