05-004 Logging 之 NLog http://nlog-project.org/
Posted on 2015-03-17 18:25 DotNet1010 阅读(174) 评论(0) 收藏 举报下面是我的一些翻译理解:
功能特点:
容易配置: 通过配置文件或者 代码
扩展性: 可以编写用户定义的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"
想要更详细的了解:请打开此网页:
浙公网安备 33010602011771号