导航

05-004 Logging 之 NLog http://nlog-project.org/

Posted on 2015-03-17 18:25  DotNet1010  阅读(174)  评论(0)    收藏  举报

官网地址:http://nlog-project.org/

下面是我的一些翻译理解:

 功能特点:

容易配置: 通过配置文件或者 代码

扩展性:    可以编写用户定义的Targets 或者 传递 自定义的 数据

跨平台:     支持 .NET 3.5 4 4.5  也支持Mono

Targets: 我理解为存储类型
Files 文件

Event Log  事件日志;Database   数据库;Console     控制台;E-mail        邮箱; Asp.net trace Asp.net 跟踪。

There are also wrapper targets which provide buffering, load balacing, failover situations, asynchronous writing and many more scenarios

还有其它一些:如 缓冲; 负载均衡 ;故障转移;异步写入 等使用场景

 使用的代码示例:

using NLog;
// 一个类用一个Logger 
Logger logger = LogManager.GetLogger("MyClassName");
//也可以这样用
  public class MyClass
  {
    private static Logger logger = LogManager.GetCurrentClassLogger();
  }

 

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

  public void MyMethod1()
  {
    logger.Trace("Sample trace message");
    logger.Debug("Sample debug message");
    logger.Info("Sample informational message");
    logger.Warn("Sample warning message");
    logger.Error("Sample error message");
    logger.Fatal("Sample fatal error message");

    // alternatively you can call the Log() method 
    // and pass log level as the parameter.
    logger.Log(LogLevel.Info, "Sample informational message");
  }
}

 ---参数化

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

  public void MyMethod1()
  {
    int k = 42;
    int l = 100;

    logger.Trace("Sample trace message, k={0}, l={1}", k, l);
    logger.Debug("Sample debug message, k={0}, l={1}", k, l);
    logger.Info("Sample informational message, k={0}, l={1}", k, l);
    logger.Warn("Sample warning message, k={0}, l={1}", k, l);
    logger.Error("Sample error message, k={0}, l={1}", k, l);
    logger.Fatal("Sample fatal error message, k={0}, l={1}", k, l);
    logger.Log(LogLevel.Info, "Sample informational message, k={0}, l={1}", k, l);
  }
}

 将上述内容写到哪里呢? 配置文件如下 NLog.config

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true">
  <targets>
    <target name="logfile"
            xsi:type="File"
            fileName="${basedir}/log/${date:format=yyyyMM}/${date:format=yyyyMMdd}.txt"
            layout="${longdate}|${level:uppercase=true}|${logger}|${event-context:item=EventId}|${message}|${ndc}" />
  </targets>
  <rules>
    <logger name="*" minlevel="Info" writeTo="logfile" />
  </rules>
</nlog>

 <target name="logfile" xsi:type="File" fileName="file.txt" />

 这个定义一个Target(存储目标)  存储到哪里:xsi:type="File" 文件名呢 "file.txt"

 上述配置文件中的文件名 fileName="${basedir}/log/${date:format=yyyyMM}/${date:format=yyyyMMdd}.txt"

  是动态的 具体生成的文件如: Debug\log\201503\20150318.txt  ${basedir}指的是:Debug

 看一下 rule: <logger name="*" minlevel="Info" writeTo="logfile" />

name="*"指的是所有名字: minlevel="Info" 指的是日志等级大于等于 Info writeTo="logfile"  logfile 即 我们上面定义的 <target name="logfile"

 多Targets:

    <targets>
        <target name="logfile" xsi:type="File" fileName="file.txt" />
        <target name="console" xsi:type="Console" />
    </targets>

    <rules>
        <logger name="*" minlevel="Trace" writeTo="logfile" />
        <logger name="*" minlevel="Info" writeTo="console" />
    </rules>
</nlog>

写文件 file.txt 也写控制台 等级不一样 文件写的多一些  Trace 等级最低。

如果想要某个类中的日志信息特别详细怎么办呢?示例如下:

    <targets>
        <target name="logfile" xsi:type="File" fileName="file.txt" />
    </targets>

    <rules>
        <logger name="SomeNamespace.Component.*" minlevel="Trace" writeTo="logfile" final="true" />
        <logger name="*" minlevel="Info" writeTo="logfile" />
    </rules>

 以SomeNamespace.Component.开头的特别详细 写完就停了 final="true"  相当于程序中的 break. 避免重复写 不考虑其它Rule了 这里说明Rule是有顺序的。

 name="*" 写剩余的其它日志。

异步缓冲写入的例子:

    <targets>
        <target name="asyncFile" xsi:type="AsyncWrapper">
            <target name="logfile" xsi:type="File" fileName="file.txt" />
        </target>
    </targets>

    <rules>
        <logger name="*" minlevel="Info" writeTo="asyncFile" />
    </rules>

 上述的 target 有嵌套。

再来说说 Loyouts 布局(这里指的是输出内容的格式)

简单的:layout="${date:format=yyyyMMddHHmmss} ${message}"

${message} 指的是用户写的信息  ${date:format=yyyyMMddHHmmss} 指的是在用户信息前 加上 指定格式的时间

 详细的看这篇文章吧:Layout-renderers

这里说一下:Event Context Layout Renderer   ASP.NET 5 中的 EventID 相关代码:

                    //ASP.NET 5 Logging
                    var eventInfo = LogEventInfo.Create(nLogLogLevel, _logger.Name, message, exception);
                    eventInfo.Properties["EventId"] = eventId;
                    _logger.Log(eventInfo);
${event-context:item=String}
//C# Code
Logger log = LogManager.GetCurrentClassLogger();
LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", "Pass my custom value");
theEvent.Properties["MyValue"] = "My custom string";
// deprecated
theEvent.Context["TheAnswer"] = 42;
log.Log(theEvent);

 配置文件以及输出:

${event-context:item=MyValue} -- renders "My custom string"
${event-context:item=TheAnswer} -- renders "42"

 想要更详细的了解:请打开此网页:

 https://github.com/nlog/nlog/wiki